brintos

brintos / linux-shallow public Read only

0
0
Text · 2.6 KiB · 417555d Raw
70 lines · plain
1=================2Triggered Buffers3=================4 5Now that we know what buffers and triggers are let's see how they work together.6 7IIO triggered buffer setup8==========================9 10* :c:func:`iio_triggered_buffer_setup` — Setup triggered buffer and pollfunc11* :c:func:`iio_triggered_buffer_cleanup` — Free resources allocated by12  :c:func:`iio_triggered_buffer_setup`13* struct iio_buffer_setup_ops — buffer setup related callbacks14 15A typical triggered buffer setup looks like this::16 17    const struct iio_buffer_setup_ops sensor_buffer_setup_ops = {18      .preenable    = sensor_buffer_preenable,19      .postenable   = sensor_buffer_postenable,20      .postdisable  = sensor_buffer_postdisable,21      .predisable   = sensor_buffer_predisable,22    };23 24    irqreturn_t sensor_iio_pollfunc(int irq, void *p)25    {26        pf->timestamp = iio_get_time_ns((struct indio_dev *)p);27        return IRQ_WAKE_THREAD;28    }29 30    irqreturn_t sensor_trigger_handler(int irq, void *p)31    {32        u16 buf[8];33        int i = 0;34 35        /* read data for each active channel */36        for_each_set_bit(bit, active_scan_mask, masklength)37            buf[i++] = sensor_get_data(bit)38 39        iio_push_to_buffers_with_timestamp(indio_dev, buf, timestamp);40 41        iio_trigger_notify_done(trigger);42        return IRQ_HANDLED;43    }44 45    /* setup triggered buffer, usually in probe function */46    iio_triggered_buffer_setup(indio_dev, sensor_iio_polfunc,47                               sensor_trigger_handler,48                               sensor_buffer_setup_ops);49 50The important things to notice here are:51 52* :c:type:`iio_buffer_setup_ops`, the buffer setup functions to be called at53  predefined points in the buffer configuration sequence (e.g. before enable,54  after disable). If not specified, the IIO core uses the default55  iio_triggered_buffer_setup_ops.56* **sensor_iio_pollfunc**, the function that will be used as top half of poll57  function. It should do as little processing as possible, because it runs in58  interrupt context. The most common operation is recording of the current59  timestamp and for this reason one can use the IIO core defined60  :c:func:`iio_pollfunc_store_time` function.61* **sensor_trigger_handler**, the function that will be used as bottom half of62  the poll function. This runs in the context of a kernel thread and all the63  processing takes place here. It usually reads data from the device and64  stores it in the internal buffer together with the timestamp recorded in the65  top half.66 67More details68============69.. kernel-doc:: drivers/iio/buffer/industrialio-triggered-buffer.c70