用SL811HS實現對U盤的操作

admin @ 2014-03-26 , reply:0

      USB(通用串列匯流排)用於將適用USB的外圍設備(device)連接到主機(host),實現二者之間數據傳輸的外部匯流排結構;是一種快速、靈活的匯流排介面。它最大的特點是易於使用,主要是用在中速和低速的外設。

  隨著USB規範的完善和成熟,USB外設的種類不斷豐富,應用領域也不斷擴大。在傳統的應用中,主要是PC扮演著主機的角色。根據USB的規範,可以看到在USB的拓樸結構中居於核心地位的是主機,每一次的數據傳輸都必須由主機發起和控制。但是隨著嵌入式產品應用領域的日益增長,USB外設的應用範圍也隨之擴大,為此在嵌入式系統中實現對USB外設控制也變得日益迫切。

  本文針對USB外設中的U盤,說明如何在嵌入式系統中利用SL811HS實現對其的操作。

1 海量存儲類

  USB設備分為五個大類,即顯示器(monitors)、通信設備(communications devices)、音頻設備(audio)、人機輸入(human input)和海量存儲(mass storage)。

  通常所用的U盤、移動硬碟均屬於海量存儲類。

  海量存儲類的規範中包括四個獨立的子規範,即CBI Transprot、Bulk-Only Transport、ATA Command Block、UFI Command Specification。前兩個協議定義了數據/命令/狀態在USB匯流排上的傳輸方法,Bulk-Only傳輸協議僅僅使用Bulk端點傳送數據/命令/狀態,CBI傳輸協議則使用Control/Bulk/Interrupt三種類型的端點進行數據/命令/狀態的傳送。后兩個協議定義了存儲介質的操作命令,ATA協議用於硬碟,UFI協議則針對USB移動存儲。

  本設計中所使用的U盤遵循Bulk-Only傳輸協議和UFI命令規範。

2 實現方法

2.1 硬體設計

  本設計採用SL811HS晶元完成對U盤的操作。SL811HS是Cypress公司推出的具有主/從兩種工作模式的USB控制器,遵循USB1.1規範;可自動檢測匯流排速率,支持全速12Mbps和低速1.5Mbps設備;具有8位雙向的數據匯流排,易與單片機連接;片內256位元組的SRAM(其中16 位元組用於工作寄存器),用於數據傳輸;可自動產生SOF和CRC5/16,簡化軟體工作量;片內具有根Hub;支持掛起/喚醒工作模式,減少功耗;支持自動加1功能,減少數據讀寫周期;3.3V工作電源,介面可承受5V的工作電壓,可與多種規格的單片機連接。

  單片機與SL811HS介面的原理如圖1所示。
        
2.2 軟體設計

  通過USB主控晶元對U盤操作的主要工作是在軟體方面,它需要對眾多規範、協議透徹的理解。下面主要通過軟體的工作流程來說明設計過程。

2.2.1 SL811HS初始化

  SL811HS共有15個配置寄存器,其中0~4、8~C是USB-A、USB-B的工作配置寄存器,5、F是控制寄存器,6是中斷使能寄存器,D為狀態寄存器,E、F為SOF計數寄存器。各個寄存器的具體功能如表1所列。
       
  在SL811HS上電開始工作后,首先對USB匯流排複位(置寄存器5的位3為1,延時30ms后清零),然後使能設備檢測中斷(置寄存器6為0x61)。

2.2.2 設備檢測

(1)軟體協議
  在設備檢測階段,主要通過setup結構的數據包(8位元組長)向USB設備的控制端點0(默認端點)發送命令。數據包結構如表2所列。
 
(2)實現過程
  當U盤插入USB插座時,SL811HS產生中斷,通過讀取中斷狀態寄存器可判斷中斷類型。當中斷類型表示為檢測到設備插入時,就可對USB設備即U盤進行配置了。此時還需使能SL811HS的1ms SOF(配置SL811HS的寄存器E=0xE0、F=0xAE,然後置位寄存器5的位0和寄存器0的位5),以便進行數據幀的同步。

  在U盤未配置之前,其默認地址和默認控制端點均為0。利用setup數據包對U盤進行配置時,須將U盤的地址寫入SL811HS的寄存器4,將數據包的類型和U盤的控制端點寫入SL811HS的寄存器3。

  以下為對U盤配置過程的主要步驟。

