最近负责 Android 驱动的GPS部分,所谓Android驱动 我觉得可以说成是linux应用
之前发了一个图描述了 Android GPS 架构
GPS芯片大多采用串口通信,所以只要CPU能够提供一个UART 驱动, 那么跟GPS芯片通信是没有问题的,
但是现在很多GPS功能不是一个单独的芯片,大部分都是一个芯片上有好几种无线模块 比如 Blletooth WiFi FM等
有时候 有些功能就会去复用一个UART,这样在管理上就相对麻烦, 要将一个UART驱动, 模拟成一个HCI的接口而后才能使GPS功能(TI1281)
比较好的是我们的项目是单一的GPS chip 听说apple也是用的这一款,不过人家拿的是全部的source code,而我们只有部分的code而没有核心算法的code 很郁闷, 但是即便是只有部分code从里边还是可以学到很多的机制
对于android GPS驱动来说主要的工作是实现HAL层 计编译生成一个叫做gps.***.so的动态库的 代码.
由app发出定位申请,此时会去启动一个定位服务线程,此线程会调用到Location provider 服务在App Framwork中,在次会通过被native方法调用到JNI中,JNI获得GpsInterface并传给接口一个回调函数的实现。
GpsInterface就是由HAL层最主要实现
介绍下gps.h下得重要相关结构题定义
在android2.3中gps.h定义在/hardware/inclue/hardware下
主要的结构
1、相关宏定义:
/** Requested operational mode for GPS operation. */
typedef uint32_t GpsPositionMode;
// IMPORTANT: Note that the following values must match
// constants in GpsLocationProvider.java.
/** Mode for running GPS standalone (no assistance). */
#define GPS_POSITION_MODE_STANDALONE 0 //纯GPS 使用卫星定位
/** AGPS MS-Based mode. */
#define GPS_POSITION_MODE_MS_BASED 1 //基于用户终端的A-GPS
/** AGPS MS-Assisted mode. */
#define GPS_POSITION_MODE_MS_ASSISTED 2 //基于用户终端辅助A-GPS
工作模式
/** Requested recurrence mode for GPS operation. */
typedef uint32_t GpsPositionRecurrence;
// IMPORTANT: Note that the following values must match
// constants in GpsLocationProvider.java.
/** Receive GPS fixes on a recurring basis at a specified period. */
#define GPS_POSITION_RECURRENCE_PERIODIC 0//周期性的
/** Request a single shot GPS fix. */
#define GPS_POSITION_RECURRENCE_SINGLE 1//单次工作
辅助数据(在测试GPS性能时候又是需要删除全部或部分的辅助数据)
/** Flags used to specify which aiding data to delete
when calling delete_aiding_data(). */
typedef uint16_t GpsAidingData;
// IMPORTANT: Note that the following values must match
// constants in GpsLocationProvider.java.
#define GPS_DELETE_EPHEMERIS 0x0001
#define GPS_DELETE_ALMANAC 0x0002
#define GPS_DELETE_POSITION 0x0004
#define GPS_DELETE_TIME 0x0008
#define GPS_DELETE_IONO 0x0010
#define GPS_DELETE_UTC 0x0020
#define GPS_DELETE_HEALTH 0x0040
#define GPS_DELETE_SVDIR 0x0080
#define GPS_DELETE_SVSTEER 0x0100
#define GPS_DELETE_SADATA 0x0200
#define GPS_DELETE_RTI 0x0400
#define GPS_DELETE_CELLDB_INFO 0x8000
#define GPS_DELETE_ALL 0xFFFF
gps芯片可以处理的“能力”