GPIO

前置知识

SFIO、GPIO的区别
Jetson Orin Nano/NX设备的 40 根引脚主要分成SFIO(Special Function I/O)特定功能和GPIO(General Purpose I/O)通用功能两大类。

其中,SFIO共有18根引脚,为不能重新定义的固定功能;分为以下三种:

  • 供电相关:

-5V 直流电输入/输出:脚位[2, 4];用于对Jetson设备供电;
-3.3V 直流电输出:脚位[1, 17],可以为一些低电设备进行供电;
-GND 接地点:脚位[6, 9, 14, 20, 25, 30, 34, 39]共 8 个;

  • 二组 I2C:I2C1_SDA/SCL=>脚位[27, 28];I2C2_SDA/SCL => 脚位[3, 5];

  • 一组 UART:UART1_TX/RX=>脚位[8, 10];

其余22根引脚可重新定义,即GPIO(图中的unused引脚)。这些引脚,可以:

  • 通过Jetson-IO 工具将特定引脚设置成为 SFIO 用途,然后配合特定的开发库;

  • 作为 GPIO 用途,通过Jetson.GPIO 或其他开发库直接调用

c1201-dcdc

Jetson-io工具

Jetson-IO:是 NVIDIA 从 L4T 32.3 版本开始,提供可以修改引脚定义的工具,在 Jetpack 烧录过程就编译到开发套件的 /opt/nvidia/jetsion-io 目录下,这是属于系统底层的配置工具。

使用Jetson-IO工具进行管脚配置:

sudo /opt/nvidia/jetson-io/jetson-io.py

进入主菜单后,选择下面的“Configure Jetson 40pin Header”,就会出现以下选择菜单视窗,通过“上下键”与“空键”选择要设定的组:

c1201-dcdc

c1201-dcdc

c1201-dcdc

JETSON.GPIO开发库的作用

  • Jetson.GPIO 是一个应用级开发库,用于配置和操作未被 Jetson-IO 设置为 SFIO 的 GPIO 引脚。允许开发者通过 Python 脚本直接操作 Jetson 的 ​​扩展引脚;

  • 包括lib/python/,用于实现引脚的控制功能;samples/,包含了范例应用

LED闪烁的工作原理

  • 本实验采用RGB三色LED

  • LED共4根引脚:R(红)、G(绿)、B(蓝)、公共接地

  • R、G、B引脚分别接GPIO的引脚;引脚输出高电平时,相应的颜色点亮;按照一定时间间隔输出高、低电平,LED闪烁

c1201-dcdc

接口实验

GPIO控制LED实验

实验步骤
1.引脚接口
连接LED正极引脚与载板GPIO的引脚

c1201-dcdc

- GND–pin 6
- G–pin 31
- R–pin 7


2.设置GPIO引脚对应的寄存器
(以设置pin 31为GPIO,Output为例)

  • 准备文件
    从Nvidia官方渠道下载如下文件:
    《Jetson-Orin-Nano-DevKit-Carrier-Board-Specification_SP-11324-001_v1.3》
    《Jetson_Orin_NX_and_Orin_Nano_series_Pinmux_Config_Template》
    《Orin-TRM_DP10508002_v1.2》

  • 在Board Specification中,查询pin 7对应的BCM编号为GPIO 11

c1201-dcdc

  • 在Pinmux Config Template中,查询GPIO 11对应的TEGRA_SOC名称为SOC_GPIO33

c1201-dcdc

  • 在TRM中 的System Components → Multi-Purpose I/O Pins and Pin Multiplexing (PinMux) → Pinmux Registers部分搜索GPIO33,读取到该寄存器相对PADCTL_G3的Offset值为0x70。

c1201-dcdc

  • 根据TRM文档Pad Control Grouping表格,G3对应的Control Registers Base Address Block为PADCTL_A0

c1201-dcdc

  • 在TRM的Memory Mapped I/O → Address Map部分搜索PADCTL_A24,查看起始地址为0x02430000。0x02430000+0x70=0x02430070即为busybox devmem命令要配置的寄存器地址

c1201-dcdc

  • 查看寄存器值定义。在TRM 的Multi-Purpose I/O Pins and Pin Multiplexing(PinMux)章节G3 PAD Control Registers部分可以查看到寄存器各Bit的定义。我们在Reset值(默认值)的基础上,修改Bit10 为0更改为GPIO模式,修改Bit4 为0(PASSTHROUGH),修改Bit3:2为1,最后寄存器配置结果即为0x004。

c1201-dcdc

  • 设置寄存器的值

sudo busybox devmem 0x2430070 w 0x004

3.使用libgpiod控制GPIO

  • 安装前置软件包

sudo apt-get install busybox automake autoconf libtool
  • 验证安装是否成功

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 状态(pin 31) pin 31对应PQ.06

c1201-dcdc

gpioget $(gpiofind "PQ.06")
0
  • 将 GPIO 设置为输出模式(pin 31)

sudo busybox devmem 0x2430070 w 0x004
  • 保持高电平

gpioset --mode=wait `gpiofind "PQ.06"`=1
  • 保持低电平

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

4.使用python控制GPIO

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

sudo busybox devmem 0x2430070 w 0x004
  • 重新安装系统自带的jetson.GPIO库

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 .
  • 编写python脚本;绿色led以1秒为间隔闪烁

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()
c1201-dcdc

常见问题

Q1 如何验证Jetson.GPIO库已经安装成功?

pip3 list | grep Jetson.GPIO
Jetson.GPIO           2.1.12