① 設備描述符(GetDeviceDescriptor)。請求設備描述符的setup數據包為
通過讀取設備描述符,可獲得設備的子類(通用海量存儲類)、端點0的最大包長(一般為8位元組)。
          
② 讀取配置描述符(GetConfigDescriptor)。
對於請求配置描述符,可以先進行首次請求,要求數據包長為9(一個配置描述符的長度)。數據包內容為
          
接收到設備返回的數據,獲得此描述符的總長,然後再發二次請求,獲得全部描述符數據。數據包內容為
           
此時返回的數據包括了設備配置、介面、端點的全部描述信息。

  此部分的內容包括Configuration Descriptor、Interface Descriptor和所有端點的Endpoint Descriptor。在配置描述符中,可獲得設備的屬性(匯流排供電)以及最大功耗;在介面描述符,可獲得設備的介面數量(只有一個數據介面)、介面類型 (海量存儲類)、介面子類代碼(UFI)、介面通信協議(Bulk-Only);在端點描述符,可獲得設備的In和Out端點號及此端點的最大數據包長。

③ 設置設備地址(SetAddress)。設置設備地址的setup數據包為
              
  設備地址為02或03(01一般用來表示設備為Hub)。

  到此,U盤的配置過程完成。此後的主機與USB設備之間的通信必須使用設置的地址,默認地址0不再有效,傳輸端點則為讀取的配置描述符中所定義的端點號。

  在配置過程中各類數據內容的正確性,可藉助BusHound軟體工具捕捉PC機與U盤之間的活動數據,然後將自己獲得的數據包內容與之相比較。

2.2.3 U盤文件系統識別

(1)軟體協議
  在與U盤之間進行大量數據傳輸時,需要利用描述符提供的In、Out端點進行數據傳送,並遵循Bulk-Only傳輸協議。

  根據USB的協議規範,所有的傳輸都須由主機啟動。即主機首先向設備的OUT端點發送一命令(CBW數據包),請求傳輸,格式如表3所列。
        
  在數據包中規定了下一步的數據傳輸方向。若為設備到主機,則當CBW發送成功后,從設備的In端點讀取CBW中規定長度的數據;若為主機到設備,則當CBW發送成功后,向設備的Out端點發送CBW中規定長度的數據。

  當主機與設備之間的數據傳送完畢后,主機還需從設備的In端點讀取傳送狀態,主機根據接收的CSW數據包即可判斷出通信是否正常。若返回的結果有錯誤,還須進行相應的出錯處理。CSW數據包結構如表4所列。
        
(2)實現過程
  CPU向U盤發送CBW數據包,其中的命令塊為UFI規範所定義的Read(10)命令。讀取0柱0道1扇區共512位元組的MBR數據,前446位元組為主引導記錄,接著的64位元組為DPT(Disk Partition Table盤分區表),最後的2位元組“55 AA”為有效結束標誌。

其中的DPT部分包含4個分區的數據結構,每個結構佔16位元組,具體定義如下:
typedef struct{
uchar BootFlag; //活動標誌,80h為活動分區,0為非活動
//分區
CHS StartCHS; //分區開始的柱面、磁頭、扇區
uchar SystemID; //分區類型
CHS EndChs; //分區結束的柱面、磁頭、扇區
ulong RelativeSectors; //分區起始扇區數
ulong TotalSectors; //分區總扇區數
}PartitionTable;

  從第一個分區數據結構的分區起始扇區數(relative sectors)的位置讀取512位元組,為DBR(系統引導記錄),包括一個引導程序和BPB(本分區的參數記錄表)。BPB參數塊記錄本分區的起始扇區、結束扇區、文件存儲格式、介質描述符、根目錄項數、FAT個數、保留扇區數、分配單元的大小等重要參數。

  根據保留扇區的數目可知 FAT表的位置(RelativeSectors+保留扇區數)。FAT表是文件組織結構的主要組成部分,反映了磁碟上所有簇的使用情況。在給一個文件分配空間時,總先掃描FAT,找到第一個可用簇,將該空間分配給文件,並將該簇的簇號填到目錄的相應段內;若文件大於一個簇,則在FAT表中此文件的首簇號位置填入下一個可用簇號,直到最後一個簇填入“FFFF”,即形成了簇號鏈。對於FAT12文件系統,簇號用12位表示;FAT16文件系統的簇號用16 位表示;FAT32文件系統的簇號用32位表示。

  根據FAT的個數以及每個FAT表佔用的扇區數,即可推算出文件目錄表(FDT)的位置(FAT表位置+FAT表個數*FAT表所佔扇區數)。FDT是文件組織結構的又一重要組成部分。目錄可看作是一種特殊的文件,數據結構為32位元組,包括文件名、擴展名、文件屬性、時間、日期、開始簇號、文件長度等。
