版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
USB接口HID設(shè)備HID(HumanInterfaceDevice,人機(jī)接口設(shè)備)是USB設(shè)備中慣用設(shè)備類型,是直接與人交互USB設(shè)備,例如鍵盤、鼠標(biāo)與游戲桿等。在USB設(shè)備中,HID設(shè)備成本較低。此外,HID設(shè)備并不一定要有人機(jī)交互功能,只要符合HID類別規(guī)范設(shè)備都是HID設(shè)備。Wndows操作系統(tǒng)最先支持HID設(shè)備。在windows98以及日后版本中內(nèi)置有HID設(shè)備驅(qū)動(dòng)程序,應(yīng)用程序可以直接使用這些驅(qū)動(dòng)程序來與設(shè)備通信。在設(shè)計(jì)一種USB接口計(jì)算機(jī)外部設(shè)備時(shí),如果HID類型設(shè)備可以滿足需要,可以將其設(shè)計(jì)為HID類型設(shè)備,這樣可以省去比較復(fù)雜USB驅(qū)動(dòng)程序編寫,直接運(yùn)用Windows操作系統(tǒng)對原則HID類型USB設(shè)備支持。HID設(shè)備簡介HID設(shè)備特點(diǎn)互換數(shù)據(jù)儲(chǔ)存在稱為報(bào)表(Report)構(gòu)造內(nèi),設(shè)備固件必要支持HlD報(bào)表格式。主機(jī)通過控制和中斷傳播中傳送和祈求報(bào)表來傳送和接受數(shù)據(jù)。報(bào)表格式非常靈活。每一筆事務(wù)可以攜帶小量或中量數(shù)據(jù)。低速設(shè)備每一筆事務(wù)最大是8B,全速設(shè)備每一筆事務(wù)最大是64B,高速設(shè)備每一筆事務(wù)最大是1024B。一種報(bào)表可以使用多筆事務(wù)。設(shè)備可以在未預(yù)期時(shí)間傳送信息給主機(jī),例如鍵盤按鍵或是鼠標(biāo)移動(dòng)。因此主機(jī)會(huì)定期輪詢設(shè)備,以獲得最新數(shù)據(jù)。HID設(shè)備最大傳播速度有限制。主機(jī)可以保證低速中斷端點(diǎn)每10ms內(nèi)最多1筆事務(wù),每一秒最多是800B。保證全速端點(diǎn)每lms一筆事務(wù),每一秒最多是64000B。保證高速端點(diǎn)每125us一筆事務(wù),每一秒最多是24.576MB。HID設(shè)備沒有保證傳播速率。如果設(shè)備是設(shè)立在10ms時(shí)距,事務(wù)之間時(shí)間也許等于或不大于10ms。除非設(shè)備是設(shè)立在全速時(shí)在每個(gè)幀傳播數(shù)據(jù),或是在高速時(shí)在每個(gè)微幀傳播數(shù)據(jù)。這是最快輪詢速率,因此端點(diǎn)可以保證有對的帶寬可供使用。HID設(shè)備除了傳送數(shù)據(jù)給主機(jī)外,它也會(huì)從主機(jī)接受數(shù)據(jù)。只要可以符合HlD類別規(guī)范設(shè)備都可以是HID設(shè)備。設(shè)備除了HlD接口之外,它也許同步還包具有其她USB接口。例如影像顯示設(shè)備也許使用HID接口來做亮度、對比度軟件控制,而使用老式影像接口來傳送要顯示數(shù)據(jù)。USB擴(kuò)音器可以使用實(shí)時(shí)傳播來播放語音,同步使用HID接口來控制音量、低音等。HID類別設(shè)備規(guī)范文獻(xiàn)重要是如下兩份:DeviceClassDefinitionforHumaninterfaceDevicesHIDUsageTables其中前者是HID基本規(guī)范文獻(xiàn),后者可以是前者附件,為開發(fā)人員提供實(shí)際控制類型描述。文獻(xiàn)是用來定義讓主機(jī)理解以及使用HID數(shù)據(jù)數(shù)值。這兩份文獻(xiàn)是由USBDeviceWorkingGroup制定,可以在網(wǎng)址。HID設(shè)備硬件規(guī)定HID接口必要符合DeviceClassDefinitionforHumaninterfaceDevices規(guī)范內(nèi)所定義HID類別需求。在此文獻(xiàn)內(nèi)描述了所需描述符、傳播頻率以及傳播類型等。為了符合規(guī)范,HID接口端點(diǎn)與描述符都必要符合數(shù)個(gè)規(guī)定。所有HID傳播都是使用默認(rèn)控制管道或是一種中斷管道,HID設(shè)備必要有一種中斷輸入端點(diǎn)來傳送數(shù)據(jù)到主機(jī),中斷輸出端點(diǎn)則不是必須。HID類別HID類別驅(qū)動(dòng)程序HID類別設(shè)備主機(jī)外設(shè)默認(rèn)控制管道中斷管道圖8-1HID傳播傳播類型表8-1HID設(shè)備傳播類型傳播類型數(shù)據(jù)來源數(shù)據(jù)類型與否需要管道控制設(shè)備(輸入)沒有嚴(yán)格時(shí)間限制數(shù)據(jù)是主機(jī)(輸出)沒有嚴(yán)格時(shí)間限制數(shù)據(jù)或是沒有中斷輸出管道時(shí)任何數(shù)據(jù)中斷設(shè)備(輸入)定期或低延遲數(shù)據(jù)是主機(jī)(輸出)定期或低延遲數(shù)據(jù)是主機(jī)與設(shè)備之間所互換數(shù)據(jù),可以提成兩種類型:低延遲數(shù)據(jù),必要盡快地到達(dá)目;配備或其她數(shù)據(jù),沒有嚴(yán)格時(shí)間限制需求。中斷管道是控制管道之外另一種數(shù)據(jù)互換方式,特別適合使用在接受端需要定期或是盡量及時(shí)收到數(shù)據(jù)時(shí)候。中斷輸入管道攜帶數(shù)據(jù)到主機(jī),中斷輸出管道則是攜帶數(shù)據(jù)到設(shè)備。在總線忙時(shí)候,控制管道也許會(huì)被延遲,而中斷管道保證會(huì)有可得到帶寬。HID不需要一定有中斷輸出管道。如果沒有中斷輸出管道,主機(jī)會(huì)在控制管道上使用HID設(shè)備特有Set_Report祈求來傳送所有報(bào)表。HID固件規(guī)定主機(jī)驅(qū)動(dòng)程序要與HID設(shè)備通信,設(shè)備固件必要符合下列需求:設(shè)備描述符必要辨認(rèn)該設(shè)備包具有HID接口。除了默認(rèn)控制管道外,固件必要此外支持一種中斷輸入管道。固件必要包括一種報(bào)表描述符來定義要傳送與接受設(shè)備數(shù)據(jù)。如果要傳送數(shù)據(jù),固件必要支持Get_Report控制傳播與中斷輸入傳播。如果要接受數(shù)據(jù),固件必要支持Set_Report控制傳播與選取性中斷輸出傳播。所有HID數(shù)據(jù)都必要使用定義過報(bào)表格式來定義報(bào)表中數(shù)據(jù)大小與內(nèi)容。設(shè)備可以支持一種或各種報(bào)表。在固件中一種報(bào)表描述符用來描述此報(bào)表,以及如何使用報(bào)表數(shù)據(jù)信息。在每一種報(bào)表中一種數(shù)值,定義此報(bào)表是一種輸入(Input)、輸出(Output)或是特性(Feature)報(bào)表。主機(jī)在輸入報(bào)表中接受數(shù)據(jù),在輸出報(bào)表中傳送數(shù)據(jù),特性報(bào)表可以在任何方向傳遞。Windows98以及日后版本HID驅(qū)動(dòng)程序使用中斷傳播來傳遞輸入報(bào)表。輸出報(bào)表傳播類型要依照設(shè)備支持端點(diǎn)與Windows版本而定。Windows98Gold只符合HID1.0規(guī)范,它HID驅(qū)動(dòng)程序使用控制傳播來傳遞輸出報(bào)表。Windows98SE、Wndows符合HID1.1規(guī)范,HID驅(qū)動(dòng)程序在有中斷輸出端點(diǎn)時(shí)使用中斷傳播,否則使用控制傳播來傳遞輸出報(bào)表。特性報(bào)表都是使用控制傳播。HID設(shè)備描述符HID設(shè)備連接到USB主機(jī)后,主機(jī)通過發(fā)送Get_Descriptor祈求讀取HID設(shè)備描述符,理解描述符對理解USB設(shè)備是至關(guān)重要。HID設(shè)備描述符HID設(shè)備除了支持USB設(shè)備5種原則描述符之外,還支持HID設(shè)備特有3種描述符。這些描述符是:USB原則描述符:設(shè)備、配備、接口、端點(diǎn)和字符串描述符。HID特有描述符:HID、報(bào)表(Report)和實(shí)體(Physical)描述符。從描述符關(guān)聯(lián)關(guān)系看,HID描述符是關(guān)聯(lián)于接口。因此如果一種HID設(shè)備有2個(gè)端點(diǎn),設(shè)備不需要每個(gè)端點(diǎn)有一種HID描述符。圖8-2圖8-2HID描述符關(guān)聯(lián)關(guān)系接口描述符Interface端點(diǎn)描述符EndpointHID描述符Hid報(bào)表描述符Report實(shí)體描述符PhysicalHID、報(bào)表和實(shí)體描述符是HID設(shè)備特有描述符 從前面USB描述符可以看出一種規(guī)律,描述符第一、二字節(jié)分別是描述符長度和類型,描述符類型字段(bDescriptorType)表白描述符種類,下表列出了不同描述符類型字段數(shù)值。表8-2HID描述符類型描述符應(yīng)用數(shù)值原則設(shè)備Device所有設(shè)備必要有,只能一種01配備Configuration所有設(shè)備必要有,至少一種02字符串String可選取03接口Interface每一種接口一種04端點(diǎn)Endpoint除端點(diǎn)0之外每個(gè)端點(diǎn)一種05設(shè)備限定Device_Qualiffier同步支持全速與高速設(shè)備必要有一種06Other_Speed_Configuration07Interface_power08類別HIDHID設(shè)備必要有21Hub29HID特定報(bào)表ReportHID設(shè)備必要有22實(shí)體Physical可選取23對于一種HID設(shè)備,設(shè)備描述符與配備描述符沒有HID特定信息。其設(shè)備描述符bDeviceClass和bDeviceSubClass字段值為0,接口描述符bInterfaceClass字段值為03,表達(dá)設(shè)備該接口是HID類別。在接口描述符中其她包括HID特定信息字段尚有子類別碼(blnterfaceSubClass)與合同碼(blnterfaceProtocol字段)。在接口描述符中子類別碼字段等于1表達(dá)此設(shè)備支持啟動(dòng)接口(BootInterface)。如果設(shè)備有啟動(dòng)接口,即便主機(jī)HID沒有加載驅(qū)動(dòng)程序,設(shè)備也可以使用。這種情形也許發(fā)生在計(jì)算機(jī)是由DOS直接啟動(dòng),在啟動(dòng)時(shí)觀看系統(tǒng)設(shè)立畫面或使用Wndows安全模式時(shí)。具有啟動(dòng)接口鍵盤或鼠標(biāo)可以使用BIOS或許多主機(jī)支持默認(rèn)簡樸合同。HID規(guī)范定義了鍵盤與鼠標(biāo)啟動(dòng)接口合同。如果設(shè)備沒有啟動(dòng)接口,并且接口描述符中合同碼字段是1,表達(dá)設(shè)備支持鍵盤接口,合同碼字段是2,表達(dá)支持鼠標(biāo)接口。接口描述符中合同碼字段是0,表達(dá)設(shè)備不支持啟動(dòng)合同。在HIDUsageTables規(guī)范中定義了鍵盤與鼠標(biāo)啟動(dòng)描述符(BootDescriptor)。BIOS不需要從設(shè)備中讀取描述符,由于它懂得啟動(dòng)合同,并且假設(shè)設(shè)備支持啟動(dòng)合同。因此要啟動(dòng)設(shè)備不需要在固件內(nèi)包括啟動(dòng)接口描述符,它只要在主機(jī)尚未規(guī)定在報(bào)表描述符中定義合同時(shí)支持啟動(dòng)合同即可。在操作系統(tǒng)加載HlD驅(qū)動(dòng)程序后會(huì)使用Set_Protocol祈求,將設(shè)備由啟動(dòng)合同轉(zhuǎn)換成報(bào)表合同。HID描述符HID描述符重要作用是用來辨認(rèn)HID通信所使用額外描述符。下表是HID描述符構(gòu)造。表8-3HID描述符構(gòu)造偏移量字段字節(jié)數(shù)數(shù)值類型闡明0bLength1Numeric描述符字節(jié)數(shù)1bDescriptorType1Constant0x21=HID描述符2bcdHID2NumericHID規(guī)范版本號(BCD)4bCountryCode1Numeric硬件設(shè)備所在國家國家代碼5bNumDescriptors1Numeric類別描述符數(shù)目(至少有一種報(bào)表描述符)6bDescriptorType1Constant類別描述符類型7wDescriptorLength2Numeric報(bào)表描述符總長度9[bDescriptorType]...1Constant附加描述符類型,可選10[wDescriptorLength]...2Numeric附加描述符總長度,可選bcdHID:設(shè)備與其描述符所遵循HID規(guī)范版本號碼,此數(shù)值是4個(gè)16進(jìn)位BCD格式字符。例如版本1.1bcdHID是0110h。bCountryCode:硬件目國家辨認(rèn)碼。如果不闡明,該字段為0。bDescriptorType:HID描述符附屬描述符類型(報(bào)表或?qū)嶓w)。每一種HID都必要至少支持一種報(bào)表描述符。一種接口可以支持各種報(bào)表描述符,以及一種或各種實(shí)體描述符。HID描述符偏移量為9和10bDescriptorType和wDescriptorLength可以重復(fù)存在各種。報(bào)表描述符報(bào)表描述符定義了執(zhí)行設(shè)備功能數(shù)據(jù)格式和用法。報(bào)表描述符和USB其她描述符是不同樣,它不是一種簡樸表格,報(bào)表描述符是USB所有描述符中最復(fù)雜。報(bào)表描述符非常復(fù)雜而有彈性,由于它需要解決各種用途設(shè)備。報(bào)表數(shù)據(jù)必要以簡潔格式來儲(chǔ)存,這樣才不會(huì)揮霍設(shè)備內(nèi)儲(chǔ)存空間以及數(shù)據(jù)傳播時(shí)總線時(shí)間。事實(shí)上可以這樣理解,報(bào)表內(nèi)容簡潔,是通過報(bào)表描述符全面、復(fù)雜數(shù)據(jù)描述實(shí)現(xiàn)。報(bào)表描述符必要先描述數(shù)據(jù)大小與內(nèi)容。報(bào)表描述符內(nèi)容與大小因設(shè)備不同而不同,在進(jìn)行報(bào)表傳播之前,主機(jī)必要先祈求設(shè)備報(bào)表描述符,只有得到了報(bào)表描述符才可對的解析報(bào)表數(shù)據(jù)。報(bào)表描述符是報(bào)表描述項(xiàng)目(Item)集合,每一種描述項(xiàng)目均有相對統(tǒng)一數(shù)據(jù)構(gòu)造,項(xiàng)目諸多,通過編碼實(shí)現(xiàn)。(1)項(xiàng)目報(bào)表描述符由描述HID設(shè)備數(shù)據(jù)項(xiàng)目(Item)構(gòu)成,項(xiàng)目第一種字節(jié)(項(xiàng)當(dāng)前綴)由三某些構(gòu)成,即項(xiàng)目類型(itemtype)、項(xiàng)目的志(itemtag)和項(xiàng)目長度(itemsize)。其中項(xiàng)目類型闡明項(xiàng)目數(shù)據(jù)類型,項(xiàng)目的簽闡明項(xiàng)目功能,項(xiàng)目長度闡明項(xiàng)目數(shù)據(jù)某些長度。HID項(xiàng)目有短項(xiàng)目和長項(xiàng)目兩種,其中短項(xiàng)目格式如下圖。DData(可以是0、1、2、4個(gè)字節(jié))bTagbTypebSize76543210位序字段圖8-3HID報(bào)表短項(xiàng)目格式短項(xiàng)目數(shù)據(jù)字節(jié)數(shù)由bSize值定義,bSize為0、1、2、3時(shí)Data某些字節(jié)數(shù)分別為0、1、2、4個(gè)字節(jié)。短項(xiàng)目項(xiàng)目類型由bType定義,bType為0、1、2時(shí)分別為Main、Global和Local類型。長項(xiàng)目可以攜帶較多數(shù)據(jù),其格式如下圖。bDataSize11111110bDataSize1111111076543210位序字段圖8-4HID報(bào)表長項(xiàng)目格式bLongItemTagData字節(jié)數(shù)1111~255下面是通過匯編實(shí)現(xiàn)一種簡樸報(bào)表描述符,描述符每一行是一種項(xiàng)目,該描述符描述了一種從設(shè)備接受2個(gè)字節(jié)輸入報(bào)表和發(fā)送2個(gè)字節(jié)到設(shè)備輸出報(bào)表。HID_Report_desc_table: db06h,A0h,F(xiàn)Fh ;UsagePage(Vendordefined)定義設(shè)備功能 db09h,A5h ;Usage(VendorDefined)定義用法 dbA1h,01h ;Collection(Application)開一種集合 db09H,A6h ; Usage(Vendordefined)定義用法 ; 輸入報(bào)表 db09h,A7h ; Usgae(Vendordefined)定義用法 db15h,80h ; LogicalMinimum定義輸入最小值=-128 db25h,7Fh ; LogicalMaximum定義輸入最大值=+27 db75h,08h ; ReportSize定義報(bào)表數(shù)據(jù)項(xiàng)大小=8 db95h,02h ; ReportCount定義報(bào)表數(shù)據(jù)向個(gè)數(shù)=2 db81h,02h ; Input(Data,Variable,Absolute)輸入項(xiàng)目 ; 輸出報(bào)表 db09h,A9h ; Usgae(Vendordefined)定義用法 db15h,80h ; LogicalMinimum定義輸入最小值=-128 db25h,7Fh ; LogicalMaximum定義輸入最大值=+27 db75h,08h ; ReportSize定義報(bào)表數(shù)據(jù)項(xiàng)大小=8 db95h,02h ; ReportCount定義報(bào)表數(shù)據(jù)向個(gè)數(shù)=2 db91h,02h ; Output(Data,Variable,Absolute)輸出項(xiàng)目 dbC0h ;EndCollection關(guān)閉集合(2)項(xiàng)目分類報(bào)表項(xiàng)目有Main、Global和Local三大類,每一類均有各種不同項(xiàng)目,實(shí)現(xiàn)不同描述。Main類項(xiàng)目用于定義報(bào)表描述符中數(shù)據(jù)項(xiàng)。也可以組合其中若干數(shù)據(jù)項(xiàng)成為一種集合。Main項(xiàng)目可以分為帶數(shù)據(jù)Main項(xiàng)目和不帶數(shù)據(jù)Main項(xiàng)目。帶數(shù)據(jù)項(xiàng)Main用于生成報(bào)表中數(shù)據(jù)項(xiàng),涉及Input、Output和Feature項(xiàng)目。不帶數(shù)據(jù)Main項(xiàng)目不生成報(bào)表中數(shù)據(jù)項(xiàng),涉及Collection和EndCollection項(xiàng)目。Global類項(xiàng)目實(shí)現(xiàn)對數(shù)據(jù)描述,用來辨認(rèn)報(bào)表并且描述報(bào)表內(nèi)數(shù)據(jù),涉及數(shù)據(jù)功能、最大與最小容許值以及數(shù)據(jù)項(xiàng)大小與數(shù)目等。變化由Main類項(xiàng)目生成項(xiàng)目狀態(tài)表。Global類項(xiàng)目描述對后續(xù)所有項(xiàng)目有效,除非遇到有新Global類項(xiàng)目。Local類項(xiàng)目定義控制特性,這一類項(xiàng)目作用域不超過下一種Main項(xiàng)目,因此在每一Main項(xiàng)目之前也許有各種Local項(xiàng)目。Local項(xiàng)目用于描述背面Input、Output和Feature項(xiàng)目。下表列出是所有項(xiàng)當(dāng)前綴字和簡要功能闡明。表8-4HID項(xiàng)目列表項(xiàng)目類型項(xiàng)目的志(Tag)項(xiàng)當(dāng)前綴,nn為數(shù)據(jù)長度功能闡明Main類項(xiàng)目Input100000nn定義輸入報(bào)表,主機(jī)運(yùn)用該信息解析設(shè)備提供數(shù)據(jù)。主機(jī)向控制端口發(fā)送Get_Report實(shí)現(xiàn)輸入Output100100nn創(chuàng)立輸出報(bào)表,通過向設(shè)備發(fā)送Set_Report實(shí)現(xiàn)輸出Feature101100nn定義送往設(shè)備設(shè)立信息Collection101000nn定義2個(gè)以上數(shù)據(jù)(Input、Output和Feature)關(guān)系為集合,Collection開始一種集合,之后EndCollection結(jié)束集合。Collection項(xiàng)目數(shù)據(jù)某些闡明Collection類型EndCollection110000nnGlobal類項(xiàng)目UsagePage000001nn指定設(shè)備功能此外由于Usage項(xiàng)目有32位數(shù)據(jù)值,UsagePage項(xiàng)目用于為Usage項(xiàng)目在報(bào)表描述符中占居存儲(chǔ)空間。用于存儲(chǔ)后續(xù)Usage項(xiàng)目高16位。LogicalMinimum000101nn定義變量或數(shù)組項(xiàng)目邏輯最小值和最大值LogicalMaximum001001nnPhysicalMinimum001101nn定義變量或數(shù)組項(xiàng)目物理最小值和最大值,分別和LogicalMinimum、LogicalMaximum相應(yīng)PhysicalMaximum010001nnUnitExponent010101nn定義數(shù)值是基于10指數(shù)Unit011001nn單位ReportSize011101nn指定報(bào)表數(shù)據(jù)區(qū)域所包括位數(shù)ReportID100001nn報(bào)表ID,該項(xiàng)目在報(bào)表中插入一種字節(jié)報(bào)表IDReportCount100101nn報(bào)表中數(shù)據(jù)域數(shù)目Push101001nn將Global項(xiàng)目狀態(tài)表送入堆棧Pop101101nn從堆?;謴?fù)Global項(xiàng)目狀態(tài)表110001nn–111101nn保存Local類項(xiàng)目Usage000010nn用法索引值,表達(dá)對項(xiàng)目或集合建議用法,用于當(dāng)一種項(xiàng)目描述各種控制,對每一種變量和數(shù)組元素均有建議用法UsageMinimum000110nn定義陣列或位圖中控制操作第一種和最后一種用法UsageMaximum001010nnDesignatorIndex001110nn擬定用于控制實(shí)體,指向物理描述符中目的DesignatorMinimum010010nn定義陣列或位圖目的起始和終結(jié)索引值DesignatorMaximum010110nnStringIndex011110nn擬定字符串描述符中索引值StringMinimum100010nn定義用于陣列或位圖控制中字符串序列索引值最小值和最大值StringMaximum100110nnDelimiter101010nn定義一組Local項(xiàng)目開始和結(jié)束,1=開始,0=結(jié)束101010nn–111110nn保存在這些項(xiàng)目中,UsagePage用來指定設(shè)備功能,而Usage項(xiàng)目用來指定個(gè)別報(bào)表功能。UsagePage項(xiàng)目相稱于是HID子集合,Usage相稱于是UsagePage子集合。報(bào)表描述符項(xiàng)目(1)Input、Outpot和Feature項(xiàng)目這3個(gè)項(xiàng)目用來定義報(bào)表中數(shù)據(jù)字段。Input項(xiàng)目可以應(yīng)用到任何控制、計(jì)數(shù)器讀數(shù)或其她設(shè)備傳給主機(jī)信息。一種輸入報(bào)表包括一種或各種Input項(xiàng)目,主機(jī)使用中斷輸入傳播來祈求輸入報(bào)表。Ouput項(xiàng)目用來定義主機(jī)傳送給設(shè)備信息。一種輸出報(bào)表包括一種或各種Outpot項(xiàng)目。輸出報(bào)表包括控制狀態(tài)數(shù)據(jù)。如果有中斷輸出管道,HID1.1兼容主機(jī)使用中斷輸出傳播來傳送輸出報(bào)表,否則使用Set_Report控制祈求。Feature項(xiàng)目應(yīng)用到主機(jī)傳送給設(shè)備信息,或是主機(jī)從設(shè)備讀取Feature項(xiàng)目。一種特性報(bào)表包括一種或各種Feature項(xiàng)目,F(xiàn)eature項(xiàng)目普通是包合影響設(shè)備與其組件整體行為配備。特性報(bào)表普通是控制可以使用實(shí)際控制面板調(diào)節(jié)設(shè)立,例如主機(jī)可以使用虛擬控制面板來讓顧客選取控制特性。主機(jī)使用Set_Report與Get_Report祈求來傳送與接受特性報(bào)表。在每一種Input、Output和Feature項(xiàng)當(dāng)前綴字之后是32位描述數(shù)據(jù),當(dāng)前最多定義了9個(gè)位,余位則是保存。位0~8定義中只有位7不能應(yīng)用于Input項(xiàng)目,除此之外其她位定義都適應(yīng)于Input、Output和Feature項(xiàng)目。表8-5Input、Output和Feature項(xiàng)目數(shù)據(jù)項(xiàng)闡明數(shù)據(jù)字段含義闡明位值名稱00Data數(shù)據(jù):表達(dá)項(xiàng)目內(nèi)容是可更改(讀/寫)。1Constant常數(shù):表達(dá)項(xiàng)目內(nèi)容是不可更改(只讀)。10Array數(shù)組:報(bào)告所有控制狀態(tài)。如在鍵盤報(bào)表中每一種鍵在報(bào)表中占一位,報(bào)表傳播所有鍵狀態(tài),可以同步按下任意各種鍵。1Variable變量:報(bào)告作用中控制。如在鍵盤報(bào)表中只報(bào)告按下鍵編號,可以同步按下鍵數(shù)目等于報(bào)表計(jì)數(shù)(Global類項(xiàng)目ReportCount)20Absolute絕對:表達(dá)數(shù)值以一種固定值為基準(zhǔn)。游戲桿普通是報(bào)告絕對數(shù)據(jù)(游戲桿當(dāng)前位置)。1Relative相對:表達(dá)數(shù)據(jù)變化以上一種讀數(shù)為基準(zhǔn)。鼠標(biāo)普通是報(bào)告相對數(shù)據(jù)(鼠標(biāo)移動(dòng)位置)。3①0NoWrap如果設(shè)立為1表達(dá)回轉(zhuǎn),當(dāng)數(shù)值超過最小值到最大值范疇時(shí)將回轉(zhuǎn),如果最小值是0而最大值是10,超過最大值下一種數(shù)值是0。1Wrap4①0Linear線形:表達(dá)測量數(shù)據(jù)與報(bào)表數(shù)據(jù)有線性關(guān)系。1Non-Linear非線性:表達(dá)測量數(shù)據(jù)與報(bào)表數(shù)據(jù)沒有線性關(guān)系。5①0Preferred優(yōu)選狀態(tài):表達(dá)控制在沒有顧客交互時(shí)會(huì)回到一種特定狀態(tài)。如按鈕就有優(yōu)選狀態(tài),在無操作時(shí)保持未按下狀態(tài)。1Non-Preferred非優(yōu)選狀態(tài):它維持在上一種顧客選取狀態(tài)。如交替開關(guān)就沒有優(yōu)選狀態(tài)。6①0NoNullPosition無空狀態(tài)位置:表達(dá)控制永遠(yuǎn)在傳送有效數(shù)據(jù)。1Null空狀態(tài):表達(dá)控制支持一種沒有傳送有效數(shù)據(jù)狀態(tài)。如操縱桿也許具備一種多方向按鈕開關(guān),在沒有按下時(shí)在空狀態(tài),這時(shí)控制將傳送一種在LogicalMinimum與LogicalMaximum范疇之外數(shù)值來表達(dá)它在空狀態(tài)。7②0Non-Volatile不可變:表達(dá)設(shè)備只有在主機(jī)祈求時(shí)才變化數(shù)值。當(dāng)主機(jī)傳送一種報(bào)表并且不要變化不可變項(xiàng)目時(shí),如果該項(xiàng)目是定義成相對(Relative),數(shù)值0表達(dá)不變化數(shù)據(jù),如果不可變項(xiàng)目是定義成絕對(Absolute),超過范疇外數(shù)值則表達(dá)不變化數(shù)據(jù)。1Volatile可變:表達(dá)設(shè)備可以自己變化數(shù)值,并不是必要主機(jī)傳送報(bào)表規(guī)定給設(shè)備來變化數(shù)值。例如設(shè)備控制面板可以由主機(jī)軟件傳送一種報(bào)表給設(shè)備,也可以由顧客自己按設(shè)備上實(shí)際按鈕。8①0BitField位字段:表達(dá)每一種位或是一種字節(jié)內(nèi)一組位可以代表一份數(shù)據(jù)。1BufferedBytes緩沖字節(jié):表達(dá)信息包括一種或各種字節(jié),緩沖字節(jié)報(bào)表大小必要是8。9~31位保存注: ①:該位不能應(yīng)用到數(shù)組。②:只應(yīng)用于Output和Feature項(xiàng)目,對于Input項(xiàng)目該位保存。(2)Collection和EndCollection項(xiàng)目所有報(bào)表類型都可以使用Collection與EndCollection項(xiàng)目來將有關(guān)Main類型項(xiàng)目構(gòu)成群組。這兩個(gè)項(xiàng)目分別用于打開和關(guān)閉集合。所有在Collection與EndCollection項(xiàng)目之間Main類型項(xiàng)目都是Collection一某些。Collection有3種類型:Application、Physical與Logical,其項(xiàng)目數(shù)據(jù)項(xiàng)值分別為1、0和2。廠商也可以自己定義Collection類型,數(shù)據(jù)項(xiàng)值為80h~FFh保存給廠商定義。EndCollection項(xiàng)目無數(shù)據(jù)項(xiàng)。ApplicationCollection包具有共同用途項(xiàng)目或執(zhí)行單一功能項(xiàng)目。例如鍵盤開機(jī)描述符將鍵盤按鍵與LED批示燈數(shù)據(jù)集合成一種ApplicationCollection。所有報(bào)表必要在一種ApplicationCollection內(nèi)。PhysicalCollection包括在一種單一幾何點(diǎn)上數(shù)據(jù)項(xiàng)目,可以將每個(gè)位置數(shù)據(jù)集合成一種PhysicalCollection。在設(shè)備報(bào)告各種傳感器位置時(shí)候,使用PhysicalCollection指明不同數(shù)據(jù)來自不同傳感器。LogicalCollection形成一種數(shù)據(jù)構(gòu)造,包括由Collection所連結(jié)不同類型項(xiàng)目。例如數(shù)據(jù)緩沖區(qū)內(nèi)容以及緩沖區(qū)內(nèi)字節(jié)數(shù)目計(jì)數(shù)。(3)UsagePage和Usage項(xiàng)目Usagepage項(xiàng)目數(shù)據(jù)某些為1~2個(gè)字節(jié),當(dāng)前定義所有都是一種字節(jié)。UsagePage定義了慣用設(shè)備功能,關(guān)于UsagePage(以及其她項(xiàng)目)詳細(xì)定義內(nèi)容,可以查閱HIDUsagetables(),下表是來自HIDUsagetablesUsagePage定義。表8-6UsagePage定義PageIDPageName00Undefined01GenericDesktopControls02SimulationControls03VRControls04SportControls05GameControls06GenericDeviceControls07Keyboard/Keypad08LEDs09Button0AOrdinal0BTelephony0CConsumer0DDigitizer0EReserved0FPIDPage10Unicode11-13Reserved14AlphanumericDisplay15-3fReserved40MedicalInstruments41-7FReserved80-83Monitorpages84-87Powerpages88-8BReserved8CBarCodeScannerpage8DScalepage8EMagneticStripeReading(MSR)Devices8FReservedPointofSalepages90CameraControlPage91ArcadeFEFFReservedFF00-FFFFVendor-defined關(guān)于UsagePage每一種有效定義項(xiàng),均有一種相應(yīng)下一級定義,如UsagePage數(shù)據(jù)項(xiàng)數(shù)值為1,則設(shè)備定義為GenericDesktopControls,關(guān)于該類設(shè)備詳細(xì)功能可以在HIDUsageTables中查到詳細(xì)定義。下表是HIDUsageTables中對GenericDesktopControls設(shè)備功能定義。表8-7GenericDesktopControls用法定義UsageIDUsageNameUsageType參閱HIDUsageTables中有關(guān)章節(jié)00Undefined01PointerCP4.102MouseCA03Reserved04JoystickCA4.105GamePadCA06KeyboardCA07KeypadCA08Multi-axisControllerCA09TabletPCSystemControlsCA0A-2FReserved30XDV4.231YDV32ZDV33RxDV34RyDV35RzDV36SliderDV4.337DialDV38WheelDV39HatswitchDV3ACountedBufferCL4.63BByteCountDV3CMotionWakeupOSC4.33DStartOOC3ESelectOOC3FReserved40VxDV4.3.141VyDV42VzDV43VbrxDV44VbryDV45VbrzDV46VnoDV47FeatureNotificationDV,DF4.848ResolutionMultiplierDV49-7FReserved80SystemControlCA4.581SystemPowerDownOSC82SystemSleepOSC4.5.183SystemWakeUpOSC84SystemContextMenuOSC4.585SystemMainMenuOSC86SystemAppMenuOSC87SystemMenuHelpOSC88SystemMenuExitOSC89SystemMenuSelectOSC8ASystemMenuRightRTC8BSystemMenuLeftRTC8CSystemMenuUpRTC8DSystemMenuDownRTC8ESystemColdRestartOSC4.5.18FSystemWarmRestartOSC90D-padUpOOC4.791D-padDownOOC92D-padRightOOC93D-padLeftOOC94-9FReservedA0SystemDockOSC4.5.1A1SystemUndockOSCA2SystemSetupOSCA3SystemBreakOSC4.9A4SystemDebuggerBreakOSCA5ApplicationBreakOSCA6ApplicationDebuggerBreakOSCA7SystemSpeakerMuteOSC4.5.1A8SystemHibernateOSCA9-AFReservedB0SystemDisplayInvertOSC4.10B1SystemDisplayInternalOSCB2SystemDisplayExternalOSCB3SystemDisplayBothOSCB4SystemDisplayDualOSCB5SystemDisplayToggleInt/ExtOSCB6SystemDisplaySwapPrimary/SecondaryOSCB7SystemDisplayLCDAutoscaleOSCB8-FFFFReserved用法(Usage)定義了各種各樣設(shè)備特性,對于UsagePage每一項(xiàng)都定義了慣用各種用法。用法闡明了3種信息,即控制、集合和數(shù)據(jù)??刂脐U明設(shè)備狀態(tài),如on/off、Enable/Disable等。集合闡明控制和數(shù)據(jù)組合關(guān)系。上表中用法類型(UsageType)描述了應(yīng)用程序如何解決由Main類型項(xiàng)目生成數(shù)據(jù),詳細(xì)定義和詳細(xì)闡明請參閱HIDUsageTables。(4)ReportID項(xiàng)目ReportID放在信息包中報(bào)表數(shù)據(jù)之前,設(shè)備可以支持各種相似類型報(bào)表,每一種報(bào)表包括不同數(shù)據(jù)與其特有ID。在報(bào)表描述符中,ReportID項(xiàng)目作用于其后續(xù)所有項(xiàng)目,直到遇到下一種ReportID為止。如果報(bào)表描述符中沒有ReportID項(xiàng)目,默認(rèn)ID值是0,描述符不能定義一種為0ReportID,輸入報(bào)表、輸出報(bào)表與特性報(bào)表可以分享同一種ReportID。在Set_Report和Get_Report祈求傳播中,主機(jī)在設(shè)立事務(wù)wValue字段低字節(jié)中指定一種ReportID。在中斷傳播中如果接口支持一種以上ReportID,ReportID必要是傳送報(bào)表中第一種字節(jié)。如果接口只支持?jǐn)?shù)值為0默認(rèn)ReportID,此ReportID不應(yīng)當(dāng)在中斷傳播中隨著報(bào)表一起傳送。(5)LogicalMinimum和LogicalMaximum項(xiàng)目LogicalMinimum與LogicalMaximum項(xiàng)目定義報(bào)表變量(Variable)或陣列(Array)數(shù)據(jù)限制范疇,此限制范疇以邏輯單位來表達(dá)。例如設(shè)備報(bào)表一種電流值讀數(shù)是500mA,而一種單位是2mA,則LogicalMaximum值等于250。負(fù)數(shù)值以2補(bǔ)碼來表達(dá)。如果LogicalMinimum與LogicalMaximum都是正數(shù),就不需要有正負(fù)號位。不論LogicalMinimum與LogicalMaximum是以有正負(fù)號或是無正負(fù)號數(shù)值來表達(dá),設(shè)備都可以對的地傳播數(shù)據(jù)。數(shù)據(jù)接受者必要懂得數(shù)據(jù)與否可以是負(fù)值。(5)PhysicalMinimum和PhysicalMaximum項(xiàng)目PhysicalMinimum和PhysicalMaximum項(xiàng)目定義數(shù)值限制范疇,該限制范疇使用Unit項(xiàng)目定義單位來表達(dá)。上例中設(shè)備報(bào)表一種電流值讀數(shù)是500mA,單位是2mA,LogicalMaximum值等于250,而PhysicalMaximum值是500。LogicalMinimum與LogicalMaximum值闡明了設(shè)備返回?cái)?shù)值邊界,可以依照PhysicalMinimum和PhysicalMaximum值對數(shù)據(jù)進(jìn)行偏移和比例變換。(6)UnitExponent項(xiàng)目UnitExponent項(xiàng)目定義了在使用邏輯范疇和實(shí)際范疇將設(shè)備返回?cái)?shù)值轉(zhuǎn)換成實(shí)際數(shù)值時(shí),使用10多少次方對數(shù)值進(jìn)行定標(biāo)。UnitExponent值編碼為4位補(bǔ)碼,代表10指數(shù)范疇是-8~+7。表8-8UnitExponent數(shù)值表代碼00h01h02h03h04h05h06h07h08h09h0Ah0Bh0Ch0Dh0Eh0FH數(shù)值01234567-8-7-6-5-4-3-2-1依照以上5個(gè)項(xiàng)目值可以換算出報(bào)表傳送數(shù)據(jù)(邏輯數(shù)據(jù))與物理數(shù)據(jù)轉(zhuǎn)換關(guān)系。物理數(shù)據(jù)值=邏輯數(shù)據(jù)值÷辨別率辨別率=(LogicalMaximum-LogicalMinimum)÷((PhysicalMaximum-PhysicalMinimum)×10UnitExponent)(7)Unit項(xiàng)目Unit項(xiàng)目指定報(bào)表數(shù)據(jù)在使用Physical與UnitExponent項(xiàng)目轉(zhuǎn)換后使用什么度量單位,以及單位冪指數(shù)值。Unit數(shù)值某些可以長達(dá)4字節(jié),按照4位為一段分段,可以分為8個(gè)半字節(jié)段,由高到低分別為半字節(jié)7、半字節(jié)6、…、半字節(jié)0。每一種半字節(jié)相應(yīng)不同基本單位,其數(shù)值表達(dá)單位指數(shù)值,采用4位2補(bǔ)碼表達(dá),取值范疇是-8~+7之間。從半字節(jié)0~6由下表給出了詳細(xì)定義,其中半字節(jié)0表達(dá)測量系統(tǒng),半字節(jié)7保存。例如在半字節(jié)0數(shù)值為1(表達(dá)采用線性公制測量系統(tǒng))條件下,半字節(jié)1表達(dá)長度(單位為厘米),如果其數(shù)值為1表達(dá)厘米,數(shù)值為2表達(dá)(厘米)2,成為面積單位。半字節(jié)3表達(dá)時(shí)間(單位為秒),如果其數(shù)值為-2,表達(dá)(秒)-2。表8-9Unit單位定義半字節(jié)序號測量項(xiàng)目數(shù)值含義012340測量系統(tǒng)無線性、公制角度、公制線性、英制角度、英制1長度厘米半徑英寸度2質(zhì)量克石拉(slug)3時(shí)間秒4溫度開式度(Kelvin)華式度5電流安培6亮度燭光7保存雖然表中只是定義了有限基本單位,但可以通過這些基本單位組合派生出大多數(shù)其他慣用單位。例如報(bào)表使用一種字節(jié)傳送一種從-20到110華氏度溫度值,可以定義如下報(bào)表描述項(xiàng)目:LogicalMinimum=-128LogicalMaximum=127PhysicalMinimum=-20PhysicalMaximum=110UnitExponent=0Unit=30003hUnit半字節(jié)0=3選取英制線性測量系統(tǒng),半字節(jié)4=3選取華氏溫度單位。130(110+20)華氏度數(shù)值范疇線性分布到了256和有效數(shù)值區(qū)域,每一位相稱于0.51華氏度,這樣就提高了辨別率。(8)ReportSize和ReportCount項(xiàng)目ReportSize項(xiàng)目指定Input、Output與Feature項(xiàng)目字段大小,以位為單位。ReportCount項(xiàng)目指定Input、Output與Feature項(xiàng)目包括字段數(shù)目。例如兩個(gè)8位字段,ReportSize等于8,而ReportCount等于2。8個(gè)1位字段,ReportSize等于1,而ReportCount等于8。Input、Output與Feature項(xiàng)目報(bào)表可以有各種項(xiàng)目,每一種項(xiàng)目可以有自己ReportSize和ReportCount項(xiàng)目。(9)Push和Pop項(xiàng)目Push項(xiàng)目將一種Global項(xiàng)目狀態(tài)表格副本壓入CPU堆棧內(nèi)。GIobal項(xiàng)目狀態(tài)表格包括所有之前定義Gobal項(xiàng)目當(dāng)前設(shè)立。Pop項(xiàng)目恢復(fù)之前壓入堆棧Global項(xiàng)目狀態(tài)儲(chǔ)存狀態(tài)。(10)Usage、UsageMinimum和UsageMaximum項(xiàng)目這3個(gè)項(xiàng)目輸入Local類型項(xiàng)目。Usage項(xiàng)目和Global類型UsagePage項(xiàng)目協(xié)同描述項(xiàng)目或集合功能。一種報(bào)表可以指定一種Usage給許各種控制,或是指定不同Usage給每一種控制。如果一種報(bào)表項(xiàng)目之前有一種Usage,此Usage應(yīng)用到該項(xiàng)目所有控制。如果一種報(bào)表項(xiàng)目之前有一種以上Usage,每一種Usage應(yīng)用到一種控制,Usage與控制是按順序結(jié)合。例如下面報(bào)表描述符一種局部,報(bào)表具有2個(gè)輸入字節(jié),第一種字節(jié)用法是x,第2個(gè)字節(jié)是y。ReportSize(8)ReportCount(2)Usage(x)Usage(y)Input(Data,Variable,Absolute)如果一種報(bào)表項(xiàng)目之前有一種以上Usage,并且控制數(shù)目多于Usage數(shù)目,每一種Usage與一種控制相應(yīng),最后一種Usage則應(yīng)用到所有剩余控制。例如在下面報(bào)表包括16個(gè)字節(jié)輸入數(shù)據(jù),第一種字節(jié)相應(yīng)用法x,第2個(gè)字節(jié)相應(yīng)用法y,剩余14個(gè)字節(jié)相應(yīng)廠商定義用法。Usage(x)Usage(y)Usage(Vendordefined)ReportSize(8)ReportCount(16)Input(Data,Variable,Absolute)UsageMinimum和UsageMaximum可以指定一種Usage給各種控制或是數(shù)組項(xiàng)目。將從UsageMinimum到UsgaeMaximun定義用法順序相應(yīng)到各種控制中。例如在一種鍵盤描述符中定義原則鍵盤左、右修飾鍵輸入項(xiàng)目中,使用一種字節(jié)8位分別輸入鍵盤左、右Ctrl鍵、Shift鍵、Alt鍵和GUI鍵,從HIDUsagetables文檔中第10節(jié)可以查到關(guān)于鍵盤用法定義,其中上述8個(gè)修飾鍵用法定義值為224到231。如下是報(bào)表描述符修飾鍵某些描述。UsagePage(1) ;1=GenericDesktopControlsUsage(6) ;6=KeyboardCollection(1) ;1=ApplicationUsagePage(7) ;7=Keyboard/KeypadUsageMinimum(224) UsageMaximum(231)LogicalMinimum(0)LogicalMaximum(1)ReportSize(1)ReportCount(8)Input(Data,Variable,Absolute)……USB接口鍵盤描述符范例下面作為一種例子,簡介一種USB接口101鍵盤所有描述符。該鍵盤固件某些由一種微解決器實(shí)現(xiàn)所有控制功能,下面列出代碼為微解決器匯編實(shí)現(xiàn)描述符定義。設(shè)備描述符設(shè)備描述符代碼如下。;=========================================;Devicedescriptor 設(shè)備描述符;=========================================DEVICE_DESC_DATA:DB0x12 ;bLength=18,該描述符長度為18字節(jié)DB0x01 ;bDescriptorType=01,表白是設(shè)備描述符DB0x10,0x01 ;bcdUSB,USB設(shè)備版本號=1.1DB0x00 ;DeviceClass,設(shè)備類碼,HID設(shè)備為0,類別在接口描述符中定義DB0X00 ;DeviceSubClass,設(shè)備子類碼,DeviceClass為0時(shí)該字段必要為0DB0X00 ;bDevicePortocol,合同碼,DeviceClass為0時(shí)該字段必要為0DB0x08 ;bMaxPacketSize0,端點(diǎn)0最大包尺寸DB0xFF,0xFF ;bVendor,廠商ID,由USB實(shí)現(xiàn)者論壇擬定DB0x01,0x00 ;bProduct,產(chǎn)品IDDB0x00,0x01 ;bcdDevice,設(shè)備版本號為1.00DB0x04 ;iManufacturer,廠商字符串索引值,見字符串描述符DB0x0E ;iProduct,產(chǎn)品字符串索引值,見字符串描述符DB0x30 ;iSerialNumber,產(chǎn)品序列號字符串索引值,見字符串描述符DB0X01 ;bNumConfigurations,配備數(shù)目只有1個(gè)配備描述符配備描述符代碼如下。;=========================================;Configurationdescriptor配備描述符;=========================================CONFIG_DESC_DATA:DB0x09 ;bLength=9,該描述符長度為9字節(jié)DB0x02 ;bDescriptorType=02,表白是配備描述符DB0x3B,0x00 ;wTotalLength=59,配備、接口、端點(diǎn)和HID描述符總和字節(jié)數(shù)DB0x02 ;bNumInterfaces=2,本配備支持接口數(shù)目為2個(gè)DB0x01 ;bConfigurationValue=1,本配備描述符標(biāo)記符DB0x00 ;iCongfiguration=0,配備描述符闡明字符串索引值,0表達(dá)無DB0XA0 ;bmAttributes,電源及喚醒設(shè)立,USB1.1版中D7=1,D6=0表達(dá)總線供電 ;D5=1表達(dá)支持遠(yuǎn)程喚醒DB0X32 ;MaxPower=50,本設(shè)備最大耗電為50X2mA=100mA需要闡明是wTotalLength值,該數(shù)值為配備描述符長度(9)加上后續(xù)鍵盤接口描述符長度(9)、端點(diǎn)描述符長度(7)、HID描述符長度(9),以及該配備下鼠標(biāo)接口描述符長度(9)、端點(diǎn)描述符長度(7)、HID描述符長度(9),共59個(gè)字節(jié)。關(guān)于鼠標(biāo)有關(guān)描述符在下面論述中省略了。接口描述符接口描述符代碼如下。;=========================================;Interfacedescriptor接口描述符;=========================================InterfaceDescriptor0:DB0x09 ;bLength=9,該描述符長度DB0x04 ;bDescriptorType=4,表白是接口描述符DB0x00 ;bInterfaceNumber=0,此接口辨認(rèn)標(biāo)記符DB0x00 ;bAlternateSetting=0,表達(dá)此接口無代替設(shè)立值DB0x01 ;bNumEndpoints=1,本接口端點(diǎn)數(shù)目,HID設(shè)備使用端點(diǎn)1DB0x03 ;bInterfaceClass=3,表達(dá)該設(shè)備是HID類別DB0x01 ;bInterfaceSubClass=1,表達(dá)支持啟動(dòng)接口DB0x01 ;bInterfaceProtocol=1,表達(dá)支持鍵盤合同DB0x00 ;iInterface=0,接口描述符闡明字符串索引值,0表達(dá)無字符串HID描述符HID描述符代碼如下。;=========================================;HIDdescriptorHID描述符;=========================================HIDDescriptor0:DB0x09 ;bLength=9,該描述符長度DB0x21 ;bDescriptorType=21h,表白是HID描述符DB0x00,0x01 ;bcdHID=0100,HID規(guī)范版本為1.00DB0x00 ;bCountryCode=0,硬件設(shè)備所在國家國家代碼,0表達(dá)未指明DB0x01 ;nNumDescriptors=1,表達(dá)支持描述符有1個(gè),即一種報(bào)表描述符DB0x22 ;bDescriptorType=22h,描述符類別,表達(dá)支持描述符是報(bào)表描述符DB0x3F,0x00 ;wDescriptorLength=63,表達(dá)支持報(bào)表描述符長度端點(diǎn)描述符端點(diǎn)描述符代碼如下。;=========================================;EndPointdescriptor端點(diǎn)描述符;=========================================EndpointDescriptor0:DB0x07 ;bLength=7,該描述符長度DB0x05 ;bDescriptorType=5,表白是端點(diǎn)描述符DB0x81 ;bEndpointAddress=10000001b,表達(dá)1號輸入端點(diǎn)DB0X03 ;bmAttributes=00000011b,表達(dá)中斷類型端點(diǎn)DB0x08,0x00 ;wMaxPacketSize=8,端點(diǎn)發(fā)送和接受最大包尺寸為8DB10 ;bInterval=10,表達(dá)中斷端點(diǎn)輪詢時(shí)間間隔為10ms字符串描述符字符串描述符代碼如下。;=========================================;Stringdescriptor字符串描述符;=========================================StringDescriptor0:DB0x04 ;bLength=4,字符串描述符0長度為4DB0x03 ;bDescriptorType=3,表白是字符串描述符DB0x09,0x00 ;wLANGID=0009h,表白是英語DB0x0A ;bLength=10,字符串描述符長度為10DB0x03 ;bDescriptorType=3,表白是字符串描述符DB0x41,0x00,0x43,0x00,0x4D,0x00,0x45,0x00 ;bString=“ACME“,Unicode編碼字符串DB0x22 ;bLength=34,字符串描述符長度為34DB0x03 ;bDescriptorType=3,表白是字符串描述符DB0x4C,0x00,0x6F,0x00,0x63,0x00,0x61,0x00DB0x74,0x00,0x6F,0x00,0x72,0x00,0x20,0x00DB0x4B,0x00,0x65,0x00,0x79,0x00,0x62,0x00DB0x6F,0x00,0x61,0x00,0x72,0x00,0x64,0x00 ;bString=“LocatorKeyboard“,Unicode編碼字符串DB0x0E ;bLength=14,字符串描述符長度為14DB0x03 ;bDescriptorType=3,表白是字符串描述符DB0x41,0x00,0x42,0x00,0x43,0x00,0x21,0x00DB0x22,0x00,0x23,0x00 ;bString=“ABC123“,Unicode編碼字符串報(bào)表描述符報(bào)表描述符代碼如下。;=========================================;HIDReportsDescriptor報(bào)表描述符;=========================================DB0x05,1 ;UsagePage(1:GenericDesktop)DB0x09,6 ;Usage(6:Keyboard)表達(dá)報(bào)表定義是HID鍵盤DB0xA1,1 ;Collection(1:Application)====================集合開始 ; ; 如下定義了鍵盤修飾鍵輸入報(bào)表,共有8個(gè)鍵,構(gòu)成一種字節(jié) ; 用法見HIDUsageTable中第10節(jié)中鍵盤用法定義DB0x05,7 ; Usagepage(7:KeyCodes)DB0x19,224 ; UsageMinimum(224)DB0x29,231 ; UsageMaximum(231)DB0x15,0 ; LogicalMinimum(0)DB0x25,1 ; LogicalMaximum(1)DB0x75,1 ; ReportSize(1)DB0x95,8 ; ReportCount(8)DB0x81,2 ; Input(Data,Variable,Absolute) ; ; 如下定義了一種保存字節(jié)輸入報(bào)表DB0x95,1 ; ReportCount(1)DB0x75,8 ; ReportSize(8),DB0x81,1 ; Input(Constant)=ReservedByte ; ; 如下定義了鍵盤LED批示燈輸出報(bào)表項(xiàng)目,共有5個(gè)批示燈 ; 用法見HIDUsageTable中第11節(jié)中LED用法定義DB0x95,5 ; ReportCount(5)DB0x75,1 ; ReportSize(1)DB0x05,8 ; UsagePage(Page#forLEDs)DB0x19,1 ; UsageMinimum(1)DB0x29,5 ; UsageMaximum(5)DB0x91,2 ; Output(Data,Variable,Absolute) ; ; 如下定義了3個(gè)填充位,與前面5個(gè)LED批示燈數(shù)據(jù)構(gòu)成一種完整字節(jié)DB0x95,1 ; ReportCount(1)DB0x75,3 ; ReportSize(3)DB0x91,1 ; Output(Constant) ; ; 如下定義了鍵盤按鍵值輸入報(bào)表項(xiàng)目,共6個(gè)字節(jié),存儲(chǔ)鍵編號(0~101) ; 用法見HIDUsageTable中第10節(jié)中鍵盤用法定義 ; 這樣設(shè)計(jì)可以容許一次輸入6個(gè)按鍵鍵值DB0x95,6 ; ReportCount(6)DB0x75,8 ; ReportSize(8)DB0x15,0 ; LogicalMinimum(0)DB0x25,101 ; LogicalMaximum(101)DB0x05,7 ; UsagePage(7:KeyCodes)DB0x19,0 ; UsageMinimum(0)DB0x29,101 ; UsageMaximum(101)DB0x81,0 ; Input(Data,Array)DB0xC0 ;End_Collection================================集合結(jié)束通過上面報(bào)表描述符定義,擬定了鍵盤輸入報(bào)表和輸出報(bào)表數(shù)據(jù)格式。其中輸入報(bào)表共8個(gè)字節(jié),輸出報(bào)表只有1個(gè)字節(jié)。修飾鍵修飾鍵保存鍵值1鍵值2鍵值3鍵值4鍵值5鍵值6圖8-4鍵盤輸入報(bào)表格式字節(jié)0字節(jié)1字節(jié)2字節(jié)3字節(jié)4字節(jié)5字節(jié)6字節(jié)77~57~5圖8-5鍵盤輸出報(bào)表格式43210ScrollLock批示燈NnmLock批示燈CapsLock批示燈常數(shù),保存Compose批示燈Kana批示燈字節(jié)0HID特定祈求除了USB設(shè)備11個(gè)原則祈求外,HID規(guī)范此外還定義了6個(gè)HID特定控制祈求。所有HID設(shè)備都必要支持Get_Report祈求,同步支持啟動(dòng)設(shè)備必要支持Get_Protocol祈求和Set_Protocol祈求,其她祈求是可選取。如果設(shè)備沒有中斷輸出端點(diǎn),此設(shè)備需要支持Get_Report祈求來從主機(jī)讀取數(shù)據(jù)。在控制傳播設(shè)立階段數(shù)據(jù)包中8個(gè)字節(jié)中第一字節(jié)bmRequestType編碼含義參閱第6章中USB原則祈求。第2個(gè)字節(jié)bRequest定義祈求內(nèi)容。wValue因祈求不同而不同。wIndex指明HID所在接口。表8-10HID特定祈求bmRequestTypebRequest(值)wValuewIndexwLength數(shù)據(jù)階段10100001bGet_Report(1)報(bào)表類型,報(bào)表ID接口報(bào)表長度報(bào)表00100001bSet_Report(9)報(bào)表類型,報(bào)表ID接口報(bào)表長度報(bào)表10100001bGet_Idle(2)0,報(bào)表ID接口1閑置時(shí)間00100001bSet_Idle(10)閑置時(shí)間,報(bào)表ID接口0無10100001bGet_Protocol(3)0接口10:啟動(dòng)合同1:報(bào)表合同00100001bSet_Protocol(11)0:啟動(dòng)合同1:報(bào)表合同接口0無Get_Report祈求Get_Report作用是啟用主機(jī)使用控制傳播,來從設(shè)備讀取數(shù)據(jù)。在使用時(shí)wValue字段高字節(jié)是報(bào)表類型,1表達(dá)Input報(bào)表,2表達(dá)Output報(bào)表,3表達(dá)Feature報(bào)表。wValue低字節(jié)是報(bào)表ReportID,如果沒有定義ReportID,該字節(jié)為設(shè)0。在攜帶祈求控制傳播數(shù)據(jù)階段,HID設(shè)備回傳指定報(bào)表內(nèi)容。HlD規(guī)范不建議使用該祈求獲得未經(jīng)定期數(shù)據(jù),這樣數(shù)據(jù)建議使用中斷輸入管道獲得。該祈求用來獲得在主機(jī)初始化設(shè)備時(shí)特性項(xiàng)目狀態(tài)和其她信息。使用開機(jī)合同主機(jī)可以使用此祈求來獲得按鍵或鼠標(biāo)數(shù)據(jù)。Set_Report祈求Set_Report祈求參數(shù)含義和Get_Report同樣,但Set_Report祈求數(shù)據(jù)方向與Get_Report相反,在背面數(shù)據(jù)階段,主機(jī)傳送報(bào)表到HID設(shè)備,這樣輸出報(bào)表可以用于復(fù)位設(shè)備控制,復(fù)位產(chǎn)生效果取決于相應(yīng)控制類型是相對(Reletive)還是絕對(Absolute)。Set_Idle祈求Set_Idle祈求作用是靜默一種在中斷輸入管道特定報(bào)表,直到一種發(fā)生一種有關(guān)事件或過去了規(guī)定期間,當(dāng)數(shù)據(jù)從上一種報(bào)表后沒有變化時(shí),可以通過限制中斷輸入端點(diǎn)報(bào)表頻率來節(jié)約傳播帶寬。HID設(shè)備不是必須支持此祈求。wValue字段高字節(jié)是設(shè)立閑置時(shí)間,是報(bào)表之間最大間隔時(shí)間。該字節(jié)為0表達(dá)閑置時(shí)間為無限長,在這種狀況下,設(shè)備只有在報(bào)表數(shù)據(jù)有變化時(shí)才傳送報(bào)表,否則設(shè)備傳回一種NAK。wValue字段低字節(jié)批示此祈求應(yīng)用報(bào)表ReportID。如果低字節(jié)是0,此祈求應(yīng)用到設(shè)備所有輸入報(bào)表。閑置時(shí)間以4ms為單位,范疇在4ms~1020ms之間。如果報(bào)表數(shù)據(jù)自從上一次報(bào)表后有變化,或是接受到一種祈求,設(shè)備會(huì)傳送一種報(bào)表。如果報(bào)表數(shù)據(jù)沒有變化,并且從上一次報(bào)表后過去時(shí)間自尚未達(dá)到規(guī)定閑置時(shí)間,設(shè)備會(huì)傳回一種NAK。如果報(bào)表數(shù)據(jù)沒有變化,并且持續(xù)時(shí)間已經(jīng)達(dá)到閑置時(shí)間,設(shè)備會(huì)傳送一種報(bào)表。閑置時(shí)間設(shè)立為0表達(dá)無限長閑置時(shí)間,設(shè)備只有在報(bào)表數(shù)據(jù)有變化時(shí)才會(huì)傳送一種報(bào)表,對于其她中斷輸入祈求則是傳回NAK。在檢測HID設(shè)備時(shí),WndowsHID驅(qū)動(dòng)程序會(huì)試圖將閑置時(shí)間設(shè)立成0。如果HID設(shè)備不支持此祈求,主機(jī)會(huì)收到傳回Stall。Get_Idle祈求Get_Idle祈求作用是過設(shè)備當(dāng)前閑置時(shí)間,在數(shù)據(jù)階段,HID設(shè)備回傳一種字節(jié)閑置時(shí)間值。Get_Protocol祈求Get_Protocol祈求作用是主機(jī)獲取設(shè)備當(dāng)前作用是啟動(dòng)合同還是報(bào)表合同。在數(shù)據(jù)階段中設(shè)備回傳1個(gè)字節(jié)信息包中數(shù)據(jù)值為0表達(dá)啟動(dòng)合同,為1表達(dá)報(bào)表合同。啟動(dòng)設(shè)備必須支持該祈求。Set_Protocol祈求Set_Protocol作用是主機(jī)指定設(shè)備使用啟動(dòng)合同或報(bào)表合同。在數(shù)據(jù)階段中主機(jī)傳送1個(gè)字節(jié)信息包中數(shù)據(jù)值為0表達(dá)指定啟動(dòng)合同,為1表達(dá)指定報(bào)表合同。啟動(dòng)設(shè)備必須支持該祈求。HID程序設(shè)計(jì)HID設(shè)備是Windows系統(tǒng)提供了完善支持一類,應(yīng)用程序可以通過原則API函數(shù)調(diào)用,實(shí)現(xiàn)與HID設(shè)備通信。Windows系統(tǒng)提供了幾千個(gè)API函數(shù),作為應(yīng)用程序與操作系統(tǒng)接口,與HID有關(guān)API函數(shù)被封裝在hid.dll、setupapi.dll和kernal32.dll文獻(xiàn)中。HID訪問使用API函數(shù)文獻(xiàn)hid.dll中提供了諸各種API,由于與HID設(shè)備通信有一定復(fù)雜性。一方面,在應(yīng)用程序與HID傳播數(shù)據(jù)之前,應(yīng)用程序必要先辨認(rèn)該設(shè)備并且讀取它報(bào)表信息,這些動(dòng)作需要調(diào)用各種API函數(shù)才可以實(shí)現(xiàn)。應(yīng)用程序需要尋找連接到系統(tǒng)上是哪些HID設(shè)備,然后讀取每個(gè)設(shè)備信息直到查找到所需屬性。如果是客戶化設(shè)備,應(yīng)用程序可以尋找特定廠商與產(chǎn)品ID,或者應(yīng)用程序可以尋找特定類型設(shè)備,例如鍵盤或鼠標(biāo)。表8-11用于HID設(shè)備API函數(shù)用于理解HID設(shè)備狀況API函數(shù)(hid.dll)HidD_GetAttributes祈求獲得HID設(shè)備廠商ID、產(chǎn)品ID和版本號HidD_FreePreparsedData釋放函數(shù)HidD_GetPreparsedData所使用資源HidD_GetHidGuid祈求獲得HID設(shè)備GUIDHidD_GetIndexString祈求獲得由索引辨認(rèn)字符串HidD_GetManufactureString祈求獲得設(shè)備制造商字符串HidD_GetPhysicalDescriptor祈求獲得設(shè)備實(shí)體字符串HidD_GetPreparsedData祈求獲得與設(shè)備能力信息有關(guān)緩沖區(qū)代號HidD_GetProductString祈求獲得產(chǎn)品字符串HidD_GetSerialNumberString祈求獲得產(chǎn)品序列號字符串HidP_GetButtonCaps祈求獲得HID報(bào)表中所有按鈕能力HidP_GetCaps祈求獲得用于描述設(shè)備能力構(gòu)造指針HidP_GetLinkCollectionNotes祈求獲得描述在頂層集合中連接集合(LinkCollection)關(guān)系構(gòu)造數(shù)組HidP_GetSpecificButtonCaps祈求獲得報(bào)表中按鈕能力,該祈求可以設(shè)定一種UsagePage、Usage或是LinkCollectionHidP_GetSpecificValueCaps祈求獲得報(bào)表中數(shù)值能力,該祈求可以設(shè)定一種UsagePage、Usage或是LinkCollectionHidP_GetValueCaps祈求獲得HID報(bào)表中所有數(shù)值能力HidP_MaxUsageListLength祈求獲得HID報(bào)表中可以回傳按鈕最大數(shù)目,該祈求可以設(shè)定一種UsagePageHidP_UsageListDifference比較兩個(gè)按鈕列表,并且求出在一種列表中設(shè)定而在另一種列表中沒有設(shè)定按鈕用于從設(shè)備讀取、向設(shè)備傳送報(bào)表API函數(shù)(hid.dll)HidD_GetFeature從設(shè)備讀取一種特性報(bào)表HidD_SetFeature向設(shè)備傳送一種特性報(bào)表HidP_GetButtons從設(shè)備讀取包括每個(gè)按下按鈕用法(Usage)緩沖區(qū)指針,該祈求可以設(shè)定一種UsagePageHidP_GetButtonEx從設(shè)備讀取包括每個(gè)按下按鈕Usage和UsagePage緩沖區(qū)指針HidP_GetScaledUsageValue從設(shè)備讀取一種已經(jīng)通過比例因子調(diào)節(jié)有符號數(shù)值HidP_GetUsageValue從設(shè)備讀取一種指向數(shù)值指針HidP_GetUsageValueArray從設(shè)備讀取包括各種數(shù)據(jù)項(xiàng)Usage數(shù)據(jù)HidP_SetButtons向設(shè)備傳送設(shè)立按鈕數(shù)據(jù)HidP_SetScaledUsageValue將一種實(shí)際數(shù)值轉(zhuǎn)換成設(shè)備使用邏輯數(shù)值,并將其插入到報(bào)表中HidP_SetUsageValue向設(shè)備傳送數(shù)據(jù)HidP_SetUsageValueArray向設(shè)備傳送包括各種數(shù)據(jù)項(xiàng)Usage數(shù)據(jù)HidD_FlushQueue清空輸入緩沖區(qū)HidD_GetNumInputBuffer獲得驅(qū)動(dòng)程序用于存儲(chǔ)輸入報(bào)表環(huán)形緩沖區(qū)大小,默認(rèn)值是8HidD_SetNumInputBuffer設(shè)立驅(qū)動(dòng)程序用于存儲(chǔ)輸入報(bào)表環(huán)形緩沖區(qū)大小用于查找和辨認(rèn)設(shè)備API函數(shù)(setupapi.dll)SetupDiGetClassDevs獲得HID信息,針對已安裝設(shè)備,回傳一種指向其信息集代碼SetupDiEnumDeviceInterfaces祈求獲得設(shè)備信息群內(nèi)一種設(shè)備信息SetupDiGetDeviceInterfaceDetail祈求獲得設(shè)備途徑SetupDiDestroyDeviceInfoList釋放SetupDiGetClassDevs使用資源用于打開、關(guān)閉設(shè)備和實(shí)現(xiàn)數(shù)據(jù)傳送API函數(shù)(kernal32.dll)CreatFile獲得設(shè)備途徑后,調(diào)用該函數(shù)獲得設(shè)備代號WriteFile向設(shè)備傳送輸出報(bào)表ReadFile從設(shè)備讀取輸入報(bào)表CloseHandle關(guān)閉設(shè)備,釋放CreateFile所使用資源查找HID過程在實(shí)現(xiàn)HID訪問之前,一方面要查找指定(依照設(shè)備廠商ID、產(chǎn)品ID和產(chǎn)品序列號)HID。查找指定設(shè)備過程如下:調(diào)用函數(shù)HidD_GetHidGuid獲得USB設(shè)備GUID;調(diào)用函數(shù)SetupDiGetClassDevs,獲得一種包括所有HID信息構(gòu)造數(shù)組指針,下面依照此數(shù)組逐項(xiàng)查找指定HID;調(diào)用函數(shù)SetupDiEnumDeviceInterfaces,填寫SP_DEVICE_INTERFACE_DATA構(gòu)造數(shù)據(jù)項(xiàng),該構(gòu)造用于辨認(rèn)一種HID設(shè)備接口;調(diào)用函數(shù)SetupDiGetDeviceInterfaceDetail,獲得一種指向該設(shè)備途徑名;調(diào)用函數(shù)CreateFile,獲得設(shè)備句柄;調(diào)用函數(shù)HidD_GetAttributes,填寫HIDD_ATTRIBUTES構(gòu)造數(shù)據(jù)項(xiàng),該構(gòu)造包括設(shè)備廠商ID、產(chǎn)品ID和產(chǎn)品序列號,比照這些數(shù)值擬定該設(shè)備與否是查找設(shè)備。查找HID流程如下圖。調(diào)用調(diào)用HidD_GetHidGuid獲得GUID調(diào)用SetupDiGetClassDevs獲得所有HID信息調(diào)用SetupDiEnumDeviceInterfaces獲得特定HID辨認(rèn)信息調(diào)用SetupDiGetDeviceInterfaceDetail獲得特定HID途徑名調(diào)用CreateFile獲得特定HID句柄調(diào)用HidD_GetAttributes獲得特定HID廠商ID、產(chǎn)品ID找到指定HID?查找完畢?結(jié)束開始YesYesNoNo圖8-6查找設(shè)備流程下面簡介VB實(shí)現(xiàn)查找過程。獲得GUID應(yīng)用程序要與HID設(shè)備通信之前,必要先獲得HID類別GUID(GloballyUniqueIndentifer)。GUID是一種128位數(shù)值,每個(gè)對象均有惟一GUID。HID類別GUID包括在hidclass.h文檔內(nèi),可以接引用,或是使用HidD_GetHidGuid函數(shù)來獲得HID類別GUID?!瘮?shù)聲明PublicDeclareFunctionHidD_GetHidGuidLib"hid.dll"(ByRefHidGuidAsGUID)AsLong‘GUID構(gòu)造闡明PublicTypeGUIDData1AsLongData2AsIntegerData3AsIntegerData4(7)AsByteEndType‘變量闡明DimHidGuidasGUID‘調(diào)用CallHidD_GetHidGuid(HidGuid)獲得HID構(gòu)造數(shù)組得到GUID后調(diào)用SetupDiGetClassDevs函數(shù)傳回所有已經(jīng)連接并且檢測過HID包括其信息構(gòu)造數(shù)組地址?!瘮?shù)聲明PublicDeclareFunctionSetupDiGetClassDevsLib"setupapi.dll"Alias"SetupDiGetClassDevsA"(_ ByRefClassGuidAsGUID,_ ByValEnumeratorAsString,_ ByValhwndParentAsLong,_ ByValFlagsAsLong)_AsLong‘常量闡明PublicCons
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 安徽省阜陽市太和縣2023-2024學(xué)年八年級下學(xué)期4月期中物理試題【含答案、解析】
- 2025年粵教滬科版八年級地理下冊月考試卷含答案
- 2025年粵教新版選擇性必修2地理下冊階段測試試卷含答案
- 2025年粵人版必修1歷史上冊階段測試試卷
- 2025年蘇人新版九年級生物下冊月考試卷含答案
- 2025年粵人版七年級語文上冊階段測試試卷
- 2025年湘教版九年級生物上冊階段測試試卷
- 2025年新世紀(jì)版八年級地理上冊階段測試試卷含答案
- 2025年滬科版選擇性必修3歷史上冊月考試卷含答案
- 公司財(cái)務(wù)知到智慧樹章節(jié)測試課后答案2024年秋北京第二外國語學(xué)院
- 化學(xué)-河南省TOP二十名校2025屆高三調(diào)研考試(三)試題和答案
- 智慧農(nóng)貿(mào)批發(fā)市場平臺(tái)規(guī)劃建設(shè)方案
- 林下野雞養(yǎng)殖建設(shè)項(xiàng)目可行性研究報(bào)告
- 2023年水利部黃河水利委員會(huì)招聘考試真題
- Python編程基礎(chǔ)(項(xiàng)目式微課版)教案22
- 01J925-1壓型鋼板、夾芯板屋面及墻體建筑構(gòu)造
- 欠電費(fèi)合同范本
- 2024年新高考地區(qū)數(shù)學(xué)選擇題填空壓軸題匯編十八含解析
- 網(wǎng)易云音樂用戶情感畫像研究
- 小學(xué)四年級奧數(shù)題平均數(shù)問題習(xí)題及答案
- 工作違紀(jì)違規(guī)檢討書范文
評論
0/150
提交評論