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 -> 4How 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?
Pieter
------------------------------------------------------- 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
