一、
1、实现内核驱动程序模块
驱动程序freg的目录结构如下:
~/android-2.3_r1/kernel/goldfish
----drivers
----freg
----freg.h
----freg.c
----Kconfig
----Makefile
freg.h和freg.c请参考Linux字符设备驱动http://blog.csdn.net/jltxgcy/article/details/29184391。
Kconfig如下:
config FREG tristate "Fake Register Driver" default n help This is the freg driver for android system.在编译驱动程序freg之前,我们可以通过执行make memuconfig命令来设置这些编译选项,以便可以指定驱动程序freg的编译方式。驱动程序freg可以以三种方式来编译。第一种方式是直接内建在内核中;第二种方式是编译成内核模块;第三种方式是不编译到内核中。
这个文件定义了驱动程序freg的编译选项。
tristate定义了make menuconfig时弹出界面,配置freg编译选项的名字。
default n表示默认不编译到内核中。
Makefile如下:
obj-$(CONFIG_FREG) += freg.o其中$(CONFIG_FREG)是一个变量,它的值与驱动程序freg的编译选项有关。如果选择将驱动程序freg内建到内核中,那么变量$(CONFIG_FREG)的值为y;如果选择以模块的方式来编译驱动程序freg,那么变量$(CONFIG_FREG)的值为m;如果变量$(CONFIG_FREG)的值既不为y,也不为m,那么驱动程序freg就不会被编译。
2、修改内核Kconfig
打开arch/arm/Kconfig,找到以下两行内容:
menu "Device Drivers" ...... endmenu
在这两行之间添加下面一行内容,将驱动程序freg的Kconfig文件包含进来。
menu "Device Drivers" source "drivers/freg/Kconfig" ...... endmenu
3、修改内核Makefile文件
在drivers/Makefile,里面添加以下一行内容:
obj-$(CONFIG_FREG)+= freg/
4、编译内核驱动程序模块
首先执行三句命令:
export ANDROID_PRODUCT_OUT=~/android-2.3_r1/out/target/product/generic 有了这个声明emulator 不用加入那三个img文件 export PATH=$PATH:~/android-2.3_r1/out/host/linux-x86/bin/ emulator命令所在位置 export PATH=$PATH:~/android-2.3_r1/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin 编译内核时使用然后执行:
弹出下面的界面:
Enable loadable module support前面的[ ],可以按Y(会显示*)或者N(什么都不显示),Y代表内核可以支持动态加载模块,N代表内核不支持动态加载模块。
如果按了Y,那么进入Enable loadable module support后,在子选项"Module unloading",同理按Y,表示支持动态卸载模块。
只有按了Y,在弹出来的第一个配置页面中用上下箭头键选择“Device Drivers”项,接着在弹出的第二个配置界面中继续用上下箭头键选择“Fake Register Driver”项,按Y或者M键,就可以看到奥选项前面方括号的字符变成"*"或者“M”符号,它们分别表示将驱动程序freg编译到内核中或者以模块的方式编译。
最后执行:
编译得到的内核镜像文件zImage保存在arch/arm/boot目录下。
二、
1、开发C可执行程序验证Android硬件驱动程序
~/android-2.3_r1/kernel/goldfish
----external
----freg
----freg.c
----Android.mk
freg.c请参考Linux字符设备驱动http://blog.csdn.net/jltxgcy/article/details/29184391。
Android.mk
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE_TAGS := optional LOCAL_MODULE := freg LOCAL_SRC_FILES := $(call all-subdir-c-files) include $(BUILD_EXECUTABLE)include $(BUILD_EXECUTABLE),表示当前要编译的是一个可执行应用程序模块。
2、编译C可执行文件
首先执行以下命令:
编译成功后,就可以在out/target/product/gerneric/system/bin目录下看到一个freg文件。
然后打包:
在out/target/product/gerneri目录下会生成Android系统镜像文件system.img。
3、启动模拟器,验证正确性。
然后adb shell。
说明我们驱动程序编译正确。