基于HID類(lèi)的USB人機接口設計
摘要 USB設備及其驅動(dòng)程序的復雜性給開(kāi)發(fā)人員帶來(lái)了很大的開(kāi)發(fā)難度。本文給出一種采用C8051F120微控制器和PDIUSBD12 USB控制器結合的方式實(shí)現人機接口設備(Human Interface Devices)的方法,以及如何編寫(xiě)應用程序來(lái)對它進(jìn)行訪(fǎng)問(wèn)。此設備無(wú)需編寫(xiě)USB設備驅動(dòng)程序,Windows系統能夠自動(dòng)識別。
關(guān)鍵詞 HID 人機接口設備 USB 描述符 中斷傳輸 報告
目前市場(chǎng)上USB設備的種類(lèi)繁多,但是這些設備會(huì )有一些共同的特性,根據這些特性可以把USB設備劃分為不同的類(lèi),如顯示設備、通信設備、音頻設備、大容量存儲設備、人機接口設備(HID)。這里介紹如何實(shí)現HID類(lèi)設備,以及如何在應用程序中對HID類(lèi)設備進(jìn)行訪(fǎng)問(wèn)。從Windows98操作系統開(kāi)始,為HID類(lèi)設備提供了通用的驅動(dòng)程序,所以只要按照HID設備類(lèi)的規范編寫(xiě)設備的固件程序,就能夠讓W(xué)indows系統自動(dòng)識別設備,省去了復雜的驅動(dòng)程序編寫(xiě)過(guò)程。
1 HID協(xié)議簡(jiǎn)介
人機接口設備(HID)主要是指一些人與計算機進(jìn)行交互的設備,如鍵盤(pán)、鼠標、游戲桿等;但是HID設備不一定非要是這些人機交互設備,只要符合HID設備級定義規范要求的都可以認為是HID設備。HID設備有以下主要特點(diǎn):
?、?交換的數據存儲在報告的結構內,設備必須支持HID報告格式。
?、?每筆事務(wù)可以攜帶小量或中量的數據。低速設備每筆事務(wù)最大為8字節,全速設備每筆最大為64字節,高速設備最大為1 024字節;
?、?有最大傳輸速度的限制。低速設備最快10 ms一筆事務(wù),最高速度為800 B/s;全速設備最快1 ms一筆事務(wù),最高速度為64 KB/s;高速設備最快125 μs一筆事務(wù),最高速度為24.576 MB/s。
?、?沒(méi)有傳輸速度的保證。
當插入USB設備后,主機會(huì )向設備請求各種描述符來(lái)識別設備。為了把一個(gè)設備識別為HID類(lèi)別,設備在定義描述符的時(shí)候必須遵守HID規范。圖1顯示了HID各種描述符之間的關(guān)系。事實(shí)上,每個(gè)設備可以有多個(gè)接口描述符來(lái)實(shí)現多接口設備,而且每個(gè)接口描述符下應該有多個(gè)端點(diǎn)描述符。

圖1 HID各種描述符之間的關(guān)系
從圖1中可以看出,除了USB標準定義的一些描述符外,HID設備還必須定義HID描述符。另外設備和主機的通信是通過(guò)報告的形式來(lái)實(shí)現的,所以還必須定義報告描述符;而物理描述符不是必需的。還有就是HID描述符是關(guān)聯(lián)于接口(而不是端點(diǎn))的,所以設備不需要為每個(gè)端點(diǎn)都提供一個(gè)HID描述符。
USB設備有4種傳輸方式與主機進(jìn)行通信: 控制方式、中斷方式、批量方式和同步方式。每種方式都有它的應用領(lǐng)域。HID只支持控制和中斷傳輸方式。如圖2所示,HID設備必須要有默認的控制管道和一個(gè)中斷輸入端點(diǎn);中斷輸出端點(diǎn)是可選的。

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

USB協(xié)議定義了11種請求命令,通過(guò)這些請求來(lái)獲得設備的信息及對設備進(jìn)行設置。HID類(lèi)設備除了要支持這11種標準的請求外,還要實(shí)現以下6種特定請求:
?、?Get_Report——主機用控制傳輸從設備接收數據,所有HID類(lèi)設備都要支持這個(gè)請求;
?、?Set_Report——設備用控制傳輸接收主機的數據,設備可以不支持此請求;
?、?Get_Idle——主機讀取設備當前的空閑速率,設備可以不支持此請求;
?、?Set_Idle——設置閑置狀態(tài),設備可不支持此請求;
?、?Get_Protocol——主機獲得設備的當前活動(dòng)是引導協(xié)議還是報告協(xié)議;
?、?Set_Protocol——在引導協(xié)議和報告協(xié)議間切換,設備如果支持系統引導(如鍵盤(pán)和鼠標),就必須支持Get_Protocol和Set_Protocol請求。
2 HID接口固件設計與實(shí)現
該設備采用C8051F120微控制器和PDIUSBD12芯片來(lái)實(shí)現,如圖3所示。

