新聞中心

EEPW首頁 > 模擬技術(shù) > 設(shè)計應(yīng)用 > USB嵌入式主機(jī)控制器設(shè)計

USB嵌入式主機(jī)控制器設(shè)計

——
作者:Mark Schultz 時間:2005-10-14 來源: 收藏

介紹

  過去僅應(yīng)用于個人計算機(jī)其在系統(tǒng)領(lǐng)域的巨大潛力尚未開發(fā)系統(tǒng)中的應(yīng)用包括KVM開關(guān)數(shù)碼相機(jī)PDA打印機(jī)機(jī)頂盒及移動電話

  什幺是系統(tǒng)嵌入式系統(tǒng)被定義為硬件和固件--獨立的或作為更大型系統(tǒng)的一部分--通常帶有某種操作系統(tǒng)操作系統(tǒng)可以是Windows CEVxWorks或由“自編代碼”構(gòu)成的更簡單系統(tǒng)根據(jù)上述定義可以認(rèn)為任何帶有處理器的電子裝置均可以作為嵌入式主機(jī)

嵌入式系統(tǒng)的設(shè)計挑戰(zhàn)

  在基于PC的系統(tǒng)中三種主要部件需要USB操作它們是通常作為PCI子系統(tǒng)部分的主機(jī)控制器USB堆棧以及USB類驅(qū)動器

  主機(jī)控制器是集成主板芯片組的部分USB堆棧則包含主板芯片以及UCHI通用主機(jī)控制器接口OHCI開放主機(jī)控制器接口的驅(qū)動程序以及USB驅(qū)動程序(usbd.sys)實現(xiàn)基于PC的USB需要以上所有領(lǐng)域的專門技術(shù)

  在USB嵌入式系統(tǒng)中其主要組成部分與PC系統(tǒng)類似這些組成部分為嵌入式主機(jī)控制器芯片帶OHCI堆棧的實時操作系統(tǒng)(RTOS)以及專用驅(qū)動程序

  現(xiàn)有很多可供選擇的主機(jī)控制器芯片有些帶有處理器有些則以寄存器為基礎(chǔ)此處組成部分設(shè)備的選擇將會影響如下兩個層面

  很多公司可提供RTOS最好選擇一個處理器和與之配合工作的RTOS然后在其上添加應(yīng)用代碼如果沒有真正的RTOS某些控制器帶有可構(gòu)造應(yīng)用的“框架”以下介紹這種框架的示例以及如何在其上構(gòu)造應(yīng)用

  在PC上實現(xiàn)USB時PC具有豐富的可用資源其中包括高達(dá)512MB字節(jié)的存儲器20-60GB的硬盤以及2GHz或速度更快的微處理器此外五年多來WindowsMAC OS以及Unix等操作系統(tǒng)一直支持USB世界上有數(shù)以百計或數(shù)以千計的工程師在設(shè)計基于PC的USB應(yīng)用程序和設(shè)備驅(qū)動程序

  而另一方面嵌入式系統(tǒng)通常只有不超過64K的存儲器以及運行于12MHz - 33MHz范圍內(nèi)的處理器沒有硬盤由于USB對于嵌入式系統(tǒng)相對較新因此可能只有為數(shù)不多的工程師擁有這方面的經(jīng)驗

賽普拉斯EZ-Host 控制器

  賽普拉斯EZ-Host器件擁有兩個“串行接口引擎”每個引擎包含兩個USB端口因此無需使用額外的硬件EZ-Host便可控制四個USB設(shè)備

  EZ-Host器件具有固件結(jié)構(gòu)可管理大多數(shù)USB主機(jī)的詳細(xì)要求該結(jié)構(gòu)的另一個特點是支持網(wǎng)絡(luò)集線器鍵盤/集線器組合部件常常出現(xiàn)這樣的問題是帶有集線器的鍵盤還是帶有鍵盤的集線器答案是帶有鍵盤的集線器因此要了解位于集線器后的鍵盤需要提供集線器支持幸好框架代碼包含對集線器的支持

  以下章節(jié)將介紹框架和某些框架操作示例以及如何將其與應(yīng)用代碼接口

