跳到主要内容

I2S

1. 简介

RM_IO(Rockchip Matrix IO)是一种允许通过寄存器配置将低速外设信号(如 UART、I2C)灵活地路由到指定 I/O 引脚的技术。它打破了传统功能与特定引脚绑定的限制,支持在多个引脚间自由分配功能。通过软件配置,开发者可以实时改变引脚功能,而无需重新布线,节省了硬件资源。由于本部分涉及大量内核与设备树配置,需以SDK编译为前置条件,请先完成《SDK 环境部署》的学习与配置,确保后续功能模块的调试和移植具备基础支撑。

2. 音频编码器

音频编解码器(Audio Codec)是处理音频信号的关键组件,能够实现音频的输入和输出。在嵌入式系统和消费电子产品中,常用的音频编解码器包括 ES8156 ES7210。每款芯片在不同应用场景下有不同的优势,下面是这两款音频编解码器的简介:

  1. ES8156:高质量音频输出编解码器,适用于智能音响、蓝牙音箱等产品,专注于高品质音频输出和解码能力。
  2. ES7210:音频输入编解码器,适用于语音识别和音频录制应用,支持多种音频输入接口,常见于语音识别和可穿戴设备中。

这些音频编解码器在实际应用中有不同的功能和优点,可以根据需求提供音频输入输出、信号处理和高质量的音频传输能力。为了确保这些设备能够与系统顺利通信,内核驱动和设备树配置的正确性至关重要。接下来,我们将详细分析这三款音频编解码器的内核配置和设备树配置。

3. ES7210

3.1 内核配置

  1. 进入SDK目录,执行如下指令,打开配置界面:

    ./build.sh kernel-config
  2. 内核搜索 SND_SOC_ES7210 并勾选。

3.2 设备树配置

  1. 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>;
    };
    };
    };
  2. 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>;
    };
    };
    };
  3. 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 内核配置

  1. 下载内核补丁es8156,将ES8156驱动打包进SDK内核中。

    git am 0001-add-es8156-driver.patch
  2. 进入SDK目录,执行如下指令,打开配置界面:

    ./build.sh kernel-config
  3. 内核搜索 SND_SOC_ES8156 并勾选。

4.2 设备树配置

  1. 以 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>;
    };
    };
  2. 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>;
    };
    };
    };
  3. 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. 硬件连接

  1. 测试的硬件使用的是微雪电子Audio Driver HAT,具体信息请参考其 Wiki 说明。引脚顺序如下:

ES8156

LyraAudio Driver HAT
3V3_OUTVDD_3V3
GNDGND
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

LyraAudio Driver HAT
3V3_OUTVDD_3V3
GNDGND
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

LyraAudio Driver HAT
3V3_OUTVDD_3V3
GNDGND
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 声卡配置

  1. 查看声卡是否注册成功。

    cat /proc/asound/cards
  2. 查看声卡设备。

    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
  3. 声卡驱动目录。

    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 录制和播放

  1. 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
  2. 播放。

    aplay test.wav