sensor----framework(一)的后面,我们跟进到了mSensorDevice->activate
,下面我们就来具体看看这个怎么样链接到HAL,DRIVER里面去的。如何使能一个SENOSR的。
step 1:
\frameworks\native\services\sensorservice\SensorDevice.cpp
SensorDevice::SensorDevice()
: mSensorDevice(0),
mSensorModule(0)
{
/*
从HAL层的SENSOR MODULE中获取mSensorModule
*/
status_t err =hw_get_module(SENSORS_HARDWARE_MODULE_ID,
(hw_module_tconst**)&mSensorModule);
ALOGE_IF(err, "couldn't load %s module (%s)",
SENSORS_HARDWARE_MODULE_ID, strerror(-err));
if (mSensorModule) {
err = sensors_open_1(&mSensorModule->common,&mSensorDevice);
ALOGE_IF(err, "couldn't open device for module %s (%s)",
SENSORS_HARDWARE_MODULE_ID,strerror(-err));
if (mSensorDevice) {
if (mSensorDevice->common.version == SENSORS_DEVICE_API_VERSION_1_1||
mSensorDevice->common.version == SENSORS_DEVICE_API_VERSION_1_2) {
ALOGE(">>>>WARNING <<< Upgrade sensor HAL to version 1_3");
}
sensor_t const* list;
ssize_t count =mSensorModule->get_sensors_list(mSensorModule, &list);
mActivationCount.setCapacity(count);
Info model;
for (size_t i=0 ; i<size_t(count) ; i++) {
mActivationCount.add(list[i].handle, model);
mSensorDevice->activate(
reinterpret_cast<struct sensors_poll_device_t *>(mSensorDevice),
list[i].handle, 0);
}
}
}
}
STEP 2:
\vendor\mediatek\proprietary\hardware\sensor\sensors.c
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 = "MTK SENSORS Module",
.author = "Mediatek",
.methods = &sensors_module_methods,
},
.get_sensors_list = sensors__get_sensors_list,
};
step 3:
hardware\libhardware\include\hardware\ sensors.h
static inline int sensors_open_1(conststruct hw_module_t* module,
sensors_poll_device_1_t** device) {
return module->methods->open(module,
SENSORS_HARDWARE_POLL, (structhw_device_t**)device);
}
/*
这里的module->methods->open当然对于的就是senosr.c中的open了static structhw_module_methods_t sensors_module_methods = {
.open = open_sensors
};
*/
step 4:
\vendor\mediatek\proprietary\hardware\sensor\sensors.c
static int open_sensors(const structhw_module_t* module, const char* name,
struct hw_device_t** device)
{
ALOGD("%s: name: %s! fwq debug\r\n", __func__, name);
return init_nusensors(module, device);
}
step 5:
\vendor\mediatek\proprietary\hardware\sensor\nusensors.cpp
int init_nusensors(hw_module_t const*module, hw_device_t** device)
{
int status = -EINVAL;
dev = new sensors_poll_context_t();
/*
new 这个sensors_poll_context_t的时候,会初始化各个类型的senosr.还有其对于的FD,后续就是通过这个FD来访问DRIVER的ENABLE的。
sensors_poll_context_t::sensors_poll_context_t()
{
memset(&device, 0, sizeof(device));
mSensors[hwmsen] = new Hwmsen();
mPollFds[hwmsen].fd = ((Hwmsen*)mSensors[hwmsen])->mdata_fd;
mPollFds[hwmsen].events = POLLIN;
mPollFds[hwmsen].revents = 0;
mSensors[accel] = new AccelerationSensor();
mPollFds[accel].fd =((AccelerationSensor*)mSensors[accel])->mdata_fd;
mPollFds[accel].events = POLLIN;
mPollFds[accel].revents = 0;
mSensors[magnetic] = new MagneticSensor();
mPollFds[magnetic].fd =((MagneticSensor*)mSensors[magnetic])->mdata_fd;
mPollFds[magnetic].events = POLLIN;
mPollFds[magnetic].revents = 0;
mSensors[proximity] = new ProximitySensor();
mPollFds[proximity].fd =((ProximitySensor*)mSensors[proximity])->mdata_fd;
mPollFds[proximity].events = POLLIN;
mPollFds[proximity].revents = 0;
mSensors[light] = new AmbiLightSensor();
mPollFds[light].fd =((AmbiLightSensor*)mSensors[light])->mdata_fd;
mPollFds[light].events = POLLIN;
mPollFds[light].revents = 0;
mSensors[gyro] = new GyroscopeSensor();
mPollFds[gyr