深入浅出 - Android系统移植与平台开发 - Sensor HAL框架分析之四

转自:http://blog.csdn.net/mr_raptor/article/details/8160289

Sensor本地封装类SensorDevice

SensorDevice是在本地代码中SensorService对Sensor设备的抽象类型封装,它封装了传感器硬件的硬件操作,该类继承了Singleton类,通过getInstance方法获得单例模式设备操作对象:

@frameworks/base/services/sensorservice/SensorDevice.h

[cpp] view plain copy print ?
  1. class SensorDevice : public Singleton<SensorDevice> { 
  2.     friend class Singleton<SensorDevice>; 
  3.    struct sensors_poll_device_t* mSensorDevice; 
  4.     struct sensors_module_t* mSensorModule; 
  5.     mutable Mutex mLock;    // protect mActivationCount[].rates 
  6.     // fixed-size array after construction 
  7.     struct Info { 
  8.         Info() : delay(0) { } 
  9.         KeyedVector<void*, nsecs_t> rates; 
  10.         nsecs_t delay; 
  11. status_t setDelayForIdent(void* ident, int64_t ns); 
  12.         nsecs_t selectDelay(); 
  13.     }; 
  14.     DefaultKeyedVector<int, Info> mActivationCount; 
  15. SensorDevice(); 
  16. public
  17.     ssize_t getSensorList(sensor_t const** list); 
  18.     status_t initCheck() const
  19.     ssize_t poll(sensors_event_t* buffer, size_t count); 
  20.     status_t activate(void* ident, int handle, int enabled); 
  21.     status_t setDelay(void* ident, int handle, int64_t ns); 
  22.     void dump(String8& result, char* buffer, size_t SIZE); 
  23. }; 

通过SensorDevice类的定义可看到它包含的属性和方法:

属性:

mSensorDevice:Sensor设备HAL层操作接口封装结构

mSensorModule:Sensor设备HAL硬件模块封装结构

mActivationCount:保存激活Sensor设备向量表

方法:

SensorDevice:构造方法

getSensorList:获得Sensor设备列表方法

poll:Sensor设备多路监听方法

activate:设备激活方法

setDelay:设备Sensor设备延迟方法

由前面分析可知,SensorDevice是单例模型,其构造方法仅会调用一次:

@frameworks/base/services/sensorservice/SensorDevice.cpp

[cpp] view plain copy print ?
  1. SensorDevice::SensorDevice() 
  2.     :  mSensorDevice(0), mSensorModule(0) 
  3.         // 终于看到hw_get_module了,幸福,高兴,开心,相见时难别亦难… 
  4.     status_t err = hw_get_module(SENSORS_HARDWARE_MODULE_ID, 
  5.             (hw_module_t const**)&mSensorModule); 
  6.     LOGE_IF(err, "couldn't load %s module (%s)"
  7.             SENSORS_HARDWARE_MODULE_ID, strerror(-err)); 
  8.     if (mSensorModule) { 
  9.             //打开module设备,返回module设备的操作接口,保存在mSensorDevice中 
  10.         err = sensors_open(&mSensorModule->common, &mSensorDevice); 
  11.         LOGE_IF(err, "couldn't open device for module %s (%s)"
  12.                 SENSORS_HARDWARE_MODULE_ID, strerror(-err)); 
  13.         if (mSensorDevice) { 
  14.             sensor_t const* list; 
  15.               // 调用module设备的get_sensors_list接口 
  16.             ssize_t count = mSensorModule->get_sensors_list(mSensorModule, &list); 
  17.             mActivationCount.setCapacity(count); 
  18.             Info model; 
  19.             for (size_t i=0 ; i<size_t(count) ; i++) { 
  20.                 mActivationCount.add(list[i].handle, model); 
  21.                 mSensorDevice->activate(mSensorDevice, list[i].handle, 0); 
  22.             } 
  23.         } 
  24.     } 

在SensorDevice构造方法里调用HAL架构的hw_get_module来获得Sensor设备模块,之后调用sensors_open这个工具函数,打开Sensor设备模块(调用其methods->open函数指针),返回Sensor设备的操作接口(这些接口在HAL层实现),保存在mSensorDevice中,调用Sensor模块的get_sensors_list方法获得传感器列表,然后依次激活这些设备并且添加到mActivationCount设备信息向量中。

Sensor HAL模块代码及打开模块工具函数sensors_open:

