完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
[td]内核驱动不仅可以将驱动编译到内核中,还可以动态的编译内核驱动。本文档介绍如何以模块的方式编译内核驱动。
要动态的编译内核,首先需要将内核源码编译通过,内核的编译请参考使用手册第五章。 |
|
相关推荐
3个回答
|
|
内核编译器的查询和环境变量设置
在开发中,大家会遇到源码和编译器集成到一起的情况。迅为的 4418 源码和 arm 编译器就是集成到一起的,本节主要介绍如何找到编译器路径和配置环境变量。 进入 android 源码目录(这个目录是作者的,用户如果解压目录不一样,请注意后面的Makefile 文件以及环境变量参数也要修改)。 如下图所示,使用命令“cd kernel”。 使用命令“cp -r config_for_iTOP4418_android_RTL8211 .config”配置内核缺省文件,然后使用命令“export ARCH=arm”将平台设置为 ARM。 最后使用命令“make menuconfig”。 如下图所示,内核配置界面。 进入“ General setup ---》 ”,如下图所示。下图红色方框中的“arm-eabi-”就是我们需要的信息,内核使用的编译器是“arm-eabi-”。 退出 menuconfig 界面,使用命令“cd 。./”返回到 android 目录下,接着使用命令“find 。/ -name *arm-eabi-*”查找源码中自带的编译器在那个目录下。 如上图所示,我们找到内核使用的编译器在“prebuilts/gcc/linux-x86/arm/arm-eabi-4.7/bin”目录下。大家可能很奇怪,为什么 arm 编译器要放到“prebuilts/gcc/linux-x86/”目录下,可能是三星工作人员懒得再建文件夹了吧。另外有 4.6 和 4.7 两个版本,我们 直接用高版本就成。 那么编译器完整的路径为“/home/4418/android/prebuilts/gcc/linux-x86/arm/arm-eabi-4.7/bin/”。 使用命令“cd”命令,接着使用命令“vim .bashrc”打开环境变量文件,如下图所示。 在接着按键 Shift+g,进入环境变量文本的最底行,如下图所示。 如下所示,作者以前的编译器使用的是 arm-2009,作者这里需要注释掉。用户如果前没有设置过,则这一步可以忽略。 接着添加 4418 的编译器环境变量,export PATH=$PATH:/home/4418/android/prebuilts/gcc/linux-x86/arm/arm-eabi-4.7/bin/ 如下图所示。 保存退出,使用命令“source .bashrc”更新环境变量。控制台输入“arm”,然后按Tab 键,如下图所示。如果不出现如下界面或者仍然出现原来的编译器,可以关掉这个控制台,再开一下。 到这一步编译器和环境变量就介绍完了。 |
|
|
|
Makefile 和测试驱动源码以及编译
2.1Makefile Makefile 脚本文件: export ARCH=arm obj-m += iTOP4418_driver_hello.o KDIR := /home/4418/android/kernel PWD = $(shell pwd) all: make -C $(KDIR) M=$(PWD) modules clean: rm -rf *.o 脚本中,export ARCH=arm 表示设置目标 CPU 类别为 arm,也就是编译的依赖内核和驱动模块目标 CPU 为 ARM。 obj-m += iTOP4418_driver_hello.o 表示编译的源文件为 iTOP4418_driver_hello.c, 如果源文件名有变化,则需要修改成对应的。 KDIR 参数指向对应的内核源码目录。作者的内核源码是在 /home/4418/android/kernel 目录下,用户要根据自己的具体情况来修改。 2.2 简单驱动源码 驱动文件名称为:iTOP4418_driver_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 编译 如下图所示,将源码拷贝到 Ubuntu 系统下。 使用命令“make”,如下图所示,可以看到有“iTOP4418_driver_hello.ko”文件生成。 |
|
|
|
常见问题
在以模块的方式编译驱动的过程中,新手可能会以下问题。 1.内核源码没有编译或者内核源码路径设置不正确。 如果内核源码没有编译,那么模块将会提示缺少库之类的错误;如果路径设置不正确,会提示找不到内核。 2.编译器未设置正确。 会提示找不到 arm-gcc 库之类的错误,请仔细检查编译器路径,确定在控制台输入arm+Tab 之后可以出现 arm-eabi 编译器。 另外部分用户可能尝试使用其它的编译器,例如 arm-2009q3,之类的,理论上很多编译器也是可以编译通过,但是不建议这么做,驱动最好和内核使用同一个编译器。 3.源码和 Makefile 文件在 Windows 下编写,然后拷贝到 Ubuntu 上,由于编辑器不同导致转码错误。 这种错误比较容易解决,Make 编译之后,系统会提示 Makefile 或者驱动文件具体某一行出现问题。使用 vim 编辑器打开查看一下,就能找出一些乱码,使用 vim 编辑器修正一下再编译即可。 |
|
|
|
只有小组成员才能发言,加入小组>>
705 浏览 0 评论
1114 浏览 1 评论
2491 浏览 5 评论
2826 浏览 9 评论
移植了freeRTOS到STMf103之后显示没有定义的原因?
2671 浏览 6 评论
使用eim外接fpga可是端口一点反应都没有有没有大哥指点一下啊
659浏览 9评论
667浏览 7评论
请教大神怎样去解决iMX6Q在linux3.0.35内核上做AP失败的问题呢
789浏览 6评论
634浏览 5评论
678浏览 5评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-25 11:20 , Processed in 1.030812 second(s), Total 54, Slave 44 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号