在嵌入式系統中實(shí)現對U盤(pán)的操作
摘要:主要介紹在嵌入式系統中利用SL811HS對U盤(pán)操作的實(shí)現方法;簡(jiǎn)要介紹USB設備中的海量存儲類(lèi)、SL811HS的芯片特點(diǎn)及FAT文件系統。
關(guān)鍵詞:USB U盤(pán) FAT SL811HS
引 言
USB(通用串行總線(xiàn))用于將適用USB的外圍設備(device)連接到主機(host),實(shí)現二者之間數據傳輸的外部總線(xiàn)結構;是一種快速、靈活的總線(xiàn)接口。它最大的特點(diǎn)是易于使用,主要是用在中速和低速的外設。
隨著(zhù)USB規范的完善和成熟,USB外設的種類(lèi)不斷豐富,應用領(lǐng)域也不斷擴大。在傳統的應用中,主要是PC扮演著(zhù)主機的角色。根據USB的規范,可以看到在USB的拓樸結構中居于核心地位的是主機,每一次的數據傳輸都必須由主機發(fā)起和控制。但是隨著(zhù)嵌入式產(chǎn)品應用領(lǐng)域的日益增長(cháng),USB外設的應用范圍也隨之擴大,為此在嵌入式系統中實(shí)現對USB外設控制也變得日益迫切。
本文針對USB外設中的U盤(pán),說(shuō)明如何在嵌入式系統中利用SL811HS實(shí)現對其的操作。
1 海量存儲類(lèi)
USB設備分為五個(gè)大類(lèi),即顯示器(monitors)、通信設備(communications devices)、音頻設備(audio)、人機輸入(human input)和海量存儲(mass storage)。
通常所用的U盤(pán)、移動(dòng)硬盤(pán)均屬于海量存儲類(lèi)。
海量存儲類(lèi)的規范中包括四個(gè)獨立的子規范,即CBI Transprot、Bulk-Only Transport、ATA Command Block、UFI Command Specification。前兩個(gè)協(xié)議定義了數據/命令/狀態(tài)在USB總線(xiàn)上的傳輸方法,Bulk-Only傳輸協(xié)議僅僅使用Bulk端點(diǎn)傳送數據/命令/狀態(tài),CBI傳輸協(xié)議則使用Control/Bulk/Interrupt三種類(lèi)型的端點(diǎn)進(jìn)行數據/命令/狀態(tài)的傳送。后兩個(gè)協(xié)議定義了存儲介質(zhì)的操作命令,ATA協(xié)議用于硬盤(pán),UFI協(xié)議則針對USB移動(dòng)存儲。
本設計中所使用的U盤(pán)遵循Bulk-Only傳輸協(xié)議和UFI命令規范。
2 實(shí)現方法
2.1 硬件設計
本設計采用SL811HS芯片完成對U盤(pán)的操作。SL811HS是Cypress公司推出的具有主/從兩種工作模式的USB控制器,遵循USB1.1規范;可自動(dòng)檢測總線(xiàn)速率,支持全速12Mbps和低速1.5Mbps設備;具有8位雙向的數據總線(xiàn),易與單片機連接;片內256字節的SRAM(其中16字節用于工作寄存器),用于數據傳輸;可自動(dòng)產(chǎn)生SOF和CRC5/16,簡(jiǎn)化軟件工作量;片內具有根Hub;支持掛起/喚醒工作模式,減少功耗;支持自動(dòng)加1功能,減少數據讀寫(xiě)周期;3.3V工作電源,接口可承受5V的工作電壓,可與多種規格的單片機連接。
單片機與SL811HS接口的原理如圖1所示。
2.2 軟件設計
通過(guò)USB主控芯片對U盤(pán)操作的主要工作是在軟件方面,它需要對眾多規范、協(xié)議透徹的理解。下面主要通過(guò)軟件的工作流程來(lái)說(shuō)明設計過(guò)程。
2.2.1 SL811HS初始化
SL811HS共有15個(gè)配置寄存器,其中0~4、8~C是USB-A、USB-B的工作配置寄存器,5、F是控制寄存器,6是中斷使能寄存器,D為狀態(tài)寄存器,E、F為SOF計數寄存器。各個(gè)寄存器的具體功能如表1所列。
在SL811HS上電開(kāi)始工作后,首先對USB總線(xiàn)復位(置寄存器5的位3為1,延時(shí)30ms后清零),然后使能設備檢測中斷(置寄存器6為0x61)。
2.2.2 設備檢測
(1)軟件協(xié)議
在設備檢測階段,主要通過(guò)setup結構的數據包(8字節長(cháng))向USB設備的控制端點(diǎn)0(默認端點(diǎn))發(fā)送命令。數據包結構如表2所列。
(2)實(shí)現過(guò)程
當U盤(pán)插入USB插座時(shí),SL811HS產(chǎn)生中斷,通過(guò)讀取中斷狀態(tài)寄存器可判斷中斷類(lèi)型。當中斷類(lèi)型表示為檢測到設備插入時(shí),就可對USB設備即U盤(pán)進(jìn)行配置了。此時(shí)還需使能SL811HS的1ms SOF(配置SL811HS的寄存器E=0xE0、F=0xAE,然后置位寄存器5的位0和寄存器0的位5),以便進(jìn)行數據幀的同步。
在U盤(pán)未配置之前,其默認地址和默認控制端點(diǎn)均為0。利用setup數據包對U盤(pán)進(jìn)行配置時(shí),須將U盤(pán)的地址寫(xiě)入SL811HS的寄存器4,將數據包的類(lèi)型和U盤(pán)的控制端點(diǎn)寫(xiě)入SL811HS的寄存器3。
以下為對U盤(pán)配置過(guò)程的主要步驟。
① 設備描述符(GetDeviceDescriptor)。請求設備描述符的setup數據包為
通過(guò)讀取設備描述符,可獲得設備的子類(lèi)(通用海量存儲類(lèi))、端點(diǎn)0的最大包長(cháng)(一般為8字節)。
② 讀取配置描述符(GetConfigDescriptor)。
對于請求配置描述符,可以先進(jìn)行首次請求,要求數據包長(cháng)為9(一個(gè)配置描述符的長(cháng)度)。數據包內容為
接收到設備返回的數據,獲得此描述符的總長(cháng),然后再發(fā)二次請求,獲得全部描述符數據。數據包內容為
此時(shí)返回的數據包括了設備配置、接口、端點(diǎn)的全部描述信息。
此部分的內容包括Configuration Descriptor、Interface Descriptor和所有端點(diǎn)的Endpoint Descriptor。在配置描述符中,可獲得設備的屬性(總線(xiàn)供電)以及最大功耗;在接口描述符,可獲得設備的接口數量(只有一個(gè)數據接口)、接口類(lèi)型(海量存儲類(lèi))、接口子類(lèi)代碼(UFI)、接口通信協(xié)議(Bulk-Only);在端點(diǎn)描述符,可獲得設備的In和Out端點(diǎn)號及此端點(diǎn)的最大數據包長(cháng)。
③ 設置設備地址(SetAddress)。設置設備地址的setup數據包為
設備地址為02或03(01一般用來(lái)表示設備為Hub)。
到此,U盤(pán)的配置過(guò)程完成。此后的主機與USB設備之間的通信必須使用設置的地址,默認地址0不再有效,傳輸端點(diǎn)則為讀取的配置描述符中所定義的端點(diǎn)號。
在配置過(guò)程中各類(lèi)數據內容的正確性,可借助BusHound軟件工具捕捉PC機與U盤(pán)之間的活動(dòng)數據,然后將自己獲得的數據包內容與之相比較。
2.2.3 U盤(pán)文件系統識別
(1)軟件協(xié)議
在與U盤(pán)之間進(jìn)行大量數據傳輸時(shí),需要利用描述符提供的In、Out端點(diǎn)進(jìn)行數據傳送,并遵循Bulk-Only傳輸協(xié)議。
根據USB的協(xié)議規范,所有的傳輸都須由主機啟動(dòng)。即主機首先向設備的OUT端點(diǎn)發(fā)送一命令(CBW數據包),請求傳輸,格式如表3所列。
在數據包中規定了下一步的數據傳輸方向。若為設備到主機,則當CBW發(fā)送成功后,從設備的In端點(diǎn)讀取CBW中規定長(cháng)度的數據;若為主機到設備,則當CBW發(fā)送成功后,向設備的Out端點(diǎn)發(fā)送CBW中規定長(cháng)度的數據。
當主機與設備之間的數據傳送完畢后,主機還需從設備的In端點(diǎn)讀取傳送狀態(tài),主機根據接收的CSW數據包即可判斷出通信是否正常。若返回的結果有錯誤,還須進(jìn)行相應的出錯處理。CSW數據包結構如表4所列。
(2)實(shí)現過(guò)程
CPU向U盤(pán)發(fā)送CBW數據包,其中的命令塊為UFI規范所定義的Read(10)命令。讀取0柱0道1扇區共512字節的MBR數據,前446字節為主引導記錄,接著(zhù)的64字節為DPT(Disk Partition Table盤(pán)分區表),最后的2字節“55 AA”為有效結束標志。
其中的DPT部分包含4個(gè)分區的數據結構,每個(gè)結構占16字節,具體定義如下:
typedef struct{
uchar BootFlag; //活動(dòng)標志,80h為活動(dòng)分區,0為非活動(dòng)
//分區
CHS StartCHS; //分區開(kāi)始的柱面、磁頭、扇區
uchar SystemID; //分區類(lèi)型
CHS EndChs; //分區結束的柱面、磁頭、扇區
ulong RelativeSectors; //分區起始扇區數
ulong TotalSectors; //分區總扇區數
}PartitionTable;
從第一個(gè)分區數據結構的分區起始扇區數(relative sectors)的位置讀取512字節,為DBR(系統引導記錄),包括一個(gè)引導程序和BPB(本分區的參數記錄表)。BPB參數塊記錄本分區的起始扇區、結束扇區、文件存儲格式、介質(zhì)描述符、根目錄項數、FAT個(gè)數、保留扇區數、分配單元的大小等重要參數。
根據保留扇區的數目可知FAT表的位置(RelativeSectors+保留扇區數)。FAT表是文件組織結構的主要組成部分,反映了磁盤(pán)上所有簇的使用情況。在給一個(gè)文件分配空間時(shí),總先掃描FAT,找到第一個(gè)可用簇,將該空間分配給文件,并將該簇的簇號填到目錄的相應段內;若文件大于一個(gè)簇,則在FAT表中此文件的首簇號位置填入下一個(gè)可用簇號,直到最后一個(gè)簇填入“FFFF”,即形成了簇號鏈。對于FAT12文件系統,簇號用12位表示;FAT16文件系統的簇號用16位表示;FAT32文件系統的簇號用32位表示。
根據FAT的個(gè)數以及每個(gè)FAT表占用的扇區數,即可推算出文件目錄表(FDT)的位置(FAT表位置+FAT表個(gè)數*FAT表所占扇區數)。FDT是文件組織結構的又一重要組成部分。目錄可看作是一種特殊的文件,數據結構為32字節,包括文件名、擴展名、文件屬性、時(shí)間、日期、開(kāi)始簇號、文件長(cháng)度等。
根據根目錄中的目錄項數即可計算出數據區的起始扇區位置。這一部分占用了磁盤(pán)上的大部分空間,用于存儲各類(lèi)文件的數據。
對于FAT32文件系統來(lái)說(shuō),它的根目錄位置不單獨列出,而是等同于文件結構,保存在數據區中。這樣就沒(méi)有了目錄項的限制,不夠用的時(shí)候增加簇鏈,分配空簇即可。
對于以上各類(lèi)數據讀取內容的正確判斷,可將U盤(pán)插入PC機,借助WinHex工具,讀取磁盤(pán)上相應位置的數據內容,與之相比較。
FAT16文件格式的U盤(pán)空間分配如圖2所示。
2.2.4 文件操作
因為U盤(pán)的容量不是特別大,所以基本上都使用FAT16文件系統??梢愿鶕﨔AT16系統的磁盤(pán)特性進(jìn)行各種操作。
① 創(chuàng )建目錄。在根目錄區或指定的子目錄區中填加新目錄的數據結構。
② 刪除目錄。在根目錄區或指定的子目錄區中找到所需刪除的目錄,并置相應標志。
③ 寫(xiě)文件。當寫(xiě)一新文件時(shí),需在FAT表中查找未使用的簇,并將該簇號寫(xiě)入文件對應目錄數據結構中的起始簇號位置。當此文件長(cháng)度大于一簇時(shí),還需在FAT表中對應的起始簇號位置填入下一可用簇的簇號,直到文件的最后一簇(FAT表中的相應位置填FFFF)。
若磁盤(pán)有備份FAT,還需在備份FAT表的相應位置填入正確的內容。
④ 刪文件。刪除文件時(shí),除了將該文件對應的目錄數據結構置相應標志外,還要修改FAT表及備份FAT表。將此文件使用的簇號位置清0,表示此簇當前未被使用。
2.2.5 Bulk傳輸流程
使用U盤(pán)的Bulk端點(diǎn)進(jìn)行數據傳送,Bulk傳輸分為Bulk-In和Bulk-Out。其中Bulk-In指的是主機向外圍設備請求數據,由外圍設備向主機發(fā)送數據。Bulk-Out的傳輸方向與Bulk-In相反,由主機向外圍設備發(fā)送數據。
根據UFI規范的定義,每次讀寫(xiě)操作都以邏輯塊(扇區)為單位。一般U盤(pán)的一個(gè)扇區為512字節,而B(niǎo)ulk端點(diǎn)的最大包長(cháng)為64字節,即一個(gè)扇區的讀寫(xiě)操作需要8個(gè)循環(huán)才能完成。
(1)Bulk-In流程
Bulk-In流程如圖3所示。
在接收設備數據的循環(huán)中,因為一個(gè)扇區的操作需要8次才能完成,因此要注意每接收一個(gè)數據包,都要將SL811HS寄存器0中的數據位(位6)變換一次。data1和data0交替使用。
(2)Bulk-Out流程
與Bulk-In流程差不多,只是在CBW數據包中,注明了下一階段的傳輸方向為主機到外圍設備。在CBW發(fā)送ACK之后,向設備的Out端點(diǎn)發(fā)送PID-OUT數據包,使得設備接收所要傳送的數據。在數據傳輸完畢后,仍要向設備的In端點(diǎn)發(fā)送PID-IN數據包,讀取設備的CSW數據包,判斷傳輸結果,并進(jìn)行相應處理。
在發(fā)送數據的循環(huán)中,同樣要注意data0和data1的交替使用問(wèn)題。
結 語(yǔ)
目前開(kāi)發(fā)的在嵌入式系統中利用USB主控芯片實(shí)現與U盤(pán)的操作技術(shù),已應用在我們自主開(kāi)發(fā)研制的消防產(chǎn)品中。實(shí)現了消防控制器與U盤(pán)之間的各類(lèi)信息的傳輸,為數據分析提供了有利的手段。在越來(lái)越多的消費類(lèi)市場(chǎng),這一技術(shù)必將有更為廣闊的應用前景。
評論