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'

alt text

alt text

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'

硬件原理图

alt text
alt text
alt text
alt text
alt text
alt text

调试

基本的挂载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

alt text

# 录音
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寄存器),实际上还是会有声音输出,只是音量很小,用示波器测量也是一条直线(图一),但是通过功放电路之后就可以听到了,然后功放是在功率较大的时候升压的,所以把这个通道的增益增大会触发功放的升压喇叭就会有破音。

正常输出喇叭的波形是(图二)。

(图一)
alt text

(图二)
alt text

alt text

posted @ 2025-09-19 16:48  潇汀  阅读(51)  评论(0)    收藏  举报