On Fri, 21 Mar 2003, Pieter Palmers wrote:

> Hi all,
> 
> I face the following problem: The card I'm writing a driver for (SAM9707
> based) doesn't support any form of DMA transfer. It requires you to
> transfer the PCM data through a 'rep outsw' like mechanism. It raises an
> interrupt when it needs new data. The transfer flow is as follows:
>      1) allocate buffer on card
>      2) start playback
>      3) card raises interrupt
>      4) transfer block of data in interrupt handler
>      5) wait for next interrupt -> 4
> 
> How do I implement this in ALSA? After reading the 'Writing an ALSA
> driver' document a few times, I still cannot figure out how to do this.
> Should I use the copy/silence callbacks? Or can I access the PCM buffer
> from within the interrupt handler? I'm currently using 'concept' code
> from Uros Bizjak, and the interrupt handler looks like this:
> 
> (I removed irrelevant pieces)
> 
>      substream = voice->substream;
>      runtime = substream->runtime;
> 
>      hwoff = runtime->hw_ptr_interrupt;
> 
>      hwbuf = (u16 *) runtime->dma_area;
>             hwbuf += (frames_to_bytes(runtime, hwoff) >> 1);
> 
>      /* word transfer count */
>      wcount = snd_pcm_lib_period_bytes(substream);
>      wcount >>= 1;
> 
>      /* transfer to/from sam9407 buffers */
>      if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
>          sam->writeData16Burst(sam, hwbuf, wcount);
>      else
>          sam->readData16Burst(sam, hwbuf, wcount);
> 
>      snd_sam9407_command(sam, NULL, SAM_END_XFER,
>              &voice->channel, 1, NULL, 0, -1);
> 
>      /* update hardware pointer mirror */
>      voice->hwptr = runtime->hw_ptr_interrupt + runtime->period_size;
> 
>      snd_pcm_period_elapsed(substream);
> 
> But I'm not sure if this is correct.
> 
> What should I use here?
> Is there a card driver that I can refer to that uses the same mechanism?

This code is ok. It might use probably a little bit better interrupt 
resolution to sync the DMA ring buffer with hardware more precisely (I 
mean use the transfer size in interrupt less than the period size).

You don't need to use extra copy and silence when the DMA ring buffer has 
not a special sample order (something other than interleaved and 
non-interleaved).

                                                Jaroslav

-----
Jaroslav Kysela <[EMAIL PROTECTED]>
Linux Kernel Sound Maintainer
ALSA Project, SuSE Labs



-------------------------------------------------------
This sf.net email is sponsored by:ThinkGeek
Welcome to geek heaven.
http://thinkgeek.com/sf
_______________________________________________
Alsa-devel mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/alsa-devel

Reply via email to