文章目录
CPU | 内核版本 |
---|---|
RK3588 | Linux5.10 |
一、ES8388芯片简介
ES8388是一款高性能、低功耗、低成本的立体声音频编解码器,它由2-chADC、2-chDAC、麦克风放大器、耳机放大器、数字音效和模拟混频和增益功能组成。
1.1 ES8388特性
ADC:
24位,8 khz至96 khz采样频率
95dB动态范围,95dB信噪比,-85dB THD+N
带麦克风放大器的立体声或单声道麦克风接口
自动电平控制和噪声门
2到1模拟输入选择
各种模拟输入混合和增益
DAC
24位,8 khz至96 khz采样频率
96 dB动态范围,96 dB信噪比,-83dB THD N
40 mw耳机放大器,无噪音,无阻塞选项
立体增强
低音和高音
各种模拟输出混合和增益
Low Power
1.8V至3.3V操作
7兆瓦回放;16兆瓦回放和记录
System*
I2C或SPI uC接口
256Fs, 384Fs, USB 12 MHz or 24 MHz
主从串行口
I2S,左对齐,DSP/PCM模式
1.2 ES8388框图
通过框图,可以查看音频数据的输入输出路径:
1)LIN1 LIN2 RN1 RN2作为输入端,可以与mic等输入设备的连接器相连。
音频数据输入路径:
首先经过mux多路选择(Lin1 LIN2 LIN1-R1N1 LIN2-RIN2,四选一),已左声道为例输入的左声道支持两路LIN1、LIN2 或 LIN1-RIN1、 LIN2-RIN2立体输入源。
接下来经过mic amp,及前置放大器,将采集的声音进行放大处理。
mux多路选择到ADC,将模拟音频信号转成数字信号,完成模数转换,通过Serial audio data DSDIN 走i2s转给SOC
音频输出路径
音频的输出路径较为简单,从ASDOUT —> DAC —> OUT
二、Linux 音频驱动框架
在Linux体系下,一个sound card驱动,包括3个部分的驱动 Machine、soc/platform、codec,其中soc/platform平台驱动一般由soc厂商提供,所以开发人员通常需要完成Machine和codec的driver。
2.1.Machine
Machine驱动负责platform和codec之间的耦合,处理机器特有的一些控件和音频事件。
只有platform和codec驱动时不饿能工作的,必须通过Machine把platform和codec结合在一起才能完成音频处理工作。
对应的驱动代码:sound/soc/rockchip/rockchip_multicodecs.c
static const struct of_device_id rockchip_multicodecs_of_match[] = {
{
.compatible = "rockchip,multicodecs-card", },
{
},
};
MODULE_DEVICE_TABLE(of, rockchip_multicodecs_of_match);
static struct platform_driver rockchip_multicodecs_driver = {
.probe = rk_multicodecs_probe,
.driver = {
.name = DRV_NAME,
.pm = &snd_soc_pm_ops,
.of_match_table = rockchip_multicodecs_of_match,
},
};
rockchip_multicodecs_driver会通过rockchip_multicodecs_of_match查找到在dts中注册的sound资源节点并进行sound card注册。
2.2 platform
soc/platform侧驱动由soc厂商提供,驱动代码sound/soc/soc-core.c
platform驱动的主要作用是完成音频数据的管理,通过CPU的数字音频接口(DAI)把音频数据传送给codec进行处理,由codec输出驱动耳机或喇叭。
platform驱动分为两个部分:snd_soc_platfrom_driver和snd_soc_dai_driver。
snd_doc_platform_driver负责管理音频数据,把音频数据通过dma或其它方式传送到cpu dai中。
snd_soc_dai_driver主要完成cpu一侧的dai参数配置,同时也会把必要的dma等参数与snd_soc_platform_driver进行交互。
2.3 codec
codec驱动:sound/soc/codecs/es8323.c
关注snd_soc_dai_driver和snd_soc_codec_driver
es8323_dai
static struct snd_soc_dai_driver es8323_dai = {
.name = "ES8323 HiFi", /*dai驱动名字,需要和.codec_dai_name一致*/
.playback = {
.stream_name = "Playback",
.channels_min = 1,
.channels_max = 2,
.rates = es8323_RATES,
.formats = es8323_FORMATS,
},
.capture = {
.stream_name = "Capt