/* * SPDX-License-Identifier: GPL-2.0+ * * (C) Copyright 2022 Rockchip Electronics Co., Ltd */ #include <common.h> #include <asm/io.h> #include <dwc3-uboot.h> #include <usb.h> DECLARE_GLOBAL_DATA_PTR; #define CRU_BASE 0xFF3B2000 #define CRU_SOFTRST_CON04 0x0A10 #ifdef CONFIG_USB_DWC3 static struct dwc3_device dwc3_device_data = { .maximum_speed = USB_SPEED_HIGH, .base = 0xffb00000, .dr_mode = USB_DR_MODE_PERIPHERAL, .index = 0, .dis_u2_susphy_quirk = 1, .usb2_phyif_utmi_width = 16, }; int usb_gadget_handle_interrupts(void) { dwc3_uboot_handle_interrupt(0); return 0; } #ifdef CONFIG_SUPPORT_USBPLUG static void usb_reset_otg_controller(void) { writel(0x1 << 7 | 0x1 << 23, CRU_BASE + CRU_SOFTRST_CON04); mdelay(1); writel(0x0 << 7 | 0x1 << 23, CRU_BASE + CRU_SOFTRST_CON04); mdelay(1); } #endif int board_usb_init(int index, enum usb_init_type init) { #ifdef CONFIG_SUPPORT_USBPLUG usb_reset_otg_controller(); #endif writel(0x01ff0000, 0xff000050); /* Resume usb2 phy to normal mode */ puts("wyc hello world before uboot usb init\n"); return dwc3_uboot_init(&dwc3_device_data); } #endif 这个是uboot中的rv1106.c文件,puts("wyc hello world before uboot usb init\n"),这句话可以实现在uboot启动时,在终端上输出里面的内容吗
时间: 2025-06-15 08:04:39 浏览: 17
<think>好的,我需要分析用户提供的这段U-Boot代码,特别是关于`puts("wyc hello world before uboot usb init\n")`这一行是否能在启动时在终端输出信息。首先,我应该回顾一下U-Boot的基本结构和函数作用。
用户给出的代码是Rockchip RV1106平台的U-Boot文件,主要处理USB初始化的部分。代码中包含了头文件如`common.h`和`usb.h`,这些通常包含U-Boot的核心函数和USB相关的定义。`DECLARE_GLOBAL_DATA_PTR`用于访问全局数据结构,这在U-Boot中常见。
接下来,`board_usb_init`函数是板级USB初始化函数,会在U-Boot初始化USB子系统时被调用。这里调用了`writel`函数来配置硬件寄存器,可能是设置USB控制器的复位或工作模式。然后使用`puts`函数输出字符串,最后调用`dwc3_uboot_init`初始化DWC3 USB控制器。
需要确认的是`puts`在U-Boot中的行为。通常,U-Boot的`puts`函数会将字符串输出到控制台,但前提是串口驱动已经初始化,并且控制台设备已经准备好。在U-Boot的启动流程中,串口初始化通常在板级初始化早期完成,因此`board_usb_init`被调用时,控制台应该已经可用。
但需要考虑`board_usb_init`的执行时机。如果USB初始化发生在控制台初始化之后,那么输出会正常显示。如果控制台初始化尚未完成,则可能无法看到输出。此外,还要检查`CONFIG_USB_DWC3`和`CONFIG_SUPPORT_USBPLUG`等配置宏是否启用,因为这些条件编译指令会影响代码的执行路径。
另外,`puts`和`printf`的区别在于`puts`不处理格式字符串,直接输出字符串,效率更高。在这里使用`puts`是正确的,因为只是输出固定字符串。需要确保该函数所在的代码路径在U-Boot启动过程中被执行,例如通过USB相关的命令或初始化流程。
总结:如果代码被正确编译进U-Boot,且控制台初始化完成,`puts`语句会在初始化USB时输出信息。用户需要确认代码是否被编译,以及执行时机是否正确。</think>在U-Boot启动过程中,`puts("wyc hello world before uboot usb init\n")`这行代码**可以实现终端输出**,但需满足以下条件:
---
### 关键分析步骤
1. **代码执行路径**
- 该代码位于`board_usb_init()`函数内,此函数属于**板级USB初始化**代码。
- 当U-Boot执行到`usb init`命令或相关初始化流程时(例如自动初始化USB子系统),此函数会被调用。
2. **控制台输出条件**
- **串口驱动已初始化**:U-Boot会在早期初始化阶段(如`board_init_f()`)完成串口驱动初始化,早于USB初始化阶段。
- **控制台设备已激活**:需确保`stdout`设备(如串口)已正确配置。
3. **依赖的配置宏**
- `CONFIG_USB_DWC3`:必须启用此宏以编译DWC3 USB控制器代码。
- `CONFIG_SUPPORT_USBPLUG`:若定义,则会额外执行USB控制器的复位操作。
---
### 输出验证方法
1. **确认代码被编译**
检查U-Boot编译时的`config`文件(如`rv1106_defconfig`),确保包含:
```makefile
CONFIG_USB_DWC3=y
CONFIG_USB=y
CONFIG_DM_USB=y
```
2. **观察启动日志**
在U-Boot启动时,若以下条件满足,终端会显示`wyc hello world before uboot usb init`:
- USB初始化流程被触发(例如执行`usb start`命令)。
- 无串口输出丢失问题(如波特率配置正确)。
---
### 代码功能解读
- **硬件操作**:
- `writel(0x01ff0000, 0xff000050)`:向物理地址`0xff000050`写入值`0x01ff0000`,可能是配置USB PHY的工作模式。
- `usb_reset_otg_controller()`:通过CRU(Clock Reset Unit)复位USB OTG控制器,确保硬件状态正确。
- **DWC3初始化**:
```c
dwc3_uboot_init(&dwc3_device_data)
```
初始化DWC3 USB控制器,配置为高速外设模式(`USB_SPEED_HIGH`),基地址`0xffb00000`。
---
### 可能的问题排查
1. **无输出**:
- 检查串口连接和波特率(通常为115200)。
- 确认`board_usb_init()`是否被调用(添加调试语句或单步调试)。
2. **编译问题**:
- 确保代码未被`#ifdef`条件编译排除(如`CONFIG_USB_DWC3`未定义)。
---
### 总结
**该代码可以在U-Boot启动时输出指定内容**,但需确保:
1. USB初始化流程被执行
2. 控制台输出已就绪
3. 相关配置宏已启用
建议通过实际烧录测试验证输出效果。
阅读全文