将自己的驱动编译进内核

最近在学习android驱动开发,主要是参考李宁老师的《Android深度探索——HAL与驱动开发》。李宁老师讲的很好,按照书中的叙述,基本都能够跟着做下来,学到了很多。但是在第一个驱动程序—统计单词个数—中,在将word_count驱动编译进入内核实现自动加载的时候遇到了问题,经过思考找到了自己的解决方案,在此记录一下。

声明:可能是我的某些步骤有错,所以没能够按照书的步骤走下去,希望大牛指点。

首先是问题的情况:

按照书中所说

1、将word_count.c文件放到/drivers/char目录中。

2、修改Kconfig文件


  打开/drivers/char/Kconfig文件,找到endmenu,并在endmenu前面添加如下代码。

config WORD_COUNT

  bool "word_count driver"

  help

  This is a word count driver. It can get a word count from /dev/wordcount

3、修改Makefile文件


  打开/drivers/char/Makefile文件。找个位置添加如下内容

obj-$(CONFIG_WORD_COUNT)      += word_count.o


4、设置.config文件


 .config通过make menuconfig命令在菜单中配置。进入Linux内核顶层目录()。然后执行make menuconfig命令显示配置菜单,并进入“Device Drivers”>“Character devices”子菜单,找到“word_count_driver”菜单项,按空格键将“word_count_driver”菜单项前设置成星号(*)。然后退出配置界面并保存所做的修改。


5、编译Linux内核


  进入目录,执行下面的命令编译Linux内核。
  

# make


然后用模拟器加载刚才生成的内核(4.1是我的虚拟机的名字)

emulator -avd 4.1 -kernel /arch/arm/boot/zImage

说是可以通过adb shell在/dev下面看到wordcount这个设备。

我照着这个做的没有提示什么问题,但是在模拟器的/dev下面死活看不到wordcount这个设备。试了好多方法,比如修改文件名称啊,make clean 然后重新编译啊,还是没有解决。

突然看到/drivers这个目录下面有char还有个misc,想起来编写word_count.c,在设备注册的时候有是用的下面一句话

ret=misc_register(&misc);


也就是说注册是时候wrodcount这个驱动是按照misc设备注册的,是不是应该将word_count.c放到/drivers/misc下面来做上面的操作。

于是把以上的步骤类比放到/drivers/misc目录下面来做。如下

1、将word_count.c文件放到/drivers/misc目录中。

2、修改/drivers/misc/Kconfig文件。

3、修改/drivers/misc/Makefile文件。

4、在,运行

make menuconfig


进入“Device Drivers”>“Misc devices”子菜单,找到“word_count_driver”菜单项,按空格键将“word_count_driver”菜单项前设置成星号(*),退出并保存。

5、进入目录,编译Linux内核。

编译完成,加载到虚拟机,进入/dev下就可一看到wordcount这个设备了。

要是执行书中之前叙述的用原生C和用NDK以及直接用java代码操作设备文件对wordcount进行测试,需要修改下wordcount的权限为777

root@android:/dev # chmod 777 wordcount


或者

# adb shell  chmod 777  /dev/wordcount


然后可以看到测试成功。





你可能感兴趣的:(android内核)