forked from Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
69 lines
2.6 KiB
69 lines
2.6 KiB
================= |
|
Triggered Buffers |
|
================= |
|
|
|
Now that we know what buffers and triggers are let's see how they work together. |
|
|
|
IIO triggered buffer setup |
|
========================== |
|
|
|
* :c:func:`iio_triggered_buffer_setup` — Setup triggered buffer and pollfunc |
|
* :c:func:`iio_triggered_buffer_cleanup` — Free resources allocated by |
|
:c:func:`iio_triggered_buffer_setup` |
|
* struct iio_buffer_setup_ops — buffer setup related callbacks |
|
|
|
A typical triggered buffer setup looks like this:: |
|
|
|
const struct iio_buffer_setup_ops sensor_buffer_setup_ops = { |
|
.preenable = sensor_buffer_preenable, |
|
.postenable = sensor_buffer_postenable, |
|
.postdisable = sensor_buffer_postdisable, |
|
.predisable = sensor_buffer_predisable, |
|
}; |
|
|
|
irqreturn_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 i = 0; |
|
|
|
/* read data for each active channel */ |
|
for_each_set_bit(bit, active_scan_mask, masklength) |
|
buf[i++] = sensor_get_data(bit) |
|
|
|
iio_push_to_buffers_with_timestamp(indio_dev, buf, timestamp); |
|
|
|
iio_trigger_notify_done(trigger); |
|
return IRQ_HANDLED; |
|
} |
|
|
|
/* setup triggered buffer, usually in probe function */ |
|
iio_triggered_buffer_setup(indio_dev, sensor_iio_polfunc, |
|
sensor_trigger_handler, |
|
sensor_buffer_setup_ops); |
|
|
|
The important things to notice here are: |
|
|
|
* :c:type:`iio_buffer_setup_ops`, the buffer setup functions to be called at |
|
predefined points in the buffer configuration sequence (e.g. before enable, |
|
after disable). If not specified, the IIO core uses the default |
|
iio_triggered_buffer_setup_ops. |
|
* **sensor_iio_pollfunc**, the function that will be used as top half of poll |
|
function. It should do as little processing as possible, because it runs in |
|
interrupt context. The most common operation is recording of the current |
|
timestamp and for this reason one can use the IIO core defined |
|
:c:func:`iio_pollfunc_store_time` function. |
|
* **sensor_trigger_handler**, the function that will be used as bottom half of |
|
the poll function. This runs in the context of a kernel thread and all the |
|
processing takes place here. It usually reads data from the device and |
|
stores it in the internal buffer together with the timestamp recorded in the |
|
top half. |
|
|
|
More details |
|
============ |
|
.. kernel-doc:: drivers/iio/buffer/industrialio-triggered-buffer.c
|
|
|