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 或其他开发库直接调用
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”,就会出现以下选择菜单视窗,通过“上下键”与“空键”选择要设定的组:
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闪烁
接口实验
GPIO控制LED实验
实验步骤
1.引脚接口
连接LED正极引脚与载板GPIO的引脚
- 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
在Pinmux Config Template中,查询GPIO 11对应的TEGRA_SOC名称为SOC_GPIO33
在TRM中 的System Components → Multi-Purpose I/O Pins and Pin Multiplexing (PinMux) → Pinmux Registers部分搜索GPIO33,读取到该寄存器相对PADCTL_G3的Offset值为0x70。
根据TRM文档Pad Control Grouping表格,G3对应的Control Registers Base Address Block为PADCTL_A0
在TRM的Memory Mapped I/O → Address Map部分搜索PADCTL_A24,查看起始地址为0x02430000。0x02430000+0x70=0x02430070即为busybox devmem命令要配置的寄存器地址
查看寄存器值定义。在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。
设置寄存器的值
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
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()
常见问题
Q1 如何验证Jetson.GPIO库已经安装成功?
pip3 list | grep Jetson.GPIO
Jetson.GPIO 2.1.12