基于CPLD/FPGA的USB讀寫(xiě)控制器
可以看出,當令牌包是OUT包(PID為8'hE1)或SETUP包(PID為8'h2D)時(shí),數據包由主機發(fā)往設備,握手包由設備返回給主機;如果令牌包是IN包(PID為8'h69)時(shí),則數據包由設備發(fā)給主機,握手包由主機返回給設備。在全速模式下,只可能有4種令牌包,除了這3種包外就只可能是SOF包,而該包沒(méi)有后續的數據包和握手包,因此狀態(tài)機仍為初始狀態(tài)。如果一次傳輸事務(wù)出錯,沒(méi)有數據包或握手包,則主機和設備會(huì )通過(guò)超時(shí)來(lái)判斷是否出錯,而不會(huì )持續等待。在CPLD中,超時(shí)信號和系統復位信號相與之后作為本模塊的復位信號。
2.2 CBW包識別和數據流控制模塊
USB Mass Storage Device在完成枚舉之后就進(jìn)入到僅批量傳輸模式。在僅批量傳輸協(xié)議中數據傳輸分為命令、數據和狀態(tài)3個(gè)階段。主機發(fā)送的命令被封裝成CBW(Command Block Wrapper)包在命令階段發(fā)送,以定義要操作的命令以及要傳輸的數據方向和長(cháng)度。CBW的前4個(gè)字節是標志位,第15個(gè)字節是操作代碼。
在本設計中,借助序列識別的思想識別出寫(xiě)命令的CBW,并在接下來(lái)的數據階段將標志位CBW_flag置位為0,使數據流控制模塊截斷從主機發(fā)往設備的數據包。下面為狀態(tài)機的部分代碼:
可以看出,只有在檢測到CBW包中的寫(xiě)命令(操作代碼是8h2A和8hAA)時(shí)才將CBW_flg置0,其余狀態(tài)都為1。
數據流控制模塊完成的工作比較簡(jiǎn)單,主要有3個(gè):
①在系統復位有效或失效時(shí)控制轉發(fā)器模擬拔下或插入的過(guò)程;
②根據當前的傳輸方向提取總線(xiàn)數據以供分析;
③cbw_flg無(wú)效時(shí),將上游端口的VP和VM直接賦值給下游端口的VP0
和VM0,同樣將下游端口的VP和VM賦給上游端口的VP0和VM0,否則將上游端口的VM強制置0,使傳輸過(guò)程失敗以阻止數據從主機向普通存儲設備傳送數據。
評論