一、Android Sensor的框架
在刚开始的时候,Android上的sensor调用还是在走内核的,通过芯片厂商编写相应的设备驱动来生成设备节点供上层访问,以读取设备节点的方式来读取sensor数据,但是后来人们发现这样做会增加功耗,因为sensor需要不断的上报数据,不断的更新数据,所以这就要求处理器不断为其工作,所以就会影响待机功耗,故高通在MSM8960之后就提出了一种方案,把sensor数据的处理放到ADSP中处理,ADSP在处理音频数据的数据顺便把sensor数据处理掉,降低功耗。因此在MSM8953后sensor数据的处理都放在ADSP中处理,并向以往那样通过节点的方式来获取数据。下面就是sensor数据处理的结构框图:
二、sensor的调用流程
1.framework调用流程图
1.1 hardware加载sensor hal层模块的代码流程
上层会起一个SensorService服务,在随后的第一次初始化时,其onFirstRef会被调用(均继承自RefBase虚基类),紧接着,它会获取Sensors::Sensors()构造函数,去通过hw_get_module()函数去加载sensor hal层的代码以及sensor 结构体。
Sensors::Sensors()
: mInitCheck(NO_INIT),
mSensorModule(nullptr),
mSensorDevice(nullptr) {
status_t err = OK;
if (UseMultiHal()) {
mSensorModule = ::get_multi_hal_module_info();
} else {
err = hw_get_module(
SENSORS_HARDWARE_MODULE_ID,
(hw_module_t const **)&mSensorModule);
}
if (mSensorModule == NULL) {
err = UNKNOWN_ERROR;
}
if (err != OK) {
LOG(ERROR) << "Couldn't load "
<< SENSORS_HARDWARE_MODULE_ID
<< " module ("
<< strerror(-err)
<< ")";
mInitCheck = err;
return;
}
err = sensors_open_1(&mSensorModule->common, &mSensorDevice);
if (err != OK) {
LOG(ERROR) << "Couldn't open device for module "