为基于S905X P212的Armbian盒子启用SPDIF输出


前言

为了给家里的音响添加基于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文件的,如果机器上的版本与官方版本不一致,那么需要注意修改以下几处内容:

  1. audio-codec部分和dai-link-3部分的0xa7值,如果已经有某项的phandle值是0xa7了,那就需要修改该值为一个未使用的值;
  2. pinctrl-0 = <0x90>中的0x90对应于spdif_out_ao_h项的phandle值,如果该值不是0x90则要对应修改;
  3. 如果原始dts文件中已经有dai-link-3了,则应对应增加数字值,如dai-link-4;
  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
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值