1

我目前正在为我的操作系统组装笔式驱动器编写 USB(EHCI)驱动程序。我可以成功获取设备、字符串、配置(接口和端点)描述符。但是,SCSI 查询和其他命令失败。这就是我所做的(在 getMaxLUN 之后):

  1. 设置配置(1)
  2. 询问

另一种方式:

  1. 设置配置(1)
  2. 测试单元就绪
  3. 请求感知
  4. 测试单元就绪

我在 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:这一定是由于指针不正确。我认为它解决了。

4

0 回答 0