《電子技術應用》
您所在的位置:首頁 > 嵌入式技術 > 設計應用 > 嵌入式系統(tǒng)中USB主機控制器的設計
嵌入式系統(tǒng)中USB主機控制器的設計
萬方數據電子
摘要: 嵌入式系統(tǒng)中USB主機控制器的設計, 過去USB僅應用于個人計算機,而在嵌入式系統(tǒng)領域的巨大潛力還沒有開發(fā)出來,USB在嵌入式系統(tǒng)中的應用包括KVM開關、數碼相機、PDA、打印機、機頂盒以及移動電話等。本文將介紹在嵌入式系統(tǒng)中應用USB時其主機控制
Abstract:
Key words :

     過去USB僅應用于個人計算機,而在嵌入式系統(tǒng)領域的巨大潛力還沒有開發(fā)出來,USB在嵌入式系統(tǒng)中的應用包括KVM開關、數碼相機、PDA、打印機、機頂盒以及移動電話等。本文將介紹在嵌入式系統(tǒng)中應用USB時其主機控制器的設計。

    嵌入式系統(tǒng)被定義為硬件和固件(獨立的或作為更大型系統(tǒng)的一部分)通常帶有某種操作系統(tǒng),操作系統(tǒng)可以是Windows CE、VxWorks或其它由“自編代碼”構成的更簡單系統(tǒng)。根據這樣的定義,可以認為任何帶有處理器的電子裝置均可以作為USB嵌入式主機。

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

     在基于PC的系統(tǒng)中,USB操作一般需要三種部件,分別是通常作為PCI子系統(tǒng)的主機控制器、USB堆棧以及USB類驅動器。

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

      在嵌入式USB系統(tǒng)中,其主要組成部分與PC系統(tǒng)類似,如嵌入式主機控制器芯片、帶OHCI堆棧的實時操作系統(tǒng)(RTOS)以及專用驅動程序。現有很多可供選擇的主機控制器芯片,有些帶有處理器,有些則是基于寄存器的,對器件的選擇將影響到其下面兩層。

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

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

控制器與框架

      下面我們以賽普拉斯EZ-Host為例介紹嵌入式系統(tǒng)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)和端口編號的數據字段、終點數、收發(fā)數據緩沖器長度、數據包ID編碼以及URB結構指示器。

     URB含有TD所需的邏輯信息,該邏輯信息包括USB設備緩沖器、安裝軟件包以及USB設備結構指示器。

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

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

* 請求類型:表明USB請求類型的字節(jié),該字節(jié)包含表示傳輸方向、傳輸類型以及傳輸接受方的位。

* 請求: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,如地址、速度、終點數以及傳輸方向,還有表示傳輸類型的字節(jié)和“回調”函數指示器。利用回調函數可以在框架內進行某些并行操作,也可在硬件處理USB操作的同時執(zhí)行其它任務。TD需要USB傳輸類型信息,這樣框架就可以安排正確的傳輸類型時序。此外,與批量或中斷傳輸相反,框架一次只允許進行一個控制傳輸操作。

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

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

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

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

    在驅動程序運行期間,系統(tǒng)可執(zhí)行各種任務。對于集線器設備驅動程序,要檢查集線器的端口,以了解是否有設備插入和去除。這里鍵盤和鼠標驅動程序運行函數不起任何作用。

框架數據流

    框架代碼執(zhí)行過程是這樣的:上電復位、微處理器對所有寄存器和計數器以及設備結構進行初始化,然后進入如下的循環(huán):

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

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

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

     檢查主機USB端口以了解狀態(tài)變化需要檢查變量的改變,如果發(fā)生變化,可通過端口變化中斷處理程序設定變量。如果端口發(fā)生改變,將執(zhí)行枚舉代碼進行處理。

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

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

     通過中斷傳輸還可以檢查來自相連鍵盤和鼠標設備的新數據,這些傳輸每10毫秒種發(fā)生一次,由TD處理器安排時序。任務完成后,TD處理器將傳輸控制轉給回調函數,這時可提取鍵盤和鼠標數據,并送至應用層。

