完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
[td]内核驱动不仅可以将驱动编译到内核中,还可以动态的编译内核驱动。本文档介绍如何以
模块的方式编译内核驱动。 以 module 的方式编译驱动,需要以下几个部分: 1 内核成功编译过; 2 找到内核的 arm 编译器; 3 编译简单驱动; 4 编译简单的 Makefile 文件,Makefile 文件中需要指向内核源码目录(成功编译过的内核源码目录); 和文档在一起的有“Makefile”、c 文件和 ko 文件,大家可以用来测试。 要动态的编译内核,首先需要将内核源码编译通过,内核的编译请参考使用手册第五章。 |
|
相关推荐
4个回答
|
|
内核和编译器路径
本节介绍内核路径、编译器路径。无论是 Qt 和 Ubuntu 的内核源码,都是在 android 源码包中,所以必须先解压 android 源码到 Ubuntu14.04 中。 如下图所示,作者的 android 源码在“/home/iMX6Q/iTOP-iMX6_android6.0.1”目录下,内核源码在其中的“kernel_imx”目录下。 进入“kernel_imx”目录,查看“build_android_kernel.sh”中的脚本文件,如下图所示。 如上图所示,我们可以得到一些信息,在后面编译内核模块的时候,需要设置编译目标平台为 arm,“export ARCH=arm”; 编译器的路径为“$(pwd)/。。/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.9/bin/arm-linux-androideabi-”。理论上,应该使用这个编译器,但是实际上以 modules 的方式编译内核驱动的时候,使用这个编译器,是无法编译的!! 应该使用“。。/prebuilts/gcc/linux-x86/arm/arm-eabi-4.8/bin/arm-eabi-”这个编译器才行,如下图所示。 编译器路径为内核源码目录对应的。。/prebuilts/gcc/linux-x86/arm/arm-eabi-4.8/bin/arm-eabi-”,这是作者测试出来的,作者没有太多时间深入研究编译脚本,但是这个编译器是可以的。前面红色部分介绍的编译器,会提示报错,对于这个报错,飞思卡尔官方给出的是简单的回复“你使用了 android 的编译器”,没有提供更多的解释,也没有提示方法,不过作者测试了几个内核驱动,都是可以正常 insmod 和 rmmod 的。 |
|
|
|
Makefile 和测试驱动源码以及编译
作者在“/home/imx6”目录下新建一个“imx_driver_modules”目录,将要编译的驱动和 Makefile 文件放到这个目录下。 2.1 Makefile Makefile 脚本文件: obj-m += iTOP_IMX6_treedriver_hello.o KDIR =/home/iMX6Q/iTOP-iMX6_android6.0.1/kernel_imx PWD ?= $(shell pwd) all: make -C $(KDIR) M=$(PWD) modules modules ARCH=arm CROSS_COMPILE=$(KDIR)/。./prebuilts/gcc/linux-x86/arm/arm-eabi-4.8/bin/arm-eabi- clean: rm -rf modules.order *.o workqueue.o Module.symvers *.mod.c *.ko 脚本中: 第一行《img sr smiliei borde al》bj-m += iTOP_IMX6_treedriver_hello.o 表示编译的源文件为iTOP_IMX6_treedriver_hello.c,如果源文件名有变化,则需要修改成对应的。 第二行:KDIR 参数指向对应的内核源码目录。作者的内核源码是在/home/iMX6Q/iTOP-iMX6_android6.0.1/kernel_imxx 目录下,用户要根据自己的具体情况来修改。 第三行:PWD ?= $(shell pwd)表示将当前目录的路径赋值给 PWD 变量,也就是/home/imx6_tree_driver/iTOP_IMX6_treedriver_hello。作者将会把 Makefile 文件和驱动源码放到这个目录下编译。 第五行:其中 make -C $(KDIR) M=$(PWD) modules,表示将当前目录下的文件编译为模块,并且制定了内核源码的路径; 其中 ARCH=arm 表示设置目标 CPU 类别为 arm,也就是编译的依赖内核和驱动模块目标 CPU 为 ARM; 其中 CROSS_COMPILE=$(KDIR)/。./prebuilts/gcc/linux-x86/arm/arm-eabi-4.8/bin/arm-eabi- ,这里的路径,指向内核编译器的路径。 2.2 简单驱动源码 驱动文件名称为:iTOP_IMX6_treedriver_hello.c,源码如下: #include #include MODULE_LICENSE(“Dual BSD/GPL”); MODULE_AUTHOR(“iTOPEET_dz”); static int hello_init(void) { printk(KERN_EMERG “Hello World enter!/n”); return 0; } static void hello_exit(void) { printk(KERN_EMERG “Hello world exit!/n”); } module_init(hello_init); module_exit(hello_exit); 驱动源码只有基本的入口和出口函数。加载和卸载的时候分别打印“Hello Worldenter!”和“Hello world exit!”。 2.3 编译 将源码和 Makefile 文件拷贝到 Ubuntu14 系统下。 使用命令“make”,如下图所示,可以看到有“iTOP_IMX6_treedriver_hello.ko”文件生成。 使用命令“make clean”,可以删除中间文件。 |
|
|
|
模块编译常见问题
在以模块的方式编译驱动的过程中,新手可能会以下问题。 1.内核源码没有编译或者内核源码路径设置不正确。 如果内核源码没有编译,那么模块将会提示缺少库之类的错误;如果路径设置不正确,会提示找不到内核。 2.源码和 Makefile 文件在 Windows 下编写,然后拷贝到 Ubuntu 上,由于编辑器不同导致转码错误。 这种错误比较容易解决,Make 编译之后,系统会提示 Makefile 或者驱动文件具体某一行出现问题。使用 vim 编辑器打开查看一下,就能找出一些乱码,使用 vim 编辑器修正一下再编译即可。 |
|
|
|
模块加载和卸载
作者这里使用最小 linux 系统来测试模块的加载和卸载,最小系统在使用手册第十三章有介绍。在编译模块前,内核源码必须要编译通过,作者这里是在最小系统是加载模块,那么内核源码也必须编译为 qt 的内核(最小系统使用的是 qt 的内核),否则是无法加载的。 如下图所示,将驱动模块拷贝到开发板(作者采用的是 nfs 共享目录的方式,关于 nfs 大家可以参考群共享中 nfs 相关的文档,设备树和非设备的 Ubuntu 都通用。也可以用 tf 卡或者 U 盘)。 然后使用命令“insmod iTOP_IMX6_treedriver_hello.ko”加载驱动模块,如下图示,打印出“Hello World enter!”,表明模块驱动加载成功。 接着使用命令“rmmod iTOP_IMX6_treedriver_hello”卸载模块,如下图所示,发现提示没有目录 4.1.15,这里我们新建“/lib/modules/4.1.15”。 如下图所示,使用命令“mkdir /lib/modules/4.1.15”新建目录,再次使用命令“rmmod iTOP_IMX6_treedriver_helloello”卸载驱动模块。 发现打印信息“Hello world exit!”,模块卸载成功。 只要重新烧写系统,这些新建目录只需要建立一次即可。 |
|
|
|
只有小组成员才能发言,加入小组>>
661 浏览 0 评论
1083 浏览 1 评论
2454 浏览 5 评论
2779 浏览 9 评论
移植了freeRTOS到STMf103之后显示没有定义的原因?
2615 浏览 6 评论
使用eim外接fpga可是端口一点反应都没有有没有大哥指点一下啊
638浏览 9评论
634浏览 7评论
请教大神怎样去解决iMX6Q在linux3.0.35内核上做AP失败的问题呢
765浏览 6评论
610浏览 5评论
651浏览 5评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-8 18:30 , Processed in 1.106998 second(s), Total 87, Slave 67 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号