详细讲解如何进行音频设置开发,涉及的步骤、概念以及具体操作。
概念概述
在 Jetson 设备中,音频设备的配置和管理通常通过 Device Tree 来完成。设备树 (dts/dtsi 文件) 定义了硬件配置,告诉操作系统和驱动程序如何与硬件交互。在音频开发中,主要涉及音频编解码器、I2S 总线、时钟源以及音频路径等设置。

在这个例子中,涉及了 SGTL5000 音频编解码器 ,这是一个常见的音频编解码器芯片,支持多个输入输出通道。这个 dtsi 文件定义了如何在 Jetson 上配置这个编解码器,以及如何通过设备树与其他硬件(如 I2S 接口、音频卡等)进行通信。


1. 时钟配置
在设备树中,首先需要为音频编解码器配置时钟,这对于音频信号的采样和传输至关重要。文件中有如下配置:
fragment@0 {
target-path = "/";
__overlay__ {
clocks {
sgtl5000_mclk: sgtl5000_mclk {
compatible = "fixed-clock";
#clock-cells = <0>;
clock-frequency = <12288000>;
clock-output-names = "sgtl5000-mclk";
status = "okay";
};
};
};
};
-
sgtl5000_mclk是配置的时钟源,它使用了fixed-clock类型,表示该时钟频率固定为 12.288 MHz,适用于 SGTL5000 编解码器。 -
clock-frequency = <12288000>:设置时钟频率为 12.288 MHz,这是 SGTL5000 的工作频率。
操作步骤:
-
确认时钟源的频率符合你的音频设备要求。
-
设置
clocks节点以指定正确的时钟源。
2. I2C 配置与 SGTL5000 编解码器配置
接下来需要配置 I2C 接口与 SGTL5000 音频编解码器之间的通信:
fragment@1 {
target = <&hdr40_i2c1>;
__overlay__ {
#address-cells = <1>;
#size-cells = <0>;
sgtl5000: sgtl5000@0a {
compatible = "fsl,sgtl5000";
reg = <0x0a>;
clocks = <&sgtl5000_mclk>;
micbias-resistor-k-ohms = <2>;
micbias-voltage-m-volts = <3000>;
VDDA-supply = <&hdr40_vdd_3v3>;
VDDIO-supply = <&hdr40_vdd_3v3>;
#sound-dai-cells = <0>;
status = "okay";
sound-name-prefix = "H40-SGTL";
port {
sgtl5000_ep: endpoint {
remote-endpoint = <&hdr40_snd_i2s_dap_ep>;
link-name = "fe-pi-audio-z-v2";
};
};
};
};
};
-
target = <&hdr40_i2c1>:这个部分表示音频编解码器通过 I2C 接口i2c1进行通信。 -
reg = <0x0a>:指定 SGTL5000 编解码器的 I2C 地址。 -
clocks = <&sgtl5000_mclk>:与前面的时钟源连接,确保编解码器有稳定的时钟输入。 -
micbias-resistor-k-ohms = <2>和micbias-voltage-m-volts = <3000>:配置麦克风偏置电压。
操作步骤:
-
确保 I2C 地址和时钟源设置正确。
-
设置编解码器的电源管理配置,如电压和偏置电压。
3. 音频卡设置
然后,定义音频卡的音频路由和音频组件,如扬声器、麦克风、耳机等:
fragment@2 {
target = <&tegra_sound>;
__overlay__ {
nvidia-audio-card,widgets =
"Headphone", "H40-SGTL Headphone",
"Microphone", "H40-SGTL Mic",
"Line", "H40-SGTL Line In",
"Line", "H40-SGTL Line Out";
nvidia-audio-card,routing =
"H40-SGTL Headphone", "H40-SGTL HP_OUT",
"H40-SGTL MIC_IN", "H40-SGTL Mic",
"H40-SGTL ADC", "H40-SGTL Mic Bias",
"H40-SGTL LINE_IN", "H40-SGTL Line In",
"H40-SGTL Line Out", "H40-SGTL LINE_OUT";
};
};
-
widgets定义了音频卡的输入输出设备,如耳机、麦克风、线路输入和输出。 -
routing定义了音频信号的路径,比如从编解码器的耳机输出到音频卡的耳机输入。
操作步骤:
-
配置音频卡的音频通道(例如耳机、麦克风)。
-
定义音频流的路由配置,确保信号正确传输。
4. I2S 接口配置
I2S 是音频数据的传输协议,文件中的配置定义了如何连接 I2S 接口:
fragment@3 {
target = <&hdr40_snd_link_i2s>;
__overlay__ {
link-name = "fe-pi-audio-z-v2";
bitclock-master;
frame-master;
codec {
sound-dai = <&sgtl5000>;
prefix = "H40-SGTL";
};
};
};
-
bitclock-master和frame-master:设置 I2S 总线的时钟源和帧时钟的主控。 -
sound-dai = <&sgtl5000>:指定 SGTL5000 为音频编解码器的 DAI(数字音频接口)。
操作步骤:
-
配置 I2S 接口作为音频数据的传输通道。
-
设置
bitclock-master和frame-master,确保时钟和数据帧同步。
5. 引脚复用配置
音频相关的引脚需要配置为 I2S 功能,这通常是通过引脚复用来实现的:
fragment@4 {
target = <&pinmux>;
__overlay__ {
pinctrl-names = "default";
pinctrl-0 = <&jetson_io_pinmux>;
jetson_io_pinmux: exp-header-pinmux {
hdr40-pin12 {
nvidia,pins = HDR40_PIN12;
nvidia,function = HDR40_I2S;
nvidia,pull = <TEGRA_PIN_PULL_DOWN>;
nvidia,tristate = <TEGRA_PIN_DISABLE>;
nvidia,enable-input = <TEGRA_PIN_ENABLE>;
};
// 更多引脚配置...
};
};
};
-
nvidia,function = HDR40_I2S:配置引脚为 I2S 功能。 -
nvidia,pull = <TEGRA_PIN_PULL_DOWN>:设置引脚的下拉电阻。 -
nvidia,enable-input = <TEGRA_PIN_ENABLE>:使能输入。
操作步骤:
-
配置 I2S 数据线和时钟线的引脚复用。
-
确保所有相关引脚的方向和电气特性设置正确。
6. 音频端点配置
最后,配置音频数据端点,建立与编解码器的连接:
fragment@6 {
target = <&hdr40_snd_i2s_dap_ep>;
__overlay__ {
bitclock-master;
frame-master;
remote-endpoint = <&sgtl5000_ep>;
};
};
remote-endpoint = <&sgtl5000_ep>:定义 I2S 数据端点连接到 SGTL5000。
操作步骤:
- 设置端点连接,确保数据流在设备之间正确传输。
总结与步骤:
-
配置时钟源,确保音频编解码器获得正确的时钟信号。
-
设置 I2C 接口与音频编解码器的通信,确保正确的地址和时钟源配置。
-
配置音频卡的音频流和路由,定义音频输入输出。
-
配置 I2S 接口的音频数据传输路径。
-
配置引脚复用以支持 I2S 信号。
-
配置音频端点,建立与编解码器的音频流连接。
这些步骤基本涵盖了音频开发中 Device Tree 配置的关键部分。
老徐,2026 0123