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

时间:2010-09-02 07:42:42

标签: linux usb linux-device-driver usb-flash-drive

我正在尝试使用复合usb框架修改大容量存储驱动程序,以允许嵌入式大容量存储设备在我的Xbox 360上可见。我已经确认这不是一个简单的VendorID / ProductID块。

我想了解具体阻止某些设备(例如Xbox 360)看到某些大容量存储设备的原因。虽然我的问题是针对Xbox的,但通用答案解释了为什么设备无法看到某些类型的大容量存储,也是可以接受的。

我观察到,在我拥有的闪存设备中,那些不起作用的设备是那些只定义了2个端点的设备(Bulk IN,Bulk OUT)。而所有包含3个端点(批量输入,批量输出,中断输入)的大容量存储设备都有效。这是一个相关的观察或巧合吗?

1 个答案:

答案 0 :(得分:2)

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

最简单的原因是供应商和产品ID块。某些软件(如iTunes)会阻止设备根据显示的供应商和产品ID进行同步。这是一个非常基本的预防措施,可以通过欺骗供应商/产品ID轻松绕过。

特别是对于Xbox 360,原因是Xbox 360 SCSI实现和USB设备驱动程序实现的结合。 USB Mass Storage规范包含一个名为Command Block Wrapper的结构,该结构包含一个成员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长度字段。

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