RK3576+es8388
正在施工
一直以为懂了这部分了,还是次次调试次次卡。
硬件连接
SCLK → 连接到主控的I2S_BCLK引脚(音频数据传输时钟)
LRCK → 连接到主控的I2S_LRCK/FS引脚(帧同步时钟)
MCLK → 连接到主控的I2S_MCLK引脚(主时钟)
SDIN → 连接到主控的I2S_SDO引脚(播放数据输出)
SDOUT → 连接到主控的I2S_SDI引脚(录音数据输入)
对于i2s:
SCLK 有时候叫 BCLK (Bit Clock) - 位时钟线,数据传输的时钟信号
LRCK (Left/Right Clock) 信号线的作用是帧同步时钟,用于指示当前传输的是左声道还是右声道的数据。
I2S信号方向说明
对于播放(Playback):
- BCLK: 主控输出 → ES8388输入
- LRCK: 主控输出 → ES8388输入
- SDIN: 主控输出 → ES8388输入
- MCLK: 主控输出 → ES8388输入
对于录音(Capture):
- BCLK: 主控输出 → ES8388输入
- LRCK: 主控输出 → ES8388输入
- SDOUT: ES8388输出 → 主控输入
- MCLK: 主控输出 → ES8388输入
时序要求
- MCLK频率通常是采样率的256倍或384倍
- BCLK频率 = 采样率 × 位宽 × 2(左右声道)
- LRCK频率 = 采样率
示波器测量
播放的时候测量
录音的时候测量
软件配置
Rk3576是kernel 6.1版本,es8388的驱动在发布的SDK版本中已经被RK修改过。
设备树
控件
这个控件实际上就是写一个ALSA框架的接口好理解是配置的什么功能然后去配置寄存器,安卓系统也会调用这个接口来设置控件的值。
- 注册
static const char * const adcpol_txt[] = {
"Normal", "L Invert", "R Invert", "L + R Invert"
};
,,,
SOC_ENUM_SINGLE(ES8323_ADCCONTROL6, 6, 4, adcpol_txt),
,,,
SOC_ENUM("Capture Polarity", es8323_enum[8]),
,,,
直接映射:控件的值会直接写入到ES8323的寄存器中
寄存器操作: 目标寄存器:ES8323_ADCCONTROL6 , 控制位:从第6位开始的4位 当用户调整控件时,相应的bit值会被更新
- 系统显示:
root@linaro-alip:~# amixer -c 0 contents | grep -i pol -A 7
numid=55,iface=MIXER,name='Capture Polarity'
; type=ENUMERATED,access=rw------,values=1,items=4
; Item #0 'Normal'
; Item #1 'L Invert'
; Item #2 'R Invert'
; Item #3 'L + R Invert'
: values=3
numid=54,iface=MIXER,name='Playback De-emphasis'
用户设置控件值 → ALSA框架 → 写入ES8323_ADCCONTROL6寄存器 → 硬件执行极性反转
- 查看控件
# 一样的命令,一个详细一个不详细,
amixer -c 0 contents
amixer -c 0 scontents
# 查看控件 两个命令一致,但是
amixer -c 0 sget 'PCM'
amixer -c 0 cget name='PCM Volume'

root@linaro-alip:~# amixer -c 0 contents | grep PCM
numid=56,iface=MIXER,name='PCM Volume'
numid=35,iface=PCM,name='SAI1 PCM Read Wait Time MS'
numid=36,iface=PCM,name='SAI1 PCM Write Wait Time MS'
硬件原理图






调试
基本的挂载i2c和es8388的驱动,网上已经有很多的文章了,汇总下。
# 查看i2c有没挂载
i2cdetect -y -r 3
# 读取es8388寄存器
i2cdump -y -f 3 0x11
# 开启通道一二的电源
i2ctransfer -y -f 3 w2@0x11 0x04 0x3c
# 左右声道互换
i2ctransfer -y -f 3 w2@0x11 0x17 0x18
i2ctransfer -y -f 3 w2@0x11 0x17 0x98
# 查看控件
amixer -c 0 contents
# 收音调试到最大
i2ctransfer -y -f 3 w2@0x11 0x09 0x88

# 录音
amixer -c 0 sset 'Main Mic' on
amixer -c 0 sset 'Differential Mux' 'Line 1'
amixer -c 0 sset 'Differential Mux' 'Line 2'
arecord -D hw:0,0 -r 44100 -c 2 -f S16_LE ./test.wav &
# 收音的音量
amixer -c 0 sset 'Right Channel' 8
amixer -c 0 sset 'Left Channel' 8
# 播放
amixer -c 0 sset 'OUT1' on
amixer -c 0 sset 'PCM' 192
aplay -D hw:0,0 --period-size=1024 --buffer-size=4096 -r 44100 -c 2 -f s16_le -vv ./11223.wav
功放
关闭通道电源之后(0x04寄存器),实际上还是会有声音输出,只是音量很小,用示波器测量也是一条直线(图一),但是通过功放电路之后就可以听到了,然后功放是在功率较大的时候升压的,所以把这个通道的增益增大会触发功放的升压喇叭就会有破音。
正常输出喇叭的波形是(图二)。
(图一)

(图二)


本文来自博客园,作者:潇汀,转载请注明原文链接:https://www.cnblogs.com/allalonewithyou/p/19101203,个人邮箱:yaonie4444@foxmail.com


浙公网安备 33010602011771号