構建應用

     現在介紹如何構建一個簡單的控制鍵盤和鼠標的嵌入式USB設計,該方案使用基于處理器的USB主機控制器,處理器的代碼包含框架和應用固件。首先要做的是確定希望支持設備的數量和類型,確定設備數量后,可據此分配URB和驅動程序空間,通過修改名為fwxcfg.h的“個性化”文件完成URB分配。

    每個鍵盤、鼠標或集線器均需要一個URB來處理傳輸中重復出現的中斷。此外,在枚舉和其它USB控制傳輸過程中,URB被分配并隨后釋放。一個較好的經驗是為系統(tǒng)支持的每個設備分配兩個URB,一個用于傳輸中重復出現的中斷,另一個則用于任何可能的控制傳輸,這些傳輸可能發(fā)生在設備枚舉或設備狀態(tài)檢查過程中。雖然每次只能處理一個控制傳輸,但框架可將其它傳輸排隊,系統(tǒng)支持的URB數量應該等于所支持設備數量的兩倍。

    接下來,需要為鍵盤和鼠標創(chuàng)建驅動程序。由于這些設備的USB功能非常相近,所以兩個設備可以使用一個驅動程序。該驅動程序可稱為hid_driver(用于人機界面設備的驅動程序)。下一步是在驅動程序內添加開始、停止以及運行函數,以及查找驅動程序的設備種類編碼,還需要將驅動程序函數的名稱添加進文件drvrlist.h。包含集線器和hid driver的驅動程序聲明如下: #define FWX_DRIVER_LIST {&hid_driver, &hubclass_driver}

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

   然后需要為枚舉通報函數添加一些代碼,枚舉通報函數是枚舉代碼使用的回調函數,用于報告設備枚舉狀態(tài)并處理可能的枚舉錯誤。該代碼可將新的枚舉設備信息傳給應用層。

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

#undef FWX_INCLUDE_HUB_SUPPORT

改為

#define FWX_INCLUDE_HUB_SUPPORT

并將文件hubclass.c添加進項目形成文件,其余事務由框架處理。

本文小結

    盡管與PC相比,USB主機系統(tǒng)在計算資源和經驗方面存在不足,但開發(fā)人員仍然可以較為簡單地將USB功能加入到嵌入式系統(tǒng)中。現有多種用于實現這種功能的USB主機IC可供選擇,用戶可購買或自行開發(fā)USB主機堆棧和實時操作系統(tǒng)。

