I2S
1. 简介
RM_IO(Rockchip Matrix IO)是一种允许通过寄存器配置将低速外设信号(如 UART、I2C)灵活地路由到指定 I/O 引脚的技术。它打破了传统功能与特定引脚绑定的限制,支持在多个引脚间自由分配功能。通过软件配置,开发者可以实时改变引脚功能,而无需重新布线,节省了硬件资源。由于本部分涉及大量内核与设备树配置,需以SDK编译为前置条件,请先完成《SDK 环境部署》的学习与配置,确保后续功能模块的调试和移植具备基础支撑。
2. 音频编码器
音频编解码器(Audio Codec)是处理音频信号的关键组件,能够实现音频的输入和输出。在嵌入式系统和消费电子产品中,常用的音频编解码器包括 ES8156 和 ES7210。每款芯片在不同应用场景下有不同的优势,下面是这两款音频编解码器的简介:
- ES8156:高质量音频输出编解码器,适用于智能音响、蓝牙音箱等产品,专注于高品质音频输出和解码能力。
- ES7210:音频输入编解码器,适用于语音识别和音频录制应用,支持多种音频输入接口,常见于语音识别和可穿戴设备中。
这些音频编解码器在实际应用中有不同的功能和优点,可以根据需求提供音频输入输出、信号处理和高质量的音频传输能力。为了确保这些设备能够与系统顺利通信,内核驱动和设备树配置的正确性至关重要。接下来,我们将详细分析这三款音频编解码器的内核配置和设备树配置。
3. ES7210
3.1 内核配置
进入SDK目录,执行如下指令,打开配置界面:
./build.sh kernel-config内核搜索 SND_SOC_ES7210 并勾选。

3.2 设备树配置
以 ES7210 为例,ES7210 支持 4 个 MIC 音频输入。请在
kernel-6.1/arch/arm/boot/dts/rk3506g-luckfox-lyra.dts文件中添加以下内容(根据实际板子型号和存储介质进行相应配置):/{
es7210_sound: es7210-sound {
status = "okay";
compatible = "simple-audio-card";
simple-audio-card,format = "i2s";
simple-audio-card,mclk-fs = <256>;
simple-audio-card,name = "rockchip-es7210";
simple-audio-card,cpu {
sound-dai = <&sai1>;
};
simple-audio-card,codec {
sound-dai = <&es7210>;
};
};
};I2C 配置
&i2c1 {
status = "okay";
pinctrl-names = "default";
//clock-frequency = <5000>; // 5kHz for es8388
pinctrl-0 = <&rm_io12_i2c1_scl &rm_io13_i2c1_sda>;
es7210: es7210@40 {
status = "okay";
#sound-dai-cells = <0>;
compatible = "ES7210_MicArray_0";
reg = <0x40>;
clocks = <&mclkout_sai1>;
clock-names = "mclk";
assigned-clocks = <&mclkout_sai1>;
assigned-clock-rates = <12288000>;
};
};
&pinctrl {
rm_io13 {
rm_io13_i2c1_sda: rm-io13-i2c1-sda {
rockchip,pins =
<0 RK_PB5 33 &pcfg_pull_up>;
};
};
rm_io12 {
rm_io12_i2c1_scl: rm-io12-i2c1-scl {
rockchip,pins =
<0 RK_PB4 32 &pcfg_pull_up>;
};
};
};I2S 配置
&sai1 {
status = "okay";
pinctrl-names = "default";
pinctrl-0 = < &rm_io8_sai1_mclk
&rm_io7_sai1_sclk
&rm_io6_sai1_lrck
&rm_io5_sai1_sdi
&rm_io4_sai1_sdo0>;
};
4. ES8156
4.1 内核配置
下载内核补丁es8156,将ES8156驱动打包进SDK内核中。
git am 0001-add-es8156-driver.patch进入SDK目录,执行如下指令,打开配置界面:
./build.sh kernel-config内核搜索 SND_SOC_ES8156 并勾选。

4.2 设备树配置
以 es8156 为例,es8156 支持双声道音频输出:
es8156_sound: es8156-sound {
status = "okay";
compatible = "simple-audio-card";
simple-audio-card,format = "i2s";
simple-audio-card,mclk-fs = <256>;
simple-audio-card,name = "rockchip-es8156";
simple-audio-card,widgets =
"Speaker", "LOUT",
"Speaker", "ROUT";
simple-audio-card,routing =
"SDIN", "Channel Select Mux",
"Channel Select Mux", "DACL",
"Channel Select Mux", "DACR",
"DACL", "LOUT",
"DACR", "ROUT",
"SDOUT TRISTATE", "SDIN",
"SDOUT", "SDOUT TRISTATE";
simple-audio-card,cpu {
sound-dai = <&sai1>;
};
simple-audio-card,codec {
sound-dai = <&es8156>;
};
};I2C 配置。
&i2c1 {
status = "okay";
pinctrl-names = "default";
//clock-frequency = <5000>; // 5kHz for es8388
pinctrl-0 = <&rm_io12_i2c1_scl &rm_io13_i2c1_sda>;
es8156: es8156@8 {
status = "okay";
#sound-dai-cells = <0>;
compatible = "everest,es8156";
reg = <0x08>;
clocks = <&mclkout_sai1>;
clock-names = "mclk";
assigned-clocks = <&mclkout_sai1>;
assigned-clock-rates = <12288000>;
};
};
&pinctrl {
rm_io13 {
rm_io13_i2c1_sda: rm-io13-i2c1-sda {
rockchip,pins =
<0 RK_PB5 33 &pcfg_pull_up>;
};
};
rm_io12 {
rm_io12_i2c1_scl: rm-io12-i2c1-scl {
rockchip,pins =
<0 RK_PB4 32 &pcfg_pull_up>;
};
};
};I2S 配置。
&sai1 {
status = "okay";
pinctrl-names = "default";
pinctrl-0 = < &rm_io8_sai1_mclk
&rm_io7_sai1_sclk
&rm_io6_sai1_lrck
&rm_io5_sai1_sdi
&rm_io4_sai1_sdo0>;
};
5. ES7210 和 ES8156
注册驱动时一组 I2S 仅支持绑定一个声卡,如果是多个芯片共用一组 I2S 就需要的声卡的设备树中添加多个芯片节点。
es8156_es7210_sound: es8156-es7210-sound {
status = "okay";
compatible = "simple-audio-card";
simple-audio-card,format = "i2s";
simple-audio-card,mclk-fs = <256>;
simple-audio-card,name = "rockchip-es8156-es7210";
simple-audio-card,widgets =
"Speaker", "LOUT",
"Speaker", "ROUT";
simple-audio-card,routing =
"SDIN", "Channel Select Mux",
"Channel Select Mux", "DACL",
"Channel Select Mux", "DACR",
"DACL", "LOUT",
"DACR", "ROUT",
"SDOUT TRISTATE", "SDIN",
"SDOUT", "SDOUT TRISTATE";
simple-audio-card,dai-link@0 {
format = "i2s";
cpu {
sound-dai = <&sai1>;
};
codec {
sound-dai = <&es8156>;
};
};
simple-audio-card,dai-link@1 {
format = "i2s";
cpu {
sound-dai = <&sai1>;
};
codec {
sound-dai = <&es7210>;
};
};
};
6. 硬件连接
- 测试的硬件使用的是微雪电子Audio Driver HAT,具体信息请参考其 Wiki 说明。引脚顺序如下:


ES8156
| Lyra | Audio Driver HAT |
|---|---|
| 3V3_OUT | VDD_3V3 |
| GND | GND |
| RM_IO12(SCL) | X2A_I2C0_SCK |
| RM_IO13(SDA) | X2A_I2C0_SDA |
| RM_IO8(SA1 MCLK) | X2A_I2S1_MCLK_CON |
| RMI_O7(SA1 SCLK) | X2A_I2S1_BCLK_CON |
| RM_IO6(SA1 LRCK) | X2A_I2S1_LRCK_CON |
| RM_IO5(SA1 SDI) | / |
| RM_IO4(SA1 SDO) | X2A_I2S1_SPEAKER |
ES7210
| Lyra | Audio Driver HAT |
|---|---|
| 3V3_OUT | VDD_3V3 |
| GND | GND |
| RM_IO12(SCL) | X2A_I2C0_SCK |
| RM_IO13(SDA) | X2A_I2C0_SDA |
| RM_IO8(SA1 MCLK) | X2A_I2S1_MCLK_CON |
| RMI_O7(SA1 SCLK) | X2A_I2S1_BCLK_CON |
| RM_IO6(SA1 LRCK) | X2A_I2S1_LRCK_CON |
| RM_IO5(SA1 SDI) | X2A_I2S0_SDIO |
| RM_IO4(SA1 SDO) | / |
ES8156&ES7210
| Lyra | Audio Driver HAT |
|---|---|
| 3V3_OUT | VDD_3V3 |
| GND | GND |
| RM_IO12(SCL) | X2A_I2C0_SCK |
| RM_IO13(SDA) | X2A_I2C0_SDA |
| RM_IO8(SA1 MCLK) | X2A_I2S1_MCLK_CON |
| RMI_O7(SA1 SCLK) | X2A_I2S1_BCLK_CON |
| RM_IO6(SA1 LRCK) | X2A_I2S1_LRCK_CON |
| RM_IO5(SA1 SDI) | X2A_I2S0_SDIO |
| RM_IO4(SA1 SDO) | X2A_I2S1_SPEAKER |
7. 基础应用
7.1 声卡配置
查看声卡是否注册成功。
cat /proc/asound/cards查看声卡设备。
card 0: rockchipes8156e [rockchip-es8156-es7210], device 1: ff310000.sai-ES7210 4CH ADC 0 ES7210 4CH ADC 0-1 [ff310000.sai-ES7210 4CH ADC 0 ES7210 4CH ADC 0-1]
Subdevices: 1/1
Subdevice #0: subdevice #0声卡驱动目录。
root@luckfox:~# ls -l /dev/snd/by-path/
total 0
lrwxrwxrwx 1 root root 12 Jan 1 00:00 platform-es8156-es7210-sound -> ../controlC0
7.2 录制和播放
arecord 将使用默认的采样率。通常,arecord 的默认采样率是44100 Hz(44.1 kHz),这是 CD 音频标准的采样率。
arecord -f cd -Dhw:0,1 -d 30 test.wav- 注意:设备的音频卡是
card 0,并且设备的索引是1,因此你在命令中应该使用-Dhw:0,1,而不是-Dhw:0或-Dhw:1。
- 注意:设备的音频卡是
播放。
aplay test.wav