工具与软件:
大家好!
我们在 TQMA335x SoM 上使用 AM3352 SoC、并且通过使用 devicetre 中的 simple-audio card 和内核(Linux 5.4)中的最小 snd_soc_dai_driver、我们已成功将一个 McASP 串行器设置为 I2S 从器件。
这是我们 devicetree 的相关部分:
/ {
wssdsp1: wssdsp1 {
#sound-dai-cells = <0>;
compatible = "dwe,wssdsp1";
status = "okay";
};
sound {
compatible = "simple-audio-card";
simple-audio-card,name = "WSSDSP1";
simple-audio-card,format = "i2s";
simple-audio-card,bitclock-master = <&sound_master>;
simple-audio-card,frame-master = <&sound_master>;
simple-audio-card,cpu {
sound-dai = <&mcasp0>;
};
sound_master: simple-audio-card,codec {
#sound-dai-cells = <0>;
sound-dai = <&wssdsp1>; /* codec name */
system-clock-frequency = <24000000>;
};
};
&am33xx_pinmux {
mcasp0_pins_adsp: mcasp0_pins_adsp {
pinctrl-single,pins = <
0x194 (PIN_INPUT_PULLDOWN | MUX_MODE0) /* mcasp0_fsx.mcasp0_fsx */
0x190 (PIN_INPUT_PULLDOWN | MUX_MODE0) /* mcasp0_aclkx.mcasp0_aclkx */
0x198 (PIN_OUTPUT_PULLDOWN | MUX_MODE0) /* mcasp0_axr0.mcasp0_axr0 */
0x1a8 (PIN_INPUT_PULLDOWN | MUX_MODE0) /* mcasp0_axr1.mcasp0_axr1 */
0x19c (PIN_INPUT_PULLDOWN | MUX_MODE2) /* mcasp0_ahclkr.mcasp0_axr2 */
0x1ac (PIN_INPUT_PULLDOWN | MUX_MODE2) /* mcasp0_ahclkx.mcasp0_axr3 */
0x1a0 (PIN_INPUT_PULLDOWN | MUX_MODE0) /* mcasp0_aclkr.mcasp0_aclkr */
0x1a4 (PIN_INPUT_PULLDOWN | MUX_MODE0) /* mcasp0_fsr.mcasp0_fsr */
>;
};
};
&mcasp0 {
#sound-dai-cells = <0>;
pinctrl-names = "default";
pinctrl-0 = <&mcasp0_pins_adsp>;
status = "okay";
op-mode = <0>; /* MCASP_IIS_MODE */
tdm-slots = <2>;
/* 4 serializers */
serial-dir = < /* 0: INACTIVE, 1: TX, 2: RX */
1 0 0 0
>;
/* bit depth for tx and rx */
tx-num-evt = <32>;
rx-num-evt = <32>;
};
这是驱动程序:
#include <linux/init.h>
#include <linux/module.h>
#include <linux/platform_device.h>
#include <sound/soc.h>
static struct snd_soc_dai_driver wssdsp1_dai = {
.name = "wssdsp1-hifi",
.playback = {
.stream_name = "Playback",
.channels_min = 2,
.channels_max = 2,
.rates = SNDRV_PCM_RATE_8000_384000,
.formats = SNDRV_PCM_FMTBIT_S32_LE
},
};
static struct snd_soc_component_driver soc_component_dev_wssdsp1 = {
};
static int wssdsp1_probe(struct platform_device *pdev)
{
int ret;
ret = devm_snd_soc_register_component(&pdev->dev, &soc_component_dev_wssdsp1,
&wssdsp1_dai, 1);
if (ret) {
printk("failed to register component wssdsp1: %d\n", ret);
return ret;
}
else {
printk("successfully registered component wssdsp1: %d\n", ret);
}
return 0;
}
static const struct of_device_id wssdsp1_of_match[] = {
{ .compatible = "dwe,wssdsp1", },
{ }
};
MODULE_DEVICE_TABLE(of, wssdsp1_of_match);
static struct platform_driver wssdsp1_codec_driver = {
.probe = wssdsp1_probe,
.driver = {
.name = "wssdsp1-codec",
.of_match_table = wssdsp1_of_match,
},
};
module_platform_driver(wssdsp1_codec_driver);
MODULE_DESCRIPTION("ASoC WSSDSP1 codec driver");
MODULE_AUTHOR("Rolf Anderegg <rolf.anderegg@weiss.ch>");
MODULE_LICENSE("GPL");
打开了 播放期间无噪音 . 不过、 每当回放停止时、左侧 I2S 通道上都会出现随机噪声!
这就像未再下拉 I2S 数据引脚(McASP0_axr0)一样。
当尝试使用示波器测量 I2S 数据引脚时、噪声会消失、这表明引脚确实处于悬空状态。
噪声根据 AM3352的 CPU 负载而变化、这表明存在串扰。
我们在内核3.x 上运行完全相同的硬件、没有任何噪声、因此这必然是软件问题。
任何帮助都将非常感谢。
此致、
Michele
