触觉智能Purple Pi OH2开发板板载双20Pin的GPIO排针(兼容树莓派),提供了丰富的拓展空间。本文基于Purple Pi OH2为大家讲解GPIO概念、原理、代码示例、调试方法灯。
一、GPIO 基本概念
1.1 什么是 GPIO?
GPIO(General Purpose Input/Output,通用输入输出)是嵌入式系统中最基础的外设接口。每个 GPIO 引脚可以被配置为:
•输入模式 :读取外部信号(如按键、传感器)
•输出模式 :控制外部设备(如 LED、继电器)
•中断模式 :检测边沿变化触发中断
1.2 RK3576 GPIO 资源
RK3576 芯片共有 5 组 GPIO(GPIO0~GPIO4),每组包含 32 个引脚(A0-A7, B0-B7, C0-C7, D0-D7)。
从设备树可以看到:
gpio0 = &gpio0;
gpio1 = &gpio1;
gpio2 = &gpio2;
gpio3 = &gpio3;
gpio4 = &gpio4;
1.3 GPIO 命名规则
RK 平台使用 GPIOx_PYz 的命名方式:
•x : GPIO 组号(0-4)
•Y : 端口(A、B、C、D)
•z : 引脚号(0-7)
例如:GPIO0_PB4 表示 GPIO0 组的 B 端口第 4 号引脚
二、GPIO 工作原理
2.1 内部结构

2.2 工作模式
|------|--------------------|--------|
| 模式 | 说明 | 典型应用 |
| 输入模式 | 高阻态,读取外部电平 | 按键检测 |
| 输出模式 | 驱动外部电路 | LED 控制 |
| 中断模式 | 边沿 / 电平触发 | 事件通知 |
| 复用模式 | 作为其他功能(UART/I2C 等) | 引脚复用 |
三、GPIO 设备树配置
3.1 在设备树中添加 GPIO 节点
编辑设备树文件(如ido-evb7609-v1a.dtsi):
// 定义 LED 设备节点
/ {
leds: leds {
status = "okay";
compatible = "gpio-leds";
pinctrl-names = "default";
pinctrl-0 = <&leds_gpio>;
work_led: work {
gpios = <&gpio4 RK_PC7 GPIO_ACTIVE_HIGH>;
linux,default-trigger = "heartbeat";
};
hub_rst {
gpios = <&gpio4 RK_PD0 GPIO_ACTIVE_HIGH>;
default-state="on";
};
};
// USB 电源控制
cgpio:cgpios{
status = "okay";
compatible = "cust,cgpio";
usb_pwr { //SD-card、USB-A、Wi-Fi
gpios = <&gpio0 RK_PB6 GPIO_ACTIVE_HIGH>;
init-status = <1>;
};
};
};
3.2 pinctrl 引脚配置
&pinctrl { // LED 引脚配置
led_pins: led-pins {
rockchip,pins =
<0 RK_PB4 RK_FUNC_GPIO &pcfg_pull_none>;
};
// 按键引脚配置
key_pins: key-pins {
rockchip,pins =
<0 RK_PA0 RK_FUNC_GPIO &pcfg_pull_up>;
};
};
3.3 GPIO 上下拉配置详解
RK3576 的 GPIO 支持多种上下拉配置,通过 rockchip,pins 属性的最后一个参数指定。
上下拉配置类型

|----------|------------------|------------|------------------|
| 配置 | 设备树值 | 说明 | 典型应用 |
| 上拉 | &pcfg_pull_up | 引脚默认上拉到高电平 | 按键输入、I2C SDA/SCL |
| 下拉 | &pcfg_pull_down | 引脚默认下拉到低电平 | 复位信号、使能信号 |
| 无上下拉 | &pcfg_pull_none | 浮空输入,无上拉电阻 | LED 输出、GPIO 输出 |
| 保持 | &pcfg_pull_bus | 总线保持器 | 低功耗场景 |
实际设备树配置示例
&pinctrl {
/* LED 引脚 - 无上拉(输出模式不需要) */
leds_gpio: leds-gpio {
rockchip,pins =
<4 RK_PC7 RK_FUNC_GPIO &pcfg_pull_none>, /* work_led */
<4 RK_PD0 RK_FUNC_GPIO &pcfg_pull_none>; /* hub_rst */
};
/* USB 电源 - 无上拉 */
usb_pwr: usb-pwr {
rockchip,pins =
<0 RK_PB6 RK_FUNC_GPIO &pcfg_pull_none>;
};
/* 耳机检测 - 上拉(按键检测) */
hp_det: hp-det {
rockchip,pins =
<3 RK_PB0 RK_FUNC_GPIO &pcfg_pull_up>;
};
/* WiFi 唤醒 - 下拉 */
wifi_host_wake_irq: wifi-host-wake-irq {
rockchip,pins =
<0 RK_PB0 RK_FUNC_GPIO &pcfg_pull_down>;
};
/* 按键输入 - 上拉 */
adc_keys_pins: adc-keys-pins {
rockchip,pins =
<0 RK_PA0 RK_FUNC_GPIO &pcfg_pull_up>;
};
/* I2C 引脚 - 上拉(I2C 标准需要) */
i2c2m0_xfer: i2c2m0-xfer {
rockchip,pins =
<1 RK_PB3 9 &pcfg_pull_up>, /* i2c2_sda_m0 */
<1 RK_PB4 9 &pcfg_pull_up>; /* i2c2_scl_m0 */
};
};
上下拉选择原则

注意事项
1.输出模式 :通常使用&pcfg_pull_none,因为 GPIO 输出是推挽驱动
2.输入按键 :必须使用&pcfg_pull_up,确保按键未按下时读到高电平
3.I2C 总线 :必须使用&pcfg_pull_up,I2C 是开漏输出需要上拉电阻
4.中断引脚 :根据触发方式选择,上升沿触发用下拉,下降沿触发用上拉
今天就先写到这里 下期带来 驱动代码示例和调试方法 以及常见问题解决