# JETSON ORIN NANO系列说明

Jetson Orin Nano 资料集

# JETSON ORIN NANO系列入门教程

本章节主要介绍Jetson Orin Nano的基本配置、系统烧录和基础外设使用。

# 一、产品介绍

### 1. 简介

**Jetson Orin Nano**是**Jetson Orin**系列中的入门产品，提供 **4GB** 和 **8GB** 两种内存组合，AI算力高达 20 TOPS/40 TOPS，在super模式下至高 **34 TOPS/67 TOPS**，同时其拥有丰富的接口资源，并且兼容**NVIDIA**的软件生态，是AI机器人，AI大模型和计算机视觉开发的得力工具。

<table border="1" id="bkmrk-orin-nano-4gb-orin-n" style="border-collapse: collapse; width: 100%; height: 212.375px;"><colgroup><col style="width: 19.7855%;"></col><col style="width: 39.5709%;"></col><col style="width: 40.6436%;"></col></colgroup><tbody><tr style="height: 29.7969px;"><td style="height: 29.7969px;">  
</td><td class="align-center" style="height: 29.7969px;">Orin Nano 4GB</td><td class="align-center" style="height: 29.7969px;">Orin Nano 8GB</td></tr><tr style="height: 46.5938px;"><td class="align-center" style="height: 46.5938px;">AI算力 (INT8)</td><td class="align-center" style="height: 46.5938px;">**34** TOPS   
</td><td class="align-center" style="height: 46.5938px;">**67** TOPS   
</td></tr><tr style="height: 46.5938px;"><td class="align-center" style="height: 46.5938px;">GPU</td><td class="align-center" style="height: 46.5938px;">**512** 核 CUDA核心 **16** 个 Tensor Core GPU@1020MHz</td><td class="align-center" style="height: 46.5938px;">**1024** 核 CUDA核心 **32** 个 Tensor Core GPU@1020MHz</td></tr><tr style="height: 29.7969px;"><td class="align-center" style="height: 29.7969px;">CPU</td><td class="align-center" style="height: 29.7969px;">6x A78 @ 1.7GHz</td><td class="align-center" style="height: 29.7969px;">6x A78 @ 1.7GHz</td></tr><tr style="height: 29.7969px;"><td class="align-center" style="height: 29.7969px;">内存</td><td class="align-center" style="height: 29.7969px;">LPDDR5 **4GB**</td><td class="align-center" style="height: 29.7969px;">LPDDR5 **8GB**</td></tr><tr style="height: 29.7969px;"><td class="align-center" style="height: 29.7969px;">功率</td><td class="align-center" style="height: 29.7969px;">7W | 15W | 25W </td><td class="align-center" style="height: 29.7969px;">7W | 15W | 25W </td></tr></tbody></table>

---

### 2. 外观

[![0Q7A9024 拷贝.jpg](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-07/scaled-1680-/dvS0q7a9024.jpg)](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-07/dvS0q7a9024.jpg)

[![0Q7A9030 拷贝.jpg](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-07/scaled-1680-/0q7a9030.jpg)](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-07/0q7a9030.jpg)

---

### 3. 接口

<table border="1" id="bkmrk-%E6%8E%A5%E5%8F%A3%E7%B1%BB%E5%9E%8B-%E8%A7%84%E6%A0%BC%E8%AF%A6%E6%83%85-csi-%E6%91%84%E5%83%8F%E5%A4%B4%E6%8E%A5%E5%8F%A3-" style="border-collapse: collapse; width: 100%; height: 572.484px;"><thead><tr style="height: 29.7969px;"><th style="width: 30%; height: 29.7969px;">接口类型</th><th style="width: 70%; height: 29.7969px;">规格详情</th></tr></thead><tbody><tr style="height: 36.9844px;"><td style="height: 36.9844px;">**CSI 摄像头接口**</td><td style="height: 36.9844px;">•2x MIPI CSI-2 22 针摄像头连接器</td></tr><tr style="height: 63.3906px;"><td style="height: 63.3906px;">**PCIe 接口**</td><td style="height: 63.3906px;">•M.2 Key M 插槽，支持 x4 PCIe 3.0  
•M.2 Key M 插槽，支持 x2 PCIe 3.0  
•M.2 Key E 插槽（已预装网卡）</td></tr><tr style="height: 46.5938px;"><td style="height: 46.5938px;">**USB 接口**</td><td style="height: 46.5938px;">• 4 x USB 3.2 Gen 2 (10Gbps) 接口

• USB Type-C UFP

</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">**网络接口**</td><td style="height: 29.7969px;">• 1 个千兆以太网 (GbE) 接口  
</td></tr><tr style="height: 41.375px;"><td style="height: 41.375px;">**显示输出**</td><td style="height: 41.375px;">•1x DisplayPort 1.2 (+MST) 连接器  
</td></tr><tr style="height: 46.5938px;"><td style="height: 46.5938px;">**存储接口**</td><td style="height: 46.5938px;">• 支持外部 NVMe 存储

• 支持SD卡

</td></tr><tr style="height: 231.359px;"><td style="height: 231.359px;">**扩展接口**</td><td style="height: 231.359px;">• 40 针扩展接头：  
\- 3x UART  
\- 2x SPI  
\- 2x I2S（音频）  
\- 4x I2C  
\- 1x CAN（控制器局域网）  
\- DMIC（数字麦克风）  
\- DSPK（数字扬声器）  
\- PWM（脉冲宽度调制）  
\- GPIO（通用输入输出）

• 12 针调试接口  
• 4 针风扇接头

• DC电源接口

</td></tr><tr style="height: 46.5938px;"><td style="height: 46.5938px;">**无线连接**</td><td style="height: 46.5938px;">• 支持WLAN 802.11ac

• 支持蓝牙5.0

</td></tr></tbody></table>

[![正面2.jpg](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-07/scaled-1680-/2.jpg)](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-07/2.jpg)

[![背面(标注).jpg](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-07/scaled-1680-/HX6zVlu0Qt.jpg)](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-07/HX6zVlu0Qt.jpg)

- 12Pin调试接口定义如下

[![image.png](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-07/scaled-1680-/Mwgimage.png)](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-07/Mwgimage.png)

---

### 4. 注意事项

<p class="callout info">开发板允许电源为 9~19V 5A MAX，请使用官方原装电源接入开发板，以免损坏载板和核心卡。</p>

<p class="callout info">请确认核心卡的散热器工作状态，以免模组过热导致性能下降。确保散热器安装稳固且无杂物阻碍，如有需要可定期清理灰尘以保障散热效果。</p>

<p class="callout info">在上电开机前请确保开发板已经接入 USB/固态硬盘/eMMC/内存卡等存储介质。</p>

# 二、刷机教程

### 1. 安装ubuntu虚拟机

##### 1.1 下载VMware Workstation

- 通过百度网盘下载此文件：VMware-workstation-full-16.2.5-20904516.exe  
    链接: https://pan.baidu.com/s/1xopblFgG29dYZXoNfwa5ZA 提取码: frjy

##### 1.2 安装VMware Workstation

- 打开VMware-workstation-full-16.2.5-20904516.exe

[![Snipaste_2025-06-09_14-51-05.png](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-06/scaled-1680-/snipaste-2025-06-09-14-51-05.png)](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-06/snipaste-2025-06-09-14-51-05.png)

- 选项保持默认即可，点下一步

[![Snipaste_2025-06-09_14-56-52.png](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-06/scaled-1680-/snipaste-2025-06-09-14-56-52.png)](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-06/snipaste-2025-06-09-14-56-52.png)

- 输入激活码，请自行百度搜索：vmware16密钥

[![Snipaste_2025-06-09_14-59-23.png](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-06/scaled-1680-/snipaste-2025-06-09-14-59-23.png)](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-06/snipaste-2025-06-09-14-59-23.png)

##### 1.3安装ubuntu系统

<p class="callout info">推荐使用20.04和22.04版本，这里以20.04为例。</p>

