ARM Linux驱动
就自己在学习驱动过程中的一些错误和解决办法的记录:
我的操作环境是虚拟机 Ubuntu 10.10 。 测试内核 2.6.28 和 2.6.34
今天就只写菜鸟最简单的:如何在make menuconfig 后能添加自己的驱动模块。网上Linux驱动学习的帖子都太多了,但是写给菜鸟的很少。而我自己在写完成make menuconfig时也入到了不少的错误。现在将自己的错误记录如下,只为帮助后来者。
1、修改顶层Makefile时出现的错误
在设置cpu类型,修改交叉编译器路径的时候修改为
ARCH ?= arm
CROSS_COMPILE ?= /usr/local/arm/4.2.2-eabi/usr/bin/arm-linux-
时,进行make menuconfig 测试的时候在 这一行报错,报错提示arm不能为一个目录
出现原因和解决办法:在这里极有可能是因为你在 ?= arm 的最后面有一个空格,删掉空格就可以正常编译
这个错误一般很难发现。
2、添加 ledtest 驱动模块到make menuconfig 菜单
在这一步我出现错误是 那网上的添加方法添加好了,make menuconfig 后并没有出现我添加的 ledtest 的驱动模块选项。最后我发现了其中的错误,网上的其他帖子并未提及。
首先: 我先来描述一下我最开始尝试的方法,
1)、在drivers下添加自己的驱动模块文件目录, 我自己用的是 ledtest 。然后将你写的驱动 ledtest.c拷贝到这个目录下,在这个目录下
vi Makefile 然后添加内容为 obj-$(CONFIG_LEDTEST) += ledtest.o
然后 vi Kconfig 添加内容为
menu MENU_LEDTEST
config LEDTEST
tristate "Ledtest"
---help---
This is ARM Ledtest driver file
endmenu
2)、返回上一级 drivers 目录修改目录下的Makefile 和 Kconfig
在 Makefile 的文件末尾加上: obj-$(CONFIG_LEDTEST) += ledtest/ (注意其名称的依赖关系)
在 Kconfig 的倒数第二行,也就是 endmenu 的前一行加上:
source "drivers/ledtest/Kconfig" (注意其名称的依赖关系)
做到这里我就开始 make menuconfig 了,但是 make 后的菜单Drivers下没有自己要的MENU_LEDTSET 目录选项。
而这里可能大多数的人已经得到了他们自己想看到的测试模块选项了,但有的用这种方法没有的预期结果。
如果你是那个没有得到结果的人,那么继续下一步:
3)、修改 arch/arm/Kconfig 文件 在 menu "Device Drives" 和 endmenu 之间加上
source “drivers/ledtest/Kconfig” 然后make menuconfig 后,在Device Drives 下就能出现MENU_LEDTEST选项
所以我就是那个没有得到结果的人,但是我最后找到问题之所以出的原因和解决办法,我还是觉得这个路绕的值。在这里的原理,我总结如下:
在前两步,得到预期结果的人,所使用的内核可能是新版内核,或已经打过补丁的内核。
要完成 低三步才能得到结果的人,所使用的内核可能是旧版内核,并且没有打过补丁,我开始用的内核就是。
在新版内核 arch/arm/Kconfig 的文件中 没有menu "Device Drives" ,,,,,,,,,,,,,,,,endmenu 这些文件。而仅仅是只用添加了source “drivers/Kconfig” 这一项。自己的理解是: 在新版内核arch/arm/Kconfig 没有完成对应驱动的加载任务,而是加他交给下层 drivers/Kconfig 来完成。 所以新版内核不需要进行第三步就能得到结构,而旧版不行。