uboot 下 usb 的两个问题 EHCI timed out on TD - token

本文档介绍了在UBoot环境下遇到的两个问题:一是某些品牌U盘无法被扫描到,二是加载大文件时出现超时。针对第一个问题,通过设置环境变量`usb_pgood_delay`增加延时解决了设备识别问题。对于第二个问题,通过调整`usb_max_blk`环境变量或源代码中USB传输的块数量限制,以适应不同大小的文件传输,避免了超时错误。

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

1、在uboot 下 扫描不到某些品牌的U盘,有的U盘可以扫到

参考 uboot 代码 :common/usb_hub.c  函数  usb_hub_power_on 中有一段代码,

意思是有些USB设备,并没有按照标准的spec来做,或者是和spec有些出入,这个时候需要加一个延时。

解决办法:uboot 下加一个环境变量:

setenv usb_pgood_delay 1000

经过实际测试,这个U盘,需要至少800ms的延时,才可以识别到,这里保险起见,设置了1000ms

 另外一种偶发出现的现象,scan的时候 timeout

 这种问题的出现,可能是因为 usb 每次传输的数据size 过大导致的。

第二章的问题是一样的。

cmd/usb.c 
	usb reset =  stop + start
	usb start ->
			->do_usb_start
				->usb_stor_scan    common/usb_storage.c
						->usb_stor_probe_device
								-> usb_storage_probe
									-> usb_stor_set_max_xfer_blk

2、在uboot 加载U盘里的文件,大文件10M,出现timeout, 加载识别

=> fatload usb 0 $loadaddr bootfw-som0002-g2021-12-13-a6b140f-dirty.bin
EHCI timed out on TD - token=0xa8008d80

在uboot2018 ,上做改动,usb 传输的块数量,默认是65535,  这里需要调整一下,也可以通过 环境变量来动态修改。

diff --git a/common/usb_storage.c b/common/usb_storage.c
index 9cd6474..c7e8c8f 100644
--- a/common/usb_storage.c
+++ b/common/usb_storage.c
@@ -71,6 +71,8 @@ static int usb_max_devs; /* number of highest available usb device */
 static struct blk_desc usb_dev_desc[USB_MAX_STOR_DEV];
 #endif
 
+#define USB_MAX_XFER_BLK 2000
+
 struct us_data;
 typedef int (*trans_cmnd)(struct scsi_cmd *cb, struct us_data *data);
 typedef int (*trans_reset)(struct us_data *data);
@@ -952,7 +954,7 @@ static void usb_stor_set_max_xfer_blk(struct usb_device *udev,
         * there is enough free heap space left, but the SCSI READ(10) and
         * WRITE(10) commands are limited to 65535 blocks.
         */
-       blk = USHRT_MAX;
+       blk = env_get_ulong("usb_max_blk", 10, USB_MAX_XFER_BLK);
 #else
        blk = 20;
 #endif
@@ -1171,11 +1173,12 @@ static unsigned long usb_stor_read(struct blk_desc *block_dev, lbaint_t blknr,
                /* XXX need some comment here */
                retry = 2;
                srb->pdata = (unsigned char *)buf_addr;
+retry_it:
                if (blks > ss->max_xfer_blk)
                        smallblks = ss->max_xfer_blk;
                else
                        smallblks = (unsigned short) blks;
-retry_it:
+
                if (smallblks == ss->max_xfer_blk)
                        usb_show_progress();
                srb->datalen = block_dev->blksz * smallblks;
@@ -1183,6 +1186,27 @@ retry_it:
                if (usb_read_10(srb, ss, start, smallblks)) {
                        debug("Read ERROR\n");
                        usb_request_sense(srb, ss);
+                       if (smallblks > 2047) { /* Dynamically reduce the I/O size. */
+                          ss->max_xfer_blk = 2047;
+                          debug("step down usb_max_xfer_blk to %d\n", ss->max_xfer_blk);
+                           ++retry;
+                       }
+                       else if (smallblks > 512) {
+                          ss->max_xfer_blk = 512;
+                          debug("step down usb_max_xfer_blk to %d\n", ss->max_xfer_blk);
+                          ++retry;
+                       }
+                       else if (smallblks > 511) {
+                          ss->max_xfer_blk = 511;
+                          debug("step down usb_max_xfer_blk to %d\n", ss->max_xfer_blk);
+                          ++retry;
+                       }
+                       else if (smallblks > 63) {
+                          ss->max_xfer_blk = 63;
+                          debug("step down usb_max_xfer_blk to %d\n", ss->max_xfer_blk);
+                          retry += 2;
+                       }
+
                        if (retry--)
                                goto retry_it;
                        blkcnt -= blks;
setenv usb_max_blk 2000

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值