框架概述

  EZ-Host框架包含所有實現(xiàn)USB主機(jī)功能所必需的固件其中包含任務(wù)時序設(shè)備列舉帶寬分配以及功率管理

  另一方面應(yīng)用程序是固件控制專用USB設(shè)備并將其數(shù)據(jù)傳遞給最終應(yīng)用

  框架的核心是TD處理器TD處理器的運作基于稱作“任務(wù)描述器”(TD)的數(shù)據(jù)結(jié)構(gòu)使用其信息與USB硬件尤其是“串行接口引擎”(SIE)進(jìn)行通信需要注意的是每個SIE控制兩個端口而且每個SIE具有一個TD處理器

  EZ-Host框架使用了多種數(shù)據(jù)結(jié)構(gòu)實現(xiàn)來其操作這些結(jié)構(gòu)包括TD和USB“請求模塊”(URB)

  任務(wù)描述器是傳遞給硬件的數(shù)據(jù)結(jié)構(gòu)包含特定硬件接口如SIE的數(shù)據(jù)字段端口編號終點數(shù)收發(fā)數(shù)據(jù)緩沖器長度數(shù)據(jù)包ID編碼以及URB結(jié)構(gòu)指示器

  URB包含TD所需的邏輯信息該邏輯信息包括USB設(shè)備緩沖器安裝軟件包以及USB設(shè)備結(jié)構(gòu)指示器

  在進(jìn)行USB事務(wù)處理時URB含有事務(wù)處理分配及其裝入的數(shù)據(jù)結(jié)構(gòu)而后URB提交給TD處理器TD處理器將URB加入TD列表空閑時TD處理器處理TD列表安排傳輸時序并將設(shè)定好的TD傳送給EZ-Host硬件進(jìn)行處理

圖1所示為基本的USB控制傳輸該圖表為TD處理器處理USB傳輸?shù)氖纠?

 


圖1USB控制傳輸

  為了執(zhí)行控制轉(zhuǎn)移可以使用框架函數(shù)send_request( )send_request( )函數(shù)將分配一個傳遞給TD處理器的URB結(jié)構(gòu)

  URB應(yīng)該包含有關(guān)設(shè)置狀態(tài)的信息并且借助參數(shù)傳遞給send_request( )URB需要如下信息

  請求類型 - 表示USB請求類型的字節(jié)該字節(jié)包含表示傳輸方向傳輸類型以及傳輸接受者的位

  請求 - 11種標(biāo)準(zhǔn)USB請求之一這些請求包括

  Clear_FeatureGet_ConfigurationGet_DescriptorGet_InterfaceGet_StatusSet_AddressSet_ConfigurationSet_DescriptorSet_FeatureSet_InterfaceSynch_Frame

值 - 特殊請求字段

索引 - 特殊請求字段

長度 - 有關(guān)數(shù)據(jù)緩沖器的大小


  一旦載入用于URB的設(shè)置信息便可將其它設(shè)備信息裝入URB如地址速度終點數(shù)以及傳輸方向還有表示傳輸類型的字節(jié)和“回調(diào)”函數(shù)指示器使用回調(diào)函數(shù)可以在框架內(nèi)進(jìn)行某些并行操作可在硬件處理USB操作的同時執(zhí)行其它任務(wù)TD需要USB傳輸類型信息這樣框架可以安排正確的傳輸類型的時序同樣地與批量或中斷傳輸相反框架一次只允許進(jìn)行一個控制傳輸操作

  裝入所有的URB信息之后將URB提交給TD處理器TD處理器是框架的組成部分它與硬件直接通信處理有關(guān)傳輸?shù)牡图壴敿?xì)資料TD完成任務(wù)后TD處理器將項目控制轉(zhuǎn)換為原始調(diào)用指定的“回調(diào)”函數(shù)轉(zhuǎn)換為 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é)構(gòu)相匹配并存取與國家代碼相對應(yīng)的字節(jié)此后URB被釋放


 


