首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >基于RK3576 的 uboot 早期硬件控制:Linux6.1.84 内核设备树修改与实践

基于RK3576 的 uboot 早期硬件控制:Linux6.1.84 内核设备树修改与实践

原创
作者头像
用户4984837
修改2025-11-08 16:18:26
修改2025-11-08 16:18:26
2150
举报
文章被收录于专栏:嵌入式分享嵌入式分享
RK3576开发板
RK3576开发板

一、概述

本文介绍通过修改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电平。

2.1 GPIO引脚选择方法

飞凌嵌入式RK3576开发板提供了丰富的GPIO资源,分布在多个GPIO组中,可满足不同外设的控制需求。需通过以下方式确认GPIO引脚的上电初始状态和功能兼容性:

  • 查看硬件设计文档:飞凌RK3576开发板提供完整的引脚功能表格、底板原理图,可联系飞凌嵌入式在线客服获取下载链接,文档中明确标注了各引脚的默认电平、方向(输入/输出)、电压域(如3.3V、1.8V)。
  • 实测验证:使用万用表或示波器,在上电瞬间测量引脚电平,记录初始状态(高/低)和稳定时间。

连接器引脚号

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)

低电平

RK3576开发板引脚布局图
RK3576开发板引脚布局图

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

RK3576开发板引脚布局图
RK3576开发板引脚布局图

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

本方法适用于OK3576-C开发板的以下应用场景:工业传感器模组复位控制、外设上电使能、自定义扩展板硬件初始化等需求,且无需"上电即生效",仅需在kernel驱动加载前(uboot阶段)稳定GPIO电平。飞凌提供的OK3576开发板支持宽温工作(-40℃~85℃),特别适合工业环境下的这类硬件控制需求。

三、修改与验证方法

本节以 GPIO2_B4为例(OK3576-C底板PCIe接口的PCIE0_PERSTn引脚),详细说明设备树修改步骤及验证方法。OK3576-C开发板提供了PCIe 3.0接口,可扩展高速外设,通过本文方法可在系统启动早期控制PCIe设备的复位状态。

3.1 前期准备

  • 硬件:OK3576-C开发板(核心板+底板)、PCIe接口设备(可选)、万用表、调试串口线。
  • 软件:Linux 6.1.84 SDK、交叉编译工具链、串口终端工具(如SecureCRT、MobaXterm)。SDK中包含完整的编译脚本和示例代码。
  • 测量点:GPIO2_B4对应底板R354电阻(PCIe座与电解电容之间)。

3.2 原始状态验证

先烧写原厂默认镜像,验证GPIO2_B4的原始电平变化:

  1. 连接调试串口,打开终端工具(波特率115200,8N1)。飞凌嵌入式RK3576开发板默认引出调试串口,方便开发调试。
  2. 给开发板上电,观察串口打印,记录GPIO2_B4的电平变化(通过万用表测量)。
  3. 默认情况下,该引脚会在 kernel启动后才被拉高,uboot阶段保持低电平。

图3:OK3576开发板扩展接口示意图(红框标注为PCIe接口区域)

3.3 进入uboot命令

上电启动过程中,当串口终端出现以下提示时,按下 CTRL+C可进入uboot命令行(此时uboot未移交控制权给kernel,可测量uboot阶段的GPIO电平):

代码语言:javascript
复制
Hit key to stop autoboot('CTRL+C'):  0
---------------------------------------------
0:Exit to console
1:Reboot
2:Display type
---------------------------------------------

飞凌嵌入式RK3576开发板的uboot经过飞凌优化,提供了丰富的调试命令和配置选项,支持通过环境变量配置多种启动参数,方便开发者进行底层硬件调试。

3.4 理论依据(RK U-Boot DTB机制)

根据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阶段硬件的控制,大大简化了开发流程。

3.5 kernel设备树修改(核心步骤)

通过修改kernel设备树,添加GPIO拉高节点,实现uboot阶段控制GPIO。具体修改如下(基于SDK中的arch/arm64/boot/dts/rockchip/OK3576-C-common.dtsi文件):

代码语言:javascript
复制
--- 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组和引脚编号即可。

3.6 编译与验证

  1. 编译kernel:参考SDK中提供的《OK3576-C_Linux编译手册》,使用飞凌优化的编译脚本(build.sh)可快速完成编译,生成新的boot.img(包含修改后的设备树)。
  2. 烧写镜像:使用RK烧录工具(如RKDevTool),单独烧写boot.img到开发板。飞凌嵌入式RK3576开发板支持TF卡、USB、网络等多种烧录方式,方便开发调试。
  3. 电平验证:
    • 上电后,立即用万用表测量R354电阻两端电平。
    • 进入uboot命令行(CTRL+C),观察电平是否保持高电平(若为高,则修改生效)。
    • 继续启动kernel,确认电平持续稳定(无异常拉低)。

四、总结

本方法通过利用RK U-Boot的kernel DTB机制,无需修改uboot代码,仅通过修改kernel设备树即可实现uboot阶段拉高GPIO,适用于对控制精度要求不高的场景。

本方法的核心要点如下:

  • 硬件优先:确认GPIO上电初始状态,避免"上电即拉高"需求与软件控制时序冲突。
  • 节点配置:使用regulator-fixed兼容驱动,通过regulator-boot-on确保uboot阶段生效。
  • 冲突规避:注释掉原设备树中对同一GPIO的其他引用(如PCIe reset-gpios),防止引脚复用冲突。
  • 实测验证:必须通过万用表或示波器确认uboot阶段和kernel阶段的GPIO电平稳定性。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、概述
  • 二、明确目标
    • 2.1 GPIO引脚选择方法
  • 三、修改与验证方法
    • 3.1 前期准备
    • 3.2 原始状态验证
    • 3.3 进入uboot命令行
    • 3.4 理论依据(RK U-Boot DTB机制)
    • 3.5 kernel设备树修改(核心步骤)
    • 3.6 编译与验证
  • 四、总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档