HAL introdution:
HAL(hardware abstraction layer)存在的目的在与让android framework与linux device driver分离开来.上层应用通过Dalvik VM与core services【runtime】(如sensor service,camera service等)来加载动态库文件(*.so),这里的so文件指的是HAL的实现,core service通过JNI接口调用HAL层提供的接口,这样就实现了android 应用程序对硬件的操作。
在Android源码中,HAL的主要实现位于hardware/目录下,老的实现版本和新的实现版本并存,老的HAL实现是通过JNI层直接加载动态链接库的方式,如下图所示:
新的HAL实现仍然是以加载动态链接库的方式来与linux device driver通信,不过libhardware屏蔽了具体的加载细节,每种应用以HAL stub的概念呈现给JNI层,一个HAL stub编译成一个动态链接库文件,结构如下图所示:
移植一个新的HAL实现需要开发人员编写HAL module(stub),上层应用通过libhardware获取HAL module的一系列回调函数(callback ops),这一系列回调函数直接与底层的linux device driver通信(一般是通过读写设备文件来实现的)。
目前,HAL对上层还不能完全做到与硬件无关,往往厂家添加自己的硬件设备需要改动相应的runtime(service)实现,android手机一般情况下需要的实现的HAL功能有:
- Camera
- GPS
- RIL
- WLAN
- BlueTooth
- Sensor
- vibrator等
GPS的HAL 实现:
在这里探讨的GPS HAL实例采用的是老的HAL实现方式,主要的实现代码位置:
- frameworks/base/location/* (client)
- frameworks/base/core/jni/android_location_GpsLocationProvider.cpp (JNI )
- frameworks/base/services/java/com/android/serverLocationManagerService.java(service)
- hardware/libhardware_legacy/gps/* (HAL)
首先介绍几个重要的数据结构:
/** Callback with location information. */ typedef void (* gps_location_callback)(GpsLocation* location);
/** Callback with status information. */ typedef void (* gps_status_callback)(GpsStatus* status);
/** Callback with SV status information. */ typedef void (* gps_sv_status_callback)(GpsSvStatus* sv_info);
/** GPS callback structure. */
typedef struct { gps_location_callback location_cb; gps_status_callback status_cb; gps_sv_status_callback sv_status_cb; } GpsCallbacks;
/*GPS 接口*/ typedef struct { /** * Opens the interface and provides the callback routines * to the implemenation of this interface. */ int (*init)( GpsCallbacks* callbacks );
/** Starts navigating. */ int (*start)( void );
/** Stops navigating. */ int (*stop)( void );
/** Closes the interface. */ void (*cleanup)( void );
/** Injects the current time. */ int (*inject_time)(GpsUtcTime time, int64_t timeReference, int uncertainty);
/** Injects current location from another location provider * (typically cell ID). * latitude and longitude are measured in degrees * expected accuracy is measured in meters */ int (*inject_location)(double latitude, double longitude, float accuracy);
/** * Specifies that the next call to start will not use the * information defined in the flags. GPS_DELETE_ALL is passed for * a cold start. */ void (*delete_aiding_data)(GpsAidingData flags);
/** * fix_frequency represents the time between fixes in seconds. * Set fix_frequency to zero for a single-shot fix. */ int (*set_position_mode)(GpsPositionMode mode, int fix_frequency);
/** Get a pointer to extension information. */ const void* (*get_extension)(const char* name); } GpsInterface;
|
GPS 的HAL 实现主要工作就是填充一个GpsInterface结构,android应用启动LOCATION_SERVICE时,将检测系统是否支持GPS应用,若支持GPS,则在JNI层初始化GPS设备时将返回一个GpsInterface结构,然后通过JNI层的回调函数将GPS信息发送给framework层,调用过程如下所示:
在GpsInterface->Start后,启用读线程通过epoll检测GPS设备文件的状态,若受到数据则读取NEMA数据,将数据解析后,根据解析后的数据填充GpsStatus,GpsLocation和GpsSvInfo结构,然后调用相应的JNI层在Init时传进来的回调函数,service部分的代码将自动更新GPS信息。
阅读(2497) | 评论(0) | 转发(1) |