概述
参考文章:Android硬件抽象层(HAL)概要介绍和学习计划 http://blog.csdn.net/luoshengyang/article/details/6567257
本人也是新手,不过看大牛写的例子感觉有点力不从心,本人还是通过Android源码来分析,在这里写这些东西一是给自己总结一下;二是自己也好记录一下自己的学习过程分享给大家。
我们这里首先从SensorServer.cpp开始分析:
(本人项目文件的路径:.frameworksnativeservicessensorserviceSensorServer.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一层层的代码封装,
最后
以上就是大意美女为你收集整理的MTK sensorServer层到HAL层、驱动层解析的全部内容,希望文章能够帮你解决MTK sensorServer层到HAL层、驱动层解析所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复