sensor----HAL分析

本文详细剖析了Android传感器框架中从SensorService调用到HAL层,再到Driver的激活过程。通过跟踪源码,解释了如何通过SensorDevice::SensorDevice()初始化并激活传感器,以及在不同层级间的交互细节,包括打开传感器模块、建立传感器列表、调用激活函数,最终到达内核驱动进行使能操作。
摘要由CSDN通过智能技术生成

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中的openstatic 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来访问DRIVERENABLE的。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值