探秘SensorHAL(六)
pthread_mutex_unlock(&sensors_fifo.mutex);
}
int sensors_fifo_get_all(sensors_event_t *data, int len)
{
int i;
/* This function deliberately drops all packets above len. */
pthread_mutex_lock(&sensors_fifo.mutex);
pthread_cond_wait(&sensors_fifo.data_cond, &sensors_fifo.mutex);
for (i = 0; (i < sensors_fifo.fifo_i) && (i < len); i++)
data[i] = sensors_fifo.fifo[i];
sensors_fifo.fifo_i = 0;
pthread_mutex_unlock(&sensors_fifo.mutex);
return i;
}
上边的函数用到了线程等待,有兴趣的可以去百度,很好理解,就是两个线程等待一个变量data_cond,sensors_fifo_put在放置完data后会释放掉data_cond,而sensors_fifo_get_all在data_cond释放之前会一直进行等待。
继续向前跟踪sensors_fifo_put ( DASH/sensors/bma150_input.c ):
[cpp]
static void *bma150_input_read(void *arg)
{
struct sensor_api_t *s = arg;
struct sensor_desc *d = container_of(s, struct sensor_desc, api);
struct input_event event;
int fd = d->select_worker.get_fd(&d->select_worker);
sensors_event_t data;
memset(&data, 0, sizeof(data));
while (read(fd, &event, sizeof(event)) > 0) {
switch (event.type) {
case EV_ABS:
switch (event.code) {
case ABS_X:
d->current_data[0] = ev2grav(event.value);
break;
case ABS_Y:
d->current_data[1] = ev2grav(event.value);
break;
case ABS_Z:
d->current_data[2] = ev2grav(event.value);
break;
case ABS_MISC:
default:
break;
}
break;
case EV_SYN:
data.acceleration.x = (d->neg_x -d->current_data[d->axis_x] :
d->current_data[d->axis_x]);
data.acceleration.y = (d->neg_y -d->current_data[d->axis_y] :
d->current_data[d->axis_y]);
data.acceleration.z = (d->neg_z -d->current_data[d->axis_z] :
d->current_data[d->axis_z]);
data.acceleration.status = SENSOR_STATUS_ACCURACY_HIGH;
data.sensor = bma150_input.sensor.handle;
data.type = bma150_input.sensor.type;
data.version = bma150_input.sensor.version;
data.timestamp = get_current_nano_time();
sensors_fifo_put(&data);
goto exit;
default:
goto exit;
}
}
exit:
return NULL;
}
上述函数很好理解,首先取得此传感器的内核驱动句柄,然后等待此句柄输出信息,当取得信息后,对信息进行解析与再封装,最终写入到data中。那么bma150_input_read又是谁来调用呢?答案在此传感器的初始化过程中:
[cpp]
static int bma150_input_init(struct sensor_api_t *s)
{
struct sensor_desc *d = container_of(s, struct sensor_desc, api);
int fd;
bma150_input_read_config(d);
/* check for availablity */
fd = open_input_dev_by_name(BMA150_INPUT_NAME, O_RDONLY | O_NONBLOCK);
if (fd < 0) {
ALOGE("%s: unable to find %s input device!\n", __func__,
BMA150_INPUT_NAME);
return -1;
}
d->rate_path = bma150_get_rate_path(fd);
close(fd);
sensors_select_init(&d->select_worker, bma150_input_read, s, -1);
return 0;
}
可能现在会有迷惑,这个bma150_input_init是什么时候启动的呢?这是问题1,问题2是sensors_select_init是怎么吧bma150_input_re