rk3566 android11 配置声卡(es7202 ADC)

平台:rk3566 android11

kernel : 4.19.172

audio codec : es7202 ADC ,该芯片只是一个编码芯片,没有DAC功能,即没有解码功能,音频信号不能从该codec解码输出,导致音频就只能从板载rk817 解码输出,该芯片CPU端是利用的PDM协议,而一般的用的是i2s的协议,我们一般常用的协议有:i2c、PDM、PCM、TDM等。

PDM协议简述:

一种用数字信号表示模拟信号的调制方法

PCM使用等间隔采样方法,将每次采样的模拟分量幅度表示为N位的数字分量(N = 量化深度),因此PCM方式每次采样的结果都是N bit字长的数据。

PDM,只有2根线,传音乐,编码方式和I2S不同。

PDM方式表示的正弦波

PDM格式的音频信号可以在比如LCD屏这样Noise干扰强的电路附近走线(等于没说,这里指数字信号抗干扰能力相比于模拟信号更强,同样PCM也具有此优势)

基于PDM的架构不同于I2S和TDM之处在于,抽取滤波器(Decimation Filter)不在发送设备,而在接收设备内部。源端输出是原始的高采样率(oversample)调制数据,如Sigma-Delta调制器的输出,而不是像I2S中那样的抽取数据。基于PDM接口的应用降低了发送设备的复杂性,由于作为接收设备的CODEC内部集成抽取滤波器,因此系统整体复杂度大大降低。对于数字麦克风而言,通过使用面向CODEC或处理器制造的更精细硅工艺,而非传统麦克风使用的工艺,可以实现更高效率的抽取滤波器。

音频架构重点扫盲:

Hardware Driver:音频硬件设备驱动,由三大部分组成,分别是 Machine、Platform、Codec。

ASoC音频驱动由三部分构成:platform,codec,machine。

machine 是包含 platform 与 codec  这两者之间通过i2s 连接控制, platform (cpu_dai) <----->codec_dai

Platform:Platform驱动程序包括音频DMA引擎驱动程序,数字音频接口(DAI)驱动程序(例如I2S,AC97,PCM)以及该平台的任何音频DSP驱动程序。
cpu dai:在嵌入式系统里面通常指CPU的I2S、PCM总线控制器,负责将音频数据从I2S tx FIFO搬运到CODEC(回放的情形,录制则方向相反)。cpu_dai通过snd_soc_register_dai()来注册。注:DAI是Digital Audio Interface的缩写,分为cpu_dai和codec_dai,这两者通过I2S/PCM/pdm总线连接;
AIF是Audio Interface的缩写,一般分为I2S和PCM接口。
pcm dma:负责将dmabuffer中的音频数据搬运到I2S tx FIFO,这部分的逻辑比较复杂,以下几篇会对它详细阐述。音频dma驱动通过snd_soc_register_platform()来注册。值得留意的是:某些情形下是不需要dma操作的,比如Modem和CODEC直连,因为Modem本身已经把数据送到PCM FIFO了,这时只需启动codec_dai接收数据即可;该情形下,Machine驱动dai_link中需要指定.platform_name = “snd-soc-dummy”, 这是虚拟出来的platform驱动,实现见sound/soc/soc-utils.c。

Codec:Codec驱动程序独立于平台,包含音频控件,音频接口功能,编解码器DAPM定义和编解码器IO功能。如果需要,该类可扩展至BT,FM和MODEM IC。Codec类驱动程序应该是可以在任何体系结构和机器上运行的通用代码。
对于Playback来说,userspace送过来的PCM数据是经过抽样量化出来的数字信号,在codec经过DAC转换成模拟信号送到外放耳机输出,这样我们就可以听到声音了。Codec字面意思是编解码器,但芯片里面的功能部件很多,常见的有AIF、DAC、ADC、Mixer、PGA、Line-in、Line-out,有些高端的codec芯片还有EQ、DSP、SRC、DRC、AGC、Echo canceller、Noise suppression等部件。


