探秘SensorHAL(二)

2014-11-24 07:30:28 · 作者: · 浏览: 8
meworks/base/cmds/system_server/system_init.cpp
[cpp]
extern "C" status_t system_init()
{
ALOGI("Entered system_init()");
sp proc(ProcessState::self());
sp sm = defaultServiceManager();
ALOGI("ServiceManager: %p\n", sm.get());
...
}
property_get("system_init.startsensorservice", propBuf, "1");
if (strcmp(propBuf, "1") == 0) {
// Start the sensor service
SensorService::instantiate();
}
...
}
调用到frameworks/base/services/sensorservice/SensorService.cpp
[cpp]
void SensorService::onFirstRef()
{
ALOGD("nuSensorService starting...");
SensorDevice& dev(SensorDevice::getInstance());
之后又调用到了SensorDevice.cpp(同目录下)
[cpp]
SensorDevice::SensorDevice()
: mSensorDevice(0),
mSensorModule(0)
{
status_t err = hw_get_module(SENSORS_HARDWARE_MODULE_ID,
(hw_module_t const**)&mSensorModule);
ALOGE_IF(err, "couldn't load %s module (%s)",
SENSORS_HARDWARE_MODULE_ID, strerror(-err));
if (mSensorModule) {
err = sensors_open(&mSensorModule->common, &mSensorDevice);
ALOGE_IF(err, "couldn't open device for module %s (%s)",
SENSORS_HARDWARE_MODULE_ID, strerror(-err));
if (mSensorDevice) {
sensor_t const* list;
ssize_t count = mSensorModule->get_sensors_list(mSensorModule, &list);
mActivationCount.setCapacity(count);
Info model;
for (size_t i=0 ; i
mActivationCount.add(list[i].handle, model);
mSensorDevice->
activate(mSensorDevice, list[i].handle, 0);
}
}
}
}
这段负责打开HAL,取得需要的数据及handle,对应的部分在HAL的代码中,见DASH/sensors_module.c
[cpp]
struct sensors_module_t HAL_MODULE_INFO_SYM = {
common: {
tag: HARDWARE_MODULE_TAG,
version_major: 1,
version_minor: 0,
id: SENSORS_HARDWARE_MODULE_ID,
name : "dash",
author : "oskar.andero@sonymobile.com",
methods: &sensors_module_methods,
},
get_sensors_list: sensors_list_get
};
ID对上了,即可以成功打开,mSensorModule变得有效了。
然后SensorDevice.cpp调用API sensors_open,这个函数在接口头文件中有定义:
[cpp]
static inline int sensors_open(const struct hw_module_t* module,
struct sensors_poll_device_t** device) {
return module->methods->open(module,
SENSORS_HARDWARE_POLL, (struct hw_device_t**)device);
}
是开调用HAL的open方法:
[cpp]
static int sensors_module_open(const struct hw_module_t* module, const char* id, struct hw_device_t** device)
{
struct sensors_poll_device_t *dev;
if (strcmp(id, SENSORS_HARDWARE_POLL))
return 0;
dev = malloc(sizeof(*dev));
if (!dev)
return -1;
memset(dev, 0, sizeof(*dev));
dev->common.tag = HARDWARE_DEVICE_TAG;
dev->common.version = 0;
dev->common.module = (struct hw_module_t*)module;
dev->common.close = sensors_module_close;
dev->activate = sensors_module_activate;
dev->setDelay = sensors_module_set_delay;
dev->poll = sensors_module_poll;