# JETSON ORIN 系列入门教程

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

# 连接到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)

# 摄像头

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

```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

### 3 持久化GPIO配置

某些场景下可能需要开机自动配置引脚，除了配置开机脚本以外，还可以通过修改Pinmux配置表来完成。

#### 3.1 获取Pinmux配置表和配置说明

可以在 [Jetson Download Center](https://developer.nvidia.com/embedded/downloads) 找到`Jetson Orin NX Series and Jetson Orin Nano Series Pinmux `项目并下载，或者直接[点击此处](https://developer.nvidia.com/downloads/jetson-orin-nx-and-orin-nano-series-pinmux-config-template)获取。

#### 3.2 更改Pinmux配置并生成设备树描述文件

以GPIO11(PQ.06)为例，将其从默认的输入模式改成输出模式，并默认输出高电平。

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

更改后：

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

保存后点击上方的Generate DT File，excel可能会提示宏被禁用，在选项有关可信文件的内容中将该文件加入到可信列表即可。

#### 3.3 替换设备树文件

将生成的`Orin-jetson orin nano&nx pinmux hdmi-padvoltage-default.dtsi`复制一份，并分别改名为

`tegra234-mb1-bct-pinmux-p3767-dp-a03.dtsi`

`tegra234-mb1-bct-pinmux-p3767-hdmi-a03.dts`

将`Orin-jetson orin nano&nx pinmux hdmi-pinmux.dtsi`也复制一份并分别改名为

`tegra234-mb1-bct-padvoltage-p3767-hdmi-a03.dtsi`

`tegra234-mb1-bct-padvoltage-p3767-pd-a03.dtsi`

最后连同`Orin-jetson orin nano&nx pinmux hdmi-gpio-default.dtsi`一起五个文件复制到`./Linux_for_Tegra/bootloader/t186ref/BCT`目录下

#### 3.4 烧录新的Pinmux配置并开机验证

将开发板重启到恢复模式，执行下面指令刷入新的pinmux

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

重启后上电验证31号引脚的电平，或者直接使用万用表测量。

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

# 其他外设

### 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. CAN总线

C1901/C1902与C2401的连线形式不一样，请注意甄别。

C2401包括的部分为图示蓝框的部分，C1901/1902为红框所示的部分。

[![Gemini_Generated_Image_ry4utnry4utnry4u.png](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-12/scaled-1680-/gemini-generated-image-ry4utnry4utnry4u.png)](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-12/gemini-generated-image-ry4utnry4utnry4u.png)

<p class="callout info">C1901/1902 **未配置** CAN 收发芯片，仅输出CAN\_TX, CAN\_RX信号。</p>

<p class="callout info">C2401设置有 CAN 收发芯片，通过总线通讯时，需要将**拨码开关1**调整至 **ON** 接入120Ω电阻，输出CAN\_H, CAN\_L信号。[![9svimage.png](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-12/scaled-1680-/9svimage.png)](https://www.linkzeelabs.com/wiki/uploads/images/gallery/2025-12/9svimage.png)</p>

##### CAN总线配置方法

1\. 挂载相关内核模块

```bash
sudo modprobe can
sudo modprobe can_raw
sudo modprobe mttcan
```

2\. 安装CAN工具进行收发操作

```
sudo apt-get install can-utils
```

3\. 将CAN0<span class="words-blog hl-git-1" data-pretit="波特率" data-tit="波特率">波特率</span>设置成10k

```bash
sudo ip link set down can0
sudo ip link set can0 type can bitrate 10000   #每次调整波特率前都需要先关闭端口
sudo ip link set up can0
```

4\. 发送数据

```
cansend can0 123#00.00.00.00.11.11.11.11
```

5\. 接收数据

```bash
candump can0 &
```

查看can网络情况

```bash
jetson@jetson-desktop:~$ ifconfig
can0: flags=193<UP,RUNNING,NOARP>  mtu 16
        unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  txqueuelen 10  (UNSPEC)
        RX packets 2  bytes 16 (16.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
        device interrupt 110  
```

或者

```bash
jetson@jetson-desktop:~$ ip -d link show can0
9: can0: <NOARP,UP,LOWER_UP,ECHO> mtu 16 qdisc pfifo_fast state UP mode DEFAULT group default qlen 10
    link/can  promiscuity 0 minmtu 0 maxmtu 0 
    can state ERROR-PASSIVE (berr-counter tx 128 rx 0) restart-ms 0 
  bitrate 10000 sample-point 0.875 
  tq 500 prop-seg 87 phase-seg1 87 phase-seg2 25 sjw 1
  mttcan: tseg1 2..255 tseg2 0..127 sjw 1..127 brp 1..511 brp-inc 1
  mttcan: dtseg1 1..31 dtseg2 0..15 dsjw 1..15 dbrp 1..15 dbrp-inc 1
  clock 50000000 numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535 
```

CAN 网络在协议层面有以下 **3 种状态**：

<div id="bkmrk-error-active-%28%E4%B8%BB%E5%8A%A8%E9%94%99%E8%AF%AF%29-">1. **Error Active (主动错误)** - **\[正常\]**
    
    
    - 这是健康状态。节点可以正常收发数据，如果发现总线错误，会发送“主动错误帧”（破坏总线电平）来通知其他节点。
2. **Error Passive (被动错误)** - **\[警告\]**
    
    
    - 当错误计数器（RX/TX Error Counter）超过 127 时进入此状态。
    - 节点依然可以收发数据，但发送错误帧时是被动的，以此避免干扰总线上的健康节点。
3. **Bus Off (总线关闭)** - **\[严重\]**
    
    
    - 当发送错误计数器超过 255 时进入此状态。
    - CAN 控制器会将自己从物理总线上**断开**，彻底停止收发数据。
    - **在 ifconfig 的表现**: 可能会看到 `RUNNING` 标志消失，或者只是发不出包。需要重启接口 (`down` 然后 `up`) 或配置自动重启 (`restart-ms`) 才能恢复。

  
</div>### 5. 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
```