开发工作中,经常需要添加一些新的驱动,但是有时候不想自己写Makefile,或者是驱动需要编译到内核里,那我们该如何才能把驱动加到BSP里面,只需按照原来的编译步骤就能得到想要的ko文件,或者直接编译到uImage呢?一个新驱动添加大概需要以下三个步骤:
一,编写你的驱动文件,就是new_driver.c,并将其放到你想放的目录下,比如drivers/misc/ 。
二,修改drivers/misc/Makefile,其格式,打开便知,如下:
1 obj-$(CONFIG_PLAT_NOMADIK) += gpio-nomadik.o 2 obj-$(CONFIG_GPIO_RDC321X) += rdc321x-gpio.o 3 obj-$(CONFIG_GPIO_JANZ_TTL) += janz-ttl.o 4 obj-$(CONFIG_GPIO_SX150X) += sx150x.o 5 obj-$(CONFIG_GPIO_VX855) += vx855_gpio.o 6 obj-$(CONFIG_GPIO_ML_IOH) += ml_ioh_gpio.o 7 obj-$(CONFIG_DA9052_GPIO_ENABLE)+= da9052-gpio.o 8 obj-$(CONFIG_AB8500_GPIO) += ab8500-gpio.o 9 obj-$(CONFIG_GPIO_TPS65910) += tps65910-gpio.o 10 obj-$(CONFIG_NEW_DRIVER) += new_driver.o
第十行就是需要自己添加的,那这个CONFIG_NEW_DRIVER在哪里体现呢?看下一步。
三,修改drivers/misc/Kconfig。这个文件是在make menuconfig时候会体现出来,或者如果做了些默认的配置,那么直接make就能实现编译。如下:
1 config NEW_DRIVER 2 tristate "new driver" 3 default m 4 help 5 some new driver‘s information。 6 7 8 config DEBUG_GPIO 9 bool "Debug GPIO calls" 10 depends on DEBUG_KERNEL 11 help 12 Say Y here to add some extra checks and diagnostics to GPIO calls. 13 These checks help ensure that GPIOs have been properly initialized 14 before they are used, and that sleeping calls are not made from 15 non-sleeping contexts. They can make bitbanged serial protocols 16 slower. The diagnostics help catch the type of setup errors 17 that are most common when setting up new platforms or boards.
简单解释一下,tristate 是一个三态,可以被编译成内核,模块或不编译。这里的default m。就是默认情况下编译成模块。在make menuconfig上的提醒是<>new driver. <>可以选y,n,m.
上面代码的第9行,不是tristate,而是bool。那在menuconfig里就不是<>.而是[].只能选Y和N。就是编译进内核还是不编译。
depends on是依赖关系,就是如果DEBUG_KERNEL选中或者说是有效,才出现DEBUG_GPIO这一选项。
help就是一些帮助或描述信息。可以自己随便瞎写。
ok,目前为止就可以将你的新驱动加载进去了。如果你想确认,配置好后,可以打开linux目录下的.config文件,这个是终极文件。看看是否CONFIG_NEW_DRIVER被定义成y还是m,还是找不到。
编译tips:make menuconfig 或指定架构 make ARCH=arm menuconfig,是一个文字图形界面,可以根据要求配置。
make uImage直接编内核。
make modules。编译模块。就是配置成m的,被编译成ko文件。(那天错写成module,还以为命令不对)
参考:
http://lhsblog01.blog.163.com/blog/static/102004519201022110295858/
http://www.cnblogs.com/taomaomao/archive/2012/01/05/2312816.html
谢谢!