linux下ALSA音频驱动软件开发

最近一直忙于Linux下ALSA音频驱动的开,作了一次专题讨论,现将部分内容贴出来大家分享一下。 

 

内容提要
一、音频相关的基础知识
•二、Linux下音频驱动开发模型
•三、socxx+ WM8993驱动实例分析
•四、总结
五、 Question& Discussion

 

音频相关的基础知识
  ---- 采样、量化

 

 
•1、采样频率
•   常用 32kHz、 44.1kHz、 48kHz。
•2、量化精度
  指对采样数据分析的精度,精度越高,声音就越逼真。常用8位、16位、24位。 
  
音频相关的基础知识 ---- 音频设备硬件接口  
•PCM接口:由时钟脉冲BCLK,帧同步信号FS及接收数据DR和发送数据DX组成。(先发MSB,后LSB)。
•IIS接口:在一个称为LRCLK的信号机制中经过多路转换,将两路音频信号变成单一的数据队列。LRCLK为高时,左声道数据被传输。
AC97接口:AC97不只是一种数据格式,还具有控制功能。数据帧以SYNC脉冲开始,包括12个20位时间段及16位tag段,共256个数据序列。 
 
音频相关的基础知识---- 音频放大器    
A类放大器拓扑结构使用一只晶体管作为直流(DC)电流源,能够提供扬声器需要的最大音频电流。
B类放大器拓扑结构没有DC偏置电流,所以功耗大大减少。
AB类放大器是A类放大器和B类放大器的组合折衷,它也使用DC偏置电流,但它远小于单纯的A类放大器。
•D 放大器可以接收数字输入而省去D/A变换,它的最大特点就是它能够在保持最低的失真情况下得到最高的效率。
 
Linux下音频驱动开发模型  
•OSS(Open Sound System):由一套完整的内核驱动程序模块组成,可以为绝大多数声卡提供统一的编程接口。最早、未完全开源商业产品。
ALSA(Advanced Linux Sound Architecture) :除了像OSS那样,还专门为简化应用程序的编写提供了相应的函数库,ALSA函数库比OSS提供的基于ioctl的原始编程接口使用起来要更加方便一些。
 
DAPM:
 
•1.Codec domain - VREF, VMID (core codec and audio power) Usually controlled at codec probe/remove and suspend/resume, although can be set at stream time if power is not needed for sidetone, etc. 在sound/soc/codecs目录下,wm8993.c
•3.Path domain - audio susbsystem signal paths Automatically set when mixer and mux settings are changed by the user. e.g. alsamixer, amixer. ALSA lib提供各种操作mixer或者Mux的函数,细微的切换由ALSA application以上来完成。(wm_hubs.c, rootfs里的lib_codec_path.c)
•4.Stream domain - DACs and ADCs. Enabled and disabled when stream playback/capture is started and stopped respectively. e.g. aplay, arecord.在sound/soc/socxx下,socxx-pcm.c.
2.Platform/Machine domain - physically connected inputs and outputs Is platform/machine and user action specific, is configured by the machine driver and responds to asynchronous events e.g when HP are inserted.在sound/soc/socxx下,socxx_wm8993.c 
  
•PCM设备接口:socxx-pcm.c      
socxx_pcm_open():打开PCM设备,设置硬件参数  
socxx_pcm_close():关闭PCM设备
socxx_pcm_ioctl() :PCM设备的复位,获取设备信息
socxx_pcm_hw_params():申请DMA通道,注册中断                      callback( playback or capture)
socxx_pcm_hw_free():释放DMA通道
socxx_pcm_prepare():根据当前的配置信息设置硬件
socxx_pcm_trigger():DMA传输启动和停止
socxx_pcm_pointer():获取当前硬件指针
socxx_pcm_mmap():内存地址映射,无需I/O拷贝
socxx_pcm_new():创建一个PCM设备
 
•Codec部分:wm8993.c
•Wm8993_i2c_attach():注册codec、设置输出mixer、HPOUT管理、时钟配置、MIC配置
•Wm8993_i2c_detach():注销codec、dai,释放资源
•驱动控制接口的结构体wm8993_snd_controls[ ], line:820
•Class W模式只支持DAC ->headphone
•设置寄存器值可以只更新部分位
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值