新聞中心

        EEPW首頁 > 模擬技術 > 設計應用 > USB嵌入式主機控制器設計

        USB嵌入式主機控制器設計

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

        介紹

          過去僅應用于個人計算機其在系統領域的巨大潛力尚未開發系統中的應用包括KVM開關數碼相機PDA打印機機頂盒及移動電話

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

        嵌入式系統的設計挑戰

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

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

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

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

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

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

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

        賽普拉斯EZ-Host 控制器

          賽普拉斯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硬件進行處理

        圖1所示為基本的USB控制傳輸該圖表為TD處理器處理USB傳輸的示例

         


        圖1USB控制傳輸

          為了執行控制轉移可以使用框架函數send_request( )send_request( )函數將分配一個傳遞給TD處理器的URB結構

          URB應該包含有關設置狀態的信息并且借助參數傳遞給send_request( )URB需要如下信息

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

          請求 - 11種標準USB請求之一這些請求包括

          Clear_FeatureGet_ConfigurationGet_DescriptorGet_InterfaceGet_StatusSet_AddressSet_ConfigurationSet_DescriptorSet_FeatureSet_InterfaceSynch_Frame

        值 - 特殊請求字段

        索引 - 特殊請求字段

        長度 - 有關數據緩沖器的大小


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

          裝入所有的URB信息之后將URB提交給TD處理器TD處理器是框架的組成部分它與硬件直接通信處理有關傳輸的低級詳細資料TD完成任務后TD處理器將項目控制轉換為原始調用指定的“回調”函數轉換為 send_request( ) 函數

         

        圖2send_request( )函數

          以下的圖3所示為調用帶回調函數的send_request( )在此例中我們使用控制傳輸以獲得某鍵盤的國家代碼在get_country_code( )函數中可看到send_request( )的調用注意send_request( )調用中的最后一個參數是回調函數在TD處理器確定硬件完成此次處理后執行該函數這種情況下回調函數將獲得返回的數據緩沖器將其與HID描述器結構相匹配并存取與國家代碼相對應的字節此后URB被釋放


         


        圖3調用和回調函數

          EZ-Host框架值得注意的最后一個特點是設備驅動程序的使用在執行過程中設備驅動程序將執行三個功能停止啟動和運行啟動某設備驅動程序時便是運行它的run( )函數該函數對某些數值進行初始化并分配一個用于數據傳輸的重現URB對于鼠標或鍵盤該URB將每隔10毫秒發生一次數據傳輸完成后TD處理器將控制轉換為 interrupt_in_complete( )函數通過檢查URB可以得知數據是來自鍵盤還是來自鼠標這種回調函數負責將鍵盤或鼠標數據發送至應用層面以下是用于數據傳輸的回調函數示例


         

        圖4中斷傳輸回調函數

          當某驅動程序停止時其重現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用于傳輸中的復現中斷另一個則用于任何可能的控制傳輸這些傳輸可能發生在設備列舉或設備狀態檢查的過程中雖然每次只能處理一個控制傳輸框架可將附加傳輸排列系統支持的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添加進項目“形成文件”makefile其余的事務由框架處理

        總結

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

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



        關鍵詞: USB 嵌入式

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 大庆市| 基隆市| 阜宁县| 洛川县| 固原市| 昭通市| 拉萨市| 鹿邑县| 同德县| 邮箱| 繁昌县| 元氏县| 浦东新区| 威信县| 绥阳县| 大关县| 宜良县| 三门峡市| 清新县| 长丰县| 西乌珠穆沁旗| 常宁市| 公主岭市| 横峰县| 彭水| 高要市| 钟山县| 庆元县| 汉中市| 白城市| 元阳县| 鸡西市| 双流县| 台东县| 朝阳县| 鹤峰县| 石棉县| 合水县| 白河县| 三江| 库尔勒市|