本教程提供了解决USB设备连接时遇到的“设备描述符读取”错误(代码-62)的具体步骤,帮助用户顺利识别并修复问题。
彻底解决USB错误:`usb 1-1: device descriptor read64, error -62`
### 问题概述
本段落详细分析并提供了解决一个常见于Linux系统中的USB错误——“device descriptor read64, error -62”的方法,该错误通常出现在使用s3c2410或s3c6410芯片组的设备上。此错误表明在读取USB设备描述符时发生了超时问题,并显示为-62(ETIMEOUT)。
### 错误解析
根据提供的日志信息,在插入USB设备后,系统会报告以下错误:
```
usb 1-1: device descriptor read64, error -62
```
此错误代码表示定时器过期。具体而言,这意味着在规定的总线周转时间内未接收到响应包。依据Linux内核文档中的解释,这种类型的超时问题可能被报告为-EPROTO或-EILSEQ。
### 解决方案
要解决这个问题,我们需要深入分析内核源码,并对相关驱动进行调整。以下是逐步解决问题的方法:
#### 分析代码
首先定位到关键文件路径:
- **目录**: `kernel26_hdriversusbhostohci-s3c2410.c`
接下来关注的是`ohci-s3c2410.c`中的`s3c2410_start_hc`函数。此函数的主要作用是在初始化前确保USB寄存器得到适当的高频率设置,之后恢复为标准的48MHz频率。
```c
static void s3c2410_start_hc(struct platform_device *dev, struct usb_hcd *hcd) {
struct s3c2410_hcd_info *info = dev->dev.platform_data;
unsigned long upll_value = (0x38 << 12) | (0x02 << 4) | (0x01);
unsigned long upll_value1 = (0x38 << 12) | (0x02 << 4) | (0x02);
dev_dbg(&dev->dev, s3c2410_start_hc:n);
__raw_writel(upll_value, S3C2410_UPLLCON);
mdelay(20);
__raw_writel(upll_value1, S3C2410_UPLLCON);
mdelay(20);
clk_enable(clk);
mdelay(10);
if (info != NULL) {
info->hcd = hcd;
info->report_oc = s3c2410_hcd_oc;
if (info->enable_oc != NULL) {
(info->enable_oc)(info, 1);
}
}
}
```
#### 修改建议
根据上述分析,可以推测问题可能出在USB主机时钟(48MHz)未能正确启动。因此可以通过以下方式尝试修复:
1. **检查时钟配置**:
- 确保初始化之前设置了正确的时钟频率。
- 使用`__raw_writel`函数设置`S3C2410_UPLLCON`寄存器值。
2. **延时优化**:
- 在更改时钟配置后增加适当的延时(`mdelay`),以确保时钟稳定后再继续执行后续操作。
3. **复审其他初始化步骤**:
- 确认调用了正确的函数来启用时钟。
- 检查端口配置等是否正确完成。
### 实施修改
根据上述分析,在`s3c2410_start_hc`函数中添加额外的日志记录,以便更好地理解问题。例如,可以增加每个关键步骤的状态日志,并确认时钟启用状态。
此外,还可以尝试延长延时时间以确保在继续执行其他操作前时钟已经稳定下来。比如将延时从20毫秒调整到50毫秒或更长。
### 测试验证
完成上述修改后重新编译内核并在目标设备上测试USB功能。如果一切正常,错误-62应该不再出现,并且USB设备可以正常使用。
### 总结
本段落详细分析了Linux系统中“usb 1-1: device descriptor read64, error -62”错误的原因及解决方案,通过仔细检查并修改相关内核驱动代码能够有效解决此类问题。这将有助于提高系统的稳定性和兼容性。