平台 | 内核版本 | 安卓版本 |
---|---|---|
RK3399 | Linux4.4 | Android7.1 |
文章目录
Codec Block Diagram
codec
硬件框图如下(ES8323
)
录音过程(ADC data)
模拟输入从LIN1/RIN1
,经过MUX
到ADC
,通过ASDOUT
发送给对端(CPU I2S
控制器)
放音过程(DAC data
)
数字信号从DSDIN
进入(对端CPU I2S
控制器),发送到DAC
,DAC
通过DACL/DACR
连接到MixL/MixR
,最后输出到LOUT1/ROUT1
基础知识
参考文章
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
中有4
个period
,每当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";
};
};
};
};