Global Sources
電子工程專輯
 
電子工程專輯 > 控制技術/MCU
 
 
控制技術/MCU  

嵌入式系統中USB主機控制器的設計

上網時間: 2004年02月15日     打印版  Bookmark and Share  字型大小:  

關鍵字:embedded system  USB  host controller  framework  嵌入式系統 

個人電腦是USB最大量的應用領域,在它在嵌入式系統領域的巨大潛力還沒有被開發,USB在嵌入式系統中的應用包括KVM開關、數位相機、PDA、印表機、視訊轉換盒以及行動電話等。本文將介紹在嵌入式系統中應用USB時其主機控制器的設計。

嵌入式系統被定義為硬體和韌體(獨立的或作為更大型系統的一部份)通常具有某種作業系統,作業系統可以是Windows CE、VxWorks或其它由‘自編程式碼’構成的更簡單系統。根據這樣的定義,任何具有處理器的電子裝置均可以被視為USB嵌入式主機。

嵌入式系統設計挑戰

在基於PC的系統中,USB作業一般需要三種元件,分別是通常作為PCI子系統的主機控制器、USB堆疊以及USB類驅動器。

主機控制器是整合主板晶片組的一部份,USB堆疊則包含主板晶片及通用主機控制器介面(UCHI)和開放主機控制器介面(OHCI)驅動程式以及USB驅動程式(usbd.sys),在PC上實現USB需要上述領域的專門技術。

在嵌入式USB系統中,其主要組成部份與PC系統類似,如嵌入式主機控制器晶片、帶OHCI堆疊的即時作業系統(RTOS)以及專用驅動程式。現有很多可供選擇的主機控制器晶片,有些具有處理器,有些則是基於暫存器的,對元件的選擇將影響到其下面兩層。

很多公司都可提供RTOS,最好選擇一個能配合在一起工作的處理器和RTOS,然後在其上添加應用程式碼。如果沒有真正的RTOS,某些控制器則用一個‘框架’,可在其上構造應用程式。我們後面將介紹這種框架以及如何在上面建構應用。

在PC上實現USB具有非常豐富的可用資源,包括高達512MB的記憶體、20-60GB的硬碟以及2GHz或更快的微處理器。此外,多年來Windows、MAC OS以及Unix等作業系統也一直支援USB,而且世界上還有成千上萬的工程師在設計基於PC的USB應用程式和設備驅動程式。而對嵌入式系統來說,通常只有不超過64K的記憶體,以及執行於12MHz∼33MHz的處理器,且沒有硬碟。由於USB對嵌入式系統相對較新,因此可能只有為數不多的工程師擁有這方面的經驗。

控制器與框架

下面我們以CypressEZ-Host為例介紹嵌入式系統USB控制器與框架結構。EZ-Host有兩個‘串列介面引擎’,每個引擎包含兩個USB埠,因此無需使用額外硬體EZ-Host便可控制四個USB設備。

EZ-Host元件具有韌體結構,可管理大多數USB主機的詳細請求。該結構另一個特點是支援網路集線器。鍵盤╱集線器組合在一起常常帶來這樣的問題,即它究竟是具有集線器的鍵盤還是具有鍵盤的集線器?答案應該是具有鍵盤的集線器。因此要了解集線器後面的鍵盤,還需要提供集線器支援。幸好,這裡的框架程式碼包含了對集線器的支援。

EZ-Host框架包含所有實現USB主機功能所必需的韌體,包括任務調度、設備列舉、頻寬分配以及功率管理。另外應用程式作為韌體的一部份,控制專用USB設備並將其數據傳遞給最終應用。

框架的核心是TD處理器。TD處理器的執行基於一種稱為‘任務描述器(TD)’的數據結構,使用其資訊與USB硬體尤其是‘串列介面引擎(SIE)’進行通訊。需要注意的是每個SIE控制兩個埠,而且每個SIE具有一個TD處理器。EZ-Host框架使用了多種數據結構實現其作業,這些結構包括TD和USB請求模組(URB)。

任務描述器是傳遞給硬體的數據結構,包含特定硬體介面(如SIE)和埠編號的數據字段、終點數、收發數據緩衝器長度、數據包ID編碼以及URB結構指示器。

URB含有TD所需的邏輯資訊,該邏輯資訊包括USB設備緩衝器、安裝套裝軟體以及USB設備結構指示器。

進行USB事務處理時,URB具有事務處理分配及其裝入的數據結構,而後URB交給TD處理器,TD處理器再將URB加入TD列表。空閑時,TD處理器處理TD列表,安排傳輸時序,並將設定好的TD傳送給EZ-Host硬體進行處理。

