[RK3399][Android7.1] 调试笔记 : ES8323 基础知识及设备树相关配置

平台 内核版本 安卓版本
RK3399 Linux4.4 Android7.1

Codec Block Diagram

codec硬件框图如下(ES8323)

在这里插入图片描述

录音过程(ADC data)

模拟输入从LIN1/RIN1,经过MUXADC,通过ASDOUT发送给对端(CPU I2S控制器)

放音过程(DAC data)

数字信号从DSDIN进入(对端CPU I2S控制器),发送到DAC,DAC通过DACL/DACR连接到MixL/MixR,最后输出到LOUT1/ROUT1

基础知识

参考文章

Linux ALSA 音频系统:逻辑设备篇

Frame & Period

在这里插入图片描述

Sample 样本长度,音频数据最基本的单位,常见的有8位和16位
Channel 声道数,分为单声道mono和立体声stereo
Frame 帧,构成一个完整的声音单元,所谓的声音单元是指一个采样样本,Frame = Sample * channel
Rate 又称 sample rate,采样率,即每秒的采样次数,针对帧而言
Period Size 周期,每次硬件中断处理音频数据的帧数,对于音频设备的数据读写,以此为单位
Buffer Size 数据缓冲区大小,这里指runtime的buffer size一般来说 buffer_size = period_size * period_count, period_count 相当于处理完一个 buffer 数据所需的硬件中断次数

下面一张图直观的表示buffer/period/frame/sample之间的关系

在这里插入图片描述
这个buffer中有4period,每当DMA搬运完一个period的数据就会出生一次中断,因此搬运这个buffer中的数据将产生4次中断.ALSA为什么这样做?

因为数据缓存区可能很大,一次传输可能会导致不可接受的延迟,为了解决这个问题,alsa 把缓存区拆分成多个周期,以周期为单元传输数据


首先看asoc的总体框图:
在这里插入图片描述

Codec驱动(es8323.c)

硬件连接

在这里插入图片描述

SPK_CTL连接GPIO7_B7

在这里插入图片描述

HP_CTL连接GPIO7_A4

在这里插入图片描述

HP_DET连接GPIO0_B5

在这里插入图片描述

DeviceTree Describe

	&i2c2 {
	es8323: es8323@10 {
				compatible = "es8323";
				reg = <0x10>;
				spk-con-gpio = <&gpio7 GPIO_B7 GPIO_ACTIVE_HIGH>;
				hp-con-gpio = <&gpio0 GPIO_B5 GPIO_ACTIVE_HIGH>;
				hp-det-gpio = <&gpio7 GPIO_A4 GPIO_ACTIVE_HIGH>;
			};
	};

Machine驱动(rk_es8323.c rockchip平台)

DeviceTree Describe

	/ {
		rockchip-es8323 {
			compatible = "rockchip-es8323";
			dais {
				dai0 {
					audio-codec = <&es8323>;
					audio-controller = <&i2s>;
					format = "i2s";
				};
			};
		};
	};

Platform驱动(rk_i2s.c rockchip平台)

DeviceTree Describe

	i2s: rockchip-i2s@0xff890000 {
			 compatible = "rockchip-i2s";
			 reg = <0xff890000 0x10000>;
			 i2s-id = <0>;
			 clocks = <&clk_i2s>, <&clk_i2s_out>, <&clk_gates10 8>;
			 clock-names = "i2s_clk","i2s_mclk", "i2s_hclk";
			 interrupts = <GIC_SPI 85 IRQ_TYPE_LEVEL_HIGH>;
			 dmas = <&pdma0 0>, <&pdma0 1>;
			 dma-names = "tx", "rx";
			 pinctrl-names = "default", "sleep";
			 pinctrl-0 = <&i2s_mclk &i2s_sclk &i2s_lrckrx &i2s_lrcktx &i2s_sdi &i2s_sdo0 &i2s_sdo1 &i2s_sdo2 &i2s_sdo3>;
			 pinctrl-1 = <&i2s_gpio>;
		 };

从datasheet里Address Mapping可以找到I2S控制器被映射到的位置

在这里插入图片描述

中断号(SPI[85])

在这里插入图片描述

DMA编号(tx[0], rx[1])

在这里插入图片描述

I2S寄存器信息,32bit,步进4

在这里插入图片描述

Codec驱动(es8316.c)

硬件连接(同ES8323)

DeviceTree Describe

	&i2c2 {
	es8316: es8316@10 {
				compatible = "es8316";
				reg = <0x10>;
				spk-con-gpio = <&gpio7 GPIO_B7 GPIO_ACTIVE_HIGH>;
				hp-con-gpio = <&gpio0 GPIO_B5 GPIO_ACTIVE_HIGH>;
				hp-det-gpio = <&gpio7 GPIO_A4 GPIO_ACTIVE_HIGH>;
			};
	};

Machine驱动(rk_es8316.c rockchip平台)

DeviceTree Describe

	/ {
		rockchip-es8316 {
			compatible = "rockchip-es8316";
			dais {
				dai0 {
					audio-codec = <&es8316>;
					audio-controller = <&i2s>;
					format = "i2s";
				};
			};
		};
	};
发布了247 篇原创文章 · 获赞 93 · 访问量 12万+

猜你喜欢

转载自blog.csdn.net/qq_33487044/article/details/88828202