我的产品基本上是基于恩智浦LPC18xx微控制器的USB闪存驱动器。我使用制造商提供的库(LPCOpen)处理USB MSC和SD卡介质(我存储数据的地方)。
问题在于:LPC18xx内部有一个64kB(受硬件限制)缓冲区,用于缓存读/写,这意味着它只能缓存多达128个块(512B)的内存。 SCSI Write-10命令有一个总块字段,最多可以有256个块(128kB)。最初在Windows 7上测试产品时,它一次不会写入超过128个块,但在Linux上进行测试时,它有时会写入超过128个块,这会导致微控制器崩溃。
有没有办法告诉主机操作系统不要求超过128个块?我看到读取块限制命令(05h)的参考文献[1],但它似乎并没有被广泛支持。另外,我会在Write-10命令上返回什么意义,以告诉Linux写入太大?我还在一些设备规格表中看到了对块限制VPD页面的引用,但是找不到很多关于它如何实现的文档。
答案 0 :(得分:3)
让我先提供免责声明,这是你应该做的,但这一切都不行。粗略搜索Linux SCSI驱动程序并没有向我展示我想要看到的内容。所以,我完全不确定"做正确的事情"会得到你想要的结果。
按照本书的说法,您必须做两件事:实施Block Limits VPD并在WRITE AND READ中处理过大的传输大小。
首先,实现Block Limits VPD页面,您可以在互联网上的SBC-3后期版本中找到它(如下所示:http://www.13thmonkey.org/documentation/SCSI/sbc3r25.pdf)。它可能值得去t10.org网站,注册,然后下载最后一个版本(http://www.t10.org/cgi-bin/ac.pl?t=f&f=sbc3r36.pdf)。
块限制VPD页面具有最大传输长度字段,该字段指定所有READ和WRITE命令可以传输的最大块数,以及基本上任何读取或写入数据的块。当然,实现此页面的缺点是你必须确保你返回的所有其他字段都是正确的!
其次,当处理READ和WRITE时,如果命令的传输长度超过最大值,则使用ILLEGAL REQUEST键进行响应,并将附加检测码设置为INVALID FIELD IN CDB。此行为由描述块限制VPD的部分中的表格指示,但仅在SBC-3的后期版本中显示(我看35h)。
你可能只是从返回INVALID FIELD IN CDB开始,因为它是最简单的行动方案。看看这还不够吗?