圖3調(diào)用和回調(diào)函數(shù)

  EZ-Host框架值得注意的最后一個特點是設(shè)備驅(qū)動程序的使用在執(zhí)行過程中設(shè)備驅(qū)動程序?qū)?zhí)行三個功能停止啟動和運行啟動某設(shè)備驅(qū)動程序時便是運行它的run( )函數(shù)該函數(shù)對某些數(shù)值進(jìn)行初始化并分配一個用于數(shù)據(jù)傳輸?shù)闹噩F(xiàn)URB對于鼠標(biāo)或鍵盤該URB將每隔10毫秒發(fā)生一次數(shù)據(jù)傳輸完成后TD處理器將控制轉(zhuǎn)換為 interrupt_in_complete( )函數(shù)通過檢查URB可以得知數(shù)據(jù)是來自鍵盤還是來自鼠標(biāo)這種回調(diào)函數(shù)負(fù)責(zé)將鍵盤或鼠標(biāo)數(shù)據(jù)發(fā)送至應(yīng)用層面以下是用于數(shù)據(jù)傳輸?shù)幕卣{(diào)函數(shù)示例


 

圖4中斷傳輸回調(diào)函數(shù)

  當(dāng)某驅(qū)動程序停止時其重現(xiàn)URB從TD列表中除去并釋放此外消息傳送至應(yīng)用層面除去相關(guān)的設(shè)備如果與停止驅(qū)動程序相關(guān)的設(shè)備是集線器則與該集線器相連的所有設(shè)備也被移除并且其驅(qū)動程序停止當(dāng)然如果這些移除的設(shè)備中有集線器則與該集線器相連的設(shè)備將以同樣方式移除

  在驅(qū)動程序的運行期間系統(tǒng)可執(zhí)行各種任務(wù)對于集線器的設(shè)備驅(qū)動程序要檢查集線器的端口以了解是否有設(shè)備插入和移除鍵盤和鼠標(biāo)驅(qū)動程序的運行函數(shù)不起任何作用

框架流式

  框架代碼執(zhí)行如下上電復(fù)位微處理器對所有的寄存器和計數(shù)器以及設(shè)備結(jié)構(gòu)進(jìn)行初始化然后進(jìn)入如下的循環(huán)

1.檢查主機(jī)USB端口是否存在狀態(tài)的改變設(shè)備插入或移除

2.檢查TD處理器并獲得運行于兩個SIE上的所有TD的狀態(tài)信息

3.查看運行設(shè)備驅(qū)動程序列表并執(zhí)行每個程序的運行函數(shù)

  檢查主機(jī)USB端口以了解狀態(tài)變化這需要檢查變量的改變?nèi)绻l(fā)生變化可通過端口變化中斷處理程序設(shè)定變量如果端口改變將執(zhí)行枚舉代碼來處理這個變化

  通過集線器至主機(jī)的中斷傳輸完成相連集線器變化值的檢查如果發(fā)生設(shè)備添加或移除它們將像上例那樣列舉出發(fā)現(xiàn)新設(shè)備時需匹配其設(shè)備驅(qū)動程序然后裝入匹配設(shè)備驅(qū)動程序與設(shè)備的方法有多種框架代碼將首先試著將某驅(qū)動程序與某設(shè)備的供應(yīng)商ID和產(chǎn)品ID進(jìn)行匹配只有存在特定的制造商而且特定設(shè)備在特定驅(qū)動程序中運行這種方法才起作用如果沒有實現(xiàn)匹配框架代碼會試著對設(shè)備的種類和子類進(jìn)行匹配這可實現(xiàn)更普通的驅(qū)動程序與設(shè)備匹配

  設(shè)備插入和移除檢查還有兩項附加任務(wù)如果連接的設(shè)備是集線器必須對其端口進(jìn)行檢查以查看它們是否帶有設(shè)備如果移除的設(shè)備是集線器所有與其連接的設(shè)備也必須移除

  通過中斷傳輸還可以檢查來自相連鍵盤和鼠標(biāo)設(shè)備的新數(shù)據(jù)這些傳輸每10毫秒種發(fā)生一次由TD處理器安排時序任務(wù)完成后TD處理器將傳輸控制轉(zhuǎn)換為回調(diào)函數(shù)這時可提取鍵盤和鼠標(biāo)數(shù)據(jù)并送至應(yīng)用層面