圖3 HID系統結構框圖
因為PDIUSBD12的主端點(diǎn)(Endpoint2)具有64字節的雙緩沖,能夠提供比較高的速度,所以在端點(diǎn)描述符里把它配置為中斷傳輸方式,而Endpoint1沒(méi)有使用。PDIUSBD12通過(guò)中斷觸發(fā)CPU來(lái)響應主機的各種請求。
此系統采用的USB協(xié)議版本是1.1,所以能夠支持中斷輸出傳輸。為了讓主機把設備識別為HID類(lèi)別,定義設備接口描述符時(shí)類(lèi)別這一字段的值必須設置為0x03(HID類(lèi)別),這樣主機就會(huì )繼續請求獲得設備的HID描述符和報告描述符。在主機Get_Descriptor請求中,當值字段的高位字節為0x21時(shí),表示主機要求獲得HID描述符;當值字段高字節為0x22時(shí),就是主機要求獲得報告描述符。對于報告描述符,可以參考HID Usage Tables規范。HID Descriptor Tool工具可以幫助建立和測試編寫(xiě)的報告描述符。這里定義了一個(gè)輸入和輸出64字節數據的報告描述符。
code unsigned char szReport[] = {
0x06,0xA0,0xFF,//用法頁(yè)(FFA0h, vendor defined)
0x09, 0x01,//用法(vendor defined)
0xA1, 0x01,//集合(Application)
0x09, 0x02 ,//用法(vendor defined)
0xA1, 0x00,//集合(Physical)
0x06,0xA1,0xFF,//用法頁(yè)(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,//報告長(cháng)度Report size (8位)
0x95, 0x40,//報告數值(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,//報告長(cháng)度(8位)
0x95, 0x40,//報告數值(64 fields)
0x91, 0x02,//輸出(data, variable, absolute)
0xC0,//集合結束(Physical)
0xC0//集合結束(Application)
};
這樣,后面數據的輸入和輸出都必須滿(mǎn)足報告的格式才能夠進(jìn)行傳輸。

圖4 應用程序枚舉HID設備流程
3 應用程序設計實(shí)現
Windows為應用程序訪(fǎng)問(wèn)HID設備提供了強大的支持,有一整套對HID設備進(jìn)行訪(fǎng)問(wèn)的API。應用程序要訪(fǎng)問(wèn)設備就必須先枚舉到設備,圖4為應用程序枚舉HID設備流程。
枚舉成功后根據返回的設備句柄,就可以用ReadFile和WriteFile來(lái)讀寫(xiě)設備的數據了。這里采用異步方式來(lái)讀寫(xiě)數據,這樣不會(huì )發(fā)生讀寫(xiě)時(shí)阻塞,提高了程序的效率。以下是異步方式讀寫(xiě)設備的要點(diǎn):
?、?為了實(shí)現異步訪(fǎng)問(wèn)設備,在CreateFile打開(kāi)設備時(shí)必須使用FILE_FLAG_OVERLAPPED標志。
?、?打開(kāi)設備成功后,使用CreateThread建立1個(gè)讀設備線(xiàn)程。
?、?在這個(gè)線(xiàn)程中首先建立1個(gè)OVERLAPPED結構,并用CreateEvent函數初始化它的hEvent成員,這樣就創(chuàng )建了1個(gè)事件對象。
?、?調用ReadFile函數,并傳入這個(gè)結構。
?、?調用ReadFile后會(huì )立即返回,必須調用GetLastError獲得出錯碼。 如果為ERROR_IO_PENDING, 說(shuō)明此操作是在等待完成的;否則,說(shuō)明調用出錯。
?、?調用WaitForSingleObject等待hEvent事件的通知,并使此線(xiàn)程進(jìn)入休眠狀態(tài)。如果有數據發(fā)送到主機,讀線(xiàn)程就會(huì )被激活。
WriteFile的使用也同樣要求異步操作,與ReadFile的使用差不多。
這里要注意的是,在每次讀寫(xiě)數據前都要先接收和發(fā)送1字節的PID標志,所以每次讀寫(xiě)數據的時(shí)候都要多一個(gè)字節。比如,這里每次讀寫(xiě)的是64字節數據,但是在這64字節之前必須放1字節的PID數據,所以是65字節。一般這個(gè)字節的值為0。
4 小結
充分利用PDIUSBD12主端口的雙緩沖特性后,測試設備與PC間傳輸速度能達到8 KB/s以上,對于一些傳輸數據量不大,速度要求不高,而又必須在短時(shí)間內做出響應的場(chǎng)合基本能夠滿(mǎn)足要求。在此基礎上只要生成不同的報告描述符,就能開(kāi)發(fā)出各種不同的嵌入式設備;而且這樣的設備無(wú)需驅動(dòng),在插入PC后就能立刻開(kāi)始工作,省去了安裝驅動(dòng)程序的過(guò)程,方便使用。
參考文獻
[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固件編程與驅動(dòng)程序[M]. 北京: 北京航空航天大學(xué)出版社,2003.
[6] 李肇慶,廖峰,劉建存. USB接口技術(shù)[M]. 北京:國防工業(yè)出版社,2004.
評論