Re: fast spi driver development

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 7/4/22 20:00, Andy Shevchenko wrote:
On Sun, Jul 3, 2022 at 3:09 PM Patricio Moreno <pm.pato@xxxxxxxxx> wrote:
Hello,

I'm writing a driver for the TI ADS127x family of ADCs. The ads127x is a
24 bit samples, 4/8 channels, ADC, which can be clocked, using SPI, with
up to 25 MHz. For what I've seen, I've followed a common approach within
the IIO ADC drivers, but I can't get it to work at high frequencies.

I'm using the triggered buffers interface, with a RDY interrupt pin. The
problem I have is with timings. When the ADC sends the data ready
signal, my handler is called approximately 7µs later. This handler then
calls spi_read to get 24 bytes (8 3 bytes samples) and the kernel takes
a lot of time to read the SPI bus, actually, to *start* reading.

I would really appreciate some guidance on how to deal with this issue.
+Cc: maintainers and AD guys. I remember there was a discussion about
supporting HiFreq ADCs in IIO and AFAIR there are some issues (and you
probably need to use DMA in cyclic mode or so).

A created some slides on this very topic a while ago. See https://wiki.analog.com/_media/resources/fpga/peripherals/spi-engine3.pdf

The summary is a general purpose operating system is not well suited to this task, mainly, like you noticed, due to the context switch penalty.

In general the solution to this is to batch multiple sample acquisitions together to reduce the number of context switches. There are both software and hardware based approaches for this.

 * Asymmetric multiprocessing: Dedicate one core to data acquisition running a bare metal application. It can control the SPI controller in a tight loop and make sure that transactions are scheduled on time. Data can be moved to the main OS using a shared memory ring buffer.

 * FIFO in the sensor: Probably the best solution if available. Have a FIFO in the sensor with a threshold IRQ and read multiple samples in a single SPI transfer when the FIFO is almost full.

 * SPI transfer offloading on the host side: This is what the presentation mainly talks about. The host system has a SPI controller IP that supports scheduling SPI transfers without software interaction in response to a trigger signal, e.g. a timer of external GPIO. The data is then pushed to a FIFO or directly to system memory using DMA. The host system is notified when a certain amount of samples have been received.

- Lars




[Index of Archives]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Input]     [Linux Kernel]     [Linux SCSI]     [X.org]

  Powered by Linux