一、Android 内核源码下载以及内核源码的编译
参考博文如何下载并编译Android4.0内核源码goldfish(图文)
按照官网上的步骤编译内核和android源码即可。
注意:如果配置android4.0内核源码使用以下命令(不要执行make goldfish_defconfig),否则模拟器虽然可以打开,但是进不了android启动画面
make goldfish_armv7_defconfig make
注意:如果要以模块的形式加载自己编写的驱动,需要配置执行
make menuconfig
配置内核,将enable loadable module suppot选项选上。否则编译驱动模块时会以下出错:
/root/workspace/androidsrc/packages/apps/android_test/driver/globalfifo/globalfifo.mod.c:8: error: variable '__this_module' has initializer but incomplete type /root/workspace/androidsrc/packages/apps/android_test/driver/globalfifo/globalfifo.mod.c:9: error: unknown field 'name' specified in initializer /root/workspace/androidsrc/packages/apps/android_test/driver/globalfifo/globalfifo.mod.c:9: warning: excess elements in struct initializer /root/workspace/androidsrc/packages/apps/android_test/driver/globalfifo/globalfifo.mod.c:9: warning: (near initialization for '__this_module') /root/workspace/androidsrc/packages/apps/android_test/driver/globalfifo/globalfifo.mod.c:10: error: unknown field 'init' specified in initializer /root/workspace/androidsrc/packages/apps/android_test/driver/globalfifo/globalfifo.mod.c:10: warning: excess elements in struct initializer /root/workspace/androidsrc/packages/apps/android_test/driver/globalfifo/globalfifo.mod.c:10: warning: (near initialization for '__this_module') /root/workspace/androidsrc/packages/apps/android_test/driver/globalfifo/globalfifo.mod.c:14: error: unknown field 'arch' specified in initializer /root/workspace/androidsrc/packages/apps/android_test/driver/globalfifo/globalfifo.mod.c:14: error: 'MODULE_ARCH_INIT' undeclared here (not in a function) /root/workspace/androidsrc/packages/apps/android_test/driver/globalfifo/globalfifo.mod.c:14: warning: excess elements in struct initializer /root/workspace/androidsrc/packages/apps/android_test/driver/globalfifo/globalfifo.mod.c:14: warning: (near initialization for '__this_module')
编译完内核以及android源码后就可以执行以下命令启动模拟器
emulator -kernel ../kernel/goldfish/arch/arm/boot/zImage -sysdir out/debug/target/product/generic/ -system system.img -data userdata.img &
-kernel选项是内核路径, -sysdir选项是android源码编译输出目录
二、驱动编写
1、代码的编写,详见Linux globalfifo 驱动程序和测试程序;
注意:驱动程序需要支持自动创建设备文件的功能,即在模块加载的时候调用class_create和device_create两个函数创建设备文件节点,在模块卸载的时候调用相应的函数删除文件节点。
2、设备模块的编译
(1)、将设备驱动文件所在目录链接到kernel目录中driver目录下,执行以下命令:
ln -s /root/workspace/androidsrc/packages/apps/android_test/driver/globalfifo/ /root/workspace/kernel/goldfish/drivers/
(2)、在设备驱动文件所在目录添加两个文件:Kconfig和Makefile,内容分别如下:
config GLOBALFIFO tristate "Global Fifo Driver" default n help This is a android test deriver.
Makefile中的文件内容:
obj-$(CONFIG_GLOBALFIFO)+= globalfifo.o
(3)、在arch/arm/Kconfig和drivers/kconfig这两个文件中的menu "Device Drivers"和endmenu之间添加
source "drivers/globalfifo/Kconfig"
这样在make menuconfig中就配置globalfifo驱动了;
(4)、在driver目录下的Makefile文件中添加;
obj-$(CONFIG_GLOBALFIFO) += globalfifo/
3、重新配置内核,然后在make menuconfig中选中globalfifo就可以了:
make goldfish_armv7_defconfig make menuconfig make
这样就把驱动编译进内核了。
4、启动emulator测试以下,emulator指定内核文件,命令以及选项如下:
emulator -partition-size 512 -kernel ../kernel/goldfish/arch/arm/boot/zImage -sdcard sdcard.img -sysdir out/debug/target/product/generic/ -system system.img -data userdata.img &
5、进入adb shell,测试输入输出如下:
root@ubuntu:~/workspace/androidsrc# adb shell * daemon not running. starting it now on port 5037 * * daemon started successfully * # ls /dev/globalfifo /dev/globalfifo # echo "hello world" >>/dev/globalfifo # cat /dev/globalfifo hello world