了解、学习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