了解、学习Linux声卡驱动,并在Tiny4412上实现声音的播放和录制。
1.声卡基础
1.1 基本概念
记得是初中还是高中物理,里面说过声音是由物体振动产生,然后通过空气传播到耳朵里。
把耳朵换成咪头,声音振动咪头,改变了咪头两端的电压,ADC再采集电压,就记录了音频数据;反之,将记录的数据通过DAC转成电压,通过运放放大,就使喇叭振动就产生了声音。
这整个过程,涉及声音质量的参数有三个:
- 采样频率:就是单位时间内ADC采集的次数,一般是8kHz~96kHz;
- 转换精度:就是每次ADC采集或者DAC转换的精度。一般有8bit、16bit、24bit;
- 通道数:就是单声道、双声道;
在Linux声卡驱动的发展中,最开始使用的声卡驱动框架是OSS(Open Sound System)。
从2.6版本开始,ALSA(Advanced Linux Sound Architecture)成为Linux内核中默认的标准音频驱动程序集,OSS则被标记为废弃。
OSS和ALSA的主要区别:
- OSS:提供基于ioctl等原始编程接口访问设备;
- ALSA:除了提供基于ioctl等原始编程接口,还专门为简化应用程序的编写提供了相应的函数库,相对OSS更加方便;
后面编写的驱动,将采用ALSA框架。
1.2音频编解码芯片
一般来说,大多数SOC都不包含音频的转换,可能是因为功耗、模数干扰等考虑,因此大多数都是外接了一个音频编解码芯片(Codec)。
音频文件从Flash加载到RAM中,再由DMA将其通过I2S发送给Codec,再由Codec的DAC变成模拟信号,驱动功放使喇叭播放声音;同时,SOC通过I2C(有些Codec不是I2C,而是其它的接口)设置Codec的寄存器,调整声音大小等。
因此,整个声卡框架涉及的驱动可能有SOC的DMA、I2S、I2C以及Codec驱动。
2.硬件接口
Tiny4412的声卡部分原理图如下,所采用的codec芯片为WM8960,该电路大致可分为四部分:
① IIS接口,负责Exynos4412和WM8960之间的数据传输
Function | SOC | Codec | Note |
---|---|---|---|
Date | Xi2sCDCLK0 | MCLK | 系统时钟 |
Xi2sSCLK0 | BCLK | 数据时钟 | |
Xi2sLRCK0 | DACLRC | 左右声道切换 | |
Xi2sSDO0_0 | DATDAT | 数据输出(播放) | |
Xi2sSDI0 | ADCDAT | 数据输入(录音) |
② I2C接口,负责Exynos4412对WM8960寄存器的配置
Function | SOC | Codec | Note |
---|---|---|---|
Control | Xi2cSCL0 | SCLK | I2C时钟 |
Xi2cSDA0 | SDIN | I2C数据 |
③ 录音
采用咪头和耳机接口进行录音;
④ 播放
采用耳机接口播放音频,另外还有一个耳机插入检测Earphone_detect
;