深入解析RK3588 U-Boot板级文件:evb_rk3588.c核心逻辑拆解

电子说

1.4w人已加入

描述

 

 

 

在嵌入式开发领域,瑞芯微RK3588凭借超强的算力、丰富的接口和广泛的场景适配性,成为高端边缘计算、消费电子项目的热门选择。而U-Boot作为嵌入式系统的第一道门,负责硬件初始化、引导内核启动,其板级适配代码直接决定了芯片硬件能力的落地。

 

 

今天我们聚焦RK3588评估板(EVB)的核心板级文件——u-boot/board/rockchip/evb_rk3588/evb_rk3588.c,拆解这份代码的底层逻辑,搞懂RK3588USB功能是如何在U-Boot中被初始化和管理的。

评估板

一、文件定位:RK3588 USB功能的板级适配基石

 

 

evb_rk3588.cRockchipRK3588评估板定制的U-Boot板级适配文件,核心职责是RK3588USB DWC3控制器提供板级初始化和管理逻辑,是评估板USB功能能正常工作的核心保障。

 

 

具体来说,这份文件的核心价值体现在3点:

 

 

1.适配瑞芯微RK3588USB OTG控制器(基于DWC3架构),实现硬件复位、参数配置等底层操作;

 

 

2.支撑USB Gadget(设备模式)功能,是瑞芯微Rockusb协议(刷机/调试专用)的底层依赖;

 

 

3.处理USB 3.0/2.0模式的兼容逻辑,包括PHY初始化失败时的降级策略(USB3.0→USB2.0),保证基础功能不丢失。

 

 

简单讲:没有这份文件,RK3588评估板的USB刷机、USB调试等核心功能,在U-Boot阶段就无法正常工作。

 

 

二、逐行拆解:核心宏定义与函数功能

 

 

这份文件的代码围绕“USB控制器适配展开,我们从宏定义、全局配置、核心函数三个维度,逐一解析其功能。

 

 

1. 硬件相关宏定义:操作时钟与复位的地址钥匙

 

 

  •  
  •  
#define CRU_BASE0xfd7c0000#define CRU_SOFTRST_CON420x0aa8

