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