正点原子imx6ull驱动开发学习记录(持续更新)

目录

学习记录

一、字符设备驱动开发

二、汇编点灯驱动开发

三、新字符设备驱动开发(花式点灯)

问题分析

编译Linux内核时出现“code model kernel does not support PIC mode”的解决方法

编译linux驱动时提示很多源码头文件和定义缺失

移植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的解决方法

驱动开发遇到version magic不匹配


学习记录

关闭心跳灯

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勾选(键盘空格选择取消选择)

猜你喜欢

转载自blog.csdn.net/quququuquq/article/details/131002138