Dear Sir:
您好!
我在移植ALSA时,出现以下错误:
playback write error(DMA or IRQ trouble?), I2S 没有data出来,无声音输出!
查看流程发现没有正确map dma buffer, 即.mmap = snd_pcm_mmap中没有跑流程snd_pcm_mmap_data(),而是走case SNDRV_PCM_MMAP_OFFSET_STATUS。
static int snd_pcm_mmap(struct file *file, struct vm_area_struct *area)
{
printk("(+)%s[in], line:%d\n", __func__, __LINE__);
struct snd_pcm_file * pcm_file;
struct snd_pcm_substream *substream;
unsigned long offset;
pcm_file = file->private_data;
substream = pcm_file->substream;
if (PCM_RUNTIME_CHECK(substream))
return -ENXIO;
offset = area->vm_pgoff << PAGE_SHIFT;
switch (offset) {
case SNDRV_PCM_MMAP_OFFSET_STATUS:
if (pcm_file->no_compat_mmap)
return -ENXIO;
printk("(-)%s[out], line:%d\n\n", __func__, __LINE__);
return snd_pcm_mmap_status(substream, file, area); //return -6
case SNDRV_PCM_MMAP_OFFSET_CONTROL:
if (pcm_file->no_compat_mmap)
return -ENXIO;
printk("(-)%s[out], line:%d\n", __func__, __LINE__);
return snd_pcm_mmap_control(substream, file, area);
default:
printk("(-)%s[out], line:%d\n", __func__, __LINE__);
return snd_pcm_mmap_data(substream, file, area); //没有正确map dma buffer?
}
return 0;
}
/*
* don't support mmap for status and control records.
*/
static int snd_pcm_mmap_status(struct snd_pcm_substream *substream, struct file *file,
struct vm_area_struct *area)
{
return -ENXIO; // return -6
}
导致出现上述问题的原因有可能是什么,各位如有深究过alsa, 期待您的回复!