android GPS 应用

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层直接加载动态链接库的方式,如下图所示:
 
图引用自:  http://www.jollen.org/blog/
新的HAL实现仍然是以加载动态链接库的方式来与linux device driver通信,不过libhardware屏蔽了具体的加载细节,每种应用以HAL stub的概念呈现给JNI层,一个HAL stub编译成一个动态链接库文件,结构如下图所示:
          
 
         
            图引用自:  http://www.jollen.org/blog/
 
移植一个新的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信息。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值