USB作为主机SCSI READ命令的数据传输问题

时间:2016-03-26 21:39:26

标签: embedded usb scsi

我正在使用OHCI实现USB作为主机。并使用SCSI读取大容量存储设备。 我的所有控件传输都成功运行。我已经使用Control Transfers完成了所有初始化,但是我遇到了数据传输问题。

我在SCSI中成功实现READ命令时遇到麻烦,无论是READ(6),READ(10)等。

以下是Command Block Wrapper(CBW)的快照 - enter image description here

突出显示的部分是SCSI命令。

正如您所看到的,我已经请求了512个字节 - 这是我的大容量存储设备的1 LBA大小。

以下是来自设备的512字节缓冲区的内容 - enter image description here

FYI-缓冲区初始化为0xff 这些512字节不存在于我的大容量存储设备上。我在HXD上打开了大容量存储设备并检查了字节,看到我收到的块在我的海量存储器中不存在!

我得到的命令状态包装器(CSW)如下 - enter image description here

CSW中的最后一个字节是0x01,这意味着命令失败。 我有3个问题 1-这个READ失败的原因是什么?我是否应该出于任何原因在此之前运行任何其他SCSI命令? 2-我请求512字节,我甚至得到了,但CSW中显示残差的字节8-11仍显示某个值a恰好大于512(因为这是小端格式)。这怎么可能? 3-我从设备收到的512字节可能是什么?

对此有任何帮助我已经被困在这里一段时间了,而且我没有USB分析仪。

数据传输的伪代码 - 设置端点描述符(ED)1(指示OUT端点) 设置传输描述符(TD)1(发送SCSI命令)

将BulkHead ED设置为ED 1 开始描述符处理 然后 停止它

设置端点描述符(ED)1(指示IN端点) 设置传输描述符(TD)1(读取512字节) 设置传输描述符(TD)2(读取13个CSW字节)

将BulkHead ED设置为ED 1 开始描述符处理 然后 停止它

1 个答案:

答案 0 :(得分:1)

  

我的大容量存储设备上的任何地方都没有这512个字节。

不,这对我来说非常像一个有效的部门0

您可能会错过的是Windows不允许非管理员用户查看此扇区。因此,HXD显示分区的第一个扇区,即扇区256*512。您只会在管理员权限和打开相应的物理磁盘时看到此信息。

  

我请求512字节,我甚至得到了,但CSW中显示残差的字节8-11仍显示某个值a恰好大于512

不,您请求override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 个字节。这些SCSI长度字段的字节顺序是AFAIK big endian。