RK3588的硬件操作依赖时钟复位单元(CRU,这两个宏是操作USB OTG控制器复位的关键:

 

 

CRU_BASECRU模块的基地址,所有时钟、复位寄存器都基于此地址访问;

 

 

CRU_SOFTRST_CON42USB OTG控制器的软复位寄存器偏移量,写入特定值可触发/释放复位。

 

 

这是嵌入式开发的典型设计:通过物理地址直接操作硬件寄存器,实现对底层硬件的控制。

 

 

2. 全局配置结构体:DWC3控制器的参数清单

 

 

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
static struct dwc3_device dwc3_device_data = {.maximum_speed = USB_SPEED_SUPER,.base = 0xfc000000,.dr_mode = USB_DR_MODE_PERIPHERAL,.index = 0,.dis_u2_susphy_quirk = 1,.dis_u1u2_quirk = 1,.usb2_phyif_utmi_width = 16,};

这是给DWC3 USB控制器的初始化参数,每一项都针对RK3588的硬件特性定制:

 

 

maximum_speed:默认开启USB 3.0超高速(SUPER);

 

 

dr_mode:强制工作在设备模式(而非主机模式),因为U-Boot阶段USB主要用于刷机/调试;

 

 

dis_u2_susphy_quirk/dis_u1u2_quirk:关闭USB2.0 PHY休眠、U1/U2节能模式,避免初始化失败或稳定性问题;

 

 

usb2_phyif_utmi_width:配置USB2.0 PHY接口宽度为16位,匹配RK3588的硬件设计。

 

 

3. 核心函数解析:USB功能的核心操作逻辑

 

 

1usb_gadget_handle_interruptsUSB中断的响应入口

 

 

  •  
  •  
  •  
  •  
  •  
int usb_gadget_handle_interrupts(int index){dwc3_uboot_handle_interrupt(0);return 0;}

功能:处理USB Gadget模式下的中断请求。

 

 

U-Boot运行时,USB设备模式会产生各类中断(比如数据传输完成、设备枚举),该函数是中断处理的入口”——内部调用U-Boot通用DWC3驱动的中断处理函数,确保中断被及时响应,保证USB数据传输不中断。

 

 

2rkusb_usb3_capableUSB3.0能力的判断开关

 

 

  •  
  •  
  •  
  •  
bool rkusb_usb3_capable(void){return true;}

功能:告知上层逻辑(如Rockusb协议),当前板子支持USB 3.0

 

 

Rockusb是瑞芯微定制的USB协议(用于刷机、烧录固件),该函数直接返回true,表示RK3588评估板硬件支持USB 3.0,上层可启用高速传输模式,提升刷机/调试效率。

 

 

3usb_reset_otg_controllerUSB控制器的复位操作

 

 

  •  
  •  
  •  
  •  
  •  
  •  
  •  
static void usb_reset_otg_controller(void){writel(0x00100010CRU_BASE + CRU_SOFTRST_CON42);mdelay(1);writel(0x00100000CRU_BASE + CRU_SOFTRST_CON42);mdelay(1);}

功能:对USB OTG控制器执行软复位,清除硬件异常状态。

 

 

硬件初始化前,复位是必备步骤:

 

 

1.向复位寄存器写入0x00100010,触发OTG控制器复位;

 

 

2.延时1ms,确保复位动作完成;

 

 

3.写入0x00100000释放复位;

 

 

4.再延时1ms,保证控制器稳定运行。

 

 

这一步能解决控制器残留的异常状态,为后续初始化铺路,是嵌入式硬件初始化的常规操作

 

 

4board_usb_initUSB初始化的核心入口

 

 

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
int board_usb_init(int index, enum usb_init_type init){u32 ret = 0;usb_reset_otg_controller(); // 先复位控制器#if defined(CONFIG_SUPPORT_USBPLUG)// 启用USB插拔检测时,默认降级为USB2.0dwc3_device_data.maximum_speed = USB_SPEED_HIGH;if (rkusb_switch_usb3_enabled()) {// 若开启USB3.0,尝试初始化USB3.0 PHYdwc3_device_data.maximum_speed = USB_SPEED_SUPER;ret = rockchip_u3phy_uboot_init();if (ret) {// PHY初始化失败,强制USB2.0rkusb_force_to_usb2(true);dwc3_device_data.maximum_speed = USB_SPEED_HIGH;}}#else// 未启用插拔检测,直接初始化USB3.0 PHYret = rockchip_u3phy_uboot_init();if (ret) {// 失败则降级为USB2.0rkusb_force_to_usb2(true);dwc3_device_data.maximum_speed = USB_SPEED_HIGH;}#endif// 调用通用驱动完成DWC3控制器初始化return dwc3_uboot_init(&dwc3_device_data);}

功能U-Boot板级USB初始化的核心函数,是USB控制器能工作的总开关

 

 

执行流程拆解:

 

 

1.先复位控制器,清理初始状态;

 

 

2.若开启CONFIG_SUPPORT_USBPLUGUSB插拔检测):

 

 

先默认设置为USB2.0高速模式,再检查是否启用USB3.0

 

 

尝试初始化USB3.0 PHY,失败则强制降级为USB2.0

 

 

3.若未开启插拔检测:直接初始化USB3.0 PHY,失败则降级;

 

 

4.最后调用U-Boot通用DWC3驱动的初始化函数,完成控制器配置。

 

 

这个函数的设计体现了嵌入式开发的容错思想:优先尝试高性能模式(USB3.0),失败则降级到基础模式(USB2.0),保证核心功能不丢失。

 

 

5board_usb_cleanup(条件编译):USB资源的清理入口

 

 

  •  
  •  
  •  
  •  
  •  
  •  
  •  
#if defined(CONFIG_SUPPORT_USBPLUG)int board_usb_cleanup(int index, enum usb_init_type init){dwc3_uboot_exit(index);return 0;}#endif

功能:仅在启用USB插拔检测时生效,负责清理USB控制器资源。

 

 

USB设备插拔时,需要释放旧的控制器资源,该函数调用通用驱动的退出函数,保证多次插拔时USB功能的稳定性。

三、USB功能异常排查流程图:快速定位问题

U-Boot阶段USB功能异常(刷机失败、调试无响应)的排查流程图,直接对照即可快速缩小故障范围,适配evb_rk3588.c的核心逻辑:

 

 

评估板

四、总结:嵌入式板级适配的核心思路

 

 

evb_rk3588.c虽代码量不大,但浓缩了嵌入式板级适配的核心思想:

 

 

1.分层设计:硬件无关的逻辑交给U-Boot通用驱动(如DWC3驱动),硬件相关的细节(复位、PHY配置)交给板级文件;

 

 

2.容错设计:关键功能(如USB3.0)做降级兼容,保证基础功能可用;

 

 

3.硬件直操:通过物理地址操作寄存器,实现对底层硬件的精准控制。

 

 

对于RK3588开发者来说,理解这份代码不仅能解决USB初始化失败、刷机异常等问题,更能掌握板级适配的核心逻辑——把通用驱动和具体硬件结合,让芯片的能力真正落地。

 

 

最后,留一个互动问题:你在做RK3588开发时,遇到过USB初始化失败的问题吗?评论区聊聊你的排坑经验~

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分