基于CPLD的USB总线读写控制功能实现(2)

时间:2013-07-01 16:57 来源:发表吧 作者:夏炜 点击:
 
  要实现数据从U盘到PC的单向流动,即禁止数据输出到U盘,有两种实现方式。
 
  方案一:CPLD实时监测USB总线上的数据,当检测到Write(10)命令(其SCSI指令代码为0x2a)或Write(12)命令(其SCSI指令代码为0xaa)时,自动将两根USB差分总线中的一条拉低,从而造成数据差分输出失败,达到禁止输出的目的。
 
  方案二:CPLD实时监测USB总线上的数据,当检测到Modesense命令(其SCSI指令代码为0x1a)时,预示着接下来U盘将向主机传输相应存储介质参数了。在传送的数据串中,有一位标示着该存储设备是否可以被写入。以普通带写保护功能的U盘为例,开启写保护时,检测到的输入参数数据流为23008000……,关掉写保护后,检测到的输入参数数据流为23000000……,以上数据为小端模式,故第三个字节的最高位为写保护信息位,图3是利用BusHound工具抓取的两种U盘在实际应用中的Modesense命令返回参数。若利用USB总线控制器将此位修改为1,则该U盘即不能被写入,但不影响其正常读取,从而实现了我们所需的功能。
 
  图3两种U盘的Modesense命令返回参数
 
  以上两种方式均在硬件平台上成功实现。比较可知,方案一采取简单的破坏数据输出的方式,实现起来相对容易,但输出失败的数据势必会在下次自动重新试传,这样弹出错误窗口会有时间延迟,且对配置稍低的PC机而言,这种延时比较明显;方案二采取修改Modesense返回参数的方式,直接将U盘设定为禁止写入的设备,这样在后续的数据传输时反应较快。考虑到实际使用效果,本设计选取第二种方案,本文也主要介绍基于该方案的实现。
 
  2.2传输过程分析
 
  USB总线采用差分传输方式,USB2.0共有4条线,分别是、D-、D+和GND。当D+、D-为不同电平时,有J、K两种状态;当D+、D-都为低电平时,称之为SE0状态。数据在总线上传输之前,会先进行NRZI编码。因此,在检测总线数据之前,也需进行NRZI解码。
 
  2.2.1包和事务
 
  USB2.0协议规定了四种传输类型,分别是控制传输、同步传输、批量传输和中断传输。数据在USB总线上传输的基本单位是包。不论何种包,都以同步域开始,紧跟着一个8位包标识符PID,最终以包结束符EOP结束。以数据包为例,它由一个同步域开始,紧跟着是PID,后面跟着n个字节的数据,然后是16位CRC校验码,最后是EOP。
 
  图4数据包的结构
 
  一个事务通常由两个或者三个包组成:令牌包、数据包和握手包。令牌包用来启动一个事务,总是由主机发送;数据包用于在主机和设备之间传输数据,传输方向由令牌包来指定;当接收方正确接收数据后,发送握手包。控制传输包括三个过程:建立过程、数据过程和状态过程,其中建立过程和状态过程分别是一个事务,数据过程则可能包含多个事务。
 
  2.2.2仅批量传输
 
  在仅批量传输协议中,规定了数据传输的结构和过程,共分成三个阶段:命令阶段、数据阶段和状态阶段。命令阶段由主机通过批量端点发送一个CBW(命令块封包)的结构,在CBW中定义了要操作的命令以及传输数据的方向和数量。CBW的结构参见文献[4],其中dCBWSignature为CBW的标志,长度为32位,即0x55、0x53、0x42、0x43。当检测到一个包的起始序列为0x55、0x53、0x42、0x43时,即表明该包为CBW;另外,CBW中CBWCB表示需要执行的命令,若为0x1a,即表示Modesense命令。
 
  与CBW类似,命令状态封包CSW的结构参见文献[4],其标志dCSWSignature为0x55、0x53、0x42、0x53。
 
  一次完整的仅批量传输过程如下:
 
  命令阶段令牌包主机发送
 
  数据包(CBW)主机发送
 
  握手包U盘应答
 
  数据阶段令牌包主机发送
 
  数据包(包含写保护信息位)U盘返回
 
  握手包主机应答
 
  状态阶段令牌包主机发送
 
  数据包(CSW)U盘返回
 
  握手包主机应答
 
  2.2.3返回参数的截取及修改
 
  对全速模式的USB2.0传输而言,每个包都由同步域开始,即连续的"00000001"二进制字符串,在数据传输中同步字符串是独特的,因此利用序列检测即可确定每个包的开始时刻。由于同步字节后即为一个字节的PID,同样利用序列检测到的PID即可确定该PID的类型,从而确定该包的作用。当确定该包为主机发送的令牌包后,则对下一个包的起始序列进行检测。若为CBW的起始序列0x55、0x53、0x42、0x43,则表明该包即为CBW。继续检测其第15字节的CBWCB,若为0x1a,即为Modesense命令。在数据阶段的数据包开始后,从PID结束开始的第24位起将两根差分总线全部取反,直至包结束(EOP不能取反)。
 
  2.3VerilogHDL程序模块
 
  利用VerilogHDL编程实现上述功能,首先按模块搭建框图。由于篇幅所限,在此仅给出程序框图,如图5所示。
 
  图5VerilogHDL程序框架

www.fabiaoba.com),是一个专门从事期刊推广期刊发表、投稿辅导、发表期刊的网站。
  本站提供如何投稿辅导、发表期刊,寻求论文刊登合作,快速投稿辅导,投稿辅导格式指导等解决方案:省级论文刊登/国家级论文刊登/ CSSCI核心/医学投稿辅导/职称投稿辅导。

投稿邮箱:fabiaoba365@126.com
 在线咨询: 投稿辅导275774677投稿辅导1003180928
 在线咨询: 投稿辅导610071587投稿辅导1003160816
 联系电话:18796993035

联系方式
李老师QQ:发表吧客服610071587 陈老师QQ:发表吧客服275774677 刘老师QQ:发表吧客服1003160816 张老师QQ:发表吧客服1003180928 联系电话:18796993035 投稿邮箱:fabiaoba365@126.com
期刊鉴别
  • 刊物名称:
  • 检索网站:
热门期刊
发表吧友情提醒

近来发现有些作者论文投稿存在大量剽窃、抄袭行为,“发表吧”对此类存在大量剽窃、抄袭的论文已经停止编辑、推荐。同时我们也提醒您,当您向“发表吧”投稿时请您一定要保证论文的原创性、唯一性,这既是对您自己负责,更是对他人的尊敬。

此类投稿的论文如果发表之后,对您今后的人生和事业将造成很大的麻烦,后果不堪设想,请您一定要慎重,三思而后行。

如因版权问题引起争议或任何其他原因,“发表吧”不承担任何法律责任,侵权法律责任概由剽窃、抄袭者本人承担。

 
QQ在线咨询
论文刊登热线:
137-7525-9981
微信号咨询:
fabiaoba-com

友情链接

申请链接