基于Android 的GPS 移植(主要结构体及接口介绍)

(http://blog.csdn.net/jwq2011/article/details/55268781)

最近负责 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芯片可以处理的“能力”
    /** Flags for the gps_set_capabilities callback. */

    /** GPS HAL schedules fixes for GPS_POSITION_RECURRENCE_PERIODIC mode.
        If this is not set, then the framework will use 1000ms for min_interval
        and will start and call start() and stop() to schedule the GPS.
     */

    #define GPS_CAPABILITY_SCHEDULING       0x0000001/** GPS supports MS-Based AGPS mode */
    #define GPS_CAPABILITY_MSB              0x0000002/** GPS supports MS-Assisted AGPS mode */
    #define GPS_CAPABILITY_MSA              0x0000004/** GPS supports single-shot fixes */
    #define GPS_CAPABILITY_SINGLE_SHOT      0x0000008

  • 还有很多的定义此处不一一列举 在gps.h中都有很好的解释。

2、数据结构体

  • GpsLocation   
    定义了一个表示方位的结构体,成员有经纬度,高度,速度,方位角等。
  • GpsStatus
    表示GPS的当前状态,只有两个成员一个是表示结构大小的成员,与一个表示Gps状态的类型GpsStatusValue
    /** GPS status event values. */
    typedef uint16_t GpsStatusValue;
    // IMPORTANT: Note that the following values must match
    // constants in GpsLocationProvider.java.
    /** GPS status unknown. */
    #define GPS_STATUS_NONE             0/** GPS has begun navigating. */
    #define GPS_STATUS_SESSION_BEGIN    1/** GPS has stopped navigating. */
    #define GPS_STATUS_SESSION_END      2/** GPS has powered on but is not navigating. */
    #define GPS_STATUS_ENGINE_ON        3/** GPS is powered off. */
    #define GPS_STATUS_ENGINE_OFF       4

  • GpsSvInfo
    表示当前的卫星信息,有卫星编号,信号强度,卫星仰望角方位角等
  • GpsSvStatus
    表示卫星状态,包含了GpsSvInfo结构,可见卫星数,星历时间,年历时间,与用来定位的卫星的卫星构成的一个掩码
  • AGpsRefLocation
    /* 2G and 3G */
    /* In 3G lac is discarded */
    typedef struct {
        uint16_t type;
        uint16_t mcc;
        uint16_t mnc;
        uint16_t lac;
        uint32_t cid;
    } AGpsRefLocationCellID;

    typedef struct {
        uint8_t mac[6];
    } AGpsRefLocationMac;

    /** Represents ref locations */
    typedef struct {
        uint16_t type;
        union {
            AGpsRefLocationCellID   cellID;
            AGpsRefLocationMac      mac;
        } u;
    } AGpsRefLocation;
    /** Represents the status of AGPS. */
    typedef struct {
        /** set to sizeof(AGpsStatus) */
        size_t          size;


        AGpsType        type;
        AGpsStatusValue status;
    } AGpsStatus

3、回调函数指针定义

/* Callback with location information. 告知上层位置信息*/
typedef void (* gps_location_callback)(GpsLocation* location);

/** Callback with status information.GPS状态信息回调*/
typedef void (* gps_status_callback)(GpsStatus* status);

/** Callback with SV status information.卫星状态信息回调 */
typedef void (* gps_sv_status_callback)(GpsSvStatus* sv_info);

/** Callback for reporting NMEA sentences. 向上层传递NEMA数据*/
typedef void (* gps_nmea_callback)(GpsUtcTime timestamp, const char* nmea, int length);

/** Callback to inform framework of the GPS engine's capabilities.告知上层次GPS能实现那些功能 */
typedef void (* gps_set_capabilities)(uint32_t capabilities);

/** Callback utility for acquiring the GPS wakelock.gps上锁 让gps功能不会被suspend*/
typedef void (* gps_acquire_wakelock)();

/** Callback utility for releasing the GPS wakelock. 释放锁*/
typedef void (* gps_release_wakelock)();

/** Callback for creating a thread that can call into the Java framework code.thread create 
在次线程处理函数中通常会由一个无限的循环,去等待上层的请求,并应答*/

typedef pthread_t (* gps_create_thread)(const char* name, void (*start)(void *), void* arg);

4、接口结构体

  • GpsCallbacks
    typedef struct {
        /** set to sizeof(GpsCallbacks) */
        size_t      size;
        gps_location_callback location_cb;
        gps_status_callback status_cb;
        gps_sv_status_callback sv_status_cb;
        gps_nmea_callback nmea_cb;
        gps_set_capabilities set_capabilities_cb;
        gps_acquire_wakelock acquire_wakelock_cb;
        gps_release_wakelock release_wakelock_cb;
        gps_create_thread create_thread_cb;
    } GpsCallbacks;

    就是以上函数指针组成的结构体,是一组回调函数,函数的实现在JNI层是Android实现好了得,无需做(太大的)修改

  • GpsInterface 
    Android GPS 最主要的数据结构,我们最主要的移植工作就是实现其中的函数
    /** Represents the standard GPS interface. */
    typedef struct {
        /** set to sizeof(GpsInterface) */
        size_t          size;
        /*Opens the interface and provides the callback routines 初始化callbacks 为JNI传下来的 
       在此会使用callbacks中的create_thread_cb 来创建一个线程处理函数一直循环,等待任务处理*/

        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 填入位置*/
        int  (*inject_location)(double latitude, double longitude, float accuracy);

        /*删除全部or部分辅助数据 在性能测试时候使用*/
        void  (*delete_aiding_data)(GpsAidingData flags);

        /*设置定位模式 与GPS工作模式等等*/
        int   (*set_position_mode)(GpsPositionMode mode, GpsPositionRecurrence recurrence,
                uint32_t min_interval, uint32_t preferred_accuracy, uint32_t preferred_time);

        /*自行添加的 接口 AGpsInterface接口通过次函数获得*/
        const void* (*get_extension)(const char* name);
    } GpsInterface;
  • AGpsCallbacks
    /** Callback with AGPS status information.
     *  Can only be called from a thread created by create_thread_cb.
     */

    typedef void (* agps_status_callback)(AGpsStatus* status);

    /** Callback structure for the AGPS interface. */
    typedef struct {
        agps_status_callback status_cb;
        gps_create_thread create_thread_cb;
    } AGpsCallbacks;

  • AGpsInterface
    /** Extended interface for AGPS support. */
    typedef struct {
        /** set to sizeof(AGpsInterface) */
        size_t          size;

        /**
         * Opens the AGPS interface and provides the callback routines
         * to the implemenation of this interface.
         */

        void  (*init)( AGpsCallbacks* callbacks );
        /**
         * Notifies that a data connection is available and sets 
         * the name of the APN to be used for SUPL.
         */

        int  (*data_conn_open)( const char* apn );
        /**
         * Notifies that the AGPS data connection has been closed.
         */

        int  (*data_conn_closed)();
        /**
         * Notifies that a data connection is not available for AGPS. 
         */

        int  (*data_conn_failed)();
        /**
         * Sets the hostname and port for the AGPS server.
         */

        int  (*set_server)( AGpsType type, const char* hostname, int port );
    } AGpsInterface

  • struct gps_device_t
    定义描述gps设备类型
    struct gps_device_t {
        struct hw_device_t common;

        /**
         * Set the provided lights to the provided values.
         *
         * Returns: 0 on succes, error code on failure.
         */

        const GpsInterface* (*get_gps_interface)(struct gps_device_t* dev);   
    };
    上层会通过动态库,获得此结构,等到GpsInterface从而打通APP到GPS device的全部通信。

  • 还有 GpsNiInterface AGpsRilInterface等接口 在此不赘述

文章转载至:http://www.linuxidc.com/Linux/2011-10/45371.htm,感谢作者的无私奉献!
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值