为什么某些硬件无法检测某些USB海量存储设备?

问题描述:

我正在尝试使用复合usb框架来修改大容量存储驱动程序,以允许嵌入式大容量存储设备在我的Xbox 360上可见。我已经确认这不是一个简单的VendorID/ProductID块。为什么某些硬件无法检测某些USB海量存储设备?

我想了解什么特别是阻止某些设备,比如说Xbox 360,看到某些大容量存储设备。尽管我的问题是针对Xbox的,但一个通用的答案解释了为什么设备无法看到某些类型的大容量存储,也是可以接受的。

我从我自己的闪存设备中发现,那些不工作的只有那些只有2个终端定义的(Bulk IN,Bulk OUT)。而包含3个端点(Bulk IN,Bulk OUT,Interrupt IN)的所有大容量存储设备都已运行。这是相关的观察还是巧合?

大容量存储设备可能无法在给定主机上工作有两个原因。

最简单的原因是供应商和产品ID块。某些软件(如iTunes)会阻止设备根据所提供的供应商和产品ID进行同步。这是一种非常基本的预防措施,很容易被欺骗的供应商/产品ID绕过。

对于Xbox 360而言,原因是Xbox 360 SCSI实现和USB设备驱动程序实现的结合。 USB Mass Storage规范包含一个称为命令块包装的结构,该结构包含一个成员bCBWCBLength,它声明了要执行的命令块的长度。根据规范,这可以合法地包含从1到16的值。

虽然命令块的长度可合法地从1到16,但传统的CDB长度为6,10,12或16个字节 - 长度因命令而异。例如,TEST UNIT READY命令是6个字节,而MODE SENSE有6个字节和10个字节版本。

Xbox 360恰巧发送某些命令,如TEST UNIT READY为10个字节而不是6个。对于带有较旧驱动程序的USB设备(如Palm Pre和Android),这可能会导致问题,因为驱动程序不知道如何处理这些奇怪大小的CDB。

最终,问题是设备端的驱动程序处理不良和主机端的奇怪SCSI实现混合在一起。除非您是Microsoft,否则修复方法是修改您的大容量存储驱动程序以处理奇怪大小的CBW长度字段。

关于仅批量与批量中断端点的观察仅仅是巧合,与问题,解决方案或其中任何内容无关。