Hello,
using the iio driver framework I wrote a driver for an eight channel
ADC, connected via SPI and a interrupt line.
In polling mode (reading /sys/bus/iio/..../in_voltageX_raw) everything
works fine, but this access is obviously not way I'd want to use to read
lots of data.
Looking at other drivers (in staging/ kernel v3.2) I think the most
appropriate way is to use the provided sw ring buffer ring_sw.c
I'm not sure if my ring setup is correct, can someone please comment on
this?
My _probe function does the basic setup, inits a waitqueue and requests
the irq line (a gpio):
iio->buffer = iio_sw_rb_allocate(iio);
iio->buffer->access = &ring_sw_access_funcs;
iio->pollfunc = iio_alloc_pollfunc(&iio_pollfunc_store_time,
&my_poll_handler,
IRQF_ONESHOT, //<-not sure about this flag
iio,
"my_consumer%d",//<-where is this for?
iio->id);
iio->buffer->setup_ops = &my_ring_setup_ops;
iio->modes |= INDIO_BUFFER_TRIGGERED;//<-correct mode?
Where my access funcs are:
.preenable = &my_buffer_preenable,
.postenable = &iio_triggered_buffer_postenable,
.predisable = &iio_triggered_buffer_predisable,
.postdisable = &my_buffer_postdisable
where:
preenable just sets
iio->buffer->access->set_bytes_per_datum(iio->buffer, 19);
and enables the irq
postenable disables the irq
My irq handler does basically this:
disable_irq_nosync(irq);
iio_trigger_poll(adc->trig, iio_get_time_ns());
return IRQ_HANDLED;
My poll handler does this:
ring->access->store_to(ring, (u8 *)data, pf->timestamp);
iio_trigger_notify_done(iio->trig);
enable_irq(adc->spi->irq);
return IRQ_HANDLED;
Is the approach of using the sw ring and the interrupt & poll_func more
or less correct?
I've read ring.txt but still I get most of my kernel panics somewhere in
ring of buffer management, so I must be doing something wrong there.
Is any (simple) driver recommended as reference? I see different
approaches in different drivers and I can't test them.
--Lo
--
To unsubscribe from this list: send the line "unsubscribe linux-iio" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html