Y:\git_RK3576_Linux6.1\kernel-6.1\arch\arm64\configs\rockchip_linux_defconfig
Y:\git_RK3576_Linux6.1\kernel-6.1\sound\soc\codecs\es8328.c
Y:\git_RK3576_Linux6.1\kernel-6.1\sound\soc\codecs\es8328.h
Y:\git_RK3576_Linux6.1\kernel-6.1\sound\soc\codecs\Kconfig
Y:\git_RK3576_Linux6.1\kernel-6.1\sound\soc\codecs\Makefile


20260417给万象奥科的开发板HD-RK3576-PI适配声卡es8388【驱动C文件】
2026/4/17 20:12


缘起:将万象奥科提供的内核kernel-pi-v1.0.tar.gz析取其中最小的DTS。
由于万象奥科在DTS中拿掉了es8323的兼容支持,因此需要专门编译es8388.c这个驱动文件!


1、
【万象奥科】
Y:\rk3576-kernel\kernel-pi-v1.0\arch\arm64\boot\dts\rockchip72min\rk3576-pi-lp4x.dtsi
【EVB1】
Y:\git_RK3576_Linux6.1\kernel-6.1\arch\arm64\boot\dts\rockchip\rk3576-evb1.dtsi


&i2c3 {
    status = "okay";
    es8388: es8388@10 {
        status = "okay";
        #sound-dai-cells = <0>;
        compatible = "everest,es8388", "everest,es8323";
        reg = <0x10>;
        clocks = <&mclkout_sai1>;
        clock-names = "mclk";
        assigned-clocks = <&mclkout_sai1>;
        assigned-clock-rates = <12288000>;
        pinctrl-names = "default";
        pinctrl-0 = <&sai1m0_mclk>;
    };
};
修改为:
&i2c3 {
    status = "okay";
    pinctrl-names = "default";
    pinctrl-0 = <&i2c3m0_xfer>;

        es8388: es8388@11 {
                status = "okay";
                #sound-dai-cells = <0>;
                compatible = "everest,es8388";
                reg = <0x11>;
                clocks = <&mclkout_sai2>;
                clock-names = "mclk";
                assigned-clocks = <&mclkout_sai2>;
                assigned-clock-rates = <12288000>;
                pinctrl-names = "default";
                pinctrl-0 = <&sai2m0_mclk>;
        };
};

问DeepSeek:
我们被问到:"RK3576的DTS:修改理由?" 然后给出了一个DTS片段的修改前后对比。需要解释修改的理由。分析修改内容:

修改前:

i2c3节点,status = "okay"

es8388 @10,compatible包含"everest,es8388","everest,es8323",reg=0x10

时钟:mclkout_sai1,assigned-clock-rate 12288000

pinctrl: sai1m0_mclk

修改后:

i2c3节点增加了pinctrl-names和pinctrl-0用于i2c3m0_xfer(之前没有,可能之前I2C引脚配置在其他地方?但这里明确加了)

es8388地址从0x10改为0x11

compatible去掉了"everest,es8323",只保留"everest,es8388"

时钟从mclkout_sai1改为mclkout_sai2,assigned-clocks对应改,pinctrl从sai1m0_mclk改为sai2m0_mclk

所以修改理由可能包括:

I2C设备地址变化:从0x10改为0x11,可能因为硬件设计改变或地址冲突。

音频编解码器型号确认:去掉es8323兼容,只保留es8388,可能因为实际使用的是ES8388而非ES8323。

时钟源改变:从SAI1的MCLK改为SAI2的MCLK,可能因为SAI1被其他功能占用或者需要不同的时钟路径。

I2C引脚配置:添加了i2c3m0_xfer的pinctrl,确保I2C3的引脚功能正确配置。

需要给出合理的解释,说明为什么做这些修改。

根据提供的 DTS 修改前后对比,修改理由主要涉及硬件设计变更、资源冲突解决以及设备型号确认。具体分析如下:

1. I2C 设备地址变更(reg = <0x10> → <0x11>)
原因:ES8388 音频编解码器的 I2C 地址可能因硬件原理图调整而改变(例如通过 ADDR 引脚电平配置),或者原地址 0x10 与同 I2C 总线上的其他设备冲突。

影响:确保主机能正确寻址到 ES8388。

2. 移除兼容型号 "everest,es8323"
原因:确认实际使用的芯片为 ES8388,而非 ES8323。两者虽然兼容,但寄存器或功能可能存在差异。去除冗余兼容字符串可避免驱动误匹配,提高可靠性。