@hardware/libhardware/include/hardware/sensors.h
[cpp] view plain copy print ?
  1. struct sensors_module_t { 
  2.     struct hw_module_t common; 
  3.     /**     * Enumerate all available sensors. The list is returned in "list".
  4.      * @return number of sensors in the list
  5.      */ 
  6.     int (*get_sensors_list)(struct sensors_module_t* module, 
  7.             struct sensor_t const** list); 
  8. }; 
  9. …… 
  10. static inline int sensors_open(const struct hw_module_t* module, 
  11.         struct sensors_poll_device_t** device) { 
  12.     return module->methods->open(module, 
  13.             SENSORS_HARDWARE_POLL, (struct hw_device_t**)device); 

SensorDevice其它几个方法比较简单:

[cpp] view plain copy print ?
  1. ssize_t SensorDevice::getSensorList(sensor_t const** list) { 
  2.     if (!mSensorModule) return NO_INIT; 
  3.        // 直接调用模块的get_sensors_list方法获得Sensor列表 
  4.     ssize_t count = mSensorModule->get_sensors_list(mSensorModule, list); 
  5.     return count; 
  6.  
  7. ssize_t SensorDevice::poll(sensors_event_t* buffer, size_t count) { 
  8.     if (!mSensorDevice) return NO_INIT; 
  9.     ssize_t c; 
  10.     do
  11.            // 调用Sensor设备的poll操作接口,该接口实现在HAL层 
  12.         c = mSensorDevice->poll(mSensorDevice, buffer, count); 
  13.     } while (c == -EINTR); 
  14.     return c; 
  15.  
  16. status_t SensorDevice::activate(void* ident, int handle, int enabled) 
  17.     if (!mSensorDevice) return NO_INIT; 
  18.     status_t err(NO_ERROR); 
  19.     bool actuateHardware = false
  20.  
  21.     Info& info( mActivationCount.editValueFor(handle) ); 
  22.  
  23.     LOGD_IF(DEBUG_CONNECTIONS, 
  24.             "SensorDevice::activate: ident=%p, handle=0x%08x, enabled=%d, count=%d"
  25.             ident, handle, enabled, info.rates.size()); 
  26.  
  27.     if (enabled) { 
  28.         Mutex::Autolock _l(mLock); 
  29.         LOGD_IF(DEBUG_CONNECTIONS, "... index=%ld"
  30.                 info.rates.indexOfKey(ident)); 
  31.            // 设置设备为默认延迟级别 
  32.         if (info.rates.indexOfKey(ident) < 0) { 
  33.             info.rates.add(ident, DEFAULT_EVENTS_PERIOD); 
  34.             if (info.rates.size() == 1) { 
  35.                 actuateHardware = true
  36.             } 
  37.         } else
  38.             // sensor was already activated for this ident 
  39.         } 
  40.     } else
  41.         Mutex::Autolock _l(mLock); 
  42.         LOGD_IF(DEBUG_CONNECTIONS, "... index=%ld"
  43.                 info.rates.indexOfKey(ident)); 
  44.  
  45.         ssize_t idx = info.rates.removeItem(ident); 
  46.         if (idx >= 0) { 
  47.             if (info.rates.size() == 0) { 
  48.                 actuateHardware = true
  49.             } 
  50.         } else
  51.             // sensor wasn't enabled for this ident 
  52.         } 
  53.     } 
  54.  
  55.     if (actuateHardware) { 
  56.         LOGD_IF(DEBUG_CONNECTIONS, "\t>>> actuating h/w"); 
  57.           // 调用Sensor设备activate操作接口,其实现在HAL层 
  58.         err = mSensorDevice->activate(mSensorDevice, handle, enabled); 
  59.         if (enabled) { 
  60.             LOGE_IF(err, "Error activating sensor %d (%s)", handle, strerror(-err)); 
  61.             if (err == 0) { 
  62.                  // 在电池服务中使能Sensor电源 
  63.                 BatteryService::getInstance().enableSensor(handle); 
  64.             } 
  65.         } else
  66.             if (err == 0) { 
  67.                  // 在电池服务中关闭Sensor电源 
  68.                 BatteryService::getInstance().disableSensor(handle); 
  69.             } 
  70.         } 
  71.     } 
  72.  
  73.     { // scope for the lock 
  74.         Mutex::Autolock _l(mLock); 
  75.         nsecs_t ns = info.selectDelay(); 
  76.           // 设置延迟值 
  77.         mSensorDevice->setDelay(mSensorDevice, handle, ns); 
  78.     } 
  79.  
  80.     return err; 

由这几个SensorDevice的方法可知,其具体的实现全部由mSensorDevice 封装的设备操作接口函数实现,这些设备操作接口在HAL层实现,其实SensorDevice只是SensorService的设备操作对象,封装了设备的操作,而这些操作实际“干活的”的是HAL层代码。

一路分析过来,已经到了HAL层了,我们回顾下前面所学的东西。

让我们从Java应用层到框架层再到本地代码来总结下:

深入浅出 - Android系统移植与平台开发 - Sensor HAL框架分析之四_第1张图片

1. Android的应用程序调用getSystemService方法获得SensorManager对象,该方法实现在ContextImpl.java中,它是Activity的抽象父类Context的实现类。

2. 在应用程序(Activity)初始化时调用registerService创建并注册SensorManager

3. 创建SensorManager

4. 在SensorManager的构造方法中,调用了本地方法:nativeClassInit(),它用来初始化了Java对象Sensor在本地的引用,方便本地代码对Java对象操作。

5. 在SensorManager的构造方法中,调用sensors_module_init()来创建SensorManager本地对象。

8. 调用sensors_module_get_next_sensor()方法,通过nativeClassInit中初始化的Sensor引用填充Sensor设备列表,返回给Java框架层。

12. 将sensors_module_get_next_sensor()获得的设备列表保存在sFullSensorsList中。

13. 创建SensorThread线程准备监听Sensor硬件事件变化。

14. 应用程序通过getDefaultSensor来获得指定类型传感器的对象

16. 通过registerListener注册Sensor监听器。
下一节,让我们来看下SensorThread线程。

 

你可能感兴趣的:(深入浅出 - Android系统移植与平台开发 - Sensor HAL框架分析之四)