探秘SensorHAL(九)
动句柄有效,且要求关闭时,设置句柄为-1(无效),并执行suspend操作,使传感器进入SLEEP状态,继续等待suspend_cond变量。
在执行poll_callback时候一层层向回摸吧,worker->arg就等于sensors_worker_init所带入的arg。
worker->poll_back = (work_func);
(work_func) = sensors_select_callback;
( DASH/sensors_select.c )
[cpp]
static void *sensors_select_callback(void *arg)
{
fd_set readfds;
int ret;
struct sensors_select_t *s = arg;
int maxfd;
LOCK(&s->fd_mutex);
maxfd = s->ctl_fds[0] > s->fd s->ctl_fds[0] : s->fd;
FD_ZERO(&readfds);
FD_SET(s->ctl_fds[0], &readfds);
FD_SET(s->fd, &readfds);
UNLOCK(&s->fd_mutex);
ret = select(maxfd + 1, &readfds, NULL, NULL, NULL);
if (ret < 0) {
ALOGE("%s: select failed!\n", __func__);
} else if (ret) {
if (FD_ISSET(s->ctl_fds[0], &readfds)) {
read(s->
ctl_fds[0], &ret, sizeof(ret));
} else if (FD_ISSET(s->fd, &readfds)) {
LOCK(&wrapper_mutex);
LOCK(&s->fd_mutex);
if (s->fd >= 0)
s->select_callback(s->arg);
UNLOCK(&s->fd_mutex);
UNLOCK(&wrapper_mutex);
}
}
return NULL;
}
一层层的设置执行,最终执行到s->select_callback,参数为s->arg。
select_callback = (select_func);www.2cto.com
(select_func) = bma150_input_read;
终于执行到了这一步,问题2解决。
总结: 一切的一切始于SensorService的threadLoop,他执行了一个poll操作,从而层层调用到SensorHAL,HAL经过初始化及激活后,开启了一个工作线程。当工作线程处于RUNNING(default)状态时,会无限循环来读取硬件驱动句柄所发出的数据,然后经过解析重构发回到SensorService中。至此,服务成功开启,从驱动中源源不断的获取数据。这个SensorService的threadLoop工作还有很多,大体概括就是对获取到的驱动数据进行分类,处理,最后发送……blablabla,这里边涉及到很多专业知识,也就不便再进行分析。总之SensorHAL的运作流程即使如此。