前言
为了给家里的音响添加基于DLNA的网络播放功能,在咸鱼上淘了一个二手机顶盒,型号是长虹IOH-3000T,芯片为晶晨S905L-B。这个盒子带有SPDIF光纤接口,可以与功放进行数字连接。
盒子到手时卖家已经刷好了amlogic-s9xxx-armbian 23.08.0。

盒子HDMI有输出,可以接显示器或电视。
用alsamixer命令打开混音器设置,并将“AIU HDMI CTRL SRC”项的格式由“PCM”修改为“I2S”后,用“speaker-test -c 2”命令测试,HDMI音频输出正常。
但接下来测试SPDIF输出时,发现alsamixer中的“AIU SPDIF SRC SEL”项无论设置为“I2S”还是“SPDIF”,SPDIF接口均无输出。
解决方案
经过网络搜索,有用的信息不多。最终找到了这篇帖子:How to enable SPDIF on AML-S905X-CC。楼主遇到的问题与我完全一致,原因是设备树文件中没有配置SPDIF相关的音频链路。该问题可以通过修改设备树配置来使SPDIF控制器获取到当前的PCM输出音频,并将其编码并发送至SPDIF接口,从而解决输出问题。但是,由于帖子针对的设备与我的芯片型号不同,其中的解决方案无法直接套用,只能手工修改。

修改步骤
1. 确认dtb文件
查看/boot/uEnv.txt文件,找到对应的dtb文件路径。我这里是/dtb/amlogic/meson-gxl-s905x-p212.dtb,实际路径是/boot/dtb/amlogic/meson-gxl-s905x-p212.dtb。

2. 将dtb文件解码
dtb文件是编码后的二进制文件,无法直接修改,需要先转换成文本格式。转换命令为:
dtc -I dtb -O dts /boot/dtb/amlogic/meson-gxl-s905x-p212.dtb -o meson-gxl-s905x-p212.dts
会解码输出meson-gxl-s905x-p212.dts文件至当前目录下。
3. 修改dts文件
补丁内容如下:
--- meson-gxl-s905x-p212.dts.original 2025-10-05 22:54:50.251472717 +0800
+++ meson-gxl-s905x-p212.dts 2025-10-05 22:54:10.117880499 +0800
@@ -264,6 +264,14 @@
};
};
+ audio-codec {
+ phandle = <0xa7>;
+ sound-name-prefix = "SPDIF";
+ status = "okay";
+ compatible = "linux,spdif-dit";
+ #sound-dai-cells = <0x00>;
+ };
+
soc {
compatible = "simple-bus";
#address-cells = <0x02>;
@@ -303,6 +311,8 @@
interrupts = <0x00 0x30 0x01 0x00 0x32 0x01>;
interrupt-names = "i2s\0spdif";
status = "okay";
+ pinctrl-names = "default";
+ pinctrl-0 = <0x90>;
clocks = <0x03 0x26 0x03 0x28 0x03 0x50 0x03 0x6b 0x03 0x2c 0x03 0x27 0x03 0x51 0x03 0x6e 0x03 0x71>;
clock-names = "pclk\0i2s_pclk\0i2s_aoclk\0i2s_mclk\0i2s_mixer\0spdif_pclk\0spdif_aoclk\0spdif_mclk\0spdif_mclk_sel";
resets = <0x11 0x06>;
@@ -1766,6 +1776,14 @@
sound-dai = <0x1b>;
};
};
+
+ dai-link-3 {
+ sound-dai = <0x3b 0x00 0x03>;
+
+ codec-0 {
+ sound-dai = <0xa7>;
+ };
+ };
};
cvbs-connector {
@@ -1954,6 +1972,7 @@
dwc2 = "/soc/usb@d0078080/usb@c9100000";
dwc3 = "/soc/usb@d0078080/usb@c9000000";
acodec = "/soc/audio-controller@c8832000";
+ spdif_dit = "/audio-codec";
crypto = "/soc/crypto@c883e000";
gpu_opp_table = "/opp-table";
hdmi_5v = "/regulator-hdmi-5v";
将补丁内容保存为文件,如名称为meson-gxl-s905x-p212.dts.patch,然后运行:
patch < meson-gxl-s905x-p212.dts.patch
4. 将dts文件重新编码
将修改完成后的dts文件重新编码为dtb文件,并覆盖原文件:
dtc -I dts -O dtb meson-gxl-s905x-p212.dts -o /boot/dtb/amlogic/meson-gxl-s905x-p212.dtb
这个命令会输出大量Warning信息,只要没有Error就行。
执行前记得备份原始的/boot/dtb/amlogic/meson-gxl-s905x-p212.dtb文件!
确认无误后重启:
reboot
5. 设置SPDIF输出格式为I2S
运行alsamixer,设置“AIU SPDIF SRC SEL”项为“I2S”。
再次运行“speaker-test -c 2”进行测试,此时SPDIF接口就应该有输出了。
注意事项
这里提供的补丁是针对官方版本的meson-gxl-s905x-p212.dtb文件的,如果机器上的版本与官方版本不一致,那么需要注意修改以下几处内容:
- audio-codec部分和dai-link-3部分的0xa7值,如果已经有某项的phandle值是0xa7了,那就需要修改该值为一个未使用的值;
- pinctrl-0 = <0x90>中的0x90对应于spdif_out_ao_h项的phandle值,如果该值不是0x90则要对应修改;
- 如果原始dts文件中已经有dai-link-3了,则应对应增加数字值,如dai-link-4;
- dai-link-3部分中的sound-dai = <0x3b 0x00 0x03>,其中的0x3b应与dai-link-0中对应的值相同。
资源
修改好的meson-gxl-s905x-p212.dts和meson-gxl-s905x-p212.dtb文件:
meson-gxl-s905x-p212.dts
meson-gxl-s905x-p212.dtb
1万+

被折叠的 条评论
为什么被折叠?



