我目前正在为我的操作系统组装笔式驱动器编写 USB(EHCI)驱动程序。我可以成功获取设备、字符串、配置(接口和端点)描述符。但是,SCSI 查询和其他命令失败。这就是我所做的(在 getMaxLUN 之后):
- 设置配置(1)
- 询问
另一种方式:
- 设置配置(1)
- 测试单元就绪
- 请求感知
- 测试单元就绪
我在 QueueHead(BulkIn 或 BulkOut)和设备地址中正确设置了 EndPt。我正在通过“BD Lunt - USB:通用串行总线”一书实现USB驱动程序。如果我发送查询,这就是我得到的(返回缓冲区,36 字节,十六进制):
01 00 00 00 01 00 00 00 80 0D 24 00
40 15 16 00 00 20 16 00 00 30 16 00
00 40 16 00 00 50 16 00 00 00 00 00
第 11 个字节为 0x24,即返回数据的长度(36)。这看起来很垃圾或错误消息。
如果我发送 TestUnitReady,则 RequestSense 返回(18 字节,十六进制):
01 00 00 00 01 00 00 00 80 0D 12 00
C0 16 16 00 00 20
第 11 个字节为 0x12,即返回数据的长度(18)。两个返回缓冲区的内容是相似的。Inquiry 和 TestUnitReady 的 CBW 看起来不错(我使用 LUN=0)。SCSI-spec-4 说明逻辑单元不正确,如果结果不是预期的,但我只有 LUN 0。
我正在使用 Sony 4GB pendrive 进行测试。查询应该立即工作(在缓冲区中返回正确的数据),不管它之后的 CSW,我不明白问题可能是什么。我正在尝试使用 BulkReset 和 Clear_Feature(用于 BulkIn 和 BulkOut),但这似乎并不能解决查询。TestUnitReady 的 CSW 返回 Status=01,但在 BulkReset 和 ClearFeature 之后它返回 Status=0(成功)。
缓冲区中数据不正确的原因是什么?任何帮助表示赞赏。
编辑:我也尝试过延迟(发送 CBW 前 100 毫秒,获取 CSW)。它没有帮助。
EDIT2:在 SetConfiguration(1) 之后立即调用 GetConfiguration(),正确返回 1。
EDIT3:这一定是由于指针不正确。我认为它解决了。