20260417给万象奥科的开发板HD-RK3576-PI适配声卡es8388【驱动C文件】
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

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

所有评论(0)