Android HAL hardware module分析 以GPS module为例
(2012-01-10 22:38)
准备在QT210的android系统中实现GPS功能,程序已经写好了,也可以编译出gps.s5pc110.so的库,但是不知道上层怎么调用这个库,在GPS相关的Android.mk中也没有找到,很是纳闷。通过分析hardware module才知道是怎么回事,之前并没有详细的了解hardware module,现在简单的分析一下。 HAL层的hardware module主要实现文件为: hardware/libhardware/hareware.c hardware/libhardware/include/hardware/hardware.h 重要的结构体:
表示一个硬件设备,存储了各种硬件设备的公共属性和方法
描述一个硬件模块
定义了操作设备的方法,只有一个open函数 hareware.c分析:
下面这个用于搜索不同的库文件名:
库的名称要根据实际的product或board指定 在210平台GPS模块库的文件名可以为: gps.s5pc110.so gps.ARMV7.so gps.default.so hw_get_module函数作用是在系统中查找模块的库文件 根据硬件模块的id参数和指定的查找路径,配合product,board等变量,最终指定到一个so库文件
---------------------------------------------------------------------------------
创建GPS modules分析: 下面这段话很重要,说明了如何构建一个模块
可以说这是andorid中标准的构建模块的写法
通过分析hw_get_module函数我们知道,id是用来指定模块库文件名的,给GPS_HARDWARE_MODULE_ID赋值 #define GPS_HARDWARE_MODULE_ID "gps" 实际上GPS_HARDWARE_MODULE_ID并不是在代码中这样定义的,可能是在某个编译脚本里,我暂时还没找到 指定methods:
只有一个open_gps函数,当模块加载时就会执行open_gps:
每个硬件设备都应该有一个类似xxxx_device_t的结构体,里面包含了hw_device_t gps的设备结构体定义如下:
在open函数中给这个模块所包含的hw_device_t赋值 get_gps_interface函数用来得到GPS的操作接口
接下来,程序的主体部分就是实现_GpsInterface里面所定义的所有操作 HAL层的模块是由具体的上一层JNI来调用,关于怎么调用的,下一篇分析GPS module时再说,我也不是很清楚,再整理一下 |
|