
本文介绍通过修改kernel设备树,在飞凌嵌入式OK3576-C开发板上实现在uboot阶段拉高GPIO的方法。OK3576-C作为基于RK3576处理器的高性能嵌入式平台,集成四核Cortex-A76与四核Cortex-A55架构,为工业控制、边缘计算等场景提供强大算力支持。其灵活的硬件配置和完善的软件生态,使得这类底层硬件控制需求能够通过标准化的设备树配置实现,无需复杂的底层代码修改。
对于需要在系统启动早期(uboot阶段)控制外设的应用场景,如工业传感器使能、外设复位控制等,本文方法可有效简化开发流程。若需对GPIO进行更精细的控制(如时序精确调整、多状态切换等),则仍需直接修改uboot代码。
本文验证基于飞凌官方资料《OK3576-C_Linux6.1.84_用户资料_R2》,该资料包含完整的硬件手册、驱动开发指南和示例代码,可通过飞凌嵌入式官网获取。RK其他平台(如RK3568、RK3588)或其他Linux版本可参考此方法,但需根据具体硬件手册调整引脚定义和设备树节点。
在修改uboot或kernel设备树前,需先明确需求合理性,避免无效开发。核心是判断"uboot阶段拉高GPIO"是否能满足硬件设计目标,关键在于硬件上电初期的GPIO电平状态。
若硬件电路需"上电即拉高GPIO"(如继电器控制、关键模组使能),但目标GPIO上电初始状态为低电平,则 无法通过软件解决!需更换硬件设计:选择上电后默认高电平的GPIO引脚(由硬件电路决定),因为uboot通常在上电2秒后才开始工作,软件无法控制uboot启动前的GPIO电平。
飞凌嵌入式RK3576开发板提供了丰富的GPIO资源,分布在多个GPIO组中,可满足不同外设的控制需求。需通过以下方式确认GPIO引脚的上电初始状态和功能兼容性:
连接器引脚号 | CPU球号 | 核心板引脚功能 | 开发板引脚功能 | 引脚方向选择 | 电平域电压 | 开发板引脚功能描述 | 开发板应用接口 | 复位状态 |
|---|---|---|---|---|---|---|---|---|
LD5 | A208 | PWM1_CH0_M0 | PWM1_CH0_M0 | 输出 | 3.3V | PWM1_CH0_M0 | - | 低电平 |
LD6 | — | — | — | — | — | — | — | — |
LD7 | 1U24 | UART0_TX_M0_DEBUG | UART0_TX_M0_DEBUG | 输出 | 3.3V | UART0发送 | UART0_TX_M0_DEBUG | 高电平 |
LD8 | — | GND | GND | — | — | 地 | GND | — |
LD9 | AA28 | UART0_RX_M0_DEBUG | UART0_RX_M0_DEBUG | 输入 | 3.3V | UART0接收 | UART0_RX_M0_DEBUG | 高电平 |
LD10 | — | — | — | — | — | — | — | — |
LD11 | 1W24 | I2C2_SCL_M0 | I2C2_SCL_M0 | 输出 | 3.3V | I2C2时钟 | I2C2_SCL_M0 | 低电平 |
LD12 | — | — | — | — | — | — | — | — |
LD13 | 1W22 | PWM0_CH0_M0 | PWM0_CH0_M0 | 输出 | 3.3V | PWM0_CH0_M0 | PWM0_CH0_M0(MIPI屏幕背光PWM) | 低电平 |

图1:RK3576开发板接口布局示意图

图2:RK3576开发板接口布局示意图
本方法适用于OK3576-C开发板的以下应用场景:工业传感器模组复位控制、外设上电使能、自定义扩展板硬件初始化等需求,且无需"上电即生效",仅需在kernel驱动加载前(uboot阶段)稳定GPIO电平。飞凌提供的OK3576开发板支持宽温工作(-40℃~85℃),特别适合工业环境下的这类硬件控制需求。
本节以 GPIO2_B4为例(OK3576-C底板PCIe接口的PCIE0_PERSTn引脚),详细说明设备树修改步骤及验证方法。OK3576-C开发板提供了PCIe 3.0接口,可扩展高速外设,通过本文方法可在系统启动早期控制PCIe设备的复位状态。
先烧写原厂默认镜像,验证GPIO2_B4的原始电平变化:

