我目前正在为我的操作系统中的pendrives编写USB(EHCI)驱动程序。 我可以成功获得Device-,String-,Configuration(接口和端点)-descriptors。 但是,SCSI查询和其他commnads失败。 这就是我所做的(在getMaxLUN之后):
另一种方式:
我在QueueHead(BulkIn或BulkOut)和设备地址中正确设置了EndPt。 我正在通过“B. D. 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)。 两个返回的缓冲区的内容类似。查询和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之前100ms,获得CSW)。 它没有帮助。
EDIT2:在SetConfiguration(1)之后调用GetConfiguration(),正确返回1.
EDIT3:这必须是由于指针不正确。我认为它已经解决了。