Jetson Orin Nano 音频设置与开发之 DTS

详细讲解如何进行音频设置开发,涉及的步骤、概念以及具体操作。

概念概述

在 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-masterframe-master:设置 I2S 总线的时钟源和帧时钟的主控。

  • sound-dai = <&sgtl5000>:指定 SGTL5000 为音频编解码器的 DAI(数字音频接口)。

操作步骤:

  • 配置 I2S 接口作为音频数据的传输通道。

  • 设置 bitclock-masterframe-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。

操作步骤:

  • 设置端点连接,确保数据流在设备之间正确传输。

总结与步骤:

  1. 配置时钟源,确保音频编解码器获得正确的时钟信号。

  2. 设置 I2C 接口与音频编解码器的通信,确保正确的地址和时钟源配置。

  3. 配置音频卡的音频流和路由,定义音频输入输出。

  4. 配置 I2S 接口的音频数据传输路径。

  5. 配置引脚复用以支持 I2S 信号。

  6. 配置音频端点,建立与编解码器的音频流连接。

这些步骤基本涵盖了音频开发中 Device Tree 配置的关键部分。

老徐,2026 0123

相关推荐
代码游侠8 分钟前
学习笔记——设备树基础
linux·运维·开发语言·单片机·算法
Gary Studio9 分钟前
rk芯片驱动编写
linux·学习
mango_mangojuice10 分钟前
Linux学习笔记(make/Makefile)1.23
java·linux·前端·笔记·学习
Harvey90320 分钟前
通过 Helm 部署 Nginx 应用的完整标准化步骤
linux·运维·nginx·k8s
iWZXQxBO1 小时前
运动控制卡 倒R角程序 G代码 halcon联合运动控制卡联合相机 运动控制卡内容
音视频
A星空1232 小时前
一、Linux嵌入式的I2C驱动开发
linux·c++·驱动开发·i2c
释怀不想释怀2 小时前
Linux环境变量
linux·运维·服务器
zzzsde2 小时前
【Linux】进程(4):进程优先级&&调度队列
linux·运维·服务器
凡人叶枫2 小时前
C++中智能指针详解(Linux实战版)| 彻底解决内存泄漏,新手也能吃透
java·linux·c语言·开发语言·c++·嵌入式开发
yuanmenghao2 小时前
Linux 性能实战 | 第 7 篇 CPU 核心负载与调度器概念
linux·网络·性能优化·unix