[alsa-devel] Problem with underrun on new CS42448 x2 driver
Mike Frysinger
vapier at gentoo.org
Fri Aug 27 22:37:45 CEST 2010
On Thu, Aug 26, 2010 at 14:06, Adam Rosenberg wrote:
> Thank you for the reply. I emailed Barry Song on July 30th to request some
> help moving to the new ASoC standards but received no response.
developers shouldnt be e-mailed directly ... it isnt uncommon for them
to simply be punted. this is why we have mailing lists and forums.
> I began writing this driver on the Blackfin uClinux 2009 release and based
> it on the AD1836 and AD1938 drivers. I am now using the Blackfin SVN trunk
> and have found that the driver model was changed to ASoC. It is not
> apparent how I would create a driver that supports two chips off of the same
> SPORT using the ASoC framework.
>
> The best I could do was use the same SPORT driver that the ASoC code uses
> (bf5xx-sport.c) so that I was at least up-to-date in that area. I had to
> modify that driver so that it would support the secondary data lines of the
> SPORT. I found that the driver did not function well in 2D DMA mode so I
> have to keep my period size below 64kb. There is also a problem with
> starting Rx and Tx that causes the DMA data to be placed into the SPORT
> multichannel window incorrectly. I added a function to the SPORT driver
> yesterday that can work around this problem by starting both Rx and Tx as
> normal then stopping the SPORT and restarting it like this:
>
> int sport_start_both(struct sport_device *sport)
> {
> sport_tx_start(sport);
> msleep(1); // is this needed?
> sport_rx_start(sport);
> msleep(1); // is this needed?
> sport_stop(sport);
> msleep(1); // is this needed?
> sport_start(sport);
> return 0;
> }
> EXPORT_SYMBOL(sport_start_both);
>
> This ensures that the data from the DMA buffer is properly loaded into the
> SPORT multichannel window for both the Rx and Tx data lines. If it is not
> done this way it seems that one of them is always being filled incorrectly.
> This may have sometime to do with the fact that I have to enable the
> secondary data lines but there is no clear explanation for why that would
> have an effect.
>
> I have not entered any constraints into the driver because there really
> should be no need. The driver just copies whatever PCM data that is
> provided directly to the DMA buffer. It seems that the problem occurs
> because the location to copy to is based on the pos suggested by the
> callback function. I am still finding it difficult to tell how ALSA decides
> there is an underrun or overrun. I am definitely trying to read or write
> the pcm data fast enough but it seems as though I get these errors anyway.
>
> Questions:
> 1. How do I implement an ASoC-style driver that supports multiple chips
> when they are connected to the same SPORT but use different SPI chip
> selects?
> 2. How do I define the proper buffer/period size constraints or should I
> ignore the suggested position during copy operations and just keep track of
> the position within the DMA buffer myself?
> 3. Can you suggest a good way to debug underrun/overrun problems?
i dont really know ASoC/SPORTs, so we'd have to get someone to look into it
-mike
More information about the Alsa-devel
mailing list