- 下载[ubuntu20.04\_desktop\_amd64.iso](https://releases.ubuntu.com/focal/ubuntu-20.04.6-desktop-amd64.iso)镜像，若下载速度较慢，推荐使用[清华源](https://mirrors.tuna.tsinghua.edu.cn/ubuntu-releases/focal/ubuntu-20.04.6-desktop-amd64.iso)或[中科大源](https://mirrors.ustc.edu.cn/)。

- 打开VMware Workstation Pro，新建虚拟机

[![Snipaste_2025-06-11_15-21-48.png](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-06/scaled-1680-/snipaste-2025-06-11-15-21-48.png)](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-06/snipaste-2025-06-11-15-21-48.png)

- 选择典型配置

[![Snipaste_2025-06-11_15-32-12.png](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-06/scaled-1680-/snipaste-2025-06-11-15-32-12.png)](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-06/snipaste-2025-06-11-15-32-12.png)

- 选择刚才下载的ISO镜像

[![Snipaste_2025-06-11_15-33-59.png](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-06/scaled-1680-/snipaste-2025-06-11-15-33-59.png)](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-06/snipaste-2025-06-11-15-33-59.png)

- 输入用户名与密码

[![Snipaste_2025-06-11_15-37-32.png](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-06/scaled-1680-/snipaste-2025-06-11-15-37-32.png)](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-06/snipaste-2025-06-11-15-37-32.png)

- 输入虚拟机名字与选择存放虚拟机文件的路径

[![Snipaste_2025-06-11_15-38-12.png](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-06/scaled-1680-/snipaste-2025-06-11-15-38-12.png)](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-06/snipaste-2025-06-11-15-38-12.png)

- 虚拟机可用的存储空间，建议最少给300G

[![Snipaste_2025-06-11_15-40-38.png](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-06/scaled-1680-/snipaste-2025-06-11-15-40-38.png)](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-06/snipaste-2025-06-11-15-40-38.png)

- 点击完成

[![Snipaste_2025-06-11_15-41-54.png](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-06/scaled-1680-/snipaste-2025-06-11-15-41-54.png)](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-06/snipaste-2025-06-11-15-41-54.png)

- 等待安装完成

[![Snipaste_2025-06-11_15-51-19.png](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-06/scaled-1680-/snipaste-2025-06-11-15-51-19.png)](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-06/snipaste-2025-06-11-15-51-19.png)

- 出现以下画面表示安装完成

[![Snipaste_2025-06-11_15-58-36.png](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-06/scaled-1680-/snipaste-2025-06-11-15-58-36.png)](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-06/snipaste-2025-06-11-15-58-36.png)


### 2.安装NVIDIA SDK Manager

##### 2.1 下载安装包

- 进入虚拟机打开浏览器，进入 [Jetson SDK](https://developer.nvidia.com/sdk-manager)，下载 **.deb ubuntu** 安装包。

<div id="bkmrk-1.%E8%BF%9B%E5%85%A5%E8%99%9A%E6%8B%9F%E6%9C%BA%E6%89%93%E5%BC%80%E6%B5%8F%E8%A7%88%E5%99%A8%EF%BC%8C%E8%BF%9B%E5%85%A5%5Bjets"></div>##### [![1.png](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-07/scaled-1680-/1.png)](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-07/1.png)

##### 2.2 安装SDK Manager

- 打开 文件管理器 进入 **Downloads** 文件夹，确认 **sdkmanager\_xxxxx\_amd64.deb** 存在，在当前目录下打开命令行窗口执行以下命令安装。

<div id="bkmrk-2.%E6%89%93%E5%BC%80-%2A%2A%E6%96%87%E4%BB%B6%E7%AE%A1%E7%90%86%E5%99%A8%2A%2A-%E8%BF%9B%E5%85%A5-%2A%2A"></div>```bash
sudo apt update
sudo dpkg -i sdkmanager_2.3.0-12617_amd64.deb # 需要根据实际版本修改包名
sudo apt install --fix-broken
```

[![12.png](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-07/scaled-1680-/12.png)](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-07/12.png)

[![image.png](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-07/scaled-1680-/ZDbimage.png)](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-07/ZDbimage.png)

[![image.png](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-07/scaled-1680-/f6Eimage.png)](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-07/f6Eimage.png)

### 3.使用NVIDIA SDK Manager进行刷机

#####  3.1 设置VMware的USB模式

- 将USB连接模式设置为 **`将设备连接到前台虚拟机`，避免刷机中途开发板重启导致失败。**

##### [![4.png](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-07/scaled-1680-/4.png)](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-07/4.png)

<div id="bkmrk-%E8%AE%BE%E7%BD%AEusb%E6%80%BB%E6%98%AF%E8%BF%9E%E6%8E%A5%E5%88%B0%E8%99%9A%E6%8B%9F%E6%9C%BA%EF%BC%8C%E7%84%B6%E5%90%8E%E6%89%93%E5%BC%80sd"></div>[![5.png](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-07/scaled-1680-/5.png)](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-07/5.png)

##### 3.2 进入恢复模式

- 1. ​​使用跳线帽短接开发板上的 <span style="text-decoration: underline;">**FC REC** </span>和 **<span style="text-decoration: underline;">GND</span>** 针脚。​​
    2. ​​使用 **USB to Tpye-C** 数据线将开发板连接到电脑。​​
    3. ​​接通开发板的 DC 电源。​​
    
    ​​成功进入恢复模式后， SDK Manager 会自动检测到核心卡类型，并提示选择套件类型，​同时散热器风扇不会工作。

<p class="callout warning">进入恢复模式后一段时间内不操作会重启进入系统，请注意操作时机。</p>

<div id="bkmrk--18"></div>[![0Q7A9416 拷贝.jpg](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-07/scaled-1680-/0q7a9416.jpg)](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-07/0q7a9416.jpg)

[![14.png](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-07/scaled-1680-/14.png)](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-07/14.png)

##### <span style="color: rgb(0, 0, 0);">3.3 配置SDK</span>

- <span style="color: rgb(0, 0, 0);">取消Host Machine，并点击CONTINUE</span>

[![image.png](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-07/scaled-1680-/B3Uimage.png)](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-07/B3Uimage.png)

- 只勾选Jetson Linux

[![15.png](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-07/scaled-1680-/15.png)](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-07/15.png)

##### 3.4 等待下载完成

[![image.png](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-07/scaled-1680-/3k6image.png)](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-07/3k6image.png)

##### 3.5 配置刷机参数

Pre-Config，预设账号密码

Runtime，开机后自行配置账号密码

Storage Device，系统刷入的介质，根据不同设备自行选择 (内存卡/固态硬盘/U盘)。

[![image.png](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-07/scaled-1680-/XjOimage.png)](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-07/XjOimage.png)

- 选择`developer kit version`。

[![12.png](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-07/scaled-1680-/JBF12.png)](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-07/JBF12.png)

- 耐心等待刷机完成，大约10~20分钟。

<p class="callout warning">刷入过程中开发板可能会多次与主机重新连接，请勿途中拔开数据线或切断开发板电源，可以在识别到开发板类型以后就拔掉跳线帽。</p>

[![image.png](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-07/scaled-1680-/ftEimage.png)](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-07/ftEimage.png)

- 刷入完成后，拔掉跳线帽，上电正常进入系统桌面或初始化设置页面即刷机成功。

[![6.png](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-07/scaled-1680-/6.png)](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-07/6.png)

[![7.png](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-07/scaled-1680-/7.png)](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-07/7.png)

### 4.使用命令行刷入super固件

<p class="callout warning">此操作需依赖官方固件环境，请先通过SDK Manager完成至少一次完整的烧录以创建固件缓存。</p>

##### 4.1 进入恢复模式

- 使用跳线帽短接**<span style="text-decoration: underline;">FC REC</span>**和**<span style="text-decoration: underline;">GND</span>**针脚，使用**Tpye-C**型数据线连接至电脑并接通开发板电源，使开发板进入恢复模式。


##### 4.2 使用官方固件进行命令行刷机

<p class="callout warning">操作前请关闭正在运行的SDK Manager软件，刷入过程约为10~20分钟</p>

- JetPack6.2版本刷入指令：

```bash
cd /home/ubuntu/nvidia/nvidia_sdk/JetPack_6.2.1_Linux_JETSON_ORIN_NANO_TARGETS/Linux_for_Tegra #仅供参考，需要根据实际版本和路径进行修改
sudo ./tools/kernel_flash/l4t_initrd_flash.sh --external-device nvme0n1p1 \
  -c tools/kernel_flash/flash_l4t_t234_nvme.xml -p "-c bootloader/generic/cfg/flash_t234_qspi.xml" \
  --showlogs --network usb0 jetson-orin-nano-devkit-super internal
```

- JetPack5.1.5版本刷入指令：

```bash
cd /home/ubuntu/nvidia/nvidia_sdk/JetPack_5.1.5_Linux_JETSON_ORIN_NANO_TARGETS/Linux_for_Tegra #仅供参考，需要根据实际版本和路径进行修改
sudo ./tools/kernel_flash/l4t_initrd_flash.sh --external-device nvme0n1p1\
  -c tools/kernel_flash/flash_l4t_external.xml -p "-c bootloader/t186ref/cfg/flash_t234_qspi.xml"\
  --showlogs --network usb0 jetson-orin-nano-devkit-super internal
```

[![8.png](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-07/scaled-1680-/8.png)](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-07/8.png)

##### 4.3 验证是否处于super模式


- 开发板上电开机完成用户配置后在桌面右上角可以选择电源模式，**25W** &amp; **MAXN** **SUPER**为super模式独有，普通模式只有 **7W** 和 1**5W** 两档。

<div id="bkmrk--33"></div>
[![9.png](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-07/scaled-1680-/9.png)](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-07/9.png)

### 4.备份与恢复现有固件

##### 4.1备份固件

- 使用跳线帽短接**<span style="text-decoration: underline;">FC REC</span>**和**<span style="text-decoration: underline;">GND</span>**针脚，使用**Tpye-C**型数据线连接至电脑并接通开发板电源，使开发板进入恢复模式。

 或者在正常开机状态下连接到主机，输入以下命令重启到恢复模式

```bash
sudo reboot -f forced-recovery
```

- 进入到原刷机固件缓存下的命令行目录。

```bash
cd /home/ubuntu/nvidia/nvidia_sdk/JetPack_6.2.1_Linux_JETSON_ORIN_NANO_TARGETS/Linux_for_Tegra #仅供参考，需要根据实际版本和路径进行修改
```

- 主机上安装依赖包

```bash
sudo apt-get install qemu-user-static libxml2-utils abootimg sshpass nfs-kernel-server binutils
```

- 备份命令

```bash
sudo ./tools/backup_restore/l4t_backup_restore.sh -b -e nvme0n1 jetson-orin-nano-devkit-nvme
```

- 恢复命令

```bash
sudo ./tools/backup_restore/l4t_backup_restore.sh -r -e nvme0n1 jetson-orin-nano-devkit-nvme
```

若您使用第三方载板恢复备份需要修改`nvrestore_partitions.sh`注释掉 **292~296行** 的内容

[![image.png](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-08/scaled-1680-/VXwimage.png)](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-08/VXwimage.png)

<div id="bkmrk-%60%60%60bash"></div>

# 三、摄像头

- 接入摄像头后，您可以使用以下指令查看现有摄像头的编号。

```bash
jetson@jetson-desktop:~$ ls /dev/video*
/dev/video0  /dev/video1  
```

#### 1. CSI摄像头

<p class="callout warning">尽量避免带电操作，接入CSI摄像头时注意FPC排线金属触点一面朝下</p>

##### 1.1 使用gst-launch打开摄像头

- 确认CSI摄像头正确连接后，分别在两个命令行窗口运行以下命令打开摄像头。


```bash
gst-launch-1.0 nvarguscamerasrc sensor-id=0 ! "video/x-raw(memory:NVMM), width=(int)1920, height=(int)1080,format=(string)NV12, framerate=(fraction)30/1" ! nvvidconv ! xvimagesink sync=false    
gst-launch-1.0 nvarguscamerasrc sensor-id=1 ! "video/x-raw(memory:NVMM), width=(int)1920, height=(int)1080,format=(string)NV12, framerate=(fraction)30/1" ! nvvidconv ! xvimagesink sync=false  #打开另一个命令行窗口运行
```

- **sensor-id**：指定摄像头物理接口 ID，双摄使用 `sensor-id=0` 和 `sensor-id=1`。
- **memory**：使用 NVIDIA GPU 内存（NVMM），减少延迟。
- **width, height**：设置分辨率，需硬件支持，例如 1080p。
- **format**：像素格式为 `NV12`（NVIDIA 编码器原生支持）。
- **framerate**：设置帧率，例如 `30/1`（30 FPS）。
- **sync**：`false` 禁用音视频同步，减少延迟。

[![4.png](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-07/scaled-1680-/fXv4.png)](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-07/fXv4.png)

#### 2. USB摄像头

- Cheese是一款简单易用的摄像头应用，它允许用户在Ubuntu系统中轻松地进行拍照、录像以及连拍等操作。运行以下命令以安装Cheese软件。

```bash
sudo apt install cheese
```

[![1.png](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-07/scaled-1680-/IVR1.png)](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-07/IVR1.png)

将USB摄像头连接至开发板USB接口，并打开cheese软件

[![3.png](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-07/scaled-1680-/Goj3.png)](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-07/Goj3.png)

---

- Guvcview是一款开源的图形用户界面软件，它为用户提供了简单直观的方式来捕捉视频。运行以下命令以安装guvcview软件。

```bash
sudo apt install guvcview
```

[![7.png](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-07/scaled-1680-/HZH7.png)](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-07/HZH7.png)

[![8.png](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-07/scaled-1680-/FWh8.png)](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-07/FWh8.png)

您也仍然可以使用nvgstcapture来打开USB摄像头

```bash
# V4L2 USB camera (where <N> is the /dev/videoN node)
sudo nvgstcapture --cap-dev-node 2   #0,1默认为CSI摄像头
```

[![6.png](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-07/scaled-1680-/avd6.png)](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-07/avd6.png)

<p class="callout info">更详细的说明可参考[NVIDIA Developer](https://developer.nvidia.com/embedded/learn/tutorials/first-picture-csi-usb-camera)</p>

# 四、GPIO控制

GPIO（General-purpose input/output ）是一种通用型输入输出接口，其脚位可由使用者编程控制。根据实际需要，这些脚位可以被设置为通用输入（GPI）、通用输出（GPO），或兼具输入输出功能（GPIO）。

<p class="callout info">Jetson Orin Nano系列的40PIN GPIO引脚定义如下：[![Jetson_Orin_Nano_Expansion_Header_J12_Pinout.jpeg](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-07/scaled-1680-/jetson-orin-nano-expansion-header-j12-pinout.jpeg)](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-07/jetson-orin-nano-expansion-header-j12-pinout.jpeg)</p>

### 1 在JetPack 5系统中使用GPIO

#### 1.1 使用命令行控制GPIO

##### 获取GPIO口的引脚名称与编号


以31号引脚为例，454为GPIO口编号，PQ.06为引脚名称

- 提升至root权限，启用GPIO口

```bash
sudo bash

echo 454 > /sys/class/gpio/export
```

- 设置GPIO为输入模式

```bash
echo in > /sys/class/gpio/PQ.06/direction
```

- 获取GPIO当前状态，返回值1为高电平，0为低电平

```bash
cat /sys/class/gpio/PQ.06/value
```

- 设置GPIO为输出模式

```bash
echo out > /sys/class/gpio/PQ.06/direction
```

- 设置GPIO输出，1为高电平，0为低电平

```bash
echo 1 > /sys/class/gpio/PQ.06/value
```

您也可以使用以下脚本进行测试

```bash
#!/bin/bash
trap 'echo PQ.06 > /sys/class/gpio/unexport; echo "GPIO PQ.06 is released"' EXIT

echo "setting GPIO PQ.06"
echo PQ.06 > /sys/class/gpio/export 2>/dev/null

# set Pin output mode
echo out > /sys/class/gpio/PQ.06/direction

# blink
while true
do
    echo 0 > /sys/class/gpio/PQ.06/value
    sleep 0.5
    cat /sys/class/gpio/PQ.06/value
    sleep 0.5
    echo 1 > /sys/class/gpio/PQ.06/value
    sleep 0.5
    cat /sys/class/gpio/PQ.06/value
    sleep 0.5
done

```

#### 1.2 使用python控制GPIO

##### 1.2.1 安装JETSON.GPIO包

- 如果您不确定您的环境是否正常，或者您尝试使用**conda**环境运行脚本请执行以下指令安装Jetson官方的GPIO库

```python
pip install JETSON.GPIO
```

Jetson GPIO库提供了四种给I / O引脚编号的方法。

- ​**​BOARD​**​：物理引脚编号（40针接口顺序）。
- ​**​BCM​**​：Broadcom SoC 的 GPIO 编号（​**​常用​**​）。
- ​**​CVM​**​：CVM/CVB 连接器的信号名称。
- ​**​TEGRA\_SOC​**​：Tegra SoC 信号名称。

```python
import time
import RPi.GPIO as GPIO

# define pin number
output_pin = 31

# set pin as BOARD mode
GPIO.setmode(GPIO.BOARD)

# set pin mode
GPIO.setup(output_pin, GPIO.OUT)

print("Press CTRL+C to exit")
curr_value = GPIO.HIGH
try:
    while True:
        time.sleep(1)
        print("pin {} now is {}".format(output_pin, curr_value))
        GPIO.output(output_pin, curr_value)
        # blink
        curr_value ^= GPIO.HIGH
finally:
    GPIO.cleanup()
```

其他具体用法和例程可参考[项目官网](https://sourceforge.net/p/raspberry-gpio-python/wiki/Examples/)

#### 1.3使用C/C++控制GPIO

- 安装libgpio-dev

```
sudo apt install libgpio-dev
```

参考例程：

```c++
/**
 * License - MIT.
*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <gpiod.h>

#define GPIO_CHIP       "/dev/gpiochip0"
#define GPIO_LED        3

int main()
{
    int ret = 0;
    struct gpiod_chip *gpiochip;
    struct gpiod_line *gpioline;

    // Open driver.
    gpiochip = gpiod_chip_open(GPIO_CHIP);

    if (NULL == gpiochip) {
        printf("Error in gpiod_chip_open.\n");
        ret = -1;
        goto out1;
    }

    // Get gpio.
    gpioline = gpiod_chip_get_line(gpiochip, GPIO_LED);

    if (NULL == gpioline) {
        printf("Error in gpiod_chip_get_line.\n");
        ret = -1;
        goto out2;
    }

    // Set gpio direction.
    ret = gpiod_line_request_output(gpioline, "gpio", 0);

    if (ret != 0) {
        printf("Error in gpiod_line_request_output.\n");
        ret = -1;
        goto out2;
    }

    // Blink.
    for (int i = 0; i < 10; i++) {
        printf("%d times.\n", i);

        gpiod_line_set_value(gpioline, 1);
        sleep(1);

        gpiod_line_set_value(gpioline, 0);
        sleep(1);
    }

    // Release.
    gpiod_line_release(gpioline);

out2:
    gpiod_chip_close(gpiochip);

out1:
    return ret;
}
```

- 编译源文件

```bash
g++ test_gpio.cc -o test_gpio -lgpiod
```

- 执行测试程序

```bash
./test_gpio
```

### 2 在JetPack 6系统中使用GPIO

#### 2.1使用libgpiod控制GPIO

在 **JetPack 6.2/r36.4.3** 中，NVIDIA已经移除了传统的 sysfs GPIO 接口（/sys/class/gpio）不建议再使用 sysfs 来控制 GPIO。推荐使用Linux统一的 **libgpiod** 管理 GPIO

- 安装前置软件包

```bash
sudo apt-get install busybox automake autoconf libtool
```

- 验证安装是否成功

```bash
jetson@jetson-desktop:~$ gpioinfo
gpiochip0 - 164 lines:
	line   0:      "PA.00" "regulator-vdd-3v3-sd" output active-high [used]
	line   1:      "PA.01"       unused   input  active-high 
	line   2:      "PA.02"       unused   input  active-high 
	line   3:      "PA.03"       unused   input  active-high 
	line   4:      "PA.04"       unused   input  active-high 
	line   5:      "PA.05"       unused   input  active-high 
	line   6:      "PA.06"       unused   input  active-high 
	line   7:      "PA.07"       unused   input  active-high 
	line   8:      "PB.00"       unused   input  active-high 
	line   9:      "PC.00"       unused   input  active-high 
...........
```

---

- 读取 GPIO 状态

```bash
gpioget $(gpiofind "PQ.06")
```

- 将 GPIO 设置为输出模式

```bash
sudo busybox devmem 0x2430070 w 0x004
```

各个引脚对应的寄存器地址从 **[官方文档](https://developer.nvidia.com/downloads/jetson-orin-nx-and-orin-nano-series-pinmux-config-template)** 中可以查询到

- 保持高电平：

```
gpioset --mode=wait `gpiofind "PQ.06"`=1
```

- 保持低电平：

```
gpioset --mode=wait `gpiofind "PQ.06"`=0
```

#### 2.2 使用python控制GPIO

<p class="callout info">在JetPack6 系统中仍需要修改寄存器内容来更改引脚GPIO模式以使用高级语言控制GPIO</p>

- 将 PQ.06 引脚设置为输出模式

```bash
sudo busybox devmem 0x2430070 w 0x004
```

- 如果您尝试使用 conda 环境运行脚本请执行以下指令安装 Jetson 官方的 GPIO 库

```python
pip install JETSON.GPIO
```

- 建议执行以下指令，重新安装系统自带的 JETSON.GPIO 库

```bash
sudo rm -rf /usr/lib/python3*/dist-packages/Jetson
sudo rm -rf /usr/local/lib/python3*/dist-packages/Jetson
git clone https://github.com/NVIDIA/jetson-gpio.git
cd jetson-gpio
sudo pip3 install .
```

Jetson GPIO 库提供了四种给I / O引脚编号的方法。

- ​**​BOARD​**​：物理引脚编号（40针接口顺序）。
- ​**​BCM​**​：Broadcom SoC 的 GPIO 编号（​**​常用​**​）。
- ​**​CVM​**​：CVM/CVB 连接器的信号名称。
- ​**​TEGRA\_SOC​**​：Tegra SoC 信号名称。

```python
import time
import RPi.GPIO as GPIO

# define pin number PQ.06
output_pin = 31

# set pin as BOARD mode
GPIO.setmode(GPIO.BOARD)

# set pin mode
GPIO.setup(output_pin, GPIO.OUT)

print("Press CTRL+C to exit")
curr_value = GPIO.HIGH
try:
    while True:
        time.sleep(1)
        print("pin {} now is {}".format(output_pin, curr_value))
        GPIO.output(output_pin, curr_value)
        # blink
        curr_value ^= GPIO.HIGH
finally:
    GPIO.cleanup()
```

其他具体用法和例程可参考[项目官网](https://sourceforge.net/p/raspberry-gpio-python/wiki/Examples/)

#### 2.3使用C/C++控制GPIO

<p class="callout info">在JetPack6 系统中仍需要修改寄存器内容来更改引脚GPIO模式以使用高级语言控制GPIO</p>

- 将 PQ.06 引脚设置为输出模式

```bash
sudo busybox devmem 0x2430070 w 0x004
```

- 安装libgpio-dev

```
sudo apt install libgpiod-dev
```

参考例程：

```c++
/**
 * License - MIT.
*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <gpiod.h>

#define GPIO_CHIP       "/dev/gpiochip0"
#define GPIO_LED        106

int main()
{
    int ret = 0;
    struct gpiod_chip *gpiochip;
    struct gpiod_line *gpioline;

    // Open driver.
    gpiochip = gpiod_chip_open(GPIO_CHIP);

    if (NULL == gpiochip) {
        printf("Error in gpiod_chip_open.\n");
        ret = -1;
        goto out1;
    }

    // Get gpio.
    gpioline = gpiod_chip_get_line(gpiochip, GPIO_LED);

    if (NULL == gpioline) {
        printf("Error in gpiod_chip_get_line.\n");
        ret = -1;
        goto out2;
    }

    // Set gpio direction.
    ret = gpiod_line_request_output(gpioline, "gpio", 0);

    if (ret != 0) {
        printf("Error in gpiod_line_request_output.\n");
        ret = -1;
        goto out2;
    }

    // Blink PQ.06
    for (int i = 0; i < 30; i++) {
        printf("%d times.\n", i);

        gpiod_line_set_value(gpioline, 1);
        sleep(1);

        gpiod_line_set_value(gpioline, 0);
        sleep(1);
    }

    // Release.
    gpiod_line_release(gpioline);

out2:
    gpiod_chip_close(gpiochip);

out1:
    return ret;
}
```

- 编译源文件

```bash
g++ test_gpio.cc -o test_gpio -lgpiod
```

- 执行测试程序

```bash
./test_gpio
```

#### PADCTL基地址与GPIO口偏移量

> 我们从官方文档中查找摘取了以下信息供您参考，您也可以自行查阅官方Pinmux和TRM文档。


PADCTL\_A0(PADCTL\_G3) 0x02430000  
PADCTL\_A4(PADCTL\_G4) 0x02434000  
PADCTL\_A16(PADCTL\_EDP) 0x02440000  
PADCTL\_A24(PADCTL\_G7) 0x02448000

7号 GPIO09 PADCTL\_G7\_SOC\_GPIO59\_0 0x30 gpio-492 PAC.06 0x02448030  
15号 GPIO12 PADCTL\_EDP\_SOC\_GPIO39\_0 0x20 gpio-433 PN.01 0x02440020  
29号 GPIO01 PADCTL\_G3\_SOC\_GPIO32\_0 0x68 gpio-453 PQ.05 0x02430068  
31号 GPIO11 PADCTL\_G3\_SOC\_GPIO33\_0 0x70 gpio-454 PQ.06 0x02430070  
32号 GPIO07 PADCTL\_G4\_SOC\_GPIO19\_0 0x80 gpio-389 PG.06 0x02434080  
33号 GPIO13 PADCTL\_G4\_SOC\_GPIO21\_0 0x40 gpio-391 PH.00 0x02434040

# 五、其他外设

### 1. UART接口

##### 1.1使用 cutecom 操作UART

**cutecom** 是一个**跨平台的串口终端程序**，它提供了一个简洁直观的图形用户界面，允许用户通过串口接口发送和接收数据。运行以下命令以安装 **cutecom**

```bash
sudo apt install cutecom
```

[![1.png](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-07/scaled-1680-/EKf1.png)](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-07/EKf1.png)

 官方默认开启的UART接口为 **ttyTHS1** 即 40pin GPIO中的 **pin8 (TX)** 和 **pin10( RX)** 引脚。

- 使用一根条线短接8和10引脚
- 更改串口权限（临时授权）

```bash
sudo chmod 777 /dev/ttyTHS1
```

- 运行如下语句将当前用户加入到用户组。（可选，永久授权）

```bash
sudo usermod -aG dialout $USER
```

- 打开 **cutecom**，选择 **ttyTHS1** 并打开。

[![8.png](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-07/scaled-1680-/DfP8.png)](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-07/DfP8.png)

- 输入文本并回车，可以看到下方接收区显示有内容。

[![10.png](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-07/scaled-1680-/oY510.png)](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-07/oY510.png)

##### 1.2 使用 python 操作 UART 

- 更改串口权限

```bash
sudo chmod 777 /dev/ttyTHS1
```

- 安装pyserial库

```bash
pip install pyserial
```

- 运行以下脚本进行测试

```python
import serial
import time


PORT = "/dev/ttyTHS1"
BAUDRATE = 115200
ENCODING = "UTF-8"
MESSAGE = "hello,jetson\r\n"


try:
	with serial.Serial(PORT, BAUDRATE, timeout=2) as se:
		print(f"Serial port {PORT} opened: {se.is_open}")
		while True:
			se.write(MESSAGE.encode(ENCODING))
			print(f"Sent: {MESSAGE.strip()}")
			try:
				line = se.readline().decode(ENCODING).strip()
				if line:
					print(f"Received: {line}")
			except Exception as e:
				print(f"Read error: {e}")
			time.sleep(1)
except serial.SerialException as e:
    print(f"Serial error: {e}")
except KeyboardInterrupt:
    print("\nExit by user.")
```

[![11.png](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-07/scaled-1680-/RJK11.png)](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-07/RJK11.png)

### 2. SPI接口

- 查看开发板spi资源

```bash
jetson@ubuntu:~/Downloads$ lsmod | grep -i spi
spidev                 28672  0
spi_tegra114           32768  0
```

##### 2.1使用C/C++进行SPI通讯

以SPI0为例，使用条线短接19()，20号针脚

- 下载SPI例程

```bash
git clone https://github.com/rm-hull/spidev-test
```

- 编译源文件

```bash
cd spidev-test
gcc spidev_test.c -o spidev_test
```

- 运行例程

```bash
sudo modprobe spidev  #启动官方spi驱动
./spidev_test -D /dev/spidev0.0 -s 100000 -p "\x11\x22\x33" -v
```

正确测试结果如下：

```bash
jetson@ubuntu:~/spidev-test$ ./spidev_test -D /dev/spidev0.0 -s 100000 -p "\x11\x22\x33" -v
spi mode: 0x0
bits per word: 8
max speed: 100000 Hz (100 KHz)
TX | 11 22 33 __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __  | ."3
RX | 11 22 33 __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __  | ."3
```

##### 2.1使用python进行SPI通讯

- 安装spidev库

```bash
pip install spidev
```

- 运行测试脚本

```python
import spidev
import time

spi = spidev.SpiDev()
spi.open(0, 0)
spi.max_speed_hz = 1_000_000
spi.mode = 0

TEST_DATA = [
    [11], [22], [33]
]

for data in TEST_DATA:
    resp = spi.xfer2(data)
    print(f"recived:{resp}")
    time.sleep(0.1)

spi.close()
```

正确测试结果如下：

```bash
(test) jetson@ubuntu:~/Downloads$ python test_spi.py
recived:[11]
recived:[22]
recived:[33]
```


### 3. I<sup>2</sup>C接口

- 安装i2c工具

```bash
sudo apt install  i2c-tools
```

- 查看开发板可用的i2c的总线：

```bash
jetson@jetson-desktop:~$ i2cdetect -l
i2c-0    i2c           3160000.i2c                         I2C adapter
i2c-1    i2c           c240000.i2c                         I2C adapter
i2c-2    i2c           3180000.i2c                         I2C adapter
i2c-4    i2c           Tegra BPMP I2C adapter              I2C adapter
i2c-5    i2c           31b0000.i2c                         I2C adapter
i2c-7    i2c           c250000.i2c                         I2C adapter
i2c-9    i2c           NVIDIA SOC i2c adapter 0            I2C adapter
```

- 查看连接到对应总线的i2c设备：

```bash
jetson@jetson-desktop:~$ i2cdetect -y -r -a 7
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00: 00 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
```

- 正确接入i2c设备后：

```bash
i2cdetect -y -r -a 7
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- 3c -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
```

### 4. RTC接口

**实时时钟**（Real-Time Clock, **RTC**）是一种独立计时设备，可在系统断电或主电源关闭时持续提供精确的时间和日期信息。当开发板在​**​离线环境​**​下运行，并且​**​断电后仍需保持时间同步​**​时，就需要使用到RTC。

<p class="callout info">官方套件不支持RTC功能</p>

<p class="callout info"><span style="font-family: MiSans VF Normal;">载板RTC电池连接器型号为MX1.25-2P，使用电池时，请确认好极性，禁止接反电池</span></p>

[![image.png](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-08/scaled-1680-/gfZimage.png)](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-08/gfZimage.png)

- 检查系统时间是否正确

```bash
timedatectl status
```

- 同步网络时间

```
sudo apt install ntpdate
sudo ntpdate cn.pool.ntp.org
```

- 设置时区

```
sudo timedatectl set-timezone Asia/Shanghai
```

- 同步系统时间到RTC硬件

```
sudo hwclock --systohc --utc --rtc /dev/rtc0 --noadjfile
```

- 检查RTC硬件时间

```
sudo hwclock --show --utc --rtc /dev/rtc0 --noadjfile
```

- 设置开机自动同步RTC时间

 1. 打开文件

```
sudo vi /lib/systemd/system/hwrtc.service
```

 2.写入以下内容

```bash
[Unit]
Description=Synchronise System clock to hardware RTC
DefaultDependencies=no
After=systemd-modules-load.service
Before=systemd-journald.service systemd-fsck-root.service time-sync.target sysinit.target shutdown.target
Conflicts=shutdown.target

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/sbin/hwclock --hctosys --utc --rtc /dev/rtc0 --noadjfile
RestrictRealtime=yes

[Install]
WantedBy=sysinit.target
```

 3.设置开机自启动服务

```
sudo systemctl enable hwrtc.service
```

- 手动RTC硬件同步到系统时间

```
sudo hwclock --hctosys --utc --rtc /dev/rtc0 --noadjfile
```

- 关闭网络同步时间

```
sudo timedatectl set-ntp false
```

# Orin Nano/NX USB配置说明

### 一、Jetson Orin Nano配置方法

#### 1. JetPack 5.1.5配置方法

##### 1. 1刷入**JetPack 5.1.5**系统。

 参考[官方固件刷机流程](https://www.linkzeelabs.com/wiki/books/jetson-orin-nano/page/75887)

##### 1.2 将设备树文件下载到开发板

 设备正常开机后，打开终端命令行，将**修改后的设备树文件**下载到开发板。

```bash
git clone https://gitee.com/kongyuantech/document.git
cd document/AN002\ Orin\ Nano\ NX\ USB配置/5.1.4/
```

##### 1.3 使用命令行替换设备树。

选择执行以下命令替换**DTB设备树**文件并重启设备。

- **Jetson Orin Nano 4G** 请使用以下代码

```
sudo cp /boot/dtb/kernel_tegra234-p3767-0004-p3768-0000-a0.dtb /boot/dtb/kernel_tegra234-p3767-0004-p3768-0000-a0.dtb.backup # 备份原设备树文件
sudo cp kernel_tegra234-p3767-0004-p3768-0000-a0.dtb /boot/dtb
sudo chown 0:0 /boot/dtb/kernel_tegra234-p3767-0004-p3768-0000-a0.dtb
sudo chmod 644 /boot/dtb/kernel_tegra234-p3767-0004-p3768-0000-a0.dtb
sudo reboot
```

- **Jetson Orin Nano 8G** 请使用以下代码

```
sudo cp /boot/dtb/kernel_tegra234-p3767-0003-p3768-0000-a0.dtb /boot/dtb/kernel_tegra234-p3767-0003-p3768-0000-a0.dtb.backup # 备份原设备树文件
sudo cp kernel_tegra234-p3767-0003-p3768-0000-a0.dtb /boot/dtb
sudo chown 0:0 /boot/dtb/kernel_tegra234-p3767-0003-p3768-0000-a0.dtb
sudo chmod 644 /boot/dtb/kernel_tegra234-p3767-0003-p3768-0000-a0.dtb
sudo reboot

```

#### 2. JetPack 6.2.1配置方法

##### 2.1 刷入**JetPack 6.2.1**系统。

 参考[官方固件刷机流程](https://www.linkzeelabs.com/wiki/books/jetson-orin-nano/page/75887)

##### 2.2 将设备树文件下载到开发板

- 设备正常开机后，打开终端命令行，将**修改后的设备树文件**下载到开发板。

```bash
git clone https://gitee.com/kongyuantech/document.git
cd document/AN002\ Orin\ Nano\ NX\ USB配置/6.2/
```

##### 1.3 使用命令行替换设备树。

选择执行以下命令**增加DTB设备树**文件并重启设备。

- **Jetson Orin Nano 4G** 请执行以下代码

```
sudo cp orin_nano_4g.dtb /boot/dtb
sudo sed -i 's#console=tty0#console=tty0\n      FDT /boot/dtb/orin_nano_4g.dtb#g' /boot/extlinux/extlinux.conf
sudo reboot

```

- **Jetson Orin Nano 8G** 请执行以下代码

```
sudo cp orin_nano_8g.dtb /boot/dtb
sudo sed -i 's#console=tty0#console=tty0\n      FDT /boot/dtb/orin_nano_8g.dtb#g' /boot/extlinux/extlinux.conf
sudo reboot
```

### 二、Jetson Orin NX配置方法

#### 1. JetPack 5.1.5配置方法

##### 1. 1刷入**JetPack 5.1.5**系统。

 参考[官方固件刷机流程](https://www.linkzeelabs.com/wiki/books/jetson-orin-nano/page/75887)

##### 1.2 将设备树文件下载到开发板

- 设备正常开机后，打开终端命令行，将**修改后的设备树文件**下载到开发板。

```bash
git clone https://gitee.com/kongyuantech/document.git
cd document/AN002\ Orin\ Nano\ NX\ USB配置/5.1.4/
```

##### 1.3 使用命令行替换设备树。

选择执行以下命令替换**DTB设备树**文件并重启设备。

- **Jetson Orin NX 8G** 请执行以下代码

```
sudo cp /boot/dtb/kernel_tegra234-p3767-0001-p3768-0000-a0.dtb /boot/dtb/kernel_tegra234-p3767-0001-p3768-0000-a0.dtb.backup # 备份原设备树文件
sudo cp kernel_tegra234-p3767-0001-p3768-0000-a0.dtb /boot/dtb
sudo chown 0:0 /boot/dtb/kernel_tegra234-p3767-0001-p3768-0000-a0.dtb
sudo chmod 644 /boot/dtb/kernel_tegra234-p3767-0001-p3768-0000-a0.dtb
sudo reboot
```

- **Jetson Orin NX 16G** 请执行以下代码

```
sudo cp /boot/dtb/kernel_tegra234-p3767-0000-p3768-0000-a0.dtb /boot/dtb/kernel_tegra234-p3767-0000-p3768-0000-a0.dtb.backup # 备份原设备树文件
sudo cp kernel_tegra234-p3767-0000-p3768-0000-a0.dtb /boot/dtb
sudo chown 0:0 /boot/dtb/kernel_tegra234-p3767-0000-p3768-0000-a0.dtb
sudo chmod 644 /boot/dtb/kernel_tegra234-p3767-0000-p3768-0000-a0.dtb
sudo reboot

```


#### 2. JetPack 6.2.1配置方法

##### 2.1 刷入**JetPack 6.2.1**系统。

 参考[官方固件刷机流程](https://www.linkzeelabs.com/wiki/books/jetson-orin-nano/page/75887)

##### 2.2 将设备树文件下载到开发板

- 设备正常开机后，打开终端命令行，将**修改后的设备树文件**下载到开发板。

```bash
git clone https://gitee.com/kongyuantech/document.git
cd document/AN002\ Orin\ Nano\ NX\ USB配置/6.2/
```

##### 2.3 使用命令行替换设备树。

选择执行以下命令**增加DTB设备树**文件并重启设备。

- **Jetson Orin NX 8G** 请使用以下代码

```
sudo cp orin_nx_8g.dtb /boot/dtb
sudo sed -i 's#console=tty0#console=tty0\n      FDT /boot/dtb/orin_nx_8g.dtb#g' /boot/extlinux/extlinux.conf
sudo reboot

```

- **Jetson Orin NX 16G** 请使用以下代码

```
sudo cp orin_nx_16g.dtb /boot/dtb
sudo sed -i 's#console=tty0#console=tty0\n      FDT /boot/dtb/orin_nx_16g.dtb#g' /boot/extlinux/extlinux.conf
sudo reboot
```




<div class="markdown-code-block" id="bkmrk-%E6%9B%BF%E6%8D%A2%E8%AE%BE%E5%A4%87%E6%A0%91%E5%90%8E%EF%BC%8C3%E4%B8%AAusb3.2%E7%AB%AF%E5%8F%A3%E5%8F%AF%E6%AD%A3%E5%B8%B8">---

</div>#### 检测配置结果

<div class="markdown-code-block" id="bkmrk-%E6%9B%BF%E6%8D%A2%E8%AE%BE%E5%A4%87%E6%A0%91%E5%90%8E%EF%BC%8C4%E4%B8%AAusb3.0%E7%AB%AF%E5%8F%A3%EF%BC%88c1"><div class="markdown-code-block-copy-btn">  
</div><div class="markdown-code-block-copy-btn">替换设备树后，4个USB3.0端口（C1901为3个）可正常工作，Type-C端口系统默认处于关闭状态  
</div><div class="markdown-code-block-copy-btn">可使用以下命令查看USB端口工作情况。</div></div>```bash
lsusb -t
```

- 未替换设备树前：

[![1-1.png](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-07/scaled-1680-/1-1.png)](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-07/1-1.png)

- 替换设备树成功后：

[![2.png](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-07/scaled-1680-/Bsa2.png)](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-07/Bsa2.png)

您也可以自行使用DISK工具或dd指令测试读写速率是否达到USB3.0的标准。

### 三、配置Tpye-C端口模式

- 配置**Type-C端口**为**Device**模式

<p class="callout warning">注意：此命令为临时启用，重启会失效。</p>

```
sudo bash -c 'echo device > /sys/class/usb_role/usb2-0-role-switch/role'
```

设置后，使用Type-C端口连接到PC主机时，具有以下功能

1. COM口，设备的终端命令行
2. 虚拟网卡，设备ip地址默认为：192.168.55.1
3. NCM (Network Control Model)，设备可通过PC主机联网，仅支持Linux、Mac

- 开机默认配置**Type-C端口**为**Device**模式（永久有效）

```
sudo sed -i 's#exit 0#echo device > /sys/class/usb_role/usb2-0-role-switch/role\nexit 0#g' /opt/nvidia/l4t-usb-device-mode/nv-l4t-usb-device-mode-start.sh
```

# 连接到Jetson系统

Jetson拥有一个HDMI/DP视频输出接口、RJ45网口、Type-C接口和UART调试接口，下面我们将使用上面这四种方法连接到Jetson开发板系统。

#### 1. 连接显示器

使用功能正常的 DP/HDMI 线材连接到功能正常的显示器，接通开发板电源就能正常进入桌面。接入鼠标键盘后即可如普通桌面PC一样操作。

#### 2. 远程登陆

<p class="callout info">此方法需要提前使用SDK Maneger写入用户名和密码</p>

##### 2.1将开发板连接到路由器，并接通电源开机

##### 2.2-1通过路由器后台获取到开发板ip地址

不同品牌的路由器存在较大差异，请按照设备制造商的指引进行查询

[![image.png](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-08/scaled-1680-/fBZimage.png)](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-08/fBZimage.png)

##### 2.2-2使用**advanced ip scanner**软件扫描同网段下的设备

[![image.png](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-08/scaled-1680-/image.png)](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-08/image.png)

在刷入官方固件时，制造商信息为 **NVIDIA Corporation** 的设备即为开发板。

##### 2.3 下载安装 **putty** 或 **MobaXterm** 等连接工具（下面以[MobaXterm](https://mobaxterm.mobatek.net/download.html)为例）

##### 2.4 点击 **session** 创建一个会话

[![image.png](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-08/scaled-1680-/rBnimage.png)](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-08/rBnimage.png)

##### 2.5 点击 **SSH**

[![image.png](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-08/scaled-1680-/aDzimage.png)](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-08/aDzimage.png)

##### 2.6 输入刚刚查询到的 IP 地址和刷入系统时或者自定义的用户名，完成后点击OK保存

[![image.png](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-08/scaled-1680-/0S0image.png)](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-08/0S0image.png)

##### 2.7 输入密码（命令行不显示），完成后回车即可登录到系统。

[![image.png](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-08/scaled-1680-/ryXimage.png)](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-08/ryXimage.png)

[![image.png](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-08/scaled-1680-/L2iimage.png)](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-08/L2iimage.png)

#### 3. 通过type-c连接到SSH 

#####  3.1 在开发板正常上电开机

在默认模式下连接到主机后，Jetson默认作为主机，其IP地址为 **192.168.55.1**

[![image.png](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-08/scaled-1680-/5Kbimage.png)](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-08/5Kbimage.png)

##### 3.2 使用 **putty** 或 **MobaXterm** 等连接工具，连接到开发板

参考 **2.3** 节进行操作

[![image.png](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-08/scaled-1680-/xOtimage.png)](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-08/xOtimage.png)

#### 4. 远程连接到Jetson桌面环境

<p class="callout info">在无显示器模式下建议使用HDMI/DP诱骗器确保桌面环境正常</p>

##### 4.1 使用 NoMachine

**NoMachine** 是一款功能强大、跨平台的远程桌面软件，专注于提供高速、高画质的远程访问体验。其核心基于 ​**​NX 协议​**​，通过高效压缩和加密技术实现低延迟传输，特别适合图形密集型任务（如视频编辑、3D 渲染）和多场景协作。

- 主机下载安装NoMachine

[![屏幕截图_15-8-2025_94138_www.nomachine.com.jpeg](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-08/scaled-1680-/15-8-2025-94138-www-nomachine-com.jpeg)](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-08/15-8-2025-94138-www-nomachine-com.jpeg)

- Jetson端下载安装NoMachine （下载页面参考： [NoMachine–arm\_version](https://download.nomachine.com/download/?id=30&platform=linux&distro=arm)）

[![屏幕截图_15-8-2025_95031_download.nomachine.com.jpeg](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-08/scaled-1680-/15-8-2025-95031-download-nomachine-com.jpeg)](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-08/15-8-2025-95031-download-nomachine-com.jpeg)

- 通过scp等方式上传到开发板（也可尝试复制下载链接通过命令行使用 wget 命令下载）

[![image.png](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-08/scaled-1680-/VFBimage.png)](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-08/VFBimage.png)

- 命令行安装deb软件包

```bash
sudo dpkg -i nomachine_9.1.24_6_arm64.deb #随软件的更新包名可能发生变化
```

- 主机和开发板都安装成功后将其连接到同一局域网下，在主机打开NoMachine便可自动搜索到Jetson服务端

[![image.png](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-08/scaled-1680-/HD3image.png)](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-08/HD3image.png)

[![image.png](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-08/scaled-1680-/9pQimage.png)](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-08/9pQimage.png)

[![image.png](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-08/scaled-1680-/4r1image.png)](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-08/4r1image.png)

- 输入用户名和密码，点击OK

[![image.png](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-08/scaled-1680-/Anoimage.png)](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-08/Anoimage.png)

- 成功连接到桌面

[![image.png](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-08/scaled-1680-/A8Rimage.png)](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-08/A8Rimage.png)

- 点击软件显示区域右上角可以进入设置调节画质、显示画幅和编码模式等选项

[![image.png](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-08/scaled-1680-/1LWimage.png)](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-08/1LWimage.png)

##### 4.2 使用 VNC

**VNC**（​​虚拟网络计算机​​）是一种基于图形界面的远程控制技术，允许用户通过网络（互联网或局域网）实时访问并操作另一台计算机的桌面环境。其核心协议为 ​**​RFB（**Remote Framebuffer Protocol**）​**​，通过传输屏幕帧缓冲区的像素数据实现跨平台远程控制

- 下载安装主机端

[![image.png](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-08/scaled-1680-/cDeimage.png)](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-08/cDeimage.png)

- 在Jetson上进行如下设置 
    1. 设置VNC服务为开机自启 ```
        cd /usr/lib/systemd/user/graphical-session.target.wants
        sudo ln -s ../vino-server.service ./.
        ```
    2. 配置VNC服务 ```
        gsettings set org.gnome.Vino prompt-enabled false
        gsettings set org.gnome.Vino require-encryption false
        ```
    3. 设置VNC登录密码 ```
        # 将 <密码> 替换为你要设置的密码
        gsettings set org.gnome.Vino authentication-methods "['vnc']"
        gsettings set org.gnome.Vino vnc-password $(echo -n '密码'|base64)
        ```
    4. 重启系统生效 ```
        sudo reboot
        ```
- 在主机的 **VNC** 软件中新建连接并输入 **Jetson** 的局域网 **IP** 并按回车确认

[![image.png](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-08/scaled-1680-/P73image.png)](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-08/P73image.png)

- 输入密码并确认

[![image.png](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-08/scaled-1680-/82Rimage.png)](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-08/82Rimage.png)

[![image.png](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-08/scaled-1680-/bjaimage.png)](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-08/bjaimage.png)

可参考英伟达官方说明 [Setting Up VNC | NVIDIA Developer](https://developer.nvidia.com/embedded/learn/tutorials/vnc-setup)

# JETSON ORIN NANO 进阶教程

本章主要Jetson特色的AI功能使用

# 安装jtop

jtop 是英伟达专为 ​**​Jetson 系列边缘计算设备​**​开发的​**​交互式系统监控工具。**

##### 1 安装jtop

- 安装jtop需要的依赖库

```bash
sudo apt update
sudo apt install python3
sudo apt install python3-pip
```

- 安装jtop

```
sudo pip3 install -U pip -i https://pypi.tuna.tsinghua.edu.cn/simple
sudo pip3 install jetson-stats -i https://pypi.tuna.tsinghua.edu.cn/simple
sudo systemctl restart jtop.service
```

##### 2 jtop的使用

- 安装完成后在控制台中输入`jtop`打开主界面

[![image.png](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-07/scaled-1680-/YiKimage.png)](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-07/YiKimage.png)

2.1 监视各个模块的工作信息

2.2 控制风扇

[![1.png](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-07/scaled-1680-/x711.png)](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-07/x711.png)

2.3 查看内置软件信息

[![image.png](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-07/scaled-1680-/L3Timage.png)](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-07/L3Timage.png)

# 安装CUDA

**Jetson** **CUDA**是NVIDIA为边缘AI设计的并行计算平台，基于ARM的Jetson系列硬件，支持**GPU加速**深度学习与**实时推理**，低**功耗高性能**。

##### 安装CUDA JETSON SDK

```
sudo apt update
sudo apt install nvidia-jetpack
```

[![image.png](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-07/scaled-1680-/rUKimage.png)](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-07/rUKimage.png)

##### 对开发板进行压力测试

<p class="callout info">以下测试仅在 **JetPack** **6.1 (rev1)** 和 **JetPack 5.1.5** 版本中通过验证</p>

调整功耗上限：

```bash
sudo nvpmodel -m 2 #nano 模式2为super
sudo jetson_clocks --fan
```

cpu压力测试：

```bash
sudo apt install stress
stress --cpu 8 --io 4 --vm 2 --vm-bytes 128M --hdd 1 --hdd-bytes 1024M
```

  
gpu压力测试：

```bash
git clone https://github.com/anseeto/jetson-gpu-burn/
cd jetson-gpu-burn
make
./gpu_burn 100000
```

状态查询：

```bash
sudo jtop
```

[![image.png](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-07/scaled-1680-/f1dimage.png)](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-07/f1dimage.png)

> Orin Nano 整机最大功率为**30W.**
> 
> Orin NX 整机最大功率为**40W**.

# 编译安装opencv with cuda

<p class="callout info">JetPack预装的opencv没有启用cuda，需要自行编译安装。</p>

[![image.png](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-07/scaled-1680-/g2Timage.png)](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-07/g2Timage.png)

#### 1. 脚本一键安装

```bash
#!/bin/bash
# opencv_install.sh
# Modified from https://github.com/AastaNV/JEP/blob/master/script/install_opencv4.10.0_Jetpack6.1.sh

version="4.10.0"
folder="workspace"
remove_old=""

set -e

# Parse command-line arguments
for arg in "$@"; do
    case $arg in
        --version=*)
            version="${arg#*=}"
            ;;
        --folder=*)
            folder="${arg#*=}"
            ;;
        --remove-old=*)
            remove_old="${arg#*=}"
            ;;
        --help|-h)
            echo "Usage: $0 [--version=4.x.x] [--folder=dir] [--remove-old=yes/no]"
            exit 0
            ;;
        *)
            echo "Unknown parameter: $arg"
            echo "Usage: $0 [--version=4.x.x] [--folder=dir] [--remove-old=yes/no]"
            exit 1
            ;;
    esac
done

# Create installation directory if it doesn't exist
if [ ! -d "$folder" ]; then
    echo "Creating directory: $folder"
    mkdir -p "$folder"
fi
cd "$folder" || exit

# Old OpenCV removal logic
if [ -z "$remove_old" ]; then
    read -rp "Do you want to remove system-installed OpenCV? (yes/no): " remove_old
fi

case "$remove_old" in
    [yY] | [yY][eE][sS])
        echo "** Removing system OpenCV packages"
        sudo apt -y purge *libopencv*
        sudo apt -y autoremove
        ;;
    *)
        echo "** Skipping system OpenCV removal"
        ;;
esac

echo "------------------------------------"
echo "** Installing dependencies (1/4)"
echo "------------------------------------"
sudo apt-get update
sudo apt-get install -y build-essential cmake git libgtk2.0-dev pkg-config \
    libavcodec-dev libavformat-dev libswscale-dev libgstreamer1.0-dev \
    libgstreamer-plugins-base1.0-dev python3-dev python3-numpy libtbb2 \
    libtbb-dev libjpeg-dev libpng-dev libtiff-dev libv4l-dev v4l-utils qv4l2 curl

# Verify essential dependencies installed
for dep in g++ cmake git pkg-config; do
    if ! command -v "$dep" > /dev/null; then
        echo "Error: $dep installation failed"
        exit 1
    fi
done

echo "------------------------------------"
echo "** Downloading OpenCV ${version} (2/4)"
echo "------------------------------------"

# Check if source files already exist
download_opencv=false
download_contrib=false

if [ ! -f "opencv-${version}.zip" ]; then
    echo "Downloading opencv-${version}.zip"
    wget -O opencv-${version}.zip https://github.com/opencv/opencv/archive/${version}.zip || {
        echo "Download failed! Check your internet connection or verify the version exists"
        exit 1
    }
    download_opencv=true
else
    echo "opencv-${version}.zip exists, skipping download"
fi

if [ ! -f "opencv_contrib-${version}.zip" ]; then
    echo "Downloading opencv_contrib-${version}.zip"
    wget -O opencv_contrib-${version}.zip https://github.com/opencv/opencv_contrib/archive/${version}.zip || {
        echo "Download failed! Check your internet connection or verify the version exists"
        exit 1
    }
    download_contrib=true
else
    echo "opencv_contrib-${version}.zip exists, skipping download"
fi

# Unpack source files
if [ ! -d "opencv-${version}" ] || $download_opencv; then
    if [ -d "opencv-${version}" ]; then
        echo "Removing existing opencv-${version} directory"
        rm -rf "opencv-${version}"
    fi
    echo "Unpacking opencv-${version}.zip"
    unzip -q opencv-${version}.zip || {
        echo "Extraction failed! File may be corrupt"
        exit 1
    }
fi

if [ ! -d "opencv_contrib-${version}" ] || $download_contrib; then
    if [ -d "opencv_contrib-${version}" ]; then
        echo "Removing existing opencv_contrib-${version} directory"
        rm -rf "opencv_contrib-${version}"
    fi
    echo "Unpacking opencv_contrib-${version}.zip"
    unzip -q opencv_contrib-${version}.zip || {
        echo "Extraction failed! File may be corrupt"
        exit 1
    }
fi

# Clean up zip files after successful extraction
if [ $? -eq 0 ]; then
    rm -f opencv-${version}.zip opencv_contrib-${version}.zip
fi

cd opencv-${version} || exit

echo "------------------------------------"
echo "** Building OpenCV ${version} (3/4)"
echo "------------------------------------"
mkdir -p release
cd release

# Auto-detect CUDA architecture
cuda_arch=""
if command -v nvidia-smi &> /dev/null; then
    gpu_name=$(nvidia-smi --query-gpu=name --format=csv,noheader | head -n1)
    if [[ $gpu_name == *"Orin"* ]] || [[ $gpu_name == *"Jetson"* ]]; then
        cuda_arch="8.7"
    elif [[ $gpu_name == *"A100"* ]]; then
        cuda_arch="8.0"
    fi
fi

cmake_cmd="cmake -D WITH_CUDA=ON -D WITH_CUDNN=ON -D OPENCV_GENERATE_PKGCONFIG=ON "
cmake_cmd+="-D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-${version}/modules "
cmake_cmd+="-D WITH_GSTREAMER=ON -D WITH_LIBV4L=ON -D BUILD_opencv_python3=ON "
cmake_cmd+="-D BUILD_TESTS=OFF -D BUILD_PERF_TESTS=OFF -D BUILD_EXAMPLES=OFF "
cmake_cmd+="-D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local "

# Add CUDA architecture if detected
if [ -n "$cuda_arch" ]; then
    echo "Detected NVIDIA GPU: ${gpu_name}, using CUDA_ARCH_BIN=${cuda_arch}"
    cmake_cmd+="-D CUDA_ARCH_BIN=${cuda_arch} -D CUDA_ARCH_PTX=\"\" "
else
    echo "No supported GPU detected, skipping CUDA architecture flags"
fi

# Execute CMake configuration
echo "CMake command: $cmake_cmd .."
$cmake_cmd .. || {
    echo "CMake configuration failed"
    exit 1
}

# Parallel build (leave one core for system stability)
cpu_cores=$(($(nproc) - 1))
[ $cpu_cores -lt 1 ] && cpu_cores=1
echo "Building with ${cpu_cores} CPU cores"
make -j${cpu_cores} || {
    echo "Compilation failed"
    exit 1
}

echo "------------------------------------"
echo "** Installing OpenCV ${version} (4/4)"
echo "------------------------------------"
sudo make install || {
    echo "Installation failed"
    exit 1
}

# Add environment variables to .bashrc (only if not already present)
bashrc=~/.bashrc
env_lines=(
    "export LD_LIBRARY_PATH=/usr/local/lib:\$LD_LIBRARY_PATH"
    "export PYTHONPATH=/usr/local/lib/python3.10/site-packages/:\$PYTHONPATH"
)

for line in "${env_lines[@]}"; do
    if ! grep -Fxq "$line" "$bashrc"; then
        echo "Adding to .bashrc: $line"
        echo "$line" >> "$bashrc"
    else
        echo "Environment variable already exists: $line"
    fi
done

source ~/.bashrc

echo "** OpenCV ${version} installation completed"
echo "Verification commands:"
echo "  pkg-config --modversion opencv4"
echo "  python3 -c 'import cv2; print(cv2.__version__)'"

echo "** Installation successful!"
```

<div id="bkmrk--2"></div>#### 2. 手动安装

2.1 卸载自带opencv

```bash
sudo apt-get purge libopencv*
sudo apt autoremove
sudo apt-get update
```

2.2 安装前置软件包

```bash
sudo apt-get update
sudo apt-get install -y build-essential cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
sudo apt-get install -y libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev python3.10-dev python3-numpy
sudo apt-get install -y libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libv4l-dev v4l-utils qv4l2
sudo apt-get install -y curl
```

2.3 获取opencv源码(以4.10.0版本为例)

```bash
version=4.10.0
wget -O "opencv-${version}.zip" "https://github.com/opencv/opencv/archive/${version}.zip"
wget -O "opencv_contrib-${version}.zip" "https://github.com/opencv/opencv_contrib/archive/${version}.zip"
unzip "opencv-${version}.zip"
unzip "opencv_contrib-${version}.zip"
rm "opencv-${version}.zip" "opencv_contrib-${version}.zip"
cd "opencv-${version}/"
```

2.4 编译源码

<p class="callout info">此步骤至少需要半小时以上。</p>

<p class="callout info">中途可能会下载第三方软件包，建议提前确认网络环境。</p>

```bash
mkdir build
cd build/
cmake -D WITH_CUDA=ON -D WITH_CUDNN=ON -D CUDA_ARCH_BIN="8.7" -D CUDA_ARCH_PTX="" -D OPENCV_GENERATE_PKGCONFIG=ON -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-${version}/modules -D WITH_GSTREAMER=ON -D WITH_LIBV4L=ON -D BUILD_opencv_python3=ON -D BUILD_TESTS=OFF -D BUILD_PERF_TESTS=OFF -D BUILD_EXAMPLES=OFF -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local ..
make -j$(nproc)
```

2.5 安装

```bash
sudo make install
echo 'export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH' >> ~/.bashrc
echo 'export PYTHONPATH=/usr/local/lib/python3.10/site-packages/:$PYTHONPATH' >> ~/.bashrc
source ~/.bashrc
```

#### 三、验证测试

[![image.png](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-07/scaled-1680-/bA0image.png)](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-07/bA0image.png)

```c++
#--test_cuda.cpp

#include <opencv2/opencv.hpp>
#include <opencv2/core/cuda.hpp>
#include <opencv2/cudaarithm.hpp>
#include <iostream>
#include <chrono>

// CPU 矩阵乘法
void cpu_matrix_mult(cv::Mat& a, cv::Mat& b, cv::Mat& result) {
    for (int i = 0; i < 50; i++) {
        result = a * b;
    }
}

// GPU 矩阵乘法
void gpu_matrix_mult(cv::cuda::GpuMat& d_a, cv::cuda::GpuMat& d_b, cv::cuda::GpuMat& d_result) {
    cv::cuda::Stream stream;
    
    for (int i = 0; i < 50; i++) {
        cv::cuda::gemm(d_a, d_b, 1.0, cv::cuda::GpuMat(), 0, d_result, 0, stream);
        stream.waitForCompletion();
    }
}

int main() {
    try {
        std::cout << "--- OpenCV CUDA Matrix Multiplication Test ---\n";
        
        // 创建两个 1000x1000 的随机矩阵
        cv::Mat mat_a(1000, 1000, CV_32FC1);
        cv::Mat mat_b(1000, 1000, CV_32FC1);
        cv::randu(mat_a, 0.0f, 1.0f);
        cv::randu(mat_b, 0.0f, 1.0f);
        
        cv::Mat cpu_result;
        
        // CPU 测试
        auto start_cpu = std::chrono::high_resolution_clock::now();
        cpu_matrix_mult(mat_a, mat_b, cpu_result);
        auto end_cpu = std::chrono::high_resolution_clock::now();
        double cpu_time = std::chrono::duration_cast<std::chrono::milliseconds>(end_cpu - start_cpu).count();
        
        // GPU 测试
        cv::cuda::GpuMat d_mat_a, d_mat_b, d_result;
        d_mat_a.upload(mat_a);
        d_mat_b.upload(mat_b);
        
        auto start_gpu = std::chrono::high_resolution_clock::now();
        gpu_matrix_mult(d_mat_a, d_mat_b, d_result);
        auto end_gpu = std::chrono::high_resolution_clock::now();
        double gpu_time = std::chrono::duration_cast<std::chrono::milliseconds>(end_gpu - start_gpu).count();
        
        // 下载结果进行验证
        cv::Mat gpu_result;
        d_result.download(gpu_result);
        
        // 计算误差(一般为空)
        double diff = cv::norm(cpu_result, gpu_result, cv::NORM_L2);
        std::cout << "Result difference: " << diff << "\n";
        
        std::cout << "Performance Results:\n"
                  << " - CPU time: " << cpu_time << " ms\n"
                  << " - GPU time: " << gpu_time << " ms\n"
                  << " - Speedup: " << cpu_time / gpu_time << "x\n";
        
        std::cout << "\n✅ CUDA matrix multiplication test completed\n";
        return 0;
        
    } catch (const cv::Exception& e) {
        std::cerr << "OpenCV Error (" << e.err << "): " << e.what() << "\n";
        return -1;
    } catch (const std::exception& e) {
        std::cerr << "Standard Error: " << e.what() << "\n";
        return -2;
    }
}
```

编译运行

```bash
jetson@jetson-desktop:~/work$ g++ test_cuda.cpp -o test_cuda `pkg-config --cflags --libs opencv4`
jetson@jetson-desktop:~/work$ ./test_cuda
--- OpenCV CUDA Performance Test ---
Performance Results:
 - CPU time: 2451 ms
 - GPU time: 918 ms
 - Speedup: 2.66993x

✅ CUDA performance test completed

```

# 安装使用pytorch和torchvision

​​**PyTorch** 是 Python 中最流行、最易用的深度学习框架之一。它让开发者能够像操作普通 Python 代码一样，直观、灵活地设计和训练复杂的神经网络模型。其简洁的 API 设计和强大的 GPU 加速支持，使得从研究想法到实际部署的开发过程都极其高效便捷，广受开发者青睐。​

NVIDIA 为 Jetson 系列设备专门适配了对应的软件包，其版本依赖关系如下：

<table class="BookContent-table" id="bkmrk-pytorch-version-nvid"><thead><tr><th class="entry" colspan="1" id="bkmrk-pytorch-version" rowspan="1" valign="top" width="25%">PyTorch Version</th><th class="entry" colspan="1" id="bkmrk-nvidia-framework%C2%A0con" rowspan="1" valign="top" width="25%">NVIDIA Framework [Container](https://catalog.ngc.nvidia.com/orgs/nvidia/containers/pytorch)</th><th class="entry" colspan="1" id="bkmrk-nvidia-framework%C2%A0whe" rowspan="1" valign="top" width="25%">NVIDIA Framework [Wheel](https://developer.download.nvidia.com/compute/redist/jp/)</th><th class="entry" colspan="1" id="bkmrk-jetpack-version" rowspan="1" valign="top" width="25%">JetPack Version</th></tr></thead><tbody><tr><td class="entry" colspan="1" headers="d560e78" rowspan="1" valign="top" width="25%">[<u class="ph u">2.8.0a0+5228986c39</u>](https://github.com/pytorch/pytorch/commit/5228986c395dc79f90d2a2b991deea1eef188260)</td><td class="entry" colspan="1" headers="d560e81" rowspan="1" valign="top" width="25%">25.06</td><td class="entry" colspan="1" headers="d560e86" rowspan="1" valign="top" width="25%">-</td><td class="entry" colspan="1" headers="d560e91" rowspan="1" valign="top" width="25%">6.2</td></tr><tr><td class="entry" colspan="1" headers="d560e78" rowspan="1" valign="top" width="25%">[<u class="ph u">2.8.0a0+5228986c39</u>](https://github.com/pytorch/pytorch/commit/5228986c395dc79f90d2a2b991deea1eef188260)</td><td class="entry" colspan="1" headers="d560e81" rowspan="1" valign="top" width="25%">25.05</td><td class="entry" colspan="1" headers="d560e86" rowspan="1" valign="top" width="25%">-</td><td class="entry" colspan="1" headers="d560e91" rowspan="1" valign="top" width="25%">6.2</td></tr><tr><td class="entry" colspan="1" headers="d560e78" rowspan="1" valign="top" width="25%">[<u class="ph u">2.7.0a0+79aa17489c</u>](https://github.com/pytorch/pytorch/commit/79aa17489c3fc5ed6d5e972e9ffddf73e6dd0a5c)</td><td class="entry" colspan="1" headers="d560e81" rowspan="1" valign="top" width="25%">25.04</td><td class="entry" colspan="1" headers="d560e86" rowspan="1" valign="top" width="25%">-</td><td class="entry" colspan="1" headers="d560e91" rowspan="1" valign="top" width="25%">6.2</td></tr><tr><td class="entry" colspan="1" headers="d560e78" rowspan="1" valign="top" width="25%">[<u class="ph u">2.7.0a0+7c8ec84dab</u>](https://github.com/pytorch/pytorch/commit/7c8ec84dab7dc10d4ef90afc93a49b97bbd04503)</td><td class="entry" colspan="1" headers="d560e81" rowspan="1" valign="top" width="25%">25.03</td><td class="entry" colspan="1" headers="d560e86" rowspan="1" valign="top" width="25%">-</td><td class="entry" colspan="1" headers="d560e91" rowspan="1" valign="top" width="25%">6.2</td></tr><tr><td class="entry" colspan="1" headers="d560e78" rowspan="1" valign="top" width="25%">[<u class="ph u">2.7.0a0+6c54963f75</u>](https://github.com/pytorch/pytorch/commit/6c54963f75e9dfdae34c44f71081b5d3972b6b8d)</td><td class="entry" colspan="1" headers="d560e81" rowspan="1" valign="top" width="25%">25.02</td><td class="entry" colspan="1" headers="d560e86" rowspan="1" valign="top" width="25%">-</td><td class="entry" colspan="1" headers="d560e91" rowspan="1" valign="top" width="25%">6.2</td></tr><tr><td class="entry" colspan="1" headers="d560e78" rowspan="1" valign="top" width="25%">[<u class="ph u">2.6.0a0+ecf3bae40a</u>](https://github.com/pytorch/pytorch/commit/ecf3bae40a6f2f0f3b237bde1fc4b2492765ab13)</td><td class="entry" colspan="1" headers="d560e81" rowspan="1" valign="top" width="25%">25.01</td><td class="entry" colspan="1" headers="d560e86" rowspan="1" valign="top" width="25%">-</td><td class="entry" colspan="1" headers="d560e91" rowspan="1" valign="top" width="25%">6.1</td></tr><tr><td class="entry" colspan="1" headers="d560e78" rowspan="1" valign="top" width="25%">[<u class="ph u">2.6.0a0+df5bbc09d1</u>](https://github.com/pytorch/pytorch/commit/df5bbc09d191fff3bdb592c184176e84669a7157)</td><td class="entry" colspan="1" headers="d560e81" rowspan="1" valign="top" width="25%">24.12</td><td class="entry" colspan="1" headers="d560e86" rowspan="1" valign="top" width="25%">-</td><td class="entry" colspan="1" headers="d560e91" rowspan="1" valign="top" width="25%">6.1</td></tr><tr><td class="entry" colspan="1" headers="d560e78" rowspan="1" valign="top" width="25%">[<u class="ph u">2.6.0a0+df5bbc0</u>](https://github.com/pytorch/pytorch/commit/df5bbc09d191fff3bdb592c184176e84669a7157)</td><td class="entry" colspan="1" headers="d560e81" rowspan="1" valign="top" width="25%">24.11</td><td class="entry" colspan="1" headers="d560e86" rowspan="1" valign="top" width="25%">-</td><td class="entry" colspan="1" headers="d560e91" rowspan="1" valign="top" width="25%">6.1</td></tr><tr><td class="entry" colspan="1" headers="d560e78" rowspan="1" valign="top" width="25%">[<u class="ph u">2.5.0a0+e000cf0ad9</u>](https://github.com/pytorch/pytorch/commit/e000cf0ad980e5d140dc895a646174e9b945cf26)</td><td class="entry" colspan="1" headers="d560e81" rowspan="1" valign="top" width="25%">24.10</td><td class="entry" colspan="1" headers="d560e86" rowspan="1" valign="top" width="25%">-</td><td class="entry" colspan="1" headers="d560e91" rowspan="1" valign="top" width="25%">6.1</td></tr><tr><td class="entry" colspan="1" headers="d560e78" rowspan="1" valign="top" width="25%">[<u class="ph u">2.5.0a0+b465a5843b</u>](https://github.com/pytorch/pytorch/commit/b465a5843b92f33fe3e89ff7ee91c6833df6aec0)</td><td class="entry" colspan="1" headers="d560e81" rowspan="1" valign="top" width="25%">24.09</td><td class="entry" colspan="1" headers="d560e86" rowspan="1" valign="top" width="25%">24.09</td><td class="entry" colspan="1" headers="d560e91" rowspan="1" valign="top" width="25%">6.1</td></tr><tr><td class="entry" colspan="1" headers="d560e78" rowspan="1" valign="top" width="25%">[<u class="ph u">2.5.0a0+872d972e41</u>](https://github.com/pytorch/pytorch/commit/872d972e41596a9ac94dfd343f40bfc12b340a74)</td><td class="entry" colspan="1" headers="d560e81" rowspan="1" valign="top" width="25%">24.08</td><td class="entry" colspan="1" headers="d560e86" rowspan="1" valign="top" width="25%">-</td><td class="entry" colspan="1" headers="d560e91" rowspan="1" valign="top" width="25%">6.0</td></tr><tr><td class="entry" colspan="1" headers="d560e78" rowspan="1" valign="top" width="25%">[<u class="ph u">2.4.0a0+3bcc3cddb5</u>](https://github.com/pytorch/pytorch/commit/3bcc3cddb580bf0f0f1958cfe27001f236eac2c1)</td><td class="entry" colspan="1" headers="d560e81" rowspan="1" valign="top" width="25%">24.07</td><td class="entry" colspan="1" headers="d560e86" rowspan="1" valign="top" width="25%">24.07</td><td class="entry" colspan="1" headers="d560e91" rowspan="1" valign="top" width="25%">6.0</td></tr><tr><td class="entry" colspan="1" headers="d560e78" rowspan="1" valign="top" width="25%">[<u class="ph u">2.4.0a0+f70bd71a48</u>](https://github.com/pytorch/pytorch/commit/f70bd71a48)</td><td class="entry" colspan="1" headers="d560e81" rowspan="1" valign="top" width="25%">24.06</td><td class="entry" colspan="1" headers="d560e86" rowspan="1" valign="top" width="25%">24.06</td><td class="entry" colspan="1" headers="d560e91" rowspan="1" valign="top" width="25%">6.0</td></tr><tr><td class="entry" colspan="1" headers="d560e78" rowspan="1" valign="top" width="25%">[<u class="ph u">2.4.0a0+07cecf4168</u>](https://github.com/pytorch/pytorch/commit/07cecf4168503a5b3defef9b2ecaeb3e075f4761)</td><td class="entry" colspan="1" headers="d560e81" rowspan="1" valign="top" width="25%">24.05</td><td class="entry" colspan="1" headers="d560e86" rowspan="1" valign="top" width="25%">24.05</td><td class="entry" colspan="1" headers="d560e91" rowspan="1" valign="top" width="25%">6.0</td></tr><tr><td class="entry" colspan="1" headers="d560e78" rowspan="1" valign="top" width="25%">[<u class="ph u">2.3.0a0+6ddf5cf85e</u>](https://github.com/pytorch/pytorch/commit/6ddf5cf85e3c27c596175aba7bf5affb5426255f)</td><td class="entry" colspan="1" headers="d560e81" rowspan="1" valign="top" width="25%">24.04</td><td class="entry" colspan="1" headers="d560e86" rowspan="1" valign="top" width="25%">24.04</td><td class="entry" colspan="1" headers="d560e91" rowspan="5" valign="top" width="25%">6.0 Developer Preview</td></tr><tr><td class="entry" colspan="1" headers="d560e78" rowspan="1" valign="top" width="25%">[<u class="ph u">2.3.0a0+40ec155e58</u>](https://github.com/pytorch/pytorch/commit/40ec155e58ee1a1921377ff921b55e61502e4fb3)</td><td class="entry" colspan="1" headers="d560e81" rowspan="1" valign="top" width="25%">24.03</td><td class="entry" colspan="1" headers="d560e86" rowspan="1" valign="top" width="25%">[24.03](https://developer.download.nvidia.com/compute/redist/jp/v60dp/pytorch/torch-2.3.0a0+40ec155e58.nv24.03.13384722-cp310-cp310-linux_aarch64.whl)</td></tr><tr><td class="entry" colspan="1" headers="d560e78" rowspan="1" valign="top" width="25%">[<u class="ph u">2.3.0a0+ebedce2</u>](https://github.com/pytorch/pytorch/commit/ebedce24ab578036dd9257e4928eea9ee38d1192)</td><td class="entry" colspan="1" headers="d560e81" rowspan="1" valign="top" width="25%">24.02</td><td class="entry" colspan="1" headers="d560e86" rowspan="1" valign="top" width="25%">24.02</td></tr><tr><td class="entry" colspan="1" headers="d560e78" rowspan="1" valign="top" width="25%">[<u class="ph u">2.2.0a0+81ea7a4</u>](https://github.com/pytorch/pytorch/commit/81ea7a48)</td><td class="entry" colspan="1" headers="d560e81" rowspan="1" valign="top" width="25%">23.12, 24.01</td><td class="entry" colspan="1" headers="d560e86" rowspan="1" valign="top" width="25%">23.12, 24.01</td></tr><tr><td class="entry" colspan="1" headers="d560e78" rowspan="1" valign="top" width="25%">[<u class="ph u">2.2.0a0+6a974bec</u>](https://github.com/pytorch/pytorch/commit/6a974bec)</td><td class="entry" colspan="1" headers="d560e81" rowspan="1" valign="top" width="25%">23.11</td><td class="entry" colspan="1" headers="d560e86" rowspan="1" valign="top" width="25%">23.11</td></tr><tr><td class="entry" colspan="1" headers="d560e78" rowspan="1" valign="top" width="25%">[<u class="ph u">2.1.0a</u>](https://github.com/pytorch/pytorch/commit/41361538a978eb03fa1e88bf5b8e4410db7a6927)</td><td class="entry" colspan="1" headers="d560e81" rowspan="1" valign="top" width="25%"> </td><td class="entry" colspan="1" headers="d560e86" rowspan="1" valign="top" width="25%">23.06</td><td class="entry" colspan="1" headers="d560e91" rowspan="5" valign="top" width="25%">5.1.x</td></tr><tr><td class="entry" colspan="1" headers="d560e78" rowspan="1" valign="top" width="25%">[<u class="ph u">2.0.0</u>](https://github.com/pytorch/pytorch/tree/v2.0.0)</td><td class="entry" colspan="1" headers="d560e81" rowspan="1" valign="top" width="25%"> </td><td class="entry" colspan="1" headers="d560e86" rowspan="1" valign="top" width="25%">23.05</td></tr><tr><td class="entry" colspan="1" headers="d560e78" rowspan="1" valign="top" width="25%">[<u class="ph u">2.0.0a0+fe05266f</u>](https://github.com/pytorch/pytorch/commit/fe05266fda4f908130dea7cbac37e9264c0429a2)</td><td class="entry" colspan="1" headers="d560e81" rowspan="1" valign="top" width="25%"> </td><td class="entry" colspan="1" headers="d560e86" rowspan="1" valign="top" width="25%">23.04</td></tr><tr><td class="entry" colspan="1" headers="d560e78" rowspan="1" valign="top" width="25%">[<u class="ph u">2.0.0a0+8aa34602</u>](https://github.com/pytorch/pytorch/commit/8aa34602f703896c16ae57f622ff4cb1c86c04dd)</td><td class="entry" colspan="1" headers="d560e81" rowspan="1" valign="top" width="25%"> </td><td class="entry" colspan="1" headers="d560e86" rowspan="1" valign="top" width="25%">23.03</td></tr><tr><td class="entry" colspan="1" headers="d560e78" rowspan="1" valign="top" width="25%">[<u class="ph u">1.14.0a0+44dac51c</u>](https://github.com/pytorch/pytorch/commit/44dac51c36d01f63e64585e5e7a864cb8e37948a)</td><td class="entry" colspan="1" headers="d560e81" rowspan="1" valign="top" width="25%"> </td><td class="entry" colspan="1" headers="d560e86" rowspan="1" valign="top" width="25%">23.02, 23.01</td></tr><tr><td class="entry" colspan="1" headers="d560e78" rowspan="1" valign="top" width="25%">[<u class="ph u">1.13.0a0+936e930</u>](https://github.com/pytorch/pytorch/commit/936e930)</td><td class="entry" colspan="1" headers="d560e81" rowspan="1" valign="top" width="25%"> </td><td class="entry" colspan="1" headers="d560e86" rowspan="1" valign="top" width="25%">22.11</td><td class="entry" colspan="1" headers="d560e91" rowspan="3" valign="top" width="25%">5.0.2</td></tr><tr><td class="entry" colspan="1" headers="d560e78" rowspan="1" valign="top" width="25%">[<u class="ph u">1.13.0a0+d0d6b1f</u>](https://github.com/pytorch/pytorch/commit/d0d6b1f)</td><td class="entry" colspan="1" headers="d560e81" rowspan="1" valign="top" width="25%"> </td><td class="entry" colspan="1" headers="d560e86" rowspan="1" valign="top" width="25%">22.09, 22,10</td></tr><tr><td class="entry" colspan="1" headers="d560e78" rowspan="1" valign="top" width="25%">[<u class="ph u">1.13.0a0+08820cb</u>](https://github.com/pytorch/pytorch/commit/08820cb)</td><td class="entry" colspan="1" headers="d560e81" rowspan="1" valign="top" width="25%">22.07</td><td class="entry" colspan="1" headers="d560e86" rowspan="1" valign="top" width="25%">22.07</td></tr><tr><td class="entry" colspan="1" headers="d560e78" rowspan="1" valign="top" width="25%">[<u class="ph u">1.13.0a0+340c412</u>](https://github.com/pytorch/pytorch/commit/340c412)</td><td class="entry" colspan="1" headers="d560e81" rowspan="1" valign="top" width="25%">22.06</td><td class="entry" colspan="1" headers="d560e86" rowspan="1" valign="top" width="25%">22.06</td><td class="entry" colspan="1" headers="d560e91" rowspan="1" valign="top" width="25%">5.0.1</td></tr><tr><td class="entry" colspan="1" headers="d560e78" rowspan="1" valign="top" width="25%">[<u class="ph u">1.12.0a0+8a1a93a9</u>](https://github.com/pytorch/pytorch/commit/8a1a93a9)</td><td class="entry" colspan="1" headers="d560e81" rowspan="1" valign="top" width="25%">22.05</td><td class="entry" colspan="1" headers="d560e86" rowspan="1" valign="top" width="25%">22.05</td><td class="entry" colspan="1" headers="d560e91" rowspan="3" valign="top" width="25%">5.0</td></tr><tr><td class="entry" colspan="1" headers="d560e78" rowspan="1" valign="top" width="25%">[<u class="ph u">1.12.0a0+bd13bc66</u>](https://github.com/pytorch/pytorch/commit/bd13bc66)</td><td class="entry" colspan="1" headers="d560e81" rowspan="1" valign="top" width="25%"> </td><td class="entry" colspan="1" headers="d560e86" rowspan="1" valign="top" width="25%">22.04</td></tr><tr><td class="entry" colspan="1" headers="d560e78" rowspan="1" valign="top" width="25%">[<u class="ph u">1.12.0a0+2c916ef</u>](https://github.com/pytorch/pytorch/commit/2c916ef)</td><td class="entry" colspan="1" headers="d560e81" rowspan="1" valign="top" width="25%"> </td><td class="entry" colspan="1" headers="d560e86" rowspan="1" valign="top" width="25%">22.03</td></tr><tr><td class="entry" colspan="1" headers="d560e78" rowspan="1" valign="top" width="25%">[<u class="ph u">1.11.0a0+bfe5ad28</u>](https://github.com/pytorch/pytorch/commit/bfe5ad28)</td><td class="entry" colspan="1" headers="d560e81" rowspan="1" valign="top" width="25%"> </td><td class="entry" colspan="1" headers="d560e86" rowspan="1" valign="top" width="25%">22.01</td><td class="entry" colspan="1" headers="d560e91" rowspan="1" valign="top" width="25%">4.6.1</td></tr></tbody></table>

<div id="bkmrk-%E4%B8%8B%E9%9D%A2%E6%95%99%E7%A8%8B%E4%BB%A5-jetpack6.2.1-c">下面教程以 **JetPack6.2.1 cuda12.6** 版本为例</div>#### 1.安装torch工具包

##### 1.1下载并安装torch **,** torchvison

```
wget https://pypi.jetson-ai-lab.io/jp6/cu126/+f/62a/1beee9f2f1470/torch-2.8.0-cp310-cp310-linux_aarch64.whl 
wget https://pypi.jetson-ai-lab.io/jp6/cu126/+f/907/c4c1933789645/torchvision-0.23.0-cp310-cp310-linux_aarch64.whl
pip install torch-2.8.0-cp310-cp310-linux_aarch64.whl torchvision-0.23.0-cp310-cp310-linux_aarch64.whl -i https://pypi.tuna.tsinghua.edu.cn/simple
```

##### 1.2 检测是否正确安装

使用python执行下面三个语句

```bash
jetson@jetson-desktop:~$ python
Python 3.10.16 (main, Dec 11 2024, 16:18:56) [GCC 11.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import torch
>>> print(torch.__version__)
2.8.0
>>> print(torch.cuda.is_available())
True
```

#### 2. 运行YOLO11

**YOLO** 是一种实时目标检测算法，它将目标检测视为单阶段回归问题，通过将图像划分为网格并直接预测边界框与类别概率，实现高速且高精度的检测。YOLO系列因开源易用、部署灵活，广泛应用于自动驾驶、安防监控、工业质检等领域。

##### 2.1 安装miniconda

```
curl -L https://repo.anaconda.com/miniconda/Miniconda3-py310_25.3.1-1-Linux-aarch64.sh | bash
source ~/miniconda3/bin/activate 
conda --version  
```

##### 2.2 conda换源

```bash
conda config --add channels https://mirrors.ustc.edu.cn/anaconda/pkgs/main/
conda config --add channels https://mirrors.ustc.edu.cn/anaconda/pkgs/free/
conda config --add channels https://mirrors.ustc.edu.cn/anaconda/cloud/conda-forge/
conda config --add channels https://mirrors.ustc.edu.cn/anaconda/cloud/msys2/
conda config --set show_channel_urls yes
```

##### 2.3创建conda环境

```bash
conda create -n jetson-ai python=3.10
```

##### 2.4 进入conda环境

```
conda activate jetson-ai
```

##### 2.5 安装torch和torchvison

```
wget https://pypi.jetson-ai-lab.io/jp6/cu126/+f/62a/1beee9f2f1470/torch-2.8.0-cp310-cp310-linux_aarch64.whl 
wget https://pypi.jetson-ai-lab.io/jp6/cu126/+f/907/c4c1933789645/torchvision-0.23.0-cp310-cp310-linux_aarch64.whl
pip install torch-2.8.0-cp310-cp310-linux_aarch64.whl torchvision-0.23.0-cp310-cp310-linux_aarch64.whl -i https://pypi.tuna.tsinghua.edu.cn/simple
```

##### 2.6 安装ultralytics

```bash
pip install ultralytics -i https://pypi.tuna.tsinghua.edu.cn/simple
```

##### 2.7 运行摄像头视频推理例程

接入摄像头，并在上面创建的环境中运行如下程序。

```python
import cv2
import time
from ultralytics import YOLO
from ultralytics import YOLOWorld

# Load the YOLO model
model = YOLO("yolo11s.pt")

# Open the video file
video_path = 0
cap = cv2.VideoCapture(video_path)

# Loop through the video frames
while cap.isOpened():
    
    # Read a frame from the video
    success, frame = cap.read()
    start = time.time()
    if success:
        # Run YOLO inference on the frame
        results = model(frame)
        inf_time = time.time() - start
        # Visualize the results on the frame
        annotated_frame = results[0].plot()      
        fps = 1.0 / inf_time if inf_time > 0 else 0
        # show FPS
        cv2.putText(annotated_frame, f"FPS: {fps:.2f}", (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,255,0), 2)
        cv2.imshow("YOLO Inference", annotated_frame)

        # Break the loop if 'q' is pressed
        if cv2.waitKey(1) & 0xFF == ord("q"):
            break
    else:
        # Break the loop if the end of the video is reached
        break

# Release the video capture object and close the display window
cap.release()
cv2.destroyAllWindows()
```

[![image.png](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-07/scaled-1680-/bEUimage.png)](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-07/bEUimage.png)

更多信息可参考[Ultralytics YOLO11 -Ultralytics YOLO 文档](https://docs.ultralytics.com/zh/models/yolo11/)

# 安装使用ollama

##### 1. 运行以下指令安装ollama

```bash
curl -fsSL https://ollama.com/install.sh | sh
```

##### 2. 检查是否正确安装

```bash
jetson@jetson-desktop:~$ ollama -v
ollama version is 0.9.6
```

##### 3. 下载并运行deepseek-r1 1.5b模型

```
ollama run deepseek-r1:1.5b
```

[![image.png](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-07/scaled-1680-/fKNimage.png)](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-07/fKNimage.png)

# 安装使用Jetson-container

<p class="callout info">开始本节内容前请确定您的网络环境能正常拉取docker镜像</p>

Jetson-container是NVIDIA为Jetson设备打造的轻量Docker环境，预装CUDA、cuDNN、TensorRT，快速部署AI边缘应用。

本节以 **Jetson Orin NX 16GB**，**JetPack6.2.1** 运行 **Comfy-UI** 为例进行展示。您也可以参考[官方示例](https://github.com/dusty-nv/jetson-containers/tree/master/packages/diffusion/comfyui)

**Comfy-UI** 是一款专业的节点式Stable Diffusion图形界面，拖拽连接即可构建文生图工作流，支持LoRA、ControlNet、视频扩散，低代码、易扩展等应用及特性。

[![image.png](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-08/scaled-1680-/1uQimage.png)](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-08/1uQimage.png)

1\. 下载编译[jetson-container](https://github.com/dusty-nv/jetson-containers/tree/master)环境

```
git clone https://github.com/dusty-nv/jetson-containers.git
cd jetson-containersbash 
jetson-containers/install.sh
```

2\. 拉取docker镜像并运行

```
jetson-containers run dustynv/comfyui:r36.4.3
```

3\. 成功运行后命令行窗口输出如下

[![image.png](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-08/scaled-1680-/wDnimage.png)](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-08/wDnimage.png)

4\. 打开对应服务的GUI网页

若在Jetson设备上打开则访问 [http://0.0.0.0:8188](http://0.0.0.0:8188)

若在局域网内的其他设备则输入 http://&lt;jetson设备IP&gt;:8188

[![image.png](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-08/scaled-1680-/52qimage.png)](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-08/52qimage.png)

5\. 设定映射路径，将开发板里下载好的模型映射到容器内部目录

```bash
jetson-containers run ~/models/:/opt/ComfyUI/models/checkpoints dustynv/comfyui:r36.4.3
```

6\. 按照需求搭建工作流并调整参数生成图像

[![image.png](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-08/scaled-1680-/1Naimage.png)](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-08/1Naimage.png)

关于ComfyUI的使用教程请参考其官网 [ComfyUI | 用AI生成视频、图像、音频](https://www.comfy.org/zh-cn/)

# 网卡驱动

在 **JetPack6** 以后官方移除了自带的 **Intel 8625NGW** 驱动，同时为了能够使用性能更优的 **Intel AX200** 和 **AX210** 网卡我们需要自行手动安装 **Intel** 网卡驱动包。

1\. 插入网卡，通电开机，并查看网卡状态

```bash
sudo lshw -C network
```

若显示product: Wi-Fi 6 AX200，则硬件已经检测到，若看到`UNCLAIMED`字样则表明驱动未安装

2\. 安装 **iwlwifi** 驱动

iwlwifi 是英特尔（Intel）为其无线网卡开发的开源驱动程序，专为 Linux 操作系统设计，用于支持英特尔全系列无线网络适配器（如 Centrino、Wi-Fi 6/6E/7 等芯片）在 Linux 环境下的高效运行。

```bash
sudo apt update
sudo apt install backport-iwlwifi-dkms 
```

3\. 重启开发板

```bash
sudo reboot
```

4\. 再次查看网卡状态

```bash
jetson@jetson-desktop:~$ sudo lshw -C network
[sudo] password for jetson:
  *-network
       description: Wireless interface
       product: Wi-Fi 6 AX200
       vendor: Intel Corporation
       physical id: 0
       bus info: pci@0001:01:00.0
       logical name: wlan0
       version: 1a
       serial: ac:12:03:a0:4c:db
       width: 64 bits
       clock: 33MHz
       capabilities: pm msi pciexpress msix bus_master cap_list ethernet physical wireless
       configuration: broadcast=yes driver=iwlwifi driverversion=5.10.216-tegra firmware=59.601f3a66.0 cc-a0-59.ucode latency=0 link=no multicast=yes wireless=IEEE 802.11
       resources: irq:55 memory:20a8000000-20a8003fff
  *-network
```

`description` 字段显示为 `Wireless interface` /`Ethernet interface` 便可正常使用无线网卡

# 4G模块使用说明

移远通信LTE Standard EM05系列是一款专为IoT/M2M应用而设计的LTE Cat 4模块。采用节省空间的M.2（NGFF）封装类型，超薄、紧凑的设计使其更易于嵌入到小尺寸产品中。

EM05系列支持最大下行速率150 Mbps，最大上行速率50 Mbps,包含三个型号：EM05-CN、EM05-E和EM05-G。支持LTE-FDD、LTE-TDD、DC-HSDPA、HSPA+、HSDPA、HSUPA、WCDMA和CDMA等多种网络制式。

要在Jetson系列上使用EM-05模块需要重新编译系统内核并刷入新编译的系统。

#### 方法一：替换新内核

##### 1.1 拉取编译好的资料

##### 1.2 修改设备树配置文件

##### 1.3 移动内核和驱动到指定位置

##### 1.4 应用更改并重启验证

#### 方法二：编译刷入完整系统

##### 2.1 获取源码和工具链

- 安装编译依赖工具

```bash
sudo apt install build-essential bc git bison flex libssl-dev zip libncurses-dev make git
```

- 创建工具链放置目录

```
mkdir $HOME/l4t-gcc-toolchain
cd $HOME/l4t-gcc-toolchain
```

- 下载并解压交叉编译工具链

```
wget https://developer.nvidia.com/downloads/embedded/l4t/r36_release_v3.0/toolchain/aarch64--glibc--stable-2022.08-1.tar.bz2
tar xf aarch64--glibc--stable-2022.08-1.tar.bz2
```

- 进入到缓存好的刷机固件目录

```bash
cd $HOME/nvidia/nvidia_sdk/JetPack_6.2.1_Linux_JETSON_ORIN_NANO_TARGETS/Linux_for_Tegra/source  #根据实际目录进行修改
```

- 根据 release tag 拉取源码。[Jetson Linux Archive | NVIDIA Developer](https://developer.nvidia.com/embedded/jetson-linux-archive)

```bash
 ./source_sync.sh -k -t <release-tag> #<release-tag>替换为你自己的发行版本如 jetson_36.4.3
```

##### 2.2 修改内核源码

<p class="callout info">本部分内容可参考[移远Linux&amp;Andriod驱动技术手册](https://forums.quectel.com/uploads/short-url/95mRmCPDAFQTH1TzCIB2cuFr9Yo.pdf "移远Linux&Andriod驱动技术手册")</p>

Jetson Orin Nano配置文件路径：arch/arm64/configs/defconfig

- 配置USB转串口驱动添加如下内容

```bash
CONFIG_USB_SERIAL=y
CONFIG_USB_SERIAL_WWAN=y
CONFIG_USB_SERIAL_OPTION=y
CONFIG_USB_NET_DRIVERS=y
CONFIG_USB_USBNET=y
CONFIG_USB_NET_QMI_WWAN=y
CONFIG_USB_WDM=y
```

- 修改 drivers/usb/serial/option.c，向USB转串口驱动添加VID和PID

```c
static const struct usb_device_id option_ids[] = { 
#if 1 // 2025-04-24 Added by Quectel
    { USB_DEVICE(0x2C7C, 0x0125) }, 
#endif
    ... ...
}
```

- 使用USBNet驱动，文件路径：drivers/usb/serial/option.c

```c
static int option_probe(struct usb_serial *serial,
            const struct usb_device_id *id)
{
    ... ...
 
#if 1  // 2025-04-24 Added by Quectel  
if (serial->dev->descriptor.idVendor == cpu_to_le16(0x2C7C)) { 
        __u16 idProduct = le16_to_cpu(serial->dev->descriptor.idProduct); 
        struct usb_interface_descriptor *intf = &serial->interface->cur_altsetting->desc; 
 
        if (intf->bInterfaceClass != 0xFF || intf->bInterfaceSubClass == 0x42) { 
                //ECM, RNDIS, NCM, MBIM, ACM, UAC, ADB 
                return -ENODEV; 
        } 
 
        if ((idProduct&0xF000) == 0x0000) { 
                //MDM interface 4 is QMI 
                if (intf->bInterfaceNumber == 4 && intf->bNumEndpoints == 3 
                        && intf->bInterfaceSubClass == 0xFF && intf->bInterfaceProtocol == 0xFF) 
                        return -ENODEV; 
        } 
} 
#endif 
 
    /* Store the device flags so we can use them during attach. */
    usb_set_serial_data(serial, (void *)device_flags);
 
    return 0;
}

```

- 添加零包机制，文件路径：drivers/usb/serial/usb\_wwan.c

```c
static struct urb *usb_wwan_setup_urb(struct usb_serial_port *port,
                      int endpoint,
                      int dir, void *ctx, char *buf, int len,
                      void (*callback) (struct urb *))
{
 ... ...
    usb_fill_bulk_urb(urb, serial->dev,
              usb_sndbulkpipe(serial->dev, endpoint) | dir,
              buf, len, callback, ctx);
     
#if 1   //2025-04-24 Added by Quectel for zero packet 
    if (dir == USB_DIR_OUT) { 
        struct usb_device_descriptor *desc = &serial->dev->descriptor; 
    
        if (desc->idVendor == cpu_to_le16(0x2C7C)) 
        urb->transfer_flags |= URB_ZERO_PACKET; 
    } 
#endif
    return urb;
}
```

- 添加Reset-resume机制（休眠唤醒）文件路径：drivers/usb/serial/option.c

```c
static struct usb_serial_driver option_1port_device = {
    ... ...
#ifdef CONFIG_PM
    .suspend           = usb_wwan_suspend,
    .resume            = usb_wwan_resume,
#if 1  //2025-04-24 Added by Quectel 
    .reset_resume   = usb_wwan_resume, 
#endif
#endif
};
```

- 添加QMI\_WWAN驱动  
     移远提供了QMI\_WWAN驱动源文件qmi\_wwan\_q.c，将其复制到 drivers/net/usb/ 目录下。同时修改drivers/net/usb/Makefile，使其能编译 qmi\_wwan\_q.c

```bash
#Makefile
# must insert qmi_wwan_q.o before qmi_wwan.o 
obj-${CONFIG_USB_NET_QMI_WWAN} += qmi_wwan_q.o 
obj-${CONFIG_USB_NET_QMI_WWAN} += qmi_wwan.o 
```

##### 2.3 编译内核

<p class="callout info">此步骤可能需要进行半个小时以上</p>


- 创建输出目录

```bash
cd ../../                    
mkdir kernel_out 
```

- 编译安装内核

```bash
export CROSS_COMPILE=$HOME/l4t-gcc-toolchain/aarch64--glibc--stable-2022.08-1/bin/aarch64-buildroot-linux-gnu-        #设置交叉编译工具
make -C kernel                     #构建 Jetson Linux 内核镜像
sudo -E make install -C kernel     #安装内核模块和树内模块
```

- 将内核镜像复制到刷机目录下

```
cp kernel/kernel-jammy-src/arch/arm64/boot/Image ../Linux_for_Tegra/kernel/Image
```

- 构建NVIDIA树外模块（驱动程序）

```bash
export CROSS_COMPILE=$HOME/l4t-gcc-toolchain/aarch64--glibc--stable-2022.08-1/bin/aarch64-buildroot-linux-gnu-
export KERNEL_HEADERS=$PWD/kernel/kernel-jammy-src
make modules
```

- 安装到刷机目录下

```bash
export INSTALL_MOD_PATH=$HOME/nvidia/nvidia_sdk/JetPack_6.2.1_Linux_JETSON_ORIN_NANO_TARGETS/Linux_for_Tegra/rootfs/ #根据实际目录进行修改
sudo -E make modules_install
```

- 开始构建DTB

```bash
export CROSS_COMPILE=$HOME/l4t-gcc-toolchain/aarch64--glibc--stable-2022.08-1/bin/aarch64-buildroot-linux-gnu-
export KERNEL_HEADERS=$PWD/kernel/kernel-jammy-src
make dtbs
```

- 将生成的dtb文件拷贝到刷机目录

```bash
cp kernel-devicetree/generic-dts/dtbs/* ../kernel/dtb/
```

##### 2.4 刷入系统

- 进入刷机固件缓存目录

```bash
cd $HOME/nvidia/nvidia_sdk/JetPack_6.2.1_Linux_JETSON_ORIN_NANO_TARGETS/Linux_for_Tegra/source  #根据实际目录进行修改
```

使用命令行刷机：

- super模式

```bash
sudo ./tools/kernel_flash/l4t_initrd_flash.sh --external-device nvme0n1p1 -c tools/kernel_flash/flash_l4t_t234_nvme.xml -p "-c bootloader/generic/cfg/flash_t234_qspi.xml" --showlogs --network usb0 jetson-orin-nano-devkit-super internal
```

- 普通模式

```
sudo ./flash.sh jetson-orin-nano-devkit-nvme internal
```

##### 2.5 开机验证

- 将Quectel\_Qconnectmanager上传到开发板
- 解压并编译

```bash
unizp Quectel_QConnectManager_Linux_V1.6.5.zip
cd Quectel_QConnectManager_Linux_V1.6.5
make
```

成功运行便可4G拨号上网

```
jetson@jetson-desktop:~/Downloads/Quectel_QConnectManager_Linux_V1.6.5$ sudo ./quectel-CM
[08-08_11:39:04:415] QConnectManager_Linux_V1.6.5
[08-08_11:39:04:416] Find /sys/bus/usb/devices/1-2.2 idVendor=0x2c7c idProduct=0x125, bus=0x001, dev=0x007
[08-08_11:39:04:416] Auto find qmichannel = /dev/cdc-wdm0
[08-08_11:39:04:417] Auto find usbnet_adapter = wwan0
[08-08_11:39:04:417] netcard driver = qmi_wwan_q, driver version = V1.2.6
[08-08_11:39:04:417] Modem works in QMI mode
[08-08_11:39:04:447] cdc_wdm_fd = 7
[08-08_11:39:04:523] Get clientWDS = 5
[08-08_11:39:04:557] Get clientDMS = 1
[08-08_11:39:04:589] Get clientNAS = 2
[08-08_11:39:04:620] Get clientUIM = 1
[08-08_11:39:04:653] Get clientWDA = 1
[08-08_11:39:04:684] requestBaseBandVersion EM05CNFDR08A03M1G_ND
[08-08_11:39:04:812] requestGetSIMStatus SIMStatus: SIM_READY
[08-08_11:39:04:876] requestGetProfile[pdp:1 index:1] ctnet///0/IPV4V6
[08-08_11:39:04:908] requestRegistrationState2 MCC: 460, MNC: 11, PS: Attached, DataCap: LTE
[08-08_11:39:04:940] requestQueryDataCall IPv4ConnectionStatus: DISCONNECTED
[08-08_11:39:04:941] ip addr flush dev wwan0
[08-08_11:39:04:947] ip link set dev wwan0 down
[08-08_11:39:05:003] requestSetupDataCall WdsConnectionIPv4Handle: 0x8723e530
[08-08_11:39:05:132] ip link set dev wwan0 up
[08-08_11:39:05:141] No default.script found, it should be in '/usr/share/udhcpc/' or '/etc//udhcpc' depend on your udhcpc version!
[08-08_11:39:05:142] busybox udhcpc -f -n -q -t 5 -i wwan0
udhcpc: started, v1.30.1
udhcpc: sending discover
udhcpc: sending select for 10.21.181.66
udhcpc: lease of 10.21.181.66 obtained, lease time 7200
[08-08_11:39:05:282] ip -4 address flush dev wwan0
[08-08_11:39:05:286] ip -4 address add 10.21.181.66/30 dev wwan0
[08-08_11:39:05:292] ip -4 route add default via 10.21.181.65 dev wwan0
```

查看网卡信息

```bash
jetson@jetson-desktop:~$  ifconfig wwan0
wwan0: flags=193<UP,RUNNING,NOARP>  mtu 1500
        inet 10.21.181.66  netmask 255.255.255.252
        inet6 fe80::5804:41ff:feda:ce83  prefixlen 64  scopeid 0x20<link>
        ether 5a:04:41:da:ce:83  txqueuelen 1000  (Ethernet)
        RX packets 9  bytes 2304 (2.3 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 22  bytes 1854 (1.8 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

```

连通性测试


[![ping_test.png](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-08/scaled-1680-/ZwPping-test.png)](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-08/ZwPping-test.png)

# 基础镜像制作

#### 环境准备

- 安装编译依赖工具

<div id="bkmrk-"></div>```
sudo apt install build-essential bc git bison flex libssl-dev zip libncurses-dev make git
```

创建工具链放置目录

```bash
mkdir $HOME/l4t-gcc-toolchain
cd $HOME/l4t-gcc-toolchain
```

- 下载并解压交叉编译工具链

```
wget https://developer.nvidia.com/downloads/embedded/l4t/r36_release_v3.0/toolchain/aarch64--glibc--stable-2022.08-1.tar.bz2
tar xf aarch64--glibc--stable-2022.08-1.tar.bz2
```

- 进入到缓存好的刷机固件目录

```
cd $HOME/nvidia/nvidia_sdk/JetPack_6.2.1_Linux_JETSON_ORIN_NANO_TARGETS/Linux_for_Tegra/source  #根据实际目录进行修改
```

- 同步源码

```bash
 ./source_sync.sh -k -t <release-tag> #<release-tag>替换为你自己的发行版本如 jetson_36.4.3
```

#### 修改添加设备树和驱动

##### Intel无线网卡

参考 [网卡说明](https://www.linkzeelabs.com/wiki/books/jetson-orin-nano/page/1f0e3 "网卡驱动") 在开发板安装驱动后进入 `/usr/lib/modules/$(uname -r)/updates`提取 ko驱动，

复制到固件缓存目录 `Linux_for_Tegra/rootfs/lib/modules/5.15.148-tegra/updates/` 文件夹

##### realtek 8125网卡

将在开发板上编译安装好的ko驱动放入 `Linux_for_Tegra/rootfs/lib/modules/5.15.148-tegra/updates/dkms`

烧录完成进入系统后需要运行命令使能 **r8125.ko**

```bash
sudo depmod -a
sudo modprobe r8125
```

##### 4G模块

参考[4G模块使用说明 2.2](https://www.linkzeelabs.com/wiki/books/jetson-orin-nano/page/4g "4G模块使用说明")

需要改动内核镜像

##### 支持HDMI 4K

<div id="bkmrk-%E4%BF%AE%E6%94%B9%C2%A0tegra234-dcb-p373"><div>修改 `tegra234-dcb-p3737-0000.dtsi`</div><div>替换 `nvidia,dcb-image` 字段，对应的HDMI-dcb二进制串可在源码的 `source/hardware/nvidia/t23x/nv-public/overlay/tegra234-dcb-p3767-0000-hdmi.dts` 中找到。</div></div>##### USB设备树

<div id="bkmrk-%E4%BF%AE%E6%94%B9tegra234-dcb-p3737"><div>修改`tegra234-p3768-0000.dtsi`的 `padctl@3520000` 节点 </div><div>添加usb3-2相关设置</div><div>  
</div></div>```dtd
padctl@3520000 {
			status = "okay";

			pads {
				usb2 {
					lanes {
						usb2-0 {
							nvidia,function = "xusb";
							status = "okay";
						};

						usb2-1 {
							nvidia,function = "xusb";
							status = "okay";
						};

						usb2-2 {
							nvidia,function = "xusb";
							status = "okay";
						};
					};
				};

				usb3 {
					lanes {
						usb3-0 {
							nvidia,function = "xusb";
							status = "okay";
						};

						usb3-1 {
							nvidia,function = "xusb";
							status = "okay";
						};
						
						usb3-2 {
							nvidia,function = "xusb";
							status = "okay";
						};
					};
				};
			};

			ports {
				/* recovery port */
				usb2-0 {
					mode = "otg";
					vbus-supply = <&vdd_5v0_sys>;
					status = "okay";
					usb-role-switch;
				};

				/* hub */
				usb2-1 {
					mode = "host";
					vbus-supply = <&vdd_1v1_hub>;
					status = "okay";
				};

				/* M.2 Key-E */
				usb2-2 {
					mode = "host";
					vbus-supply = <&vdd_5v0_sys>;
					status = "okay";
				};

				/* hub */
				usb3-0 {
					nvidia,usb2-companion = <1>;
					status = "okay";
				};

				/* J5 */
				usb3-1 {
					nvidia,usb2-companion = <0>;
					status = "okay";
				};
				usb3-2 {
					nvidia,usb2-companion = <2>;
					status = "okay";
				};
			};
		};

		usb@3550000 {
			status = "okay";

			phys = <&{/bus@0/padctl@3520000/pads/usb2/lanes/usb2-0}>,
			       <&{/bus@0/padctl@3520000/pads/usb3/lanes/usb3-1}>;
			phy-names = "usb2-0", "usb3-0";
		};

		usb@3610000 {
			status = "okay";

			phys = <&{/bus@0/padctl@3520000/pads/usb2/lanes/usb2-0}>,
			       <&{/bus@0/padctl@3520000/pads/usb2/lanes/usb2-1}>,
			       <&{/bus@0/padctl@3520000/pads/usb2/lanes/usb2-2}>,
			       <&{/bus@0/padctl@3520000/pads/usb3/lanes/usb3-0}>,
			       <&{/bus@0/padctl@3520000/pads/usb3/lanes/usb3-1}>,
			       <&{/bus@0/padctl@3520000/pads/usb3/lanes/usb3-2}>;
			phy-names = "usb2-0", "usb2-1", "usb2-2", "usb3-0",
				    "usb3-1", "usb3-2";
		};
```

### 编译内核、设备树和树外设备

##### 2.3 编译内核

<p class="callout info">此步骤可能需要进行半个小时以上</p>

- 创建输出目录

```bash
cd ../../                    
mkdir kernel_out
```

- 编译安装内核

```bash
export CROSS_COMPILE=$HOME/l4t-gcc-toolchain/aarch64--glibc--stable-2022.08-1/bin/aarch64-buildroot-linux-gnu- #设置交叉编译工具
make -C kernel #构建 Jetson Linux 内核镜像
sudo -E make install -C kernel #安装内核模块和树内模块
```

- 将内核镜像复制到刷机目录下

```bash
cp kernel/kernel-jammy-src/arch/arm64/boot/Image ../kernel/
```

- 构建NVIDIA树外模块（驱动程序）

```bash
export CROSS_COMPILE=$HOME/l4t-gcc-toolchain/aarch64--glibc--stable-2022.08-1/bin/aarch64-buildroot-linux-gnu-
export KERNEL_HEADERS=$PWD/kernel/kernel-jammy-src
make modules
```

- 安装到刷机目录下

```bash
export INSTALL_MOD_PATH=$HOME/nvidia/nvidia_sdk/JetPack_6.2.1_Linux_JETSON_ORIN_NANO_TARGETS/Linux_for_Tegra/rootfs/ #根据实际目录进行修改
sudo -E make modules_install
```

- 开始构建DTB

```bash
export CROSS_COMPILE=$HOME/l4t-gcc-toolchain/aarch64--glibc--stable-2022.08-1/bin/aarch64-buildroot-linux-gnu-
export KERNEL_HEADERS=$PWD/kernel/kernel-jammy-src
make dtbs
```

- 将生成的dtb文件拷贝到刷机目录

```bash
cp kernel-devicetree/generic-dts/dtbs/* ../kernel/dtb/
```

##### 刷写系统命令：

- 普通模式

```bash
sudo ./tools/kernel_flash/l4t_initrd_flash.sh --external-device nvme0n1p1 \
-c tools/kernel_flash/flash_l4t_t234_nvme.xml -p "-c bootloader/generic/cfg/flash_t234_qspi.xml" \
--showlogs --network usb0 jetson-orin-nano-devkit internal
```

- super模式

```bash
sudo ./tools/kernel_flash/l4t_initrd_flash.sh --external-device nvme0n1p1 \
-c tools/kernel_flash/flash_l4t_t234_nvme.xml -p "-c bootloader/generic/cfg/flash_t234_qspi.xml" \
--showlogs --network usb0 jetson-orin-nano-devkit-super internal
```

##### 仅刷写QSPI命令：

- 普通模式

```bash
sudo ./flash.sh -c bootloader/t186ref/cfg/flash_t234_qspi.xml --no-systemimg jetson-orin-nano-devkit nvme0n1p1
```

- super模式

```bash
sudo ./flash.sh -c bootloader/t186ref/cfg/flash_t234_qspi.xml --no-systemimg jetson-orin-nano-devkit-super nvme0n1p1
```

<div id="bkmrk--4"></div>

# 自定义启动LOGO

开机时，开发板会进入UEFI引导系统启动，期间会显示NVIDIA默认的LOGO背景，如果您需要自定义该图片，需要按照一下操作获取UEFI源码替换图片内容重新编译UEFI并刷入到开发板中。

一、安装docker环境

如果已安装docker可以跳过此步骤，但要确保当前用户添加到`docker` 用户组

```
sudo apt install docker.io
```

将当前用户添加到`docker` 用户组后重启生效

```
sudo usermod -a -G docker ${USER}
sudo reboot
```

设置变量

```
export EDK2_DEV_IMAGE="ghcr.io/tianocore/containers/ubuntu-22-dev:latest"
export EDK2_USER_ARGS="-v \"${HOME}\":\"${HOME}\" -e EDK2_DOCKER_USER_HOME=\"${HOME}\""
export EDK2_BUILD_ROOT="/build"
export EDK2_BUILDROOT_ARGS="-v \"${EDK2_BUILD_ROOT}\":\"${EDK2_BUILD_ROOT}\""
alias edk2_docker="docker run -it --rm -w \"\$(pwd)\" ${EDK2_BUILDROOT_ARGS} ${EDK2_USER_ARGS} \"${EDK2_DEV_IMAGE}\""
```

拉取并验证环境

```bash
edk2_docker echo hello
```

[![image.png](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-10/scaled-1680-/2rmimage.png)](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-10/2rmimage.png)

二、拉取源码

初始化edk2环境

```
edk2_docker init_edkrepo_conf
edk2_docker edkrepo manifest-repos add nvidia https://github.com/NVIDIA/edk2-edkrepo-manifest.git main nvidia
```

根据JetPack版本拉取uefi源码 (以**JetPack6.2.1**/**r36.4.4**为例)

```
edk2_docker edkrepo clone nvidia-uefi-r36.4.4 NVIDIA-Platforms r36.4.4-updates
```

该过程会同步多个git项目，可能耗时较长。

同步完成后可以在以下目录找到默认的LOGO文件

```
cd nvidia-uefi-r36.4.4/edk2-nvidia/Silicon/NVIDIA/Assets/
```

[![image.png](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-10/scaled-1680-/UKyimage.png)](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-10/UKyimage.png)

您可以选择直接替换掉这三个分辨率的图片，也可以在下面的配置文件中更改引用的LOGO文件路径

```
cd nvidia-uefi-r36.4.0/edk2-nvidia/Platform/NVIDIA/NVIDIA.fvmain.fdf.inc
```

[![image.png](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-10/scaled-1680-/F9Eimage.png)](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-10/F9Eimage.png)

<p class="callout warning">应该尽可能地控制文件大小，最后的编译出的uefi\_xxx.bin**不得超过3.5MB**，否则刷入后开发板将无法启动。</p>

三、编译

替换完成后，执行以下命令编译UEFI固件

```
cd nvidia-uefi-r36.4.4/
edk2_docker edk2-nvidia/Platform/NVIDIA/Jetson/build.sh
```

[![image.png](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-10/scaled-1680-/j8Uimage.png)](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-10/j8Uimage.png)

四、替换

五、刷入