图3:OK3576开发板扩展接口示意图(红框标注为PCIe接口区域)
上电启动过程中,当串口终端出现以下提示时,按下 CTRL+C可进入uboot命令行(此时uboot未移交控制权给kernel,可测量uboot阶段的GPIO电平):
Hit key to stop autoboot('CTRL+C'): 0
---------------------------------------------
0:Exit to console
1:Reboot
2:Display type
---------------------------------------------飞凌嵌入式RK3576开发板的uboot经过飞凌优化,提供了丰富的调试命令和配置选项,支持通过环境变量配置多种启动参数,方便开发者进行底层硬件调试。
根据RK官方手册《Rockchip_Developer_Guide_UBoot_Nextdev_CN.pdf》的"Kernel-DTB"章节描述,RK平台支持"使用kernel DTB初始化uboot外设",核心机制如下:
原生的U-Boot只支持使用U-Boot自己的DTB,RK平台增加了kernel DTB机制的支持,即使用kernel DTB 去初始化外设。主要目的是为了兼容外设板级差异,如:power、clock、display 等。 二者的作用: • U-Boot DTB:负责初始化存储、打印串口等核心设备; • Kernel DTB:负责初始化存储、打印串口以外的设备(如GPIO、I2C、PCIe等); U-Boot初始化时先用U-Boot DTB完成存储、打印串口初始化,然后从存储上加载Kernel DTB 并转而使用这份DTB继续初始化其余外设。Kernel DTB 的代码实现在函数: init_kernel_dtb() 。 开发者一般不需要修改 U-Boot DTB(除非更换打印串口),各平台发布的SDK里使用的 defconfig 都已启用kernel DTB机制。所以通常对于外设的DTS修改,用户应该修改kernel DTB。
飞凌提供的RK3576开发板 SDK默认启用了这一机制,使得开发者可以通过修改kernel设备树实现对uboot阶段硬件的控制,大大简化了开发流程。
通过修改kernel设备树,添加GPIO拉高节点,实现uboot阶段控制GPIO。具体修改如下(基于SDK中的arch/arm64/boot/dts/rockchip/OK3576-C-common.dtsi文件):
--- a/arch/arm64/boot/dts/rockchip/OK3576-C-common.dtsi
+++ b/arch/arm64/boot/dts/rockchip/OK3576-C-common.dtsi
@@ -428,6 +428,16 @@ wifi_ext_clk: wifi_ext_clk {
pinctrl-0 = <&net_5g_pwr_gpio>;
status = "okay";
};
+
+ gpio2b4_high_test {
+ compatible = "regulator-fixed"; // 兼容固定电压调节器驱动(用于GPIO拉高)
+ gpio = <&gpio2 RK_PB4 GPIO_ACTIVE_HIGH>; // 指定GPIO2_B4,高电平有效
+ enable-active-high; // 使能信号为高电平
+ regulator-boot-on; // 系统启动时使能(uboot阶段生效)
+ regulator-always-on; // 保持常亮(防止被后续驱动关闭)
+ status = "okay"; // 启用该节点
+ };
+
};
@@ -1164,7 +1174,7 @@ rgmii_phy1: phy@2 {
};
&pcie0 {
- reset-gpios = <&gpio2 RK_PB4 GPIO_ACTIVE_HIGH>; // 原PCIe复位GPIO定义
+ //reset-gpios = <&gpio2 RK_PB4 GPIO_ACTIVE_HIGH>; // 注释掉,避免引脚冲突
rockchip,skip-scan-in-resume;
pinctrl-names = "default";
status = "okay";飞凌嵌入式RK3576开发板提供的设备树经过优化,将不同功能模块的配置进行了清晰分离,方便开发者进行针对性修改。上述修改方法同样适用于其他GPIO引脚的控制需求,只需替换相应的GPIO组和引脚编号即可。
本方法通过利用RK U-Boot的kernel DTB机制,无需修改uboot代码,仅通过修改kernel设备树即可实现uboot阶段拉高GPIO,适用于对控制精度要求不高的场景。
本方法的核心要点如下:
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。