We are running Linux 4.9 under Xenomai 3.0.10 on an i.MX7D rev.5 v71 processor.
The SDMA engine is used to transfer data from main memory to and from the SAI 
interface.
The main memory buffer is around 40 kByte in size and the DMA uses it as a ring 
buffer for the data transfer.
In order to know where the DMA is currently reading or writing data inside this 
buffer, an interrupt is generated whenever 576 bytes of data have been 
transferred. The interrupt routine then updates a suitable buffer pointer which 
is used by our software.
The interrupt occurs on average every 250 µsec and is handled by a regular 
non-realtime Linux interrupt routine.

This works but there is a problem: The DMA interrupt and consequently the 
buffer pointer update is sometimes delayed for quite some time.  Occasionally, 
there is no interrupt for more than 2 msec, followed by nine interrupts in 
quick succession to make up for the delay.

We have no evidence that interrupts are ever lost. However, the delayed update 
of the buffer pointer causes problems in our software.

One idea we had was to read the current DMA read/write address directly from 
the SDMA hardware, rather than relying on the interrupt. We were unsuccessfully 
looking at the file imx-sdma.c in order to find this information.

In summary, we need to know the DMA's read/write address when the interrupt is 
triggered, with no or very little delay.

Any pointers would be greatly appreciated.  Thank you!

Ryan Wilkins


Reply via email to