const struct iio_buffer_setup_ops sensor_buffer_setup_ops = {
.preenable = my_sensor_buffer_preenable,
.postenable = my_sensor_buffer_postenable,
.predisable = my_sensor_buffer_predisable,
};
irqqreturn_t sensor_iio_pollfunc(int irq, void *p)
{
pf->timestamp = iio_get_time_ns((struct indio_dev *)p);
return IRQ_WAKE_THREAD;
}
irqreturn_t sensor_trigger_handler(int irq, void *p)
{
u16 buf[8];
int bit, i = 0;
struct iio_poll_func *pf = p;
struct iio_dev *indio_dev = pf->iodio_edv;
mutex_lock(&my_mutex);//用锁保护缓冲区
for_each_set_bit(bit, indio_dev->active_scan_mask, indio_dev->masklength);//读取每个活动通道的数据
buf[i++] = sensor_get_data(bit);
iio_push_to_buffers_with_timestamp(indio_dev, buf, timestamp);
mutex_unlock(&my_mutex);//解锁
iio_trigger_notify_done(indio_dev->trig);//通知触发
return IRQ_HANDLED;
}
iio_triggered_buffer_setup(indio_dev, sensor_iio_polfunc, sensor_trigger_handler, sensor_buffer_setup_ops);
在连续缓冲捕获激活时,应防止驱动程序在各个通道上执行sysfs数据捕获(由read_raw()钩子执行),因为read_raw()钩子和触发器处理程序将尝试同时访问设备
钩子函数如下:
static int my_read_raw(struct iio_dev *indio_dev, const struct iio_chan_spec *chan, int *val, int *val2, long mask)
{
[...]
switch (mask) {
case IIO_CHAN_INFO_RAW:
if (iio_buffer_enabled(indio_dev)) //测试IIO设备的缓冲区是否启用
return -EBUSY;
[...]
}
}
钩子函数:消息处理机制,用来监视系统或进程的各种事件消息
将被读取并推入缓冲区的通道的数据成为扫描元素
属性如下:
单次捕获通过读取相关通道的sysfs条目,并且只捕获与此通道相关的数据