Machine:Machine 驱动程序充当描述和绑定其他组件驱动程序以形成ALSA“声卡设备”的粘合剂。它可以处理任何机器特定的控制和机器级音频事件(例如,在播放开始时打开放大器)。
Machine 可以理解为对开发板的抽象,开发板可能包括多个声卡,对应Machine部分包含多个link。
Machine 指某一款机器,它把cpu_dai、codec_dai、modem_dai各个音频接口通过定义dai_link链结起来,然后注册snd_soc_card。和上面两个不一样,Platform和CODEC驱动一般是可以重用的,而Machine有它特定的硬件特性,几乎是不可重用的。所谓的硬件特性指:DAIs之间的链结;通过某个GPIO打开Amplifier;通过某个GPIO检测耳机插拔;使用某个时钟如MCLK/External OSC作为I2S、CODEC模块的基准时钟源等等。

platform驱动: platform驱动为cpu部分的控制代码,其抽象出两个结构体snd_soc_dai_driver和snd_soc_platform_driver;

codec驱动: codec驱动是编解码器部分的控制代码,其抽象出两个结构体分别为snd_soc_dai_driver和snd_soc_codec_driver;

machine驱动: machine驱动是控制管理platform和codec之间的连接匹配,管理控件(controls)、部件(widgets)以及routes,其抽象的结构体为snd_soc_card。
Platform驱动程序包括音频DMA引擎驱动程序(PCM DMA),数字音频接口(CPU DAI)驱动程序(例如I2S,AC97,PCM)以及该平台的任何音频DSP驱动程序。其中常用的是CPU DAI和PCM DMA驱动。

CPU DAI:在嵌入式系统里面通常指CPU的I2S、PCM总线控制器。对于playback,负责将音频数据从I2S TX FIFO搬运到CODEC(Capture则方向相反)。cpu_dai通过snd_soc_register_dai()来注册。

PCM DMA:对于playback,负责将dma buffer中的音频数据搬运到I2S TX FIFO(Capture则方向相反)。音频dma驱动通过snd_soc_register_platform()来注册。

配置:

&i2c3 {
	status = "okay";
	clock-frequency = <400000>;
	es7202: es7202@37 {
		status = "okay";
		#sound-dai-cells = <0>;
		compatible = "ES7202_PDM_ADC_1";
		reg = <0x37>;
	};
	
};

&pdm {
    status = "okay";
    #sound-dai-cells = <0>;
    rockchip,path-map = <1 0 3 2>;//录音声道顺序
    clocks = <&cru MCLK_PDM>, <&cru HCLK_PDM>;
    clock-names = "pdm_clk", "pdm_hclk";
    pinctrl-names = "default";
    pinctrl-0 = <&pdmm0_clk1
                 &pdmm0_sdi1>;
};

	es7202-sound {
		status = "okay";
		compatible = "simple-audio-card";
		simple-audio-card,format = "pdm";
		simple-audio-card,name = "rockchip,es7202";
		simple-audio-card,mclk-fs = <256>;
		simple-audio-card,cpu {
			sound-dai = <&pdm>;
		};
		simple-audio-card,codec {
			sound-dai = <&es7202>;
		};
	};

audio codec 调试命令:

通过 proc fs 确认声卡注册成功
# cat /proc/asound/cards
0 [rockchiprk809co]: rockchip_rk809- - rockchip,rk809-codec
rockchip,rk809-codec
7 [Loopback
]: Loopback - Loopback
Loopback 1
# ls /dev/snd/
by-path controlC7 pcmC0D0p pcmC7D0p pcmC7D1p
controlC0 pcmC0D0c pcmC7D0c pcmC7D1c timer

/proc/asound # cat   devices                                                                                                

  1: : sequencer
  2: [ 0- 0]: digital audio playback
  3: [ 0- 0]: digital audio capture
  4: [ 0]   : control
  5: [ 1- 0]: digital audio capture
  6: [ 1]   : control
  33:        : timer

 注意:厂家的es7202驱动是有问题的,如果你的pdm 数据线是直接回到的CPU内部,是需要修改驱动的,我上传到资源中。如有需要请自行下载。

附上硬件原理图:

        

 

猜你喜欢

转载自blog.csdn.net/qq_48709036/article/details/123730413