為了執行控制轉移,可以使用框架函數send_request(),send_request()函數將分配一個傳遞給TD處理器的URB結構。URB應該包含有關設置狀態的資訊,並且借助參數傳遞給send_request()。URB需要的資訊包括:


* 請求類型:顯示USB請求類型的位元組,該位元組包含表示傳輸方向、傳輸類型以及傳輸接受方的位。


* 請求:11種標準USB請求中的一種,這些請求包括:Clear_Feature、Get_Configuration、Get_Descriptor、Get_Interface、Get_Status、Set_Address、Set_Configuration、Set_Descriptor、Set_Feature、Set_Interface、Synch_Frame。


* 值:特殊請求字段。


* 索引:特殊請求字段。


* 長度:相關數據緩衝器的大小

載入用於URB的設置資訊之後,便可將其它設備資訊裝入URB,如地址、速度、終點數以及傳輸方向,還有表示傳輸類型的位元組和‘回調’函數指示器。利用回調函數可以在框架內進行某些平行作業,也可在硬體處理USB作業的同時執行其它任務。TD需要USB傳輸類型資訊,這樣框架就可以安排正確的傳輸類型時序。此外,與批次或中斷傳輸相反,框架一次只允許進行一個控制傳輸作業。

裝入所有URB資訊之後,URB便被提交給TD處理器。TD處理器是框架的組成部份,它與硬體直接通訊,處理有關傳輸的低級詳細資料。TD完成任務後,TD處理器將程式控制權由原始調用指定的‘回調’函數轉給send_request()函數(圖1)。

圖2顯示了調用帶回調函數的send_request()。這裡我們使用控制傳輸以獲得某鍵盤的國家程式碼,在get_country_code()函數中可看到send_request()的調用,注意send_request()調用中的最後一個參數是回調函數。在TD處理器確定硬體完成處理後執行該函數,此時回調函數將獲得返回的數據緩衝器,將其與HID描述器結構相匹配,並存取與國家程式碼對應的位元組,然後URB被釋放。

EZ-Host框架值得注意的最後一個特點是設備驅動程式的使用。在執行過程中,設備驅動程式將執行三個功能,即停止、啟動和執行。啟動某設備驅動程式便是執行它的run()函數,該函數對某些數值進行初始化,並分配一個用於數據傳輸的重覆出現的URB。對於滑鼠或鍵盤,該URB將每隔10毫秒產生一次。數據傳輸完成後,TD處理器將控制轉交給interrupt_in_complete()函數,透過檢查URB可得知數據是來自鍵盤還是來自滑鼠,該回調函數負責將鍵盤或滑鼠數據發送至應用層(圖3)。

當某驅動程式停止時,其重覆出現的URB將從TD列表中除去並釋放出空間,然後傳送一個消息至應用層,去掉相關設備。如果停止的驅動程式相關設備是集線器,則與該集線器相連的所有設備也要去除,且驅動程式同時停止。當然,如果去除的設備中還有集線器,則與該集線器相連的設備將以同樣方式去除。

在驅動程式執行期間,系統可執行各種任務。對於集線器設備驅動程式,要檢查集線器的埠,以了解是否有設備插入和去除。這裡鍵盤和滑鼠驅動程式執行函數不起任何作用。

框架數據流

框架程式碼執行過程是這樣的:上電重啟、微處理器對所有暫存器和計數器以及設備結構進行初始化,然後進入如下的循環:


1.檢查主機USB埠是否存在狀態改變(設備插入或去除)。


2.檢查TD處理器,並獲得兩個SIE上執行的所有TD狀態資訊。


3.查看執行設備驅動程式列表並執行每個程式的執行函數。

檢查主機USB埠以了解狀態變化需要檢查變量的改變,如果產生變化,可透過埠變化中斷處理程式設定變量。如果埠產生改變,將執行列舉程式碼進行處理。

透過集線器至主機的中斷傳輸完成相連集線器變化值檢查,如果產生設備添加或去除,它們將像上面那樣列舉出來。發現新設備時,需要找到設備驅動程式然後裝入。根據設備尋找設備驅動程式的方法有很多種,框架程式碼將首先嘗試將某驅動程式與某設備的供應商ID以及產品ID進行匹配,但只有存在特定的製造商且特定設備在特定驅動程式中執行這種方法才有效。如果沒有實現匹配,框架程式碼會嘗試對設備的種類和子類進行匹配,這可以利用更普通的驅動程式與設備匹配。

