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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

myqpy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值