影响:驱动将仅匹配 ES8388,不再回退到 ES8323 的初始化流程。

3. 时钟源从 mclkout_sai1 改为 mclkout_sai2
原因:硬件设计上 ES8388 的 MCLK 输入改由 SAI2 的 MCLK 输出提供(而非 SAI1)。可能原因包括:

SAI1 被其他外设(如另一音频接口、I2S 等)占用;

需要独立的时钟频率或相位控制;

PCB 布线调整,SAI2 更接近 ES8388。

相应修改:assigned-clocks 和 pinctrl 中 MCLK 引脚配置同步改为 sai2m0_mclk。

4. 为 I2C3 总线添加 pinctrl 配置(i2c3m0_xfer)
原因:原 DTS 中可能依赖 Bootloader 或其他默认配置,未显式指定 I2C3 的引脚功能。添加后明确将 I2C3 的 SCL/SDA 引脚复用为 I2C 功能(i2c3m0_xfer),避免引脚被误配置为 GPIO 或其他模式,确保通信正常。

影响:提高系统启动后 I2C 总线的稳定性。

总结
此次修改是为了匹配 硬件原理图变更(地址、时钟连接、I2C 引脚分配)及 软件驱动精确性(去除多余兼容 ID),确保 RK3576 平台上的 ES8388 音频编解码器能够正确工作。


2、配置编译es8388:
Y:\git_RK3576_Linux6.1\kernel-6.1\arch\arm64\configs\rockchip_linux_defconfig
Y:\k7_rk3576-linux_20251021\kernel-6.1\arch\arm64\configs\rockchip_linux_defconfig

CONFIG_ROCKCHIP_MPP_AV1DEC=y
CONFIG_SOUND=y
CONFIG_SND=y
CONFIG_SND_HRTIMER=y
CONFIG_SND_DYNAMIC_MINORS=y
# CONFIG_SND_SUPPORT_OLD_API is not set
CONFIG_SND_SEQUENCER=y
CONFIG_SND_SEQ_DUMMY=y
# CONFIG_SND_PCI is not set
# CONFIG_SND_SPI is not set
CONFIG_SND_USB_AUDIO=y
CONFIG_SND_SOC=y
CONFIG_SND_SOC_ROCKCHIP=y
CONFIG_SND_SOC_ROCKCHIP_ASRC=y
CONFIG_SND_SOC_ROCKCHIP_DLP_PCM=y
CONFIG_SND_SOC_ROCKCHIP_I2S_TDM=y
CONFIG_SND_SOC_ROCKCHIP_MULTI_DAIS=y
CONFIG_SND_SOC_ROCKCHIP_PDM=y
CONFIG_SND_SOC_ROCKCHIP_PDM_V2=y
CONFIG_SND_SOC_ROCKCHIP_SAI=y
CONFIG_SND_SOC_ROCKCHIP_SPDIF=y
CONFIG_SND_SOC_ROCKCHIP_SPDIFRX=y
CONFIG_SND_SOC_ROCKCHIP_MAX98090=y
CONFIG_SND_SOC_ROCKCHIP_MULTICODECS=y
CONFIG_SND_SOC_ROCKCHIP_RT5645=y
CONFIG_SND_SOC_ROCKCHIP_HDMI=y
CONFIG_SND_SOC_DUMMY_CODEC=y
CONFIG_SND_SOC_ES7202=y
CONFIG_SND_SOC_ES7243E=y
CONFIG_SND_SOC_ES8311=y
CONFIG_SND_SOC_ES8316=y
CONFIG_SND_SOC_ES8323=y
CONFIG_SND_SOC_ES8326=y
CONFIG_SND_SOC_ES8328=y
CONFIG_SND_SOC_ES8328_I2C=y
CONFIG_SND_SOC_ES8388=y

CONFIG_SND_SOC_RK3308=y


3、将万象奥科提供的内核kernel-pi-v1.0.tar.gz析取es8388.c、es8388.h
rootroot@rootroot-HP-245-14-inch-G10-Notebook-PC:~/git_RK3576_Linux6.1/kernel-6.1$ 
rootroot@rootroot-HP-245-14-inch-G10-Notebook-PC:~/git_RK3576_Linux6.1/kernel-6.1$ 
rootroot@rootroot-HP-245-14-inch-G10-Notebook-PC:~/git_RK3576_Linux6.1/kernel-6.1$ find . -name *8388*
./include/config/SND_SOC_ES8388
./arch/arm64/boot/dts/rockchip52es8388.tar.gz
./sound/soc/codecs/es8388.c
./sound/soc/codecs/es8388.o
./sound/soc/codecs/es8388.h

