當(dāng)前位置:首頁 > 智能硬件 > 智能硬件
[導(dǎo)讀]本文給出一種采用C8051F120微控制器和PDIUSBD12 USB控制器結(jié)合的方式實現(xiàn)人機接口設(shè)備(Human Interface Devices)的方法,以及如何編寫應(yīng)用程序來對它進行訪問。

摘要 USB設(shè)備及其驅(qū)動程序的復(fù)雜性給開發(fā)人員帶來了很大的開發(fā)難度。本文給出一種采用C8051F120微控制器和PDIUSBD12 USB控制器結(jié)合的方式實現(xiàn)人機接口設(shè)備(Human Interface Devices)的方法,以及如何編寫應(yīng)用程序來對它進行訪問。此設(shè)備無需編寫USB設(shè)備驅(qū)動程序,Windows系統(tǒng)能夠自動識別。
關(guān)鍵詞 HID 人機接口設(shè)備 USB 描述符 中斷傳輸 報告

  目前市場上USB設(shè)備的種類繁多,但是這些設(shè)備會有一些共同的特性,根據(jù)這些特性可以把USB設(shè)備劃分為不同的類,如顯示設(shè)備、通信設(shè)備、音頻設(shè)備、大容量存儲設(shè)備、人機接口設(shè)備(HID)。這里介紹如何實現(xiàn)HID類設(shè)備,以及如何在應(yīng)用程序中對HID類設(shè)備進行訪問。從Windows98操作系統(tǒng)開始,為HID類設(shè)備提供了通用的驅(qū)動程序,所以只要按照HID設(shè)備類的規(guī)范編寫設(shè)備的固件程序,就能夠讓W(xué)indows系統(tǒng)自動識別設(shè)備,省去了復(fù)雜的驅(qū)動程序編寫過程。

1  HID協(xié)議簡介

  人機接口設(shè)備(HID)主要是指一些人與計算機進行交互的設(shè)備,如鍵盤、鼠標(biāo)、游戲桿等;但是HID設(shè)備不一定非要是這些人機交互設(shè)備,只要符合HID設(shè)備級定義規(guī)范要求的都可以認(rèn)為是HID設(shè)備。HID設(shè)備有以下主要特點:

 ?、? 交換的數(shù)據(jù)存儲在報告的結(jié)構(gòu)內(nèi),設(shè)備必須支持HID報告格式。
  ②  每筆事務(wù)可以攜帶小量或中量的數(shù)據(jù)。低速設(shè)備每筆事務(wù)最大為8字節(jié),全速設(shè)備每筆最大為64字節(jié),高速設(shè)備最大為1 024字節(jié);
 ?、?nbsp; 有最大傳輸速度的限制。低速設(shè)備最快10 ms一筆事務(wù),最高速度為800 B/s;全速設(shè)備最快1 ms一筆事務(wù),最高速度為64 KB/s;高速設(shè)備最快125 μs一筆事務(wù),最高速度為24.576 MB/s。
  ④  沒有傳輸速度的保證。

  當(dāng)插入USB設(shè)備后,主機會向設(shè)備請求各種描述符來識別設(shè)備。為了把一個設(shè)備識別為HID類別,設(shè)備在定義描述符的時候必須遵守HID規(guī)范。圖1顯示了HID各種描述符之間的關(guān)系。事實上,每個設(shè)備可以有多個接口描述符來實現(xiàn)多接口設(shè)備,而且每個接口描述符下應(yīng)該有多個端點描述符。

圖1  HID各種描述符之間的關(guān)系

  從圖1中可以看出,除了USB標(biāo)準(zhǔn)定義的一些描述符外,HID設(shè)備還必須定義HID描述符。另外設(shè)備和主機的通信是通過報告的形式來實現(xiàn)的,所以還必須定義報告描述符;而物理描述符不是必需的。還有就是HID描述符是關(guān)聯(lián)于接口(而不是端點)的,所以設(shè)備不需要為每個端點都提供一個HID描述符。

  USB設(shè)備有4種傳輸方式與主機進行通信: 控制方式、中斷方式、批量方式和同步方式。每種方式都有它的應(yīng)用領(lǐng)域。HID只支持控制和中斷傳輸方式。如圖2所示,HID設(shè)備必須要有默認(rèn)的控制管道和一個中斷輸入端點;中斷輸出端點是可選的。