構(gòu)建應(yīng)用

  下一節(jié)將介紹如何構(gòu)建控制鍵盤和鼠標(biāo)的簡單嵌入式USB設(shè)計

  該方案使用基于處理器的USB主機(jī)控制器處理器的代碼將包含框架和應(yīng)用固件首先要做的是確定想要支持設(shè)備的數(shù)量和類型確定了設(shè)備數(shù)量后可據(jù)此分配URB和驅(qū)動程序空間通過修改名為fwxcfg.h的“個性化”文件完成URB分配

  每個鍵盤鼠標(biāo)或集線器均需要一個URB來處理其在傳輸中的復(fù)現(xiàn)中斷此外在列舉和其它USB控制傳輸過程中URB被分配并隨后釋放一種好的經(jīng)驗法則是為系統(tǒng)支持的每個設(shè)備分配兩個URB一個分配URB用于傳輸中的復(fù)現(xiàn)中斷另一個則用于任何可能的控制傳輸這些傳輸可能發(fā)生在設(shè)備列舉或設(shè)備狀態(tài)檢查的過程中雖然每次只能處理一個控制傳輸框架可將附加傳輸排列系統(tǒng)支持的URB數(shù)量應(yīng)該等于所支持設(shè)備數(shù)量的二倍

  接下來需要為鍵盤和鼠標(biāo)創(chuàng)建驅(qū)動程序由于這些設(shè)備的USB功能非常相近所以兩個設(shè)備可以使用一個驅(qū)動程序該驅(qū)動程序可稱為hid_driver用于人機(jī)界面設(shè)備的驅(qū)動程序下一步是在驅(qū)動程序內(nèi)添加開始停止以及運行函數(shù)以及查找驅(qū)動程序的設(shè)備種類編碼還需要將驅(qū)動程序函數(shù)的名稱添加進(jìn)文件drvrlist.h包含集線器和hid driver的驅(qū)動程序聲明如下


#define FWX_DRIVER_LIST { &hid_driver, &hubclass_driver }


  hid_driver啟動函數(shù)將分配傳輸中的復(fù)現(xiàn)中斷以獲得鍵盤和鼠標(biāo)數(shù)據(jù)該函數(shù)內(nèi)的編碼將獲得數(shù)據(jù)并將數(shù)據(jù)傳給編碼應(yīng)用層停止函數(shù)將釋放復(fù)現(xiàn)中斷傳輸并通知應(yīng)用層面設(shè)備已被移除運行函數(shù)將用來檢查來自應(yīng)用代碼的輸入指令

  接下來需要為列舉通報函數(shù)添加一些代碼列舉通報函數(shù)是列舉代碼使用的回調(diào)函數(shù)用于報告設(shè)備列舉的狀態(tài)并處理可能的列舉錯誤該代碼可將有關(guān)新列舉設(shè)備的信息傳給應(yīng)用層面

  在這里集線器支持很容易不需要添加任何代碼也不需要編寫驅(qū)動程序因為框架已包含驅(qū)動程序所要做的是更改fwxcfg.h中的語句從


#undef FWX_INCLUDE_HUB_SUPPORT


#define FWX_INCLUDE_HUB_SUPPORT


  并將文件hubclass.c添加進(jìn)項目“形成文件”makefile其余的事務(wù)由框架處理

總結(jié)

  與PC相比盡管USB主機(jī)系統(tǒng)在計算資源和經(jīng)驗方面存在不足開發(fā)人員仍然可以很簡單地將USB功能加入其嵌入式系統(tǒng)現(xiàn)有數(shù)種用于實現(xiàn)此功能的USB主機(jī)IC可供選擇用戶可購買或開發(fā)USB主機(jī)堆棧和“實時操作系統(tǒng)”

  本文論述如何僅僅使用一個附加IC并且不使用第三方軟件來實現(xiàn)USB嵌入式主機(jī)USB嵌入式主機(jī)框架可處理所有的較低級技術(shù)細(xì)節(jié)賽普拉斯的EZ-Host USB主機(jī)可在不進(jìn)行額外編碼的情況下支持HID設(shè)備和集線器該系統(tǒng)目前最多可支持8個設(shè)備和兩個集線器等級可方便地實現(xiàn)更多設(shè)備和更多等級的支持當(dāng)前代碼的大小大約為22k字節(jié)設(shè)計人員所需做的是為整個系統(tǒng)添加專用代碼



關(guān)鍵詞: USB 嵌入式

評論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