Chinaunix首页 | 论坛 | 博客
  • 博客访问: 271499
  • 博文数量: 42
  • 博客积分: 485
  • 博客等级: 下士
  • 技术积分: 482
  • 用 户 组: 普通用户
  • 注册时间: 2011-05-26 19:33
文章分类
文章存档

2017年(1)

2016年(4)

2015年(8)

2014年(3)

2013年(4)

2012年(3)

2011年(19)

我的朋友

分类: LINUX

2012-12-24 10:53:20

一、音频问题调试
问题描述:使用一小段音频数据,不断的重复播放,会导致声卡不再工作,从上层看就是写声卡数据的接口处阻塞住了,如果把alsa的播放模式改为非阻塞模式,则会失败返回,且系统reboot都不可用,只有重新上电才可用;从底层驱动看,出问题之后,音频数据传输的DMA没有产生中断(这个DMA通道是将内存音频数据搬移到DAI/SAIF接口的输出数据寄存器上),导致音频数据环形缓冲区满了,上层看来就是阻塞那了。
问题解决:依以上描述,可判断应该是CPU的I2S模块或者DMA模块出现了问题,且经过验证通过寄存器软复位这些模块都无法恢复正常。最后BSP支持修改了代码,在每次close音频的时候,都需复位一次DMA通道即不会出现此问题。
 
二、录音问题调试
问题描述:系统的播放会影响到录音功能,即在播放之后,有时会导致录音出现很大的背景噪声(可隐约听到环境声音),只要reboot系统即可恢复正常。
问题解决:最终验证,这个问题是因为每次开始播放的时候,BSP代码中都会去复位一次SAIF0模块,而我们的系统是播放(SAIF0)和录音(SAIF1)的I2S的时钟都是共用SAIF0的,而系统启动后I2S的时钟一直都是开启的,这个复位过程可能会导致SAIF1的I2S数据采样对时钟产生了不同步,导致采样数据产生了偏移。为什么要在播放时进行复位SAIF0的工作呢?按BSP的注释说明,似乎是为了解决问题一的音频阻塞问题,但他们最终给出的方案证明与此无关,只是DMA出现了问题,而这里的代码又未恢复导致了这个问题。
 
三、平台中的音频驱动框架理解(kernel/sound/)
从应用层往下看,应用层->alsa的应用层动态库->alsa驱动(其中支持模拟的OSS)->底层音频驱动接口(BSP相关的部分);BSP相关部分主要含有3个方面,**-dai.c/saif.c,**-pcm.c,**-es8328e.c/sgtl5000.c,其中,dai接口是负责管理CPU上的I2S接口,es8328e/sgtl5000.c负责的是管理这此声卡芯片的寄存器配置,而pcm主要负责的是音频内存的管理,包括DMA的配置,操作等;以上三者通过系统提供的结构体(snd_soc_dai,snd_soc_platform)抽象出相应的对象,最终pcm注册成platform,dai在一个统一的地方(如**-devb.c)将二者注册关联到一个声卡设备上并注册这个设备。
阅读(3202) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~