音频调试指南
本章主要是关于 I2S 的规格特性,语音基础知识以及添加 codec、调试声卡的说明。
概述
CPU DAI: CPU 侧的数字音频接口,一般是 i2s 接口,控制总线传输
CODEC DAI:即 codec。控制 codec 工作流,提供给 core 层
DAI LINK:绑定 CPU DAI 和 CODEC DAI,指硬件控制器驱动
PLATFORM:指定 CPU 侧的平台驱动,通常是 DMA 驱动,用于传输
DAPM:动态音频电源管理
音频开发说明
一个完整的声卡由 cpu dai、codec dai、platform、sound card 构成。
cpu dai driver:一般是 I2S 接口驱动。
codec dai driver:指的是外接 codec 驱动。
platform driver:通常是 dma 驱动,用于完成对音频数据的管理。
sound card driver:用来负责连接 cpu dai 和 codec dai,比如 sound/soc/hobot/hobot-snd-super-ac-fdx-host.c。
I2S 参数说明
I2S 芯片支持能力说明:
- 通道支持:支持1/2/4/8/16通道;
- 采样率支持:8k/16k/32k/48k/44.1k/96k/192k;
- 采样精度支持:8bit/16bit/24bit/32bit;
- 传输协议支持:I2S/DSP(TDM);
- I2S 支持配置 master 或者 slave 模式;
- I2S 模块的 sysclk 需要为 bclk 的6倍及以上;
- 支持全双工模式。在全双工模式时 sdio0为输入,sdio1为输出,不能更改;
- bclk 输出不能超过25MHz
新增 Codec 说明
添加 codec driver
将所添加的 codec 驱动文件增加到 sound/soc/codecs/目录下。
添加编译选项
- 通过修改 sound/soc/codec/Kconfig 以及 Makefile 添加 codec 驱动的编译配置。
其中 Kconfig 添加内容参考如下:
config SND_SOC_ES7210
tristate "ES7210 Audio Codec"
depends on I2C
Makefile 添加内容参考:
obj-$(CONFIG_SND_SOC_ES7210) += snd-soc-es7210.o
- 通过 menuconfig 修改 config 配置,使能编译
sudo ./mk_kernel.sh menuconfig
执行以上命令后,打开 Kernel Configuration 配置界面,输入CONFIG_SND_SOC_ES7210并使能。
修改 dts
dts 修改一般涉及以下:
- 增加 codec 驱动节点。一般通过 i2c 控制 codec 寄存器,知道 codec 挂载在哪个 i2c 上,在 i2c 对应节点增加 codec 信息即可。参考如下:
i2c5: i2c@39470000 {
es7210_0: es7210_0@40 {
compatible = "MicArray_0";
reg = <0x40>;
#sound-dai-cells = <1>;
channels = <8>;
adc_dev_num = <2>;
status = "okay";
};
};
- 增加 sound card 节点。建立 codec 与 i2s 的 dai link 绑定关系,参考如下:
snd2: snd2 {
status = "okay";
model = "s100snd2";
compatible = "hobot, super-snd-ac-fdx-master";
i2s_mode = <1>;/*1:i2s mode; 7:dsp_a mode*/
work_mode = <1>;/*0:hal-duplex; 1:full-duplex*/
channel_max = <2>;
mclk_set = <24576000>;
dai-link@0 {
dai-format = "dsp_a"; //"i2s"/"dsp_a" //对应SND_SOC_DAIFMT_DSP_A
// bitclock-master; /配置*-master,对应dai_fmt等价于SND_SOC_DAIFMT_CBM_CFM。表示指定codec作为master提供时钟源
// frame-master;
// frame-inversion; //对应SND_SOC_DAIFMT_NB_IF,对应帧同步信号的极性反转。正常情况左声道对应低电平,右声道对应高电平。启动frame-inversion后极性反转
link-name = "s100dailink0";
cpu {
sound-dai = <&i2s0 0>; //数字音频接口,控制总线传输
};
codec {
sound-dai = <&es7210_0 0>; //codec芯片接口
};
};
dai-link@1 {
dai-format = "dsp_a";
link-name = "s100dailink1";
cpu {
sound-dai = <&i2s0 1>;
};
codec {
sound-dai = <&es8156>;
};
};
};
- 另外,在 dts 中增加了 dummy_codec 节点,在没有外部 codec 或 codec 需要单独配置不依赖 alsa 框架的情况下,通过注册绑定虚拟 codec 的声卡设备方式实现用户空间创建设备节点控制 I2S/DMA。