目录
编译Linux内核时出现“code model kernel does not support PIC mode”的解决方法
移植u-boot问题:include/config.h:6:10: fatal error: configs/.h: No such file or directory
modprobe 提示 FATAL: Module chrdevbase not found in directory /lib/modules/4.1.15-g06f53e4的解决方法
学习记录
关闭心跳灯
echo none > /sys/class/leds/sys-led/trigger
一、字符设备驱动开发
下载一个内核源码,依据内核源码编译写的驱动文件
通过交叉编译获取 模块 . ko 文件,通过网络传输至开发板
insmod/modprobe 模块名 加载模块 调用module_init
rmmod 模块名 卸载模块 调用module_exit
lsmod 模块名 列出现有模块
如果加载模块不成功可尝试去掉 .ko后缀重试
写一个测试app测试字符驱动功能
创建字符设备节点 mknod /dev/chrdevbase c 200 0
设备名 c表示字符设备 节点ID
二、汇编点灯驱动开发
首先需要找到需要控制寄存器的物理地址,通过ioremap函数得到虚拟地址的指针
得到后通过给寄存器赋值初始化点灯所需的电气属性
通过驱动的io接口实现点灯和关灯的功能
当卸载驱动时应使用iounmap函数释放指针
注意在操作寄存器时应先清空寄存器现有的值然后进行赋值操作
开灯关灯应在释放指针前进行操作
按位赋值取反应用~而不是-
三、新字符设备驱动开发(花式点灯)
可利用alloc_chrdev_region函数获得系统分配的设备号
利用cdev_init函数添加字符设备
利用cdev_del函数删除字符设备
利用unregister_chrdev_region函数注销设备号
剩余的就是和上一节一样的汇编电气属性配置,花式点灯完成
问题分析
编译Linux内核时出现“code model kernel does not support PIC mode”的解决方法
修改内核工程目录下的Makefile
在KBUILD_CFLAGS中加入-fno-pie字段
编译linux驱动时提示很多源码头文件和定义缺失
类似下图所示问题
此问题为交叉编译链未指定正确
修改内核工程目录下的Makefile
此处使用了交叉编译链的绝对路径,如果在环境变量中提前设置过默认的编译链可不使用绝对路径
移植u-boot问题:include/config.h:6:10: fatal error: configs/.h: No such file or directory
遇到这种情况主要检查两个地方的Kconfig文件,首先是board/freescale/mx6ul_14x14_evk/Kconfig
:
if TARGET_MX6ULL_ZXIAT_NAND
config SYS_BOARD
default "mx6ull_zxiat_nand"
config SYS_VENDOR
default "freescale"
config SYS_SOC
default "mx6"
config SYS_CONFIG_NAME
default "mx6ull_zxiat_nand"
endif
另外一个地方是arch/arm/cpu/armv7/mx6/Kconfig
:
config TARGET_MX6ULL_ZXIAT_NAND
bool "Support mx6ull_zxiat_nand"
select MX6ULL
select DM
select DM_THERMAL
source "board/freescale/mx6ull_zxiat_nand/Kconfig"
modprobe 提示 FATAL: Module chrdevbase not found in directory /lib/modules/4.1.15-g06f53e4的解决方法
可能是缺少相关路径、文件或是文件名不需要带扩展
使用modprobe XX.ko命令后,会到文件系统/lib/modules/xxxxx目录下查找相应的XX.ko文件;
这里的xxxxx是指系统内核版本,可以通过uname -r命令获得。
解决方案:
没有这个目录的话,自己创建一个~
创建后将.ko文件放入这个目录中
执行depmod命令(建立该模块的依赖关系。也即必须用 depmod 来更新一下 /lib/modules/$(uname -r)/modules.dep 文件)
重新执行modprobe XX 命令(注意:这里不要有后缀.ko,不然会找不到,如:ko文件名是hello.ko,那么modprobe hello) 就可以了);insmod 则需要加后缀名,即 insmod hello.ko 。
卸载驱动模块的时候,使用modprobe -r 卸载,不需要将后缀名,即 modprobe -r hello 就可以
使用remod 卸载则必须要加后缀名.ko 即remod hello.ko
参考链接:https://blog.csdn.net/Nicolas_shen/article/details/124648073
驱动开发遇到version magic不匹配
打印报错: chrdevbase: version magic '4.1.15 SMP preempt mod_unload modversions ARMv6 p2v8 ' should be '4.1.15-g06f53e4 SMP preempt mod_unload modversions ARMv7 p2v8 '
问题原因:发现是编译驱动是指定的内核源码version magic与开发板已经跑起来的系统内核的version magic不一致造成的。
解决方法:可见红字有两处不同
第一处:4.1.15 ---> 4.1.15-g06f53e4
修改 linux 源码目录/include/generated/utsrelease.h
将4.1.15修改为4.1.15-g06f53e4
第二处:ARMv6 ---> ARMv7
修改make menuconfig ---> System Type ----> Multiple Platform selection
取消ARMv6勾选(键盘空格选择取消选择)