You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SAM9x60开发板设备树添加UDA1334A I2S音频配置报错咨询

问题解答

一、simple-audio-card适配思路是否正确?

思路完全可行,启动报错-22是配置存在硬伤,和框架选型无关:

  • 首先纠正硬件认知偏差:UDA1334A是无I2C/SPI控制接口的纯I2S输入DAC,芯片本身没有配置寄存器,工作模式全靠硬件引脚电平设置,不需要挂在任何I2C总线下,你之前写的codec@1a属于错误配置(@后需跟总线地址,该芯片不接I2C不存在对应地址)。
  • 报错could not get #sound-dai-cells for /codec@1a的直接原因:uda1334节点没有定义#sound-dai-cells属性,同时你在codec_dai段错误把这个值设为<1>——UDA1334只有1路音频DAI,不需要额外的DAI标识参数,该值固定为<0>。
  • 时钟主从配置完全错误:UDA1334本身是纯从设备,无法输出位时钟(BCLK)和帧时钟(LRCLK),你之前配置codec作为时钟主设备,就算过了设备树解析也不可能出声,必须配置SAM9x60的I2S控制器作为主设备提供两路时钟。
  • 提前确认内核配置:必须开启CONFIG_SND_SOC_UDA1334和CONFIG_SND_SOC_SIMPLE_CARD两个内核选项,把对应驱动编进内核或者编成模块,否则设备树无法匹配到驱动。

修正后的参考设备树配置

/ {
    sound {
        compatible = "simple-audio-card";
        simple-audio-card,name = "UDA1334A Card";
        simple-audio-card,format = "i2s";
        /* 配置CPU侧I2S作为时钟主设备 */
        simple-audio-card,bitclock-master = <&cpu_dai>;
        simple-audio-card,frame-master = <&cpu_dai>;
        simple-audio-card,widgets = "Speaker", "Speakers";
        simple-audio-card,routing = "Speakers", "VOUTL", "Speakers", "VOUTR";

        cpu_dai: simple-audio-card,cpu {
            sound-dai = <&i2s>;
        };

        codec_dai: simple-audio-card,codec {
            #sound-dai-cells = <0>;
            sound-dai = <&uda1334>;
        };
    };

    /* UDA1334不需要挂I2C总线,作为根节点下的独立外设即可 */
    uda1334: audio-codec {
        compatible = "nxp,uda1334";
        #sound-dai-cells = <0>;
        nxp,mute-gpios = <&pioA 8 GPIO_ACTIVE_LOW>;
        nxp,deemph-gpios = <&pioC 3 GPIO_ACTIVE_LOW>;
        status = "okay";
    };
};

/* 别忘了把I2S控制器节点的status设为okay,配好对应引脚复用 */
&i2s {
    status = "okay";
    pinctrl-names = "default";
    pinctrl-0 = <&pinctrl_i2s_default>;
};

如果上面的配置在当前内核版本加载失败,可以换用audio-graph-card框架替代simple-audio-card,二者逻辑一致,只是用端口(port)方式映射DAI连接,对老版本内核的兼容性更好。

二、关于默认识别的ClassD声卡

这个是SAM9x60芯片内置的ClassD功放控制器,属于片上原生外设,直接输出脉冲信号驱动无源喇叭,和你外接的I2S接口UDA1334 DAC完全独立。等外接声卡加载成功后,用aplay -l就能看到两张声卡,指定UDA1334对应的声卡节点输出音频即可。

三、树莓派HiFiBerry DAC驱动兼容UDA1334的原理

你看到的dtoverlay=hifiberry-dac本质不是某个特定codec的专用驱动,它是针对所有无控制接口、标准I2S时序的从模式DAC做的通用适配:

  • 这类DAC(包括UDA1334、PCM5102A、ES9023等)不需要和主控做任何寄存器配置交互,只要硬件接对I2S的BCLK、LRCLK、SDATA三根信号线,主控提供正确的时钟和符合格式的音频流,DAC就能直接解码输出声音,不需要识别DAC的具体型号。
  • HiFiBerry DAC的overlay内部直接用通用simple-codec驱动模拟了一个符合标准I2S时序的DAI端点,和树莓派的I2S控制器做对接,根本不需要枚举具体的外置codec型号,也不需要给codec建单独的设备树节点,只要I2S时序匹配就能正常工作。
  • dtoverlay=i2s-mmap的作用是打开树莓派I2S控制器的内存映射支持,让用户态ALSA库可以直接通过mmap方式读写I2S音频缓冲区、降低播放延迟,和codec驱动本身没有关系。

内容的提问来源于stack exchange,提问作者tqn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 09:36:23