探秘SensorHAL(七)
ad启动起来的?
下面一次解决,问题1:
[cpp]
static struct sensor_desc bma150_input = {
...
.api = {
init: bma150_input_init,
activate: bma150_input_activate,
set_delay: bma150_input_fw_delay,
close: bma150_input_close
},
...
};
bma150_input_init被注册到api->init.
( DASH/sensors_module.c )
[cpp]
static int sensors_module_open(const struct hw_module_t* module, const char* id, struct hw_device_t** device)
{
...
sensors_list_foreach_api(sensors_init_iterator, NULL);
return 0;
}
static int sensors_init_iterator(struct sensor_api_t* api, void *arg)
{
return api->init(api);
}
( DASH/sensors_list.c )
[cpp]
void sensors_list_foreach_api(int (*f)(struct sensor_api_t* api, void* arg),
void *arg)
{
int i;
for (i = 0; i < number_of_sensors; i++)
if (f(sensor_apis[i], arg) != SENSOR_OK) {
sensors_list_deregister(sensor_apis[i]);
/* need to revisit this position after deregister */
--i;
}
}
遍历所有注册过的传感器,执行其api->init. 问题1解决完毕。
问题2:
( DASH/sensors_select.c )
[cpp]
void sensors_select_init(struct sensors_select_t* s,
void* (*select_func)(void *arg), void* arg, int fd)
{
s->suspend = sensors_select_suspend;
s->resume = sensors_select_resume;
s->destroy = sensors_select_destroy;
s->set_delay = sensors_select_set_delay;
s->set_fd = sensors_select_set_fd;
s->get_fd = sensors_select_get_fd;
s->arg = arg;
s->fd = fd;
s->delay = 0;
if (pipe(s->ctl_fds) < 0)
ALOGE("%s: pipe failed: %s", __func__, strerror(errno));
sensors_worker_init(&s->worker, sensors_select_callback, s);
s->worker.set_delay(&s->worker, 0);
pthread_mutex_init(&s->fd_mutex, NULL);
}
bma150_init_read为该函数的第二个参数,即select_func, 组装给了s->select_callback。送去sensors_worker_init函数( DASH/sensors_worker.c ):
[cpp]
void sensors_worker_init(struct sensors_worker_t* worker,
void* (*work_func)(void *arg), void* arg)
{
worker->mode = SENSOR_SLEEP;
worker->poll_callback = work_func;
worker->suspend = sensors_worker_suspend;
worker->resume = sensors_worker_resume;
worker->destroy = sensors_worker_destroy;
worker->set_delay = sensors_worker_set_delay;
worker->delay_ns = 200000000L;
worker->arg = arg;
pthread_mutex_init (&worker->mode_mutex, NULL);
pthread_cond_init (&worker->suspend_cond, NULL);
pthread_create(&worker->worker_thread_id, NULL,
sensors_worker_internal_worker, (void*) worker);
}
该函数第二个参数为sensors_select_init所送入的sensors_select_callback, 暂放此处,稍后分析,只记得他化身work_func组装给了worker->poll_callback, 最终被当作参数送入新开启的线程sensors_worker_internal_worker中:
[cpp]
static void *sensors_worker_internal_worker(void *arg)
{
struct sensors_worker_t* worker = (struct sensors_worker_t*) arg;
enum sensors_worker_mode mode;
while (1) {
pthread_mutex_lock(&worker->mode_mutex);
mode = worker->mode;
pthread_mutex_unlock(&worker->mode_mutex);
swi