| ================= | |
| 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 :c:type:`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 |