USB嵌入式主機控制器設計
介紹
過去USB僅應用于個人計算機其在嵌入式系統(tǒng)領域的巨大潛力尚未開發(fā)USB在嵌入式系統(tǒng)中的應用包括KVM開關數(shù)碼相機PDA打印機機頂盒及移動電話
什幺是嵌入式系統(tǒng)嵌入式系統(tǒng)被定義為硬件和固件--獨立的或作為更大型系統(tǒng)的一部分--通常帶有某種操作系統(tǒng)操作系統(tǒng)可以是Windows CEVxWorks或由“自編代碼”構成的更簡單系統(tǒng)根據(jù)上述定義可以認為任何帶有處理器的電子裝置均可以作為USB嵌入式主機
嵌入式系統(tǒng)的設計挑戰(zhàn)
在基于PC的系統(tǒng)中三種主要部件需要USB操作它們是通常作為PCI子系統(tǒng)部分的主機控制器USB堆棧以及USB類驅動器
主機控制器是集成主板芯片組的部分USB堆棧則包含主板芯片以及UCHI通用主機控制器接口OHCI開放主機控制器接口的驅動程序以及USB驅動程序(usbd.sys)實現(xiàn)基于PC的USB需要以上所有領域的專門技術
在USB嵌入式系統(tǒng)中其主要組成部分與PC系統(tǒng)類似這些組成部分為嵌入式主機控制器芯片帶OHCI堆棧的實時操作系統(tǒng)(RTOS)以及專用驅動程序
現(xiàn)有很多可供選擇的主機控制器芯片有些帶有處理器有些則以寄存器為基礎此處組成部分設備的選擇將會影響如下兩個層面
很多公司可提供RTOS最好選擇一個處理器和與之配合工作的RTOS然后在其上添加應用代碼如果沒有真正的RTOS某些控制器帶有可構造應用的“框架”以下介紹這種框架的示例以及如何在其上構造應用
在PC上實現(xiàn)USB時PC具有豐富的可用資源其中包括高達512MB字節(jié)的存儲器20-60GB的硬盤以及2GHz或速度更快的微處理器此外五年多來WindowsMAC OS以及Unix等操作系統(tǒng)一直支持USB世界上有數(shù)以百計或數(shù)以千計的工程師在設計基于PC的USB應用程序和設備驅動程序
而另一方面嵌入式系統(tǒng)通常只有不超過64K的存儲器以及運行于12MHz - 33MHz范圍內(nèi)的處理器沒有硬盤由于USB對于嵌入式系統(tǒng)相對較新因此可能只有為數(shù)不多的工程師擁有這方面的經(jīng)驗
賽普拉斯EZ-Host 控制器
賽普拉斯EZ-Host器件擁有兩個“串行接口引擎”每個引擎包含兩個USB端口因此無需使用額外的硬件EZ-Host便可控制四個USB設備
EZ-Host器件具有固件結構可管理大多數(shù)USB主機的詳細要求該結構的另一個特點是支持網(wǎng)絡集線器鍵盤/集線器組合部件常常出現(xiàn)這樣的問題是帶有集線器的鍵盤還是帶有鍵盤的集線器答案是帶有鍵盤的集線器因此要了解位于集線器后的鍵盤需要提供集線器支持幸好框架代碼包含對集線器的支持
以下章節(jié)將介紹框架和某些框架操作示例以及如何將其與應用代碼接口
框架概述
EZ-Host框架包含所有實現(xiàn)USB主機功能所必需的固件其中包含任務時序設備列舉帶寬分配以及功率管理
另一方面應用程序是固件控制專用USB設備并將其數(shù)據(jù)傳遞給最終應用
框架的核心是TD處理器TD處理器的運作基于稱作“任務描述器”(TD)的數(shù)據(jù)結構使用其信息與USB硬件尤其是“串行接口引擎”(SIE)進行通信需要注意的是每個SIE控制兩個端口而且每個SIE具有一個TD處理器
EZ-Host框架使用了多種數(shù)據(jù)結構實現(xiàn)來其操作這些結構包括TD和USB“請求模塊”(URB)
任務描述器是傳遞給硬件的數(shù)據(jù)結構包含特定硬件接口如SIE的數(shù)據(jù)字段端口編號終點數(shù)收發(fā)數(shù)據(jù)緩沖器長度數(shù)據(jù)包ID編碼以及URB結構指示器
URB包含TD所需的邏輯信息該邏輯信息包括USB設備緩沖器安裝軟件包以及USB設備結構指示器
在進行USB事務處理時URB含有事務處理分配及其裝入的數(shù)據(jù)結構而后URB提交給TD處理器TD處理器將URB加入TD列表空閑時TD處理器處理TD列表安排傳輸時序并將設定好的TD傳送給EZ-Host硬件進行處理
圖1所示為基本的USB控制傳輸該圖表為TD處理器處理USB傳輸?shù)氖纠?
圖1USB控制傳輸
為了執(zhí)行控制轉移可以使用框架函數(shù)send_request( )send_request( )函數(shù)將分配一個傳遞給TD處理器的URB結構
URB應該包含有關設置狀態(tài)的信息并且借助參數(shù)傳遞給send_request( )URB需要如下信息
請求類型 - 表示USB請求類型的字節(jié)該字節(jié)包含表示傳輸方向傳輸類型以及傳輸接受者的位
請求 - 11種標準USB請求之一這些請求包括
Clear_FeatureGet_ConfigurationGet_DescriptorGet_InterfaceGet_StatusSet_AddressSet_ConfigurationSet_DescriptorSet_FeatureSet_InterfaceSynch_Frame
值 - 特殊請求字段
索引 - 特殊請求字段
長度 - 有關數(shù)據(jù)緩沖器的大小
一旦載入用于URB的設置信息便可將其它設備信息裝入URB如地址速度終點數(shù)以及傳輸方向還有表示傳輸類型的字節(jié)和“回調(diào)”函數(shù)指示器使用回調(diào)函數(shù)可以在框架內(nèi)進行某些并行操作可在硬件處理USB操作的同時執(zhí)行其它任務TD需要USB傳輸類型信息這樣框架可以安排正確的傳輸類型的時序同樣地與批量或中斷傳輸相反框架一次只允許進行一個控制傳輸操作
裝入所有的URB信息之后將URB提交給TD處理器TD處理器是框架的組成部分它與硬件直接通信處理有關傳輸?shù)牡图壴敿氋Y料TD完成任務后TD處理器將項目控制轉換為原始調(diào)用指定的“回調(diào)”函數(shù)轉換為 send_request( ) 函數(shù)
圖2send_request( )函數(shù)
以下的圖3所示為調(diào)用帶回調(diào)函數(shù)的send_request( )在此例中我們使用控制傳輸以獲得某鍵盤的國家代碼在get_country_code( )函數(shù)中可看到send_request( )的調(diào)用注意send_request( )調(diào)用中的最后一個參數(shù)是回調(diào)函數(shù)在TD處理器確定硬件完成此次處理后執(zhí)行該函數(shù)這種情況下回調(diào)函數(shù)將獲得返回的數(shù)據(jù)緩沖器將其與HID描述器結構相匹配并存取與國家代碼相對應的字節(jié)此后URB被釋放
圖3調(diào)用和回調(diào)函數(shù)
EZ-Host框架值得注意的最后一個特點是設備驅動程序的使用在執(zhí)行過程中設備驅動程序將執(zhí)行三個功能停止啟動和運行啟動某設備驅動程序時便是運行它的run( )函數(shù)該函數(shù)對某些數(shù)值進行初始化并分配一個用于數(shù)據(jù)傳輸?shù)闹噩F(xiàn)URB對于鼠標或鍵盤該URB將每隔10毫秒發(fā)生一次數(shù)據(jù)傳輸完成后TD處理器將控制轉換為 interrupt_in_complete( )函數(shù)通過檢查URB可以得知數(shù)據(jù)是來自鍵盤還是來自鼠標這種回調(diào)函數(shù)負責將鍵盤或鼠標數(shù)據(jù)發(fā)送至應用層面以下是用于數(shù)據(jù)傳輸?shù)幕卣{(diào)函數(shù)示例
圖4中斷傳輸回調(diào)函數(shù)
當某驅動程序停止時其重現(xiàn)URB從TD列表中除去并釋放此外消息傳送至應用層面除去相關的設備如果與停止驅動程序相關的設備是集線器則與該集線器相連的所有設備也被移除并且其驅動程序停止當然如果這些移除的設備中有集線器則與該集線器相連的設備將以同樣方式移除
在驅動程序的運行期間系統(tǒng)可執(zhí)行各種任務對于集線器的設備驅動程序要檢查集線器的端口以了解是否有設備插入和移除鍵盤和鼠標驅動程序的運行函數(shù)不起任何作用
框架流式
框架代碼執(zhí)行如下上電復位微處理器對所有的寄存器和計數(shù)器以及設備結構進行初始化然后進入如下的循環(huán)
1.檢查主機USB端口是否存在狀態(tài)的改變設備插入或移除
2.檢查TD處理器并獲得運行于兩個SIE上的所有TD的狀態(tài)信息
3.查看運行設備驅動程序列表并執(zhí)行每個程序的運行函數(shù)
檢查主機USB端口以了解狀態(tài)變化這需要檢查變量的改變?nèi)绻l(fā)生變化可通過端口變化中斷處理程序設定變量如果端口改變將執(zhí)行枚舉代碼來處理這個變化
通過集線器至主機的中斷傳輸完成相連集線器變化值的檢查如果發(fā)生設備添加或移除它們將像上例那樣列舉出發(fā)現(xiàn)新設備時需匹配其設備驅動程序然后裝入匹配設備驅動程序與設備的方法有多種框架代碼將首先試著將某驅動程序與某設備的供應商ID和產(chǎn)品ID進行匹配只有存在特定的制造商而且特定設備在特定驅動程序中運行這種方法才起作用如果沒有實現(xiàn)匹配框架代碼會試著對設備的種類和子類進行匹配這可實現(xiàn)更普通的驅動程序與設備匹配
設備插入和移除檢查還有兩項附加任務如果連接的設備是集線器必須對其端口進行檢查以查看它們是否帶有設備如果移除的設備是集線器所有與其連接的設備也必須移除
通過中斷傳輸還可以檢查來自相連鍵盤和鼠標設備的新數(shù)據(jù)這些傳輸每10毫秒種發(fā)生一次由TD處理器安排時序任務完成后TD處理器將傳輸控制轉換為回調(diào)函數(shù)這時可提取鍵盤和鼠標數(shù)據(jù)并送至應用層面
構建應用
下一節(jié)將介紹如何構建控制鍵盤和鼠標的簡單嵌入式USB設計
該方案使用基于處理器的USB主機控制器處理器的代碼將包含框架和應用固件首先要做的是確定想要支持設備的數(shù)量和類型確定了設備數(shù)量后可據(jù)此分配URB和驅動程序空間通過修改名為fwxcfg.h的“個性化”文件完成URB分配
每個鍵盤鼠標或集線器均需要一個URB來處理其在傳輸中的復現(xiàn)中斷此外在列舉和其它USB控制傳輸過程中URB被分配并隨后釋放一種好的經(jīng)驗法則是為系統(tǒng)支持的每個設備分配兩個URB一個分配URB用于傳輸中的復現(xiàn)中斷另一個則用于任何可能的控制傳輸這些傳輸可能發(fā)生在設備列舉或設備狀態(tài)檢查的過程中雖然每次只能處理一個控制傳輸框架可將附加傳輸排列系統(tǒng)支持的URB數(shù)量應該等于所支持設備數(shù)量的二倍
接下來需要為鍵盤和鼠標創(chuàng)建驅動程序由于這些設備的USB功能非常相近所以兩個設備可以使用一個驅動程序該驅動程序可稱為hid_driver用于人機界面設備的驅動程序下一步是在驅動程序內(nèi)添加開始停止以及運行函數(shù)以及查找驅動程序的設備種類編碼還需要將驅動程序函數(shù)的名稱添加進文件drvrlist.h包含集線器和hid driver的驅動程序聲明如下
#define FWX_DRIVER_LIST { &hid_driver, &hubclass_driver }
hid_driver啟動函數(shù)將分配傳輸中的復現(xiàn)中斷以獲得鍵盤和鼠標數(shù)據(jù)該函數(shù)內(nèi)的編碼將獲得數(shù)據(jù)并將數(shù)據(jù)傳給編碼應用層停止函數(shù)將釋放復現(xiàn)中斷傳輸并通知應用層面設備已被移除運行函數(shù)將用來檢查來自應用代碼的輸入指令
接下來需要為列舉通報函數(shù)添加一些代碼列舉通報函數(shù)是列舉代碼使用的回調(diào)函數(shù)用于報告設備列舉的狀態(tài)并處理可能的列舉錯誤該代碼可將有關新列舉設備的信息傳給應用層面
在這里集線器支持很容易不需要添加任何代碼也不需要編寫驅動程序因為框架已包含驅動程序所要做的是更改fwxcfg.h中的語句從
#undef FWX_INCLUDE_HUB_SUPPORT
至
#define FWX_INCLUDE_HUB_SUPPORT
并將文件hubclass.c添加進項目“形成文件”makefile其余的事務由框架處理
總結
與PC相比盡管USB主機系統(tǒng)在計算資源和經(jīng)驗方面存在不足開發(fā)人員仍然可以很簡單地將USB功能加入其嵌入式系統(tǒng)現(xiàn)有數(shù)種用于實現(xiàn)此功能的USB主機IC可供選擇用戶可購買或開發(fā)USB主機堆棧和“實時操作系統(tǒng)”
本文論述如何僅僅使用一個附加IC并且不使用第三方軟件來實現(xiàn)USB嵌入式主機USB嵌入式主機框架可處理所有的較低級技術細節(jié)賽普拉斯的EZ-Host USB主機可在不進行額外編碼的情況下支持HID設備和集線器該系統(tǒng)目前最多可支持8個設備和兩個集線器等級可方便地實現(xiàn)更多設備和更多等級的支持當前代碼的大小大約為22k字節(jié)設計人員所需做的是為整個系統(tǒng)添加專用代碼
評論