圖2  HID類設(shè)備使用控制和中斷傳輸方式

  中斷輸出傳輸是USB1.1規(guī)范才有的內(nèi)容,且必須獲得Windows系統(tǒng)的支持。從Windows98 SE版本開始才支持中斷輸出傳輸方式,所以如果需要中斷輸出傳輸方式的設(shè)備應(yīng)該選擇相應(yīng)的操作系統(tǒng)。表1列出了傳輸類型和相關(guān)情況。

表1  HID類設(shè)備支持的傳輸方式傳輸

  USB協(xié)議定義了11種請求命令,通過這些請求來獲得設(shè)備的信息及對設(shè)備進行設(shè)置。HID類設(shè)備除了要支持這11種標(biāo)準(zhǔn)的請求外,還要實現(xiàn)以下6種特定請求:

  ①  Get_Report——主機用控制傳輸從設(shè)備接收數(shù)據(jù),所有HID類設(shè)備都要支持這個請求;
  ②  Set_Report——設(shè)備用控制傳輸接收主機的數(shù)據(jù),設(shè)備可以不支持此請求;
 ?、?nbsp; Get_Idle——主機讀取設(shè)備當(dāng)前的空閑速率,設(shè)備可以不支持此請求;
  ④  Set_Idle——設(shè)置閑置狀態(tài),設(shè)備可不支持此請求;
 ?、?nbsp; Get_Protocol——主機獲得設(shè)備的當(dāng)前活動是引導(dǎo)協(xié)議還是報告協(xié)議;
 ?、? Set_Protocol——在引導(dǎo)協(xié)議和報告協(xié)議間切換,設(shè)備如果支持系統(tǒng)引導(dǎo)(如鍵盤和鼠標(biāo)),就必須支持Get_Protocol和Set_Protocol請求。

2  HID接口固件設(shè)計與實現(xiàn)

  該設(shè)備采用C8051F120微控制器和PDIUSBD12芯片來實現(xiàn),如圖3所示。


圖3  HID系統(tǒng)結(jié)構(gòu)框圖

  因為PDIUSBD12的主端點(Endpoint2)具有64字節(jié)的雙緩沖,能夠提供比較高的速度,所以在端點描述符里把它配置為中斷傳輸方式,而Endpoint1沒有使用。PDIUSBD12通過中斷觸發(fā)CPU來響應(yīng)主機的各種請求。

  此系統(tǒng)采用的USB協(xié)議版本是1.1,所以能夠支持中斷輸出傳輸。為了讓主機把設(shè)備識別為HID類別,定義設(shè)備接口描述符時類別這一字段的值必須設(shè)置為0x03(HID類別),這樣主機就會繼續(xù)請求獲得設(shè)備的HID描述符和報告描述符。在主機Get_Descriptor請求中,當(dāng)值字段的高位字節(jié)為0x21時,表示主機要求獲得HID描述符;當(dāng)值字段高字節(jié)為0x22時,就是主機要求獲得報告描述符。對于報告描述符,可以參考HID Usage Tables規(guī)范。HID Descriptor Tool工具可以幫助建立和測試編寫的報告描述符。這里定義了一個輸入和輸出64字節(jié)數(shù)據(jù)的報告描述符。

code unsigned char szReport[] = {
  0x06,0xA0,0xFF,//用法頁(FFA0h, vendor defined)
  0x09, 0x01,//用法(vendor defined)
  0xA1, 0x01,//集合(Application)
  0x09, 0x02 ,//用法(vendor defined)
  0xA1, 0x00,//集合(Physical)
  0x06,0xA1,0xFF,//用法頁(vendor defined)
//輸入報告
  0x09, 0x03 ,//用法(vendor defined)
  0x09, 0x04,//用法(vendor defined)
  0x15, 0x80,//邏輯最小值(0x80 or -128)
  0x25, 0x7F,//邏輯最大值(0x7F or 127)
  0x35, 0x00,//物理最小值(0)
  0x45,0xFF,//物理最大值(255)
  0x75, 0x08,//報告長度Report size (8位)
  0x95, 0x40,//報告數(shù)值(64 fields)
  0x81, 0x02,//輸入(data, variable, absolute)
//輸出報告
  0x09, 0x05,//用法(vendor defined)
  0x09, 0x06,//用法(vendor defined)
  0x15, 0x80,//邏輯最小值(0x80 or -128)
  0x25, 0x7F,//邏輯最大值(0x7F or 127)
  0x35, 0x00,//物理最小值(0)
  0x45,0xFF,//物理最大值(255)
  0x75,0x08,//報告長度(8位)
  0x95, 0x40,//報告數(shù)值(64 fields)
  0x91, 0x02,//輸出(data, variable, absolute)
  0xC0,//集合結(jié)束(Physical)
  0xC0//集合結(jié)束(Application)
};

  這樣,后面數(shù)據(jù)的輸入和輸出都必須滿足報告的格式才能夠進行傳輸。


