OK, 

I've been stuck for a month now writing this driver. I am hoping I can
make some progress over the holiday break, but I think I need someone to
hold my hand to get started. I am not even sure what to ask.

I am writing a driver for the Gadget Labs Wave/4. This ISA card has no
DMA. To use PCM DAC, I want to simply write interleaved PCM values to a
port.

There is also a port to set the level of data at which an interrupt is
generated.

I thought I would be able to just define my own pcm_ops->copy routine,
which does copy_from_user for each frame and two outw() to put the value
in the card: (questions follow)

/* Maximum naivete follows */
snd_scache_playback_copy(snd_pcm_substream_t *substream,
                         int channel,
                         snd_pcm_uframes_t pos,
                         void *src, 
                         snd_pcm_uframes_t count) 
{
        u16 reg;
        int i;
        int device = substream->pcm->device;
        u16 *data = src;
        u16 outdata[2];
        scache_t *scache = _snd_pcm_substream_chip(substream);
        snd_pcm_runtime_t *runtime = scache->playback_substream[device]->runtime;
        
        if (device) {
          reg=SC_DAC0_DATA;
        } else {
          reg=SC_DAC1_DATA;
        }

        for (i = 0; i < count ; i++ ) {
          copy_from_user(outdata, data+i+i,   4); /* Four byte frame */

          outw(outdata[0],scache->iobase+reg); /* left */
          outw(outdata[1],scache->iobase+reg); /* right */
        }

        return 0;
}

Q1. Is this the right way to do this? I'm hoping someone with experience
with drivers will say, "no, no, you should be doing ____________" and then
explain a little the concept involved.

Q2. Can I sidestep defining the pcm_ops->pointer operation? There is a
register I can read to find the current depth of the soundcard's FIFO. I
discovered last night that it doesn't stop at 0 when the buffer empties
but wraps around. I don't want to deal with this until my basic driver
works.

Q3. Can someone give me a typical sequence of how the pcm_ops operations
are called when an application wants to write some data to the
soundcard? Paul Davis described what they do ( I put the message at
http://mlug.missouri.edu/~markrages/wiki/index.php?snd_pcm_ops ). I still
don't see the big picture though.

When I asked before Jaroslav gave me this response: 
> Sure, everything what you need is emulation of DMA transfer. Transfer
> the required count of samples (period_size) and then notify the high
> layer that trasfer has been finished (period_done). You can do this
> trasfer via cards interrupts (interrupt when FIFO is filled) or use a
> timer source.

I think my answer lies in what he said, I just can't figure out what I'm
supposed to do. Can someone please expand on his answer (use small words
:) ) 

Regards,
Mark
[EMAIL PROTECTED]







_______________________________________________
Alsa-devel mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/alsa-devel

Reply via email to