此內容為AET網站原創(chuàng),未經授權禁止轉載。
亚洲一区二区欧美_亚洲丝袜一区_99re亚洲国产精品_日韩亚洲一区二区
国产精品免费一区二区三区观看| 亚洲免费观看高清完整版在线观看| 欧美freesex8一10精品| 欧美夜福利tv在线| 亚洲专区一二三| aa级大片欧美| 99精品视频网| 亚洲免费电影在线观看| 亚洲激情av在线| 亚洲缚视频在线观看| 欧美伊人久久大香线蕉综合69| 午夜久久美女| 亚洲欧美日韩精品久久久| 亚洲综合视频在线| 亚洲在线视频免费观看| 亚洲系列中文字幕| 亚洲影视在线播放| 亚洲综合精品一区二区| 亚洲一区二区免费在线| 亚洲自拍偷拍福利| 午夜一区二区三区在线观看| 性色一区二区| 欧美一区在线视频| 亚洲高清视频在线观看| 亚洲大胆人体在线| 亚洲欧洲日产国产网站| 亚洲精品一区二区三区四区高清 | 亚洲缚视频在线观看| 亚洲国产精品久久久久| 亚洲国产日韩精品| 亚洲七七久久综合桃花剧情介绍| 日韩一级成人av| 99国产欧美久久久精品| 亚洲视频在线一区| 午夜精品福利在线| 久久丁香综合五月国产三级网站| 久久天天狠狠| 欧美风情在线| 欧美色一级片| 国产欧美一区二区精品仙草咪| 国产真实乱偷精品视频免| 亚洲国产高清高潮精品美女| 一区二区av| 先锋亚洲精品| 亚洲人成网站在线播| 亚洲一区在线播放| 久久久久国产成人精品亚洲午夜| 欧美成人免费播放| 国产精品第十页| 狠狠色丁香婷婷综合| 亚洲精品精选| 亚洲欧美在线看| 亚洲激情视频在线| 亚洲视频在线观看一区| 久久精品人人做人人综合| 欧美激情亚洲精品| 国产精品青草综合久久久久99| 国产自产精品| 夜夜狂射影院欧美极品| 欧美一区免费| 宅男在线国产精品| 久久精品国内一区二区三区| 欧美激情1区2区| 国产日韩欧美一二三区| 亚洲精品韩国| 久久成人精品一区二区三区| 亚洲天堂久久| 久久一综合视频| 国产精品成人va在线观看| 一区二区亚洲精品| 亚洲一区精品电影| 亚洲理伦在线| 久久久久久久久久久一区| 欧美日韩日本视频| 国语精品中文字幕| 一区二区三区欧美日韩| 亚洲大片在线| 午夜精品久久久久久久久 | 免费日韩av| 国产精品呻吟| 亚洲伦理精品| 久久精品国产77777蜜臀| 亚洲中无吗在线| 欧美顶级少妇做爰| 国产欧美一区二区精品性色| 亚洲精品中文字幕女同| 亚洲国产精品99久久久久久久久| 午夜国产精品视频免费体验区| 母乳一区在线观看| 国产欧美日韩| 亚洲天堂第二页| 日韩一区二区免费看| 久久综合伊人77777尤物| 国产精品免费网站| 亚洲美女网站| 亚洲免费观看高清完整版在线观看| 久久久欧美精品| 国产精品久久久爽爽爽麻豆色哟哟| 91久久久精品| 亚洲黄色高清| 久久久久综合一区二区三区| 国产酒店精品激情| 在线视频亚洲| 在线亚洲国产精品网站| 欧美成人午夜免费视在线看片| 国模吧视频一区| 亚洲欧美日韩在线综合| 亚洲影视在线| 欧美午夜不卡| 一区二区三区免费观看| 一本色道婷婷久久欧美| 欧美激情1区2区3区| 亚洲电影免费在线| 亚洲国产精品123| 久久免费国产| 好看的日韩av电影| 欧美一区二区三区婷婷月色| 欧美一区二区视频观看视频| 国产精品日韩欧美一区二区三区| 中文国产一区| 亚洲欧美精品中文字幕在线| 欧美视频第二页| 亚洲免费大片| 亚洲一区二区三区乱码aⅴ| 欧美日韩国语| aa国产精品| 亚洲女同在线| 国产精品视频1区| 亚洲欧美一区二区原创| 久久成人在线| 国产亚洲观看| 亚洲国产一区二区三区a毛片| 奶水喷射视频一区| 亚洲美女黄色| 欧美日韩亚洲在线| 亚洲欧洲综合| 亚洲精品三级| 久久婷婷蜜乳一本欲蜜臀| 亚洲欧美不卡| 欧美午夜精品| 亚洲一区二区在线视频| 性做久久久久久久久| 国产精品综合色区在线观看| 欧美一区二区视频观看视频| 久久人人97超碰精品888| 黑丝一区二区三区| 最新69国产成人精品视频免费| 欧美成人一区二区三区片免费| 亚洲国产欧美精品| 一区二区三区 在线观看视频| 国产精品成人一区二区三区吃奶| 亚洲免费视频网站| 久久综合久久综合九色| 最近看过的日韩成人| 亚洲欧美国产高清| 国产一区二区日韩| 亚洲三级观看| 国产精品久久久久久av下载红粉| 午夜伦理片一区| 麻豆精品传媒视频| 日韩午夜电影在线观看| 欧美在线播放高清精品| 影音先锋国产精品| 亚洲少妇在线| 国产亚洲欧美另类中文| 亚洲美女在线国产| 国产精品视频999| 亚洲国产综合在线看不卡| 欧美午夜一区二区福利视频| 久久国产乱子精品免费女 | 这里只有精品视频| 久久久久久久久久久久久9999| 亚洲日本国产| 欧美一区二区三区免费观看视频 | 国产精品h在线观看| 欧美一区午夜视频在线观看| 欧美精品一区在线播放| 亚洲欧美日本国产有色| 欧美成人精品三级在线观看| 亚洲一区二区在线免费观看| 欧美成人四级电影| 午夜精品久久久久久久久| 欧美啪啪一区| 欧美在线不卡| 欧美日韩在线亚洲一区蜜芽| 久久激情五月激情| 国产精品久久9| 91久久久久久| 国产伦精品一区二区三区视频孕妇 | 亚洲一区二区三区四区在线观看 | 欧美日韩国产成人在线91| 午夜在线观看欧美| 欧美三级网址| 91久久久久久久久| 国产一区999| 亚洲免费在线精品一区| 亚洲黄色小视频| 久久午夜色播影院免费高清| 亚洲综合久久久久| 欧美日韩美女在线|