Android 驱动程序实例分析总结 本节通过一个简单的Android 驱动程序实例,来总结Android 驱动程序的写法,从底层往上层,包括Kernel 层驱动、HAL 层、JNI 层、Framework 层以及 Application 层,各层的实现方法。首先从Kernel 内核驱动开始。 一、 Android 系统中 Kernel 内核层驱动实现 Android 系统中,Kerinel 内核层的驱动写法与 Linux系统中驱动的写法大体一致,下面是实现一个简单的字符设备驱动的步骤: 1、在内核源码目录下的drivers/char 目录下,新建一个文件 s3c6410_leds.c; 2、向 s3c6410_leds.c 文件中添加代码,首先是包含相应的头文件(可以参考类似字符设备驱动代码中所包含的头文件来包含),然后定义一个file_operations 结构体,给相应的成员变量(函数)赋值(如:owner 赋值为 THIS_MODULE、unlocked_ioctl 赋值为具体的ioctl 函数),再定义一个miscdevice 结构体(杂项字符设备,其主设备号固定为 10),给相应的成员变量(函数)赋值(如次设备号 minor、设备名称 name、fops赋值为上述定义的file_operation 结构体); 3、实现上述 file_operation 结构体中被赋值的相关函数,如被赋值为 unclock_ioctl 的函数s3c6410_leds_ioctl()函数,在这些函数中,实现具体的硬件操作; 4、实现驱动入口和出口函数,在入口函数中,利用 misc_register()函数向系统注册 misc设备,在出口函数中,使用 misc_deregister()函数向系统注销 misc 设备,并用module_init()和 module_exit()来指定驱动入口和出口函数。 具体代码及注释如下: 5、修改当前目录(/drivers/char/)下的 Kconfig 文件和 Makefile 文件,Kconfig 文件用于配置编译内核前执行 make menuconfig 命令后显示的内核配置界面中的选项,Makefile根据内核配置情况来编译内核。 Kconfig 文件中增加的相应内容如下: 上述 tristate 表示模块可以编译进内核、以模块方式动态加载、不编译,一般选择编译到内核中或者不编译到内核,如果要支持动态加载模块选项,必须要在内核配置菜单中选择 Enable loadable module support 选项;在支持动态卸载模块选项,必须要在 Enable loadable module support 菜单项中,选择 Module unloading 选项。 Makefile 文件中增加的相应内容如下: Kernel 层编译后(模块编译方法:终端中,在内核源码根目录下执行 make SUBDIR=drivers/char modules),...