根據根目錄中的目錄項數即可計算出數據區的起始扇區位置。這一部分佔用了磁碟上的大部分空間,用於存儲各類文件的數據。

  對於FAT32文件系統來說,它的根目錄位置不單獨列出,而是等同於文件結構,保存在數據區中。這樣就沒有了目錄項的限制,不夠用的時候增加簇鏈,分配空簇即可。

  對於以上各類數據讀取內容的正確判斷,可將U盤插入PC機,藉助WinHex工具,讀取磁碟上相應位置的數據內容,與之相比較。

  FAT16文件格式的U盤空間分配如圖2所示。
         
2.2.4 文件操作

  因為U盤的容量不是特別大,所以基本上都使用FAT16文件系統。可以根據FAT16系統的磁碟特性進行各種操作。

① 創建目錄。在根目錄區或指定的子目錄區中填加新目錄的數據結構。

② 刪除目錄。在根目錄區或指定的子目錄區中找到所需刪除的目錄,並置相應標誌。

③ 寫文件。當寫一新文件時,需在FAT表中查找未使用的簇,並將該簇號寫入文件對應目錄數據結構中的起始簇號位置。當此文件長度大於一簇時,還需在FAT表中對應的起始簇號位置填入下一可用簇的簇號,直到文件的最後一簇(FAT表中的相應位置填FFFF)。
若磁碟有備份FAT,還需在備份FAT表的相應位置填入正確的內容。

④ 刪文件。刪除文件時,除了將該文件對應的目錄數據結構置相應標誌外,還要修改FAT表及備份FAT表。將此文件使用的簇號位置清0,表示此簇當前未被使用。

2.2.5 Bulk傳輸流程
  使用U盤的Bulk端點進行數據傳送,Bulk傳輸分為Bulk-In和Bulk-Out。其中Bulk-In指的是主機向外圍設備請求數據,由外圍設備向主機發送數據。Bulk-Out的傳輸方向與Bulk-In相反,由主機向外圍設備發送數據。

  根據UFI規範的定義,每次讀寫操作都以邏輯塊(扇區)為單位。一般U盤的一個扇區為512位元組,而Bulk端點的最大包長為64位元組,即一個扇區的讀寫操作需要8個循環才能完成。

(1)Bulk-In流程
  Bulk-In流程如圖3所示。
            
  在接收設備數據的循環中,因為一個扇區的操作需要8次才能完成,因此要注意每接收一個數據包,都要將SL811HS寄存器0中的數據位(位6)變換一次。data1和data0交替使用。

(2)Bulk-Out流程
  與Bulk-In流程差不多,只是在CBW數據包中,註明了下一階段的傳輸方向為主機到外圍設備。在CBW發送ACK之後,向設備的Out端點發送 PID-OUT數據包,使得設備接收所要傳送的數據。在數據傳輸完畢后,仍要向設備的In端點發送PID-IN數據包,讀取設備的CSW數據包,判斷傳輸結果,並進行相應處理。

  在發送數據的循環中,同樣要注意data0和data1的交替使用問題。

結 語
  目前開發的在嵌入式系統中利用USB主控晶元實現與U盤的操作技術,已應用在我們自主開發研製的消防產品中。實現了消防控制器與U盤之間的各類信息的傳輸,為數據分析提供了有利的手段。在越來越多的消費類市場,這一技術必將有更為廣闊的應用前景。

                 參考文獻
1 Universal Serial Bus Specification 1.1
2 Universal Serial Bus Mass Storage Class UFI Command Specification
3 Universal Serial Bus Mass Storage Class Bulk-Only Transport
4 Microsoft. Microsoft Extensible Firmware Initiative FAT32 File System Specification
5 Cypress Semiconductor Corporation. SL811HS Embedded USB Host/Slave Controller


[admin via 研發互助社區 ] 用SL811HS實現對U盤的操作已經有4833次圍觀

http://www.cocdig.com/docs/show-post-45173.html