./sound/soc/codecs/.es8388.o.cmd
rootroot@rootroot-HP-245-14-inch-G10-Notebook-PC:~/git_RK3576_Linux6.1/kernel-6.1$ 
rootroot@rootroot-HP-245-14-inch-G10-Notebook-PC:~/git_RK3576_Linux6.1/kernel-6.1$ find . -name es8*.c
./sound/soc/codecs/es8396.c
./sound/soc/codecs/es8326.c
./sound/soc/codecs/es8323.c
./sound/soc/codecs/es8388.c
./sound/soc/codecs/es8328-i2c.c
./sound/soc/codecs/es8316.c
./sound/soc/codecs/es8311.c
./sound/soc/codecs/es8328-spi.c
./sound/soc/codecs/es8328.c
rootroot@rootroot-HP-245-14-inch-G10-Notebook-PC:~/git_RK3576_Linux6.1/kernel-6.1$ 


Y:\git_RK3576_Linux6.1\kernel-6.1\sound\soc\codecs\es8328.c
Y:\git_RK3576_Linux6.1\kernel-6.1\sound\soc\codecs\es8328.h


Y:\git_RK3576_Linux6.1\kernel-6.1\sound\soc\codecs\Kconfig

    imply SND_SOC_DUMMY_CODEC
    imply SND_SOC_ES8316
    imply SND_SOC_ES8323
    imply SND_SOC_ES8326
    imply SND_SOC_ES8328_SPI
    imply SND_SOC_ES8328_I2C
    imply SND_SOC_ES8388

    imply SND_SOC_ES8396
    imply SND_SOC_ES7134
    imply SND_SOC_ES7202
    imply SND_SOC_ES7241
    imply SND_SOC_ES7243E
    imply SND_SOC_GTM601


config SND_SOC_ES8328_SPI
    tristate "Everest Semi ES8328 CODEC (SPI)"
    depends on SPI_MASTER
    select SND_SOC_ES8328

config SND_SOC_ES8388
    tristate "Everest Semi ES8388 CODEC"
    depends on I2C

config SND_SOC_ES8396
    tristate "Everest Semi ES8396 CODEC"
    depends on I2C


Y:\git_RK3576_Linux6.1\kernel-6.1\sound\soc\codecs\Makefile

snd-soc-es8326-objs := es8326.o
snd-soc-es8328-objs := es8328.o
snd-soc-es8328-i2c-objs := es8328-i2c.o
snd-soc-es8328-spi-objs := es8328-spi.o
snd-soc-es8388-objs := es8388.o
snd-soc-es8396-objs := es8396.o


obj-$(CONFIG_SND_SOC_ES7134)    += snd-soc-es7134.o
obj-$(CONFIG_SND_SOC_ES7202)    += snd-soc-es7202.o
obj-$(CONFIG_SND_SOC_ES7210)    += snd-soc-es7210.o
obj-$(CONFIG_SND_SOC_ES7241)    += snd-soc-es7241.o
obj-$(CONFIG_SND_SOC_ES7243E)    += snd-soc-es7243e.o
obj-$(CONFIG_SND_SOC_ES8311)    += snd-soc-es8311.o
obj-$(CONFIG_SND_SOC_ES8316)    += snd-soc-es8316.o
obj-$(CONFIG_SND_SOC_ES8323)    += snd-soc-es8323.o
obj-$(CONFIG_SND_SOC_ES8326)    += snd-soc-es8326.o
obj-$(CONFIG_SND_SOC_ES8328)    += snd-soc-es8328.o
obj-$(CONFIG_SND_SOC_ES8388)    += snd-soc-es8388.o
obj-$(CONFIG_SND_SOC_ES8328_I2C)+= snd-soc-es8328-i2c.o
obj-$(CONFIG_SND_SOC_ES8328_SPI)+= snd-soc-es8328-spi.o
obj-$(CONFIG_SND_SOC_ES8396)    += snd-soc-es8396.o


4、编译之后,你可以发现编译生成的es8388.o文件
Y:\git_RK3576_Linux6.1\kernel-6.1\sound\soc\codecs\es8388.o

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