主题 : [linux声卡驱动之ALSA移植][三星s5pv210移植kernel 3.8.13, codec是wm8960 ] 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 123066
精华: 0
发帖: 4
金钱: 20 两
威望: 4 点
综合积分: 8 分
注册时间: 2016-03-01
最后登录: 2016-08-20
楼主  发表于: 2016-07-20 20:22

 [linux声卡驱动之ALSA移植][三星s5pv210移植kernel 3.8.13, codec是wm8960 ]

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, 期待您的回复!