uboot之u盘枚举

              UBOOT U盘枚举

简单的说下U盘的枚举过程,一下是我的U盘的枚举截图

 

 

在接口描述符,09 04 00 00 03 08 06 50 00,其后为三个端点描述符

030端点的数目 两个批量传输 一个interrupt

08 接口所使用的类为mass storage

06 子类为SCSI命令集

50 协议为批量传输

接着与U盘有关的就是从GET MAX LUN开始,返回长度为0001

a1 fe 00 00 00 00 01 00返回的00表示有1块逻辑块

接下来显示的是批量传输协议的数据流模型(封装UFI

需要明白CBWCSW结构,这里就不详细介绍,简单说明

0x43425355 CBWCSW的标志

0x85ca3cd8为主机分配的CBW签名,CSW返回也需要此值

0x00000024为请求的长度,36字节

80 D7表示传输数据方向 1IN 0OUT

00 低四位表示使用LUN

06 低五位表示返回的CBWCB长度 不足16字节补0

后面的16字节根据选择的子类(这里是SCSI命令集,实际上使用UFI

CSW就不分析了,总体而言,就是UFI命令被CBW封装,解析UFI之后,返回对应数据,最后以CSW(最后一个字节00表示传输成功)结束一次批量数据传输。

UFIUSB Floppy Interface)命令集介绍

(1)    INQUIRY 查询U盘信息

发送:

12 00 00 00 24 00 00 00 00 …

12 UFI INQUIRY操作码

00 D7~D5 逻辑单元号,0

24 为返回的数据分配的存储空间长度 36字节(前面请求的最大长度也不能超过36字节)

返回的数据具体看文档

内容包括外设类型,存储介质是否可移除,厂商信息,产品信息,产品版本信息(1.00 信息均为ACSII

(2)    READ FORMAT CAPACITIES 读取可格式化容量

发送: 23 00 00 …00 fc 00…

23 read format capacities 主机读取可能的格式化容量的列表

00fc  分配的缓冲区长度252

返回的数据:

00 00 00 08 00 1e bf fe 02 00 02 00

08 表示容量列表的长度

001ebffe 高字节在前 表示块数

02 描述符代码

000200 高字节在前 每块字节数512字节

容量=块数*每块字节数

(3)    READ CAPACITY 读取可用的最大容量

发送:25 00 …

25 操作码 读取可用容量

返回: 00 1e bf fe 00 00 02 00

001ebffe 最后逻辑块地址

(与可格式化容量一样表示没有其他块用作他用)

00000200 块大小 512字节

(4)    READ(10)

28 00 …01.

28 READ(10)操作码 逻辑块的地址为00000000 01为传输长度

就是读取以逻辑地址为起始地址,长度为1的块的内容

返回: 对应块的内容

(5)    WRITE(10)

命令和(4)类似,略,操作码为0x2A

(6)    REQUEST SENSE 用于探测上一个命令执行失败的原因

(7)    TEST UNIT READY 用来检测设备的某个逻辑单元是否准备好

对于U盘的操作,就是基于这些UFI来进行的。

 

<think>好的,用户现在想知道如何在RK平台的uboot中实现U升级。根据之前的对话历史,用户已经了解过RK平台通过U升级的几种方法,比如Recovery模式、Loader模式和MaskRom模式。现在他们的问题更底层,涉及uboot阶段的U升级,这可能是因为他们的设备无法进入正常系统,只能停留在uboot阶段,或者需要定制升级流程。 首先,我需要回顾用户提供的参考资料。引用[1]提到在uboot命令行中通过U升级kernel,因为OTG口不可用,也没有SD卡,只能通过USB2.0口和串口操作。这显示用户可能遇到硬件限制,需要uboot级别的解决方案。引用[2]则讨论了在Linux系统下,将uboot的手动升级过程封装成命令,并修改bootcmd实现自动升级。这可能是用户需要的核心方法。引用[3]介绍了RK3568平台的uboot启动流程,涉及到SPL、uboot阶段划分,这可能对理解uboot的启动过程有帮助。引用[4]提到Recovery模式下U升级的sepolicy配置,但用户现在关注的是uboot阶段,所以这部分可能暂时用不上。 用户的需求是具体的实现步骤,可能包括如何编译支持Uuboot、如何添加自定义命令、如何修改启动流程等。需要结合RK平台的SDK和uboot的代码结构来解释。例如,需要确认uboot是否支持USB驱动,如何挂载U,如何读取固件文件,以及如何写入到存储介质中。 另外,用户提到的RK平台可能指的是RK3568或其他类似型号,需要注意不同型号的差异。例如,RK3568的uboot启动流程可能与其他型号有所不同,需要参考对应的开发文档。 接下来,我需要整理实现步骤。首先,确保uboot支持USB主机模式和存储设备驱动,可能需要配置相关的Kconfig选项。然后,编写或利用现有的升级命令,比如usb_update,或者参考引用[2]中的usbupdate命令,将升级过程封装成一个uboot命令。接着,修改bootcmd,在启动内核前执行升级命令,这样每次启动都会检查U中的固件并进行升级。这需要修改环境变量,可能使用setenv和saveenv命令。 还需要考虑升级的具体操作,比如从U读取镜像文件,写入到eMMC或Flash的指定分区。可能需要使用uboot中的文件系统支持(如FAT)来读取U中的文件,以及使用mmc write或nand write等命令来写入存储设备。 此外,用户可能需要了解如何调试这一过程,比如通过串口输出查看错误信息,或者如何处理可能的失败情况,比如U无法识别、文件系统不支持、镜像损坏等。安全措施也很重要,比如验证镜像的完整性,防止写入错误导致设备变砖。 最后,用户可能需要示例代码或具体的命令序列,比如在uboot命令行中手动执行挂载U、加载文件、写入分区的步骤,以及如何将这些步骤自动化。同时,引用之前的参考资料,如引用[1]和[2],来支持这些步骤的可行性。 总结来说,回答需要分步骤说明uboot中实现U升级的方法,涵盖环境准备、驱动支持、命令添加、启动流程修改、具体操作命令和注意事项。同时,结合用户提供的引用资料,特别是引用[1]和[2],来确保回答的准确性和相关性。</think>根据RK平台开发经验和相关技术文档,在U-Boot中实现U升级可通过以下步骤完成: ### 一、基础环境准备 1. **编译支持USB功能的U-Boot** 在RK平台SDK中,确保配置选项包含: ```makefile CONFIG_USB=y CONFIG_USB_STORAGE=y CONFIG_CMD_USB=y CONFIG_FS_FAT=y # 支持FAT文件系统[^3] ``` 通过`make menuconfig`验证: ``` Device Drivers → USB Support → Enable USB Host Controller ``` 2. **U格式要求** - 使用FAT32格式 - 镜像文件必须存放在根目录(如`kernel.img`) ### 二、U-Boot命令行升级实现 1. **手动升级流程** 在U-Boot命令行执行: ```bash # 扫描USB设备 usb start # 挂载U第一个分区 fatload usb 0:1 ${loadaddr} kernel.img # 写入eMMC的kernel分区(假设kernel分区起始块为0x8000) mmc write ${loadaddr} 0x8000 0x2000 # 引用[1] ``` 2. **自动化脚本集成** 创建自定义命令`usbupdate`(需修改U-Boot源码): ```c // 在cmd目录下添加usbupdate.c U_BOOT_CMD( usbupdate, 1, 1, do_usbupdate, "Update firmware from USB", "" ); ``` 在`do_usbupdate()`函数中实现上述手动流程的自动化逻辑[^2] ### 三、启动流程改造 1. **修改bootcmd环境变量** 通过串口或脚本修改启动顺序: ```bash setenv bootcmd 'usbupdate; run boot_normal' # 先执行升级再启动系统[^2] saveenv ``` 2. **安全校验机制** 建议增加镜像校验(以CRC32为例): ```bash crc32 ${loadaddr} ${filesize} if test $? -ne 0; then echo "CRC check failed!"; exit; fi ``` ### 四、特殊场景处理 1. **双存储设备支持** 对于RK3568等支持EMMC/NOR双存储的平台,需指定存储介质: ```bash mmc dev 1 # 切换到EMMC设备 mmc part # 确认分区信息[^3] ``` 2. **内核镜像加载异常处理** 若遇到镜像加载失败,可通过以下命令调试: ```bash usb reset # 重置USB控制器 fatinfo usb 0 # 查看U文件系统信息 ``` **注意事项**: 1. 升级前必须确认目标分区的起始块地址,错误写入会导致系统崩溃 2. 建议在U-Boot中添加`CONFIG_CMD_BOOTMENU`实现交互式升级菜单 3. 对于OTG口不可用的情况,需确保USB Host控制器已正确初始化[^1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值