引 言 USB移動存儲技術(U盤)把USB接口技術與Flash存儲器技術結合在一起,構成了一種快速、大容量、方便的新型數據交換系統,主要構成有主控制器(MCU)、USB接口芯片和Flash存儲器。主控制器(MCU)是系統的核心,負責控制各種外圍設備、實現各種算法、協調與主機通信;USB接口芯片負責USB通信;Flash(閃爍存儲器)用來存儲數據,它決定了U盤的容量。 1 硬件系統設計 U盤設計結構框圖如圖1所示。使用Phil-ips公司的ARM7芯片LPC2132,控制 Philips的USB1.1接口芯片PDI-USBD12,處理PMC公司的128 KB串行Flash存儲器作為數據存儲設備實現U盤。 (1) ARM處理器 LPC2132是基于一個支持實時仿真和跟蹤的16/32位ARM7TDMI-S CPU,并帶有64 KB嵌入的高速Flash存儲器。LPC2132的實時仿真和跟蹤功能方便了代碼的調試,降低了開發成本。 (2) PDIUSBD12 PDIUSBD12(簡稱為“D12”)是一款性價比很高的USB器件;通常用于微控制器系統中實現與微控制器進行通信的高速通用并行接口;支持本地的DMA傳輸。PDIUSBD12所具有的低掛起功耗連同LazyClock輸出可以滿足使用ACPI、OnNOW和USB電源管理的要求。低功耗可以應用于使用USB總線供電的外設。 (3) Flash存儲器 存儲器選用PMC公司的Pm25LV010。適合低功耗和低電壓下工作的應用場合;具有完備的數據保護功能。通過沒置芯片的狀態寄存器,可以將存儲空間的高1/4、高1/2或整片寫保護。寫使能和寫禁止指令進一步保護數據。另外還提供WP引腳用于硬件數據保護,以防止對狀態寄存器的意外修改。 U盤電路原理如圖2所示。 2 軟件設計 軟件設計主要包括D12驅動、Mass Storage類協議和Flash存儲器的讀/寫控制。 2.1 D12驅動的實現 在USB設備插入主機之前,主機對這個USB設備的情況一無所知,無法建立起通信;但USB協議規定了一些最基本的準則,如每個設備的端點0都是可用的,屬于控制端點。有了這個基本的溝通途徑,主機就開始通過端點0向設備提出一些問題,這些問題是有關設備基本情況的。這些基本情況可以反映USB設備所屬的類別及子類,反映配置情況、接口情況和端點情況;一旦得知了這些信息,主機就大體了解了這個設備是個什么樣的設備,按照USB協議中的相應規定,就逐步建立起了一條介于設備之間的高速數據通道,用于數據的傳輸。主機向設備提出的這些問題實際上就是USB協議中規定的各種標準清求,設備必須對這些問題進行回答;而回答的方式就是向主機傳送相應的描述符,即設備描述符、配置描述符、接口描述符、端點描述符。 為了使軟件可移植性強、易維護,采用分層的方法編寫PDIUSBD12的驅動程序。USB驅動程序分層結構如表1所列。 ① 硬件提取層(D12HAL.c)包含最底層的函數。 ② D12命令接口(D12CI.c)實現PDIUSBD12的命令接口以簡化器件的編程。該層的函數及其功能如下: ◇讀取芯片ID號,uint16 D12_ReadChipID(void); ◇設置地址/使能,void D12_SetAddressEnable(UINT8 bAddress,UINT8 bEnable); ◇設置端點使能,void D12_SetEndpointEnable(UINT8 bEnable); ◇設置模式,void D12_SetMode(uint8 bConfig,uint8bClkDiv)。 ③ 協議層(Chap_9.c)處理標準的USB設備請求,以及特殊的廠商請求,如DMA等。USB主機通過標準USB設備請求,可設定和獲取USB設備的有關信息,完成USB設備的枚舉。 所有的請求都是通過端點0接收和發送SETUP包來完成的。接收主機SETUP包的函數為ep0_rxdone(),所有SETUP包都由函數control_handler()來處理,發送SETUP包的函數為ep0_txdone()。SETUP包的接收和發送通過控制傳輸結構全局變量CONTROL_XFER Con-trolData來控制,它實現了以上3個函數之間的通信。CONTROL_XFER結構體的定義如下: 上述幾個函數及ControlData變量之間的關系如圖3所示。 ④ 應用層(D12Driver.c)實現PDIUSBD12的所有功能。USB設備控制驅動、USB接口控制驅動和協議層都在應用層的控制之中。應用層要實現的任務包括: ◆初始化PDIUSBD12。包括初始化PDIUSBD12的硬件連接、復位PDIUSBD12、配置PDIUSBD12的中斷服務程序地址、初始化應用層相關的全局變量。 ◆編寫PDIUSBD12中斷服務程序。PDIUSBD12幾乎所有功能都是通過PDIUSBD12中斷服務程序來完成的,因此中斷服務程序是應用層的核心部分,也是本驅動程序的核心部分。它要完成以下任務: ◇控制端點數據接收與發送中斷服務程序,負責處理控制傳輸的有關工作; ◇端點1和端點2數據接收與發送中斷服務程序; ◇USB總線掛起、復位、DMA結束中斷服務程序。 ◆用戶讀寫端點1和端點2的API函數。 ◆傳輸控制處理任務。該任務用于處理枚舉、標準任務清求、廠商請求等傳輸控制。 2.2 Mass Storage類協議的實現 完整的Mass Storage類協議需要實現如下幾部分:在枚舉時,提供Mass Storage類協議描述符;實現Bulk-Only批量傳輸協議;實現SCSI命令集。 2.2.1 Mass Storage類協議描述符 USB采用設備類的方式對設備進行管理。要讓主機識別設備,設備就必須提供正確的描述符: ◇設備描述符; ◇配置描述符; ◇接口捕述符; ◇端點描述符。 2.2.2 BuIk-Only批量傳輸協議實現 Bulk-Only協議包括兩部分:類特定請求命令和Bulk-Only傳輸。 (1) 類特定請求命令 ① 批量傳輸的大容量存儲器復位。要發送批量傳輸的大容量存儲器復位請求,主機將在默認管道發送一個設備請求: ◇bmRequestType——類、接口、主機到設備; ◇bRequest字段設置為255(FFh); ◇wValue字段設置為0; ◇wIndex字段設置為接口編號; ◇wLength字段設置為0。 批量傳輸的大容量存儲器復位請求如下: ② 獲取最大邏輯單元號(專用類請求)。Get MaxLUN設備請求用于確定設備支持的邏輯單元編號。設備的邏輯單元編號可以從LUN為0到LUN的最大值15(Fh)。 要發送Get Max LUN設備請求,主機應在以下默認管道發送一個設備請求: ◇bmRequestType——類、接口、設備到主機; ◇bRequest范圍設置為254(FEh); ◇wValue字段設置為0; ◇wIndex字段設置為接口編號; ◇wLength字段設置為1。 獲得最大邏輯單元字如下: 設備應返回1字節包含設備支持的最大邏輯單元數。例如,如果設備支持4個LUN,則LUN的編號應從0~3,則返回值為3。如果設備沒有相關的LUN,則返回值為0。主機不應向一個不存在的LUN發送命令塊包(CBW)。 不支持多LUN的設備會返回STALL。 (2) Bulk-Only傳輸 Bulk-Only傳輸協議沒有使用中斷和控制端點,僅使用Bulk批量端點來進行命令塊、數據和命令塊狀態的傳輸?刂贫它c(默認)管道僅用來請求批量端點上的STALL停止的狀態和執行類特定請求命令。 Bulk-Only傳輸的流程如圖4所示。 2.2.3 SCSI命令集實現 SCSI命令集是SCSI設備通用命令集。SCSI有3種字長的命令:6字節、10字節和12字節。Microsoft Win-dows環境下支持12字節長的命令。圖5給出了通用的UFI命令塊的格式。請注意,這些字節就是CBW封包中CBWCB字段的內容。 對不同的命令只需根據SCSI命令集白皮書作出適當的回應。Pm25LV010的最小擦除單位為扇區(4 KB),故在程序中定義一個4 KB的緩沖區Cache_STRUC Flash-Cache,把每次收到的數據放入緩沖區中,到緩沖區滿數據接收完畢時再將其寫入Flash存儲器中,流程如圖6所示。 2.3 Flash存儲器的讀寫控制 Flash存儲器讀寫程序由SPI控制和Pm25LV010控制兩部分組成。 Pm25LV010 Flash存儲器采用的是SPI串行接口,其SPI有兩種工作模式——模式0和模式3。SPI.c完成SPI底層操作,給Pm25LV010控制程序提供一個讀寫1字節數據函數。該函數使用SPI模式0。 Pm25LV010控制程序完成Pm25LV010器件的所有操作,其向高層提供的函數及功能如表2所列。 Pm25LV010的最小擦除單位是扇區(每扇區4 KB),在改寫扇區內任意一字節數據時都需要將該扇區擦除。針對這種情況,在程序中定義了一個4 KB大小的緩沖區,當上層調用函數WriteToFlash()向Flash寫數據時,并不直接寫入Flash,而是先寫到數據緩沖區,其流程如圖7所示。 3 結 論 基于LPC2132微控制器的硬件平臺上實現了USB驅動、Bulk-Only傳輸協議、SCSI命令集,實現了完整的U盤功能。 |