設備插入和去除檢查還有兩項額外的任務。如果連接的設備是集線器,則必須對其埠進行檢查,以查看它們是否具有設備。如果去除的設備是集線器,那麼所有與之連接的設備也必須去除。

透過中斷傳輸還可以檢查來自相連鍵盤和滑鼠設備的新數據,這些傳輸每10毫秒種產生一次,由TD處理器安排時序。任務完成後,TD處理器將傳輸控制轉給回調函數,這時可擷取鍵盤和滑鼠數據,並送至應用層。

建構應用

接下來介紹如何建構一個簡單的控制鍵盤和滑鼠的嵌入式USB設計,該方案使用基於處理器的USB主機控制器,處理器的程式碼包含框架和應用韌體。首先要做的是確定希望支援設備的數量和類型,確定設備數量後,可據此分配URB和驅動程式空間,透過修改名為fwxcfg.h的‘個性化’文件完成URB分配。

每個鍵盤、滑鼠或集線器均需要一個URB來處理傳輸中重覆出現的中斷。此外,在列舉和其它USB控制傳輸過程中,URB被分配並隨後釋放。一個較好的經驗是為系統支援的每個設備分配兩個URB,一個用於傳輸中重覆出現的中斷,另一個則用於任何可能的控制傳輸,這些傳輸可能產生在設備列舉或設備狀態檢查過程中。雖然每次只能處理一個控制傳輸,但框架可將其它傳輸排隊,系統支援的URB數量應該等於所支援設備數量的兩倍。

接下來,需要為鍵盤和滑鼠製作驅動程式。由於這些設備的USB功能非常相近,所以兩個設備可以使用一個驅動程式。該驅動程式可稱為hid_driver(用於人機介面設備的驅動程式)。下一步是在驅動程式內添加開始、停止以及執行函數,以及查找驅動程式的設備種類編碼,還需要將驅動程式函數的名稱添加進文件drvrlist.h。包含集線器和hid driver的驅動程式聲明如下:

#define FWX_DRIVER_LIST {&hid_driver, &hubclass_driver}

hid_driver啟動函數將分配傳輸中重覆出現的中斷,以獲得鍵盤和滑鼠數據。該函數內的編碼將獲取數據並將數據傳給編碼應用層;停止函數將釋放重覆出現的中斷傳輸,並通知應用層設備已被去除;執行函數用來檢查來自應用程式碼的輸入指令。

然後需要為列舉通報函數添加一些程式碼,列舉通報函數是列舉程式碼使用的回調函數,用於報告設備列舉狀態並處理可能的列舉錯誤。該程式碼可將新的列舉設備資訊傳給應用層。

在這裡對集線器提供支援很容易,不需要添加任何程式碼,也不需要編寫驅動程式,因為框架已包含驅動程式。所要做的是更改fwxcfg.h中的語句,即將


#undef FWX_INCLUDE_HUB_SUPPORT


改為


#define FWX_INCLUDE_HUB_SUPPORT


並將文件hubclass.c添加進計畫形成文件,其餘事務由框架處理。

本文小結

儘管與PC相較,USB主機系統在運算資源和經驗方面存在不足,但開發人員仍然可以較為簡單地將USB功能加入到嵌入式系統中。現有多種用於實現這種功能的USB主機IC可供選擇,用戶可購買或自行開發USB主機堆疊和即時作業系統。

另外本文論述如何僅僅使用一個附加IC且不使用第三方軟體來實現USB嵌入式主機設計,USB嵌入式主機框架可處理所有低級技術細節。EZ-Host USB主機能夠在不進行額外編碼情況下支援HID設備和集線器,該系統目前最多可支援8個設備和兩個集線器,並可方便地實現更多設備和更多級支援。目前程式碼大小大約為22K位元組,設計人員所需做的僅僅是為整個系統添加專用程式碼。

作者:Mark Schultz


高級應用工程師


Cypress半導體公司




投票數:   加入我的最愛
我來評論 - 嵌入式系統中USB主機控制器的設計
評論:  
*  您還能輸入[0]個字
*驗證碼:
 
論壇熱門主題 熱門下載
 •   將邁入40歲的你...存款多少了  •  深入電容觸控技術就從這個問題開始
 •  我有一個數位電源的專利...  •  磷酸鋰鐵電池一問
 •   關於設備商公司的工程師(廠商)薪資前景  •  計算諧振轉換器的同步整流MOSFET功耗損失
 •   Touch sensor & MEMS controller  •  針對智慧電表PLC通訊應用的線路驅動器
 •   下週 深圳 llC 2012 關於PCB免費工具的研討會  •  邏輯閘的應用


EE人生人氣排行
 
返回頁首