[alsa-devel] Questions about writing a new ALSA driver for a very limitted device

Tim Harvey tim_harvey at yahoo.com
Thu Apr 12 03:18:54 CEST 2007


Greetings,

I'm setting out to write an ALSA driver for a very limited device thats behind
a PLD.  The actual codec is a uda1380 and does 16bit MSB stereo encode/decode. 
The way the device is driven the sampling rate is limited to 8KHz and data
transfer to/from the device I have to handle manually.

I've read over the 'writing an ALSA driver' tutorial and have started the
driver but have run into a few questions:

 - for the specs I've given above: 8000Hz sampling rate, 16bit stereo MSB
samples does the following snd_pcm_hardware_t look right?:

static snd_pcm_hardware_t my_playback_hw = {
        .info = (SNDRV_PCM_INFO_MMAP |
                 SNDRV_PCM_INFO_INTERLEAVED |
                 SNDRV_PCM_INFO_BLOCK_TRANSFER |
                 SNDRV_PCM_INFO_MMAP_VALID),
        .formats =          SNDRV_PCM_FMTBIT_U16_BE,  // is this 16bit MSB?
        .rates =            SNDRV_PCM_RATE_8000,      // seems redundant?
        .rate_min =         8000,
        .rate_max =         8000,
        .channels_min =     2,
        .channels_max =     2,
        .buffer_bytes_max = 32768,
        .period_bytes_min = 4096,
        .period_bytes_max = 32768,
        .periods_min =      1,
        .periods_max =      1024,
};

 - I'm a little confused at how to deal with copying data from/to the device. 
It looks like I would implement the copy callback and copy the passed buffer to
the device in the device specific manner I need to (playback), but I'm not
clear where to put data that I receive from the device (capture).  I notice
that when the hw_params callback is called a dma buffer has been created by
ALSA in the substream->runtime struct.  I assume this is created based on hte
buffer_bytes_max field above and I'm to copy data to this buffer?  How do I
know where to copy it within the buffer and what data ALSA has already consumed
from the buffer?

 - I might need to create an intermediate buffer between ALSA's rather large
buffers and my hardware buffer.  Is there any driver that I could look at that
does this?  The tutorial talks about the vxpocket driver but that code looks
very foriegn from the rest of the ALSA drivers.

 - I'm not sure I understand what the 'period' is about.  Its clear to me that
I need to call snd_pcm_period_elapsed() periodically from either an IRQ or
other timed callback, but I'm not clear what the hardware pointer is or how
that converts to 'frames' and 'periods'.

 - in general, if my hardware device only allows 16bit MSB 8KHz, does ALSA
provides a mechanism for converting data from other formats?

Thanks for any pointers,

Tim


More information about the Alsa-devel mailing list