在线客服系统

期刊库

教育   经济   科技   财会   管理   
医学   法学   文史   工业   建筑   
农学   水利   计算机   更多>>
 首 页    论文大全   论文精品    学术答疑    论文检测    出书咨询    服务流程    诚信通道    关于我们 

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

人气指数: 发布时间:2013-07-01 16:58  来源:http://www.zgqkk.com  作者: 夏炜
分享到:

 

 
  要实现数据从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程序框架
 
  3测试

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


  【免责声明】本文仅代表作者本人观点,与投稿辅导_期刊发表_中国期刊库专业期刊网站无关。投稿辅导_期刊发表_中国期刊库专业期刊网站站对文中陈述、观点判断保持中立,不对所包含内容的准确性、可靠性或完整性提供任何明示或暗示的保证。请读者仅作参考,并请自行承担全部责任。

 
QQ在线咨询
投稿辅导热线:
180-1501-6272
微信号咨询:
fabiaoba-com
咨询电话:18015016272 投稿邮箱:zgqkk365#126.com(#换成@)
本站郑重声明:文章只代表作者观点, 并不意味着本站认同。所载文章、数据仅供参考,使用前请核实,风险自负。
部分作品系转载,版权归原作者或相应的机构   若某篇作品侵犯您的权利,请来信告知.版权:周口博闻教育咨询有限公司 
Copyright © 2005-2023 . 期刊库 版权所有