uboot中usb storage启动方法1

本文介绍了通过U-Boot实现从USB启动的过程。首先需要在配置文件中添加USB支持,并使用usbstart及usbboot命令将内核文件加载到内存。然后通过tftp下载内核文件并使用usbwrite命令写入USB存储,最后执行bootm命令完成启动。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


转载自:http://blog.chinaunix.net/uid-22117117-id-2881169.html 

这种方法比较简单,就是利用uboot自带命令usbboot来实现启动,也算是最粗糙的一种。

1.在配置文件中添加一系列有关USB的支持。
uboot编译启动后输入
usb start
usbboot 0x30800000 0:1
这里的0是usb设备0,1是第一分区
当然,这里肯定会失败,因为usb storage中还没有必须的内核文件呢。

2.usbboot是从指定分区的起始位置拷贝内核文件到指定的地址。
因为没有找到合适的拷贝工具,于是使用uboot自带的usb命令进行复制。
先把内核拷贝到内存,再从内存拷贝到usb storage。
tftp 0x30800000 uImage_n35
usb write 0x30800000 0x1f80 0x1000
这里要注意的一点是起始block和blknum都应该是16进制,如果觉得麻烦,可以把do_usbboot中获取参数的simple_stroul改为10进制。

内核文件准备完毕后,最终的启动命令为:
usb start; usbboot 0x30800000 0:1; bootm 0x30800000 //因为usbboot会自动识别分区起始位置的内核头,内核头中指明了内核大小。

<think>好的,用户让我介绍一下分析U-Boot USB驱动代码的内容。首先,我需要确定用户的需求是什么。他可能是在进行嵌入式系统开发,需要了解U-Boot中的USB驱动部分,以便进行定制或调试。或者他可能是在学习Bootloader的相关知识,想要深入理解USB驱动的实现机制。 接下来,我应该考虑用户的背景。如果他是嵌入式开发者,可能已经具备一定的U-Boot和驱动开发基础,需要更深入的代码分析。如果是学生或刚入门的开发者,可能需要先介绍U-Boot的整体结构,再逐步深入到USB驱动的部分。 用户的问题比较广泛,可能需要一个结构化的回答。我应该先介绍U-Boot的整体架构,说明USB驱动在其中的位置,然后分模块详细讲解各个部分,比如控制器驱动、协议栈、设备枚举等。此外,还需要提到分析代码的方法,比如代码位置、配置选项、关键函数和数据结构,以及调试技巧。 需要注意U-Boot的版本差异,不同版本的代码结构可能有所不同,因此要提醒用户注意自己使用的版本。另外,USB协议本身较为复杂,可能需要简要说明相关概念,帮助用户理解代码的逻辑。 还要考虑用户在实际操作中可能遇到的问题,比如如何配置USB驱动,如何调试,常见问题排查等,这些内容可以增强回答的实用性。最后,提供一些参考资料或建议,比如查看官方文档、使用调试工具等,帮助用户进一步研究。 总结下来,回答的结构应该是:U-Boot概述,USB驱动架构,代码分析步骤,关键代码讲解,调试方法,以及总结建议。这样既全面又有条理,能够满足不同层次用户的需求。</think>好的,我将从U-Boot整体架构和USB驱动实现的角度进行分步说明。分析U-Boot USB驱动代码需要关注以下几个关键层面: #### 一、U-Boot整体架构概述 1. **启动流程**:U-Boot的USB驱动初始化发生在`board_init`阶段,通过`initr_usb`函数触发 2. **驱动模型**:采用类似Linux的`device-driver-model`架构,关键数据结构: ```c struct usb_device; // 描述USB设备 struct usb_driver; // 驱动注册结构体 struct usb_interface; // 接口描述 ``` #### 二、USB驱动架构 U-Boot的USB子系统分为三层: ``` Application Layer (e.g. usb storage) ↓ USB Protocol Layer (Mass Storage/HID/etc) ↓ USB Controller Driver (EHCI/OHCI/xHCI) ``` #### 三、代码分析步骤 1. **定位代码位置**: - 控制器驱动:`drivers/usb/host/`(ehci.c, ohci.c等) - 协议层:`drivers/usb/storage/`, `drivers/usb/emul/` - 核心框架:`common/usb.c`, `include/usb.h` 2. **关键配置选项**: ```makefile CONFIG_USB=y CONFIG_USB_EHCI_HCD=y # 启用EHCI控制器 CONFIG_USB_STORAGE=y # 启用大容量存储设备支持 ``` 3. **初始化流程分析**: ```c usb_init() → usb_lowlevel_init() → controller_init() ↓ usb_scan_devices() → usb_get_descriptor() → 设备枚举 ``` #### 四、关键代码解析(以EHCI为例) 1. **控制器操作结构体**: ```c struct ehci_ops { int (*init)(struct ehci_hccr *hccr, struct ehci_hcor *hcor); int (*reset)(struct ehci_ctrl *ctrl); int (*port_reset)(struct ehci_ctrl *ctrl, int port); }; ``` 2. **传输描述符构建**: ```c // 构建QTD(Queue Element Transfer Descriptor) ehci_submit_async(struct ehci_ctrl *ctrl, struct usb_device *dev, unsigned long pipe, void *buffer, int length) ``` 3. **设备枚举关键路径**: ```c usb_setup_device() → usb_get_configuration() → usb_set_configuration() → usb_find_interface_driver() ``` #### 五、调试技巧 1. **开启调试输出**: ```c #define DEBUG // 或通过环境变量 setenv usb_debug 1 ``` 2. **关键调试宏**: ```c USB_PRINTF(...) // 输出USB协议交互信息 EHCI_DUMP_REGS() // 寄存器状态打印 ``` 3. **常见问题定位**: - 设备无法识别:检查描述符解析代码(`usb_get_descriptor`) - 传输超时:检查TD处理状态(`qh->overlay.status`) - DMA错误:验证物理地址映射(`virt_to_phys()`) #### 六、与Linux驱动对比 | 特性 | U-Boot实现 | Linux实现 | |---------------------|---------------------|-------------------------| | 中断处理 | 轮询方式 | 中断驱动 | | DMA支持 | 有限支持 | 完整DMA映射机制 | | 电源管理 | 无 | 完整PM框架 | | 设备树支持 | 基础支持 | 完整OF解析 | #### 七、演进趋势 1. **向Linux驱动靠拢**:最新版本开始引入类似`usb_core.c`的统一核心层 2. **USB 3.0支持**:逐步增加xHCI控制器驱动(`drivers/usb/host/xhci.c`) 3. **USB PD协议**:新增`drivers/usb/pd/`目录支持供电协议 建议分析时结合具体硬件平台(如i.MX6的USB IP核),通过`git grep`命令追踪控制器的寄存器操作流程,同时配合USB协议分析工具(如Bus Hound)进行行为验证。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值