圖4  應(yīng)用程序枚舉HID設(shè)備流程

3  應(yīng)用程序設(shè)計實現(xiàn)

  Windows為應(yīng)用程序訪問HID設(shè)備提供了強大的支持,有一整套對HID設(shè)備進行訪問的API。應(yīng)用程序要訪問設(shè)備就必須先枚舉到設(shè)備,圖4為應(yīng)用程序枚舉HID設(shè)備流程。

  枚舉成功后根據(jù)返回的設(shè)備句柄,就可以用ReadFile和WriteFile來讀寫設(shè)備的數(shù)據(jù)了。這里采用異步方式來讀寫數(shù)據(jù),這樣不會發(fā)生讀寫時阻塞,提高了程序的效率。以下是異步方式讀寫設(shè)備的要點:

 ?、?nbsp; 為了實現(xiàn)異步訪問設(shè)備,在CreateFile打開設(shè)備時必須使用FILE_FLAG_OVERLAPPED標(biāo)志。
 ?、? 打開設(shè)備成功后,使用CreateThread建立1個讀設(shè)備線程。
 ?、?nbsp; 在這個線程中首先建立1個OVERLAPPED結(jié)構(gòu),并用CreateEvent函數(shù)初始化它的hEvent成員,這樣就創(chuàng)建了1個事件對象。
 ?、?nbsp; 調(diào)用ReadFile函數(shù),并傳入這個結(jié)構(gòu)。
 ?、?nbsp; 調(diào)用ReadFile后會立即返回,必須調(diào)用GetLast?Error獲得出錯碼。 如果為ERROR_IO_PENDING, 說明此操作是在等待完成的;否則,說明調(diào)用出錯。
  ⑥  調(diào)用WaitForSingleObject等待hEvent事件的通知,并使此線程進入休眠狀態(tài)。如果有數(shù)據(jù)發(fā)送到主機,讀線程就會被激活。

  WriteFile的使用也同樣要求異步操作,與ReadFile的使用差不多。

  這里要注意的是,在每次讀寫數(shù)據(jù)前都要先接收和發(fā)送1字節(jié)的PID標(biāo)志,所以每次讀寫數(shù)據(jù)的時候都要多一個字節(jié)。比如,這里每次讀寫的是64字節(jié)數(shù)據(jù),但是在這64字節(jié)之前必須放1字節(jié)的PID數(shù)據(jù),所以是65字節(jié)。一般這個字節(jié)的值為0。

4  小結(jié)

  充分利用PDIUSBD12主端口的雙緩沖特性后,測試設(shè)備與PC間傳輸速度能達(dá)到8 KB/s以上,對于一些傳輸數(shù)據(jù)量不大,速度要求不高,而又必須在短時間內(nèi)做出響應(yīng)的場合基本能夠滿足要求。在此基礎(chǔ)上只要生成不同的報告描述符,就能開發(fā)出各種不同的嵌入式設(shè)備;而且這樣的設(shè)備無需驅(qū)動,在插入PC后就能立刻開始工作,省去了安裝驅(qū)動程序的過程,方便使用。

參考文獻

[1]  Universal Serial Bus Specification.Revision 1.1,1998.
[2]  Device Class Definition for Human Interface Devices (HID) Firmware Specification. Version 1.11,2001.
[3]  HID Usage Tables.Version 1.11,2001.
[4]  Jan Axelson.  USB大全[M].陳逸,等譯. 北京:中國電力出版社,2001.
[5]  周立功,等. PDIUSBD12 USB固件編程與驅(qū)動程序[M]. 北京: 北京航空航天大學(xué)出版社,2003.
[6]  李肇慶,廖峰,劉建存. USB接口技術(shù)[M]. 北京:國防工業(yè)出版社,2004.

涂曉強(研究生),周洪利(副教授):主要研究方向為單片機與嵌入式系統(tǒng)。

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫毥谦F公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險,如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅持高質(zhì)量發(fā)展策略,塑強核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運營商 數(shù)字經(jīng)濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學(xué)會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