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
相关产品推荐
相关产品推荐

