| ================= |
| 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 |