關鍵詞:USB CBI 大容量存儲設備
引言
USB是英文Universal Serial Bus的縮寫,中文含義是“通用串行總線”。它不是一種新的總線標準,而是應用在PC領域的新型接口技術,具有使用方便、速度較快、連接靈活、獨立供電等特點。1998年后,隨著微軟在Windows 98中內置了對USB接口的支持模塊,加上USB設備的日漸增多,USB逐步走進了實用階段,USB協(xié)議已經發(fā)展到2.0版本,最高速度可達480Mb/s。目前,廣泛使用的1.1版本也可達12Mb/s。
USB協(xié)議中,對USB設備按類型進行分類。同類型的設備擁有一些共同的行為特征和工作協(xié)議,這樣可以屏蔽不同硬件之間的差別,以便于主機(PC)對設備進行方便、統(tǒng)一的管理。對USB大容量存儲設備(mass storage device)的設計,國際有關機構定義了兩種基本傳輸方式:CBI和BULK ONLY,并對各自開發(fā)過程中應注意的問題進行了規(guī)定,開發(fā)者必須遵循其中至少一種。
一、CBI結構要點
在CBI(Control/Bulk/Interrupt)結構中,要用到USB協(xié)議中說到的控制(Control)、批量輸入/輸出(Bulk in/out)、中斷(Interrupt)四種端點(Endpoint)??刂贫它c用來在主機和設備間傳送USB標準命令和對硬盤的控制命令集;批量輸入/輸出端點用來傳輸數據;可選用的中斷端點用來通知命令的完成。
1.數據傳輸的說明
主機和CBI存儲設備間的通訊通過命令/數據/狀態(tài)的傳輸來實現,就是說,協(xié)議從主機向設備傳送命令,在主機和設備間相互傳送數據,從設備向主機傳送命令執(zhí)行狀態(tài),并允許主機對設備進行重啟。USB大容量存儲設備應可接收2類重啟命令和3類命令塊(command block)。2類重啟命令是:USB端口重啟和命令重啟;3類命令塊是:非數據(nondata)、數據輸入(data-in)和數據輸出(data- out)。本文只對各類命令中和CBI存儲設備設計相關的加以說明,其余屬于普通USB總線傳輸的內容可參考USB協(xié)議。
(1)USB端口重啟
通常用在設備死機等情況。通過主機USB端口強制設備重啟,詳細情況可參見USB協(xié)議。
(2)命令重啟
在使用端口重啟之前,主機也可以通過發(fā)送重啟命令來使設備重啟。在接收到該命令后,設備將依次執(zhí)行如下動作:
a.嘗試從正在執(zhí)行的命令或數據傳輸中退出;
b.清除等待執(zhí)行的其它命令;
c.清除設備緩沖區(qū)的數據;
d.按照設備所使用的子類相應協(xié)議執(zhí)行重啟,例如執(zhí)行自檢測、對設備進行初始化并恢復到缺省狀態(tài)。
(3)非數據命令傳輸的總線管理和與之相關的設備初始化等功能,詳細情況可參見USB協(xié)議。
b.類相關命令。采用CBI結構的存儲設備應該在控制端點上支持的USB類相關命令為:Accept Device-Specific Command(ADSC)。由ADSC從主機向設備傳送命令塊。ADSC命令的起始包由表1所示8個字節(jié)組成。
表1 ADSC起始包結構
字 節(jié) | 命 名 | 大 小 | 值 | 說 明 |
0 | bmRequestType | Byte | 21h | 指明為USB類相關命令 |
1 | bRequest | Byte | 00h | 指明為ADSC命令 |
2 | (LSB) wValue (MSB) |
Word | 00h | 保留 |
3 | 00h | |||
4 | (LSB) wIndex (MSB) |
Word | ??h | bInterfaceNumber指明設備用哪個端口接收命令 |
5 | 00h | 保留 | ||
6 | (LSB) wLength (MSB) |
Word | ????h | 指明每次傳送命令時的數據大小 |
7 |
需要注意的是,wLength的值由所設計的存儲設備所屬的子類決定,這可以在接口描述字中的bInterfaceSubClass域設置。WLength 設置好之后,每次傳輸命令數據時就必須嚴格按照這個值進行。如果不等,設備就將認為此次傳輸失敗并向主機發(fā)回相應提示,而且CBI結構的大容量存儲設備每次只能接收1個命令塊。在主機端,應該把將要傳輸的命令以隊列形式排好便于傳送。下面是個ADSC命令的舉例:
1 SOF(xA5)
2 SETUP(xB4) ADDR(x7F) ENDP(x0)
3 DATA0(xC3)DATA(x21 00 00:00 00:00 0C:00)
4 ACK(x4B)
5 SOF(xA5)
6 OUT(x87)ADDR(x7F)ENDP(x0)
7 DATA1(xD2) DATA(x 2A 00 00:01:23:45 00 00:)
8 NAK(x5A)
9 SOF(xA5)
10 OUT(x87) ADDR(x7F) ENDP(x0)
11 DATA1(xD2) DATA(x 2A 00 00:01:23:45 00 00:)
12 ACK(x4B)
13 SOF(xA5)
14 DATA0(xC3) DATA(x 00 00 00:00)
15 NAK(x5A)
16 SOF(xA5)
17 OUT(x87) ADDR(x7F) ENDP(x0)
18 DATA0(xC3) DATA(x 00 00 00:00)
19 ACK(x4B)
20 SOF(xA5)
21 IN(x96) ADDR(x7F) ENDP(x0)
22 NAK(x5A)
23 SOF(xA5)
24 IN(x96) ADDR(x7F) ENDP(x0)
25 DATA1(xD2) DATA ( )
26 ACK(x4B)
(4)數據輸入和數據輸出
主機和存儲設備之間交換數據時所用。當主機通過控制端點發(fā)出數據輸入或數據輸出命令并向設備批量輸入端點或發(fā)出IN PID或OUT PID后,設備開始向主機輸出數據或從主機輸入數據直至達到主機要求的量為止。
2.CBI存儲設備相關描述字設置
按照USB協(xié)議,每一個USB設備都有一個或多個配置,每個配置對應相應設備的一項功能。配置是口的集合,通過接口指定設備如何進行USB總線互聯(lián),而接口又是一系列端點的集合。從設備到端口都有相應的描述字進行設備,對它們的一般信息進行說明。
CBI結構存儲設備應該支持下列USB描述字:
a.設備描述字(device descriptor)。
b.配置描述字(configuration descriptor)。
c.接口描述字(interface descriptor)。CBI存儲設備至少應支持一個數據接口。
d.端點描述字(endpoint descriptor)。除用作初始化和命令傳輸的控制端口Endpoint 0外、CBI存儲設備還應該支持批量輸入、批量輸出、中斷三種端點。
(1)設備描述字和配置描述字
有關這兩類描述字的結構和含義在USB協(xié)議有關這兩類描述字的結構和含義在USB協(xié)議有詳細介紹,本文不再作更多說明,設計時根據實際情況加以設置即可。
(2)接口描述字
CBI存儲設備至少應支持1個數據接口。此數據口包括最多4個端點,即前面提到的:控制、批量輸入/輸出、中斷。其中中斷端點可設置為用或不用。
接口描述字的結構和含義在USB協(xié)議中也有介紹。這里需要說明的有3點:第一是描述字中的bInterfaceClass域,必須設成08h,用來說明該設備為大容量存儲系統(tǒng)。第二是bInterfaceSubClass域,用來指明設計時所使用的對設備進行控制的標準命令集。如01h指明是Reduced Block Commands,06h指明是SCSI transparent command set,設計時可根據需要選用。這些在USB Mass Storage Class Specification Overview中有詳細說明。第三是bInterfaceProtocol域,指明存儲設備的設計使用體積結構。00h和01h說明使用CBI結構。不同的是前者說明設備需使用中斷端口告知系統(tǒng)命令的完成與否。
(3)端點描述字
接口所用的每一個除控制端口之外的端口都有自己的描述字。這些端口描述字總是作為配置信息的一部分在回應GetDescriptor命令時由設備發(fā)給主機的。
CBI存儲設備所支持的批量輸入/輸出和中斷端點描述字結構相同。不同的是具體設置,如表2所列。
表2 端點描述字結構
字 節(jié) | 命 名 | 大 小 | 值 | 說 明 |
0 | bLength | Byte | 07h | 指明該描述字長度 |
1 | bDescriptorType | Byte | 05h | 指明該描述字為端點描述字 |
2 | bEndpointAddress | Byte | 8?h或0?h | 指明該描述字在設備上的端號,必須在1-15之間 Bit0..3 指明端口號 Bit4..6 保留,須設為0 Bit 7 0說明為輸出端口,1說明為輸入端口 |
3 | bmAttributes | Byte | ??h | 指明是什么端點描述字(批量端點為02h,中斷端點為03h) |
4 | wMaxPacketSize | Word | 00??h | 最大數據傳輸長度 |
5 | ||||
6 | bInterval | Byte | ??h | 數據傳輸間隔(對批量端點,設成00h) |
表3 中斷端口狀態(tài)信息結構
字 節(jié) | 命 名 | 大 小 | 值 | 說 明 |
0 | bType | Byte | ??h | 00h:指明為命令完成情況中斷 01h-FFh:保留 |
1 | bValue | Byte | ??h | 當bType為00hjf , Bit7..4:由設計者指定 Bit3..2:保留,需設成0 Bit1..0:命令完成狀態(tài) 00=通過 01=失敗 10=相位錯誤 11=永久失敗 |
中斷端點可由接口描述字的bInterfaceProtocol域的設置決定用否。如果設成00h,就需用中斷端點來提示命令的完成情況。當設備需要產生中斷時,CBI設備應該在中斷端點返回2個字節(jié)的狀態(tài)信息,主機系統(tǒng)使用接口描述字的bInterfaceSubClass域的值來判別這2個字節(jié)的含義,并做出相應的處理,這2個字節(jié)定義如表3所列。
二、CBI結構的USB存儲設備開發(fā)實例
這里介紹我們在開發(fā)數字化家庭信息系統(tǒng)中的USB硬盤接口時一些簡單過程和經驗。
1.T33510控制器
開發(fā)時采用的T33510是臺灣創(chuàng)品公司生產的以89C51為內核,集成有USB和IDE存儲設備接口的控制芯片。由于集成度較高,因此在成本和開發(fā)難度上較低。它擁有很靈活的體系結構,能夠滿足設計需要,具體說明如下:
*內嵌有和89C51兼容的8位單片機;
*32K×8片內ROM;
*768×8片內RAM;
*可用作DMA通道的兩個528×8片內RAM;
*擁有和89C51相似的P0、P1、P2和P3口,支持存儲器的外部擴展;
*具有省電模式;
*擁有5個中斷源,其中復用有USB中斷源;
*支持全速(12Mb/s)和低速(1.5Mb/s)的USB數據傳輸速率;
*擁有Control endpoint、Bulk in/out endpoint、Interrupt endpoint等USB通訊端口。
*和Compact Flash Specificeation Rev.1.3兼容的IDE設備接口;
*內置有ECC(Error Correction Code)功能;
*使用3.3V工作電壓。
2.T33510中有關USB寄存器設置
為方便設備的開發(fā),對一些常用的USB參數,T33510已經設置好,開發(fā)時只要對其它一些比較靈活的部分在相應寄存器中加以設置即可。這里結合本文前面討論的CBI部分加以說明。
對控制端點,T33510提供了1個8位控制寄存器USBICX和4個字節(jié)的控制端點數據寄存器USBICMD。對中斷端點,T33510提供8位的控制寄存器USBICR和最少2個字節(jié)最多8個字節(jié)的數據寄存器(USBICRD1~USBICRD8)。對批量輸入/輸出端點,也有控制寄存器 USBIBULK和64個字節(jié)的FIFO提供使用。
T33510的通用控制寄存器USBIGEN對接口描述字中bInterfaceProtocol等域進行設置,其結構如表4所列。
表4 通用控制寄存器結構
- | - | - | SYS_OK | B_INTF_P | I_INTF_SC | B_INTF_C | SUSP_n |
- | - | - | R/W | R/W | R/W | R/W | R |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
SYS_OK 用來通知主機所需各種描述字已準備好,可以進行訪問。B_INTF_P用來設置bInterfaceProtocol域,當為1時,設該域為00h;當為 0時,設該域為01h。我們在設計時設為1,指明使用中斷端口來說明命令完成情況。I_INTF_SC用來設定iInterfaceSubClass域,當為1時,設該域為FFh;當為0時,設該域為01h。我們在設計時設為0,指明使用RBC命令集。B_INTF_C用來設定 bInterfaceClass域,當為1時,設該域為FFh;當為0時,設該域為08h,指明為容量存儲系統(tǒng)。我們在設計時將該位置0。SUSP_n為系統(tǒng)掛起標記。
T33510支持CBI結構所需的4種端點,按控制端點、批量輸入、批量輸出、中斷端點的順序依次分配端點號為0、1、2、3。在中斷端點速率寄存器USBIINTR中,可對速度進行設置。開發(fā)時我們設為FFh。端點寄存器其它域已由T33510預先設置好。
3.系統(tǒng)結構和軟硬件設計
基于T33510的USB硬盤結構如圖1所示。系統(tǒng)可分為兩部分:主機端和單片機端。USB設計分硬件和軟件兩部分。硬件包括電路設計和固件程序的編寫,通常用匯編或C語言;軟件分USB設備驅動程序和USB客戶軟件。固件的編寫可采用分塊的方法,比如Main模塊、Interrupt模塊、Vector模塊、Timer模塊、Declare模塊等。通過編譯連接以.hex文件的格式寫到芯片里面去。固件主要解決以下幾個問題:一是描述符的確定與建立;二是中斷請求的功能實現;三是命令請求的解析;四是初始化的設置。設備驅動程序和客戶軟件位于主機端。
T3351 所支持的RBC命令集包括INQUIRY、READ FORMAT CAPASCITIES、READ、WTITE等等,有關RBC命令可從相應協(xié)議中得到。系統(tǒng)通過READ命令讀取硬盤的啟動扇區(qū),并分析其文件系統(tǒng)結構,然后讀取其它扇區(qū)進行文件的操作。T33510的IDE接口設計有對硬盤操作所需的各個寄存器,符合Compact Flash Specification Rev.1.3協(xié)議,給程序編制帶來了很大方便。由于所有的文件系統(tǒng)和數據的分析都交由PC端來執(zhí)行,因此在IDE接口上,只需提供基本的 “Sectors Read”和“Sectors Write”等命令就可以了。主程序流程如圖2所示。
下面給出對硬盤一個扇區(qū)進行讀寫的C語言程序段。
讀扇區(qū):void ReadOneSecoter (Dword LBA)
{IDE_WRITE_1F6(0xE0); Master & LBA模式
IDE_WRITE_1F2(1); //扇區(qū)數
IDE_WRITE_1F3(LBA%0x100);//LBA_7_0位
IDE_WRITE_1F4((LBA/0x100)%0x100);//LBA_15_8位
IDE_WRITE_1F5((LBA/0x10000)%0x100);
// LBA_23_16位
IDE_WRITE_1F7(0x20); //命令:讀扇區(qū)
While(IdeRead1F7()!=0x58);
IdeReadData();
while(!cf_sfr_ready);
while(IdeRead1F7()!=0x50);}
//--------------------------------------------------------------------
寫扇區(qū):void WriteOneSecoter(Dword LBA)
{IDE_WRITE_1F6(0xE0); //Master & LBA模式
IDE_WRITE_1F2(1); //扇區(qū)數
IDE_WRITE_1F3(LBA%0x100); //LBA_7_0位
IDE_WRITE_1F4((LBA/0x100)%0x100);
//LBA_15_8位
IDE_WRITE_1F5((LBA/0x10000)%0x100);
//LBA_23_16位
IDE_WRITE_1F7(0x30); //命令:寫扇區(qū)
while (IdeRead1F7()!0x58);
IdeWriteData( );
while (!cf_sfr_ready); //等待結束
while (IdeRead1F7() !=0x50);}
結束語
CBI結構只是USB存儲設備設計時可供選擇的一種,此外還有BULK-ONLY結構。應該說,USB硬盤的開發(fā)除結構的選擇,還涉及許多其它東西,比如RBC命令集的合作、ISE接口的協(xié)議、主機端驅動程序等很多因素。本文在此不能一一詳述。
USB硬盤驅動器為小型辦公、家庭辦公、個為及網絡,提供了一種快速方便地解決存儲問題的途徑。
由于USB技術連接方式和速度上相對傳統(tǒng)的并口、串口等方式的優(yōu)勢,必將極大改變計算機外設的設計方式。新出臺的USB的速度可達480Mb/s,可以改善以前版本速度不是很快的缺憾,將進一步擴展USB應用的范圍。