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