MTK sensorServer层到HAL层、驱动层解析


参考文章:Android硬件抽象层(HAL)概要介绍和学习计划  http://blog.csdn.net/luoshengyang/article/details/6567257

本人也是新手,不过看大牛写的例子感觉有点力不从心,本人还是通过Android源码来分析,在这里写这些东西一是给自己总结一下;二是自己也好记录一下自己的学习过程分享给大家。

我们这里首先从SensorServer.cpp开始分析:

(本人项目文件的路径:.\frameworks\native\services\sensorservice\SensorServer.cpp)

1.enable()

在这里我们可以先去找enable()函数,在这里我们可以看出来其实就是调用了另外一个sensor全局量类型在封装层SensorDevice.cpp中

  if (actuateHardware) {
        ALOGD_IF(DEBUG_CONNECTIONS, "\t>>> actuating h/w activate handle=%d enabled=%d", handle,
                 enabled);
        err = mSensorDevice->activate(
                reinterpret_cast (mSensorDevice), handle, enabled);
        ALOGE_IF(err, "Error %s sensor %d (%s)", enabled ? "activating" : "disabling", handle,
                 strerror(-err));

        if (err != NO_ERROR && enabled) {
            // Failure when enabling the sensor. Clean up on failure.
            info.removeBatchParamsForIdent(ident);
        }
    }

    // On older devices which do not support batch, call setDelay().
    if (getHalDeviceVersion() < SENSORS_DEVICE_API_VERSION_1_1 && info.numActiveClients() > 0) {
        ALOGD_IF(DEBUG_CONNECTIONS, "\t>>> actuating h/w setDelay %d %" PRId64, handle,
                 info.bestBatchParams.batchDelay);
        mSensorDevice->setDelay(
                reinterpret_cast(mSensorDevice),
                handle, info.bestBatchParams.batchDelay);
    }

在进入sensorDevice.cpp中 我们可以看到这里对enable变量进行了判断并且如果是第一次的话,后面就可以省一些硬件操作,每个应用调用一次sensor都有有一个connetion(注解里面有相关说明的!)后面会对actuateHardware进行判断并进行对应操作。

现在到此,我们可以看出server层是用SensorDevice.cpp()进行的封装,然后我们开始进入HAL,在HAL一样和server层类似,先是在sensor.c中去调用封装层nusensor.cpp,在这里实现了HAL的具体调用device的API,在active()这里去调用poll_active(),这里代码就不去分析了,其实就是层层封装,到后面的具体实现就是那几个关键的函数!

在这server层到HAL层的封装中,我们可以看见函数的参数明显少了一个device类型参数,当然我们也是可以理解的,在server层是面向应用,一个device可能被好几个应用调用,所以必须得有device参数,而到HAL层中(就已经是有对应好了device),已经知道对应的device,也就不需要这个参数,所以我们也能越来越理解Google代码的设计思想了。



到这里我感觉其他的setDelay()其他什么的都是类似的原理,后面可以自己去理解,只不过是花的时间可能多一点,不过花时间去自己尝试就是最好的锻炼!相信你可以的!

今天收获最大的就是知道了整个流程的date和control的传递流程,和Google一层层的代码封装,



猜你喜欢

转载自blog.csdn.net/u012542095/article/details/72902071
MTK
今日推荐