USB接HID設(shè)備培訓(xùn)課程_第1頁(yè)
USB接HID設(shè)備培訓(xùn)課程_第2頁(yè)
USB接HID設(shè)備培訓(xùn)課程_第3頁(yè)
USB接HID設(shè)備培訓(xùn)課程_第4頁(yè)
USB接HID設(shè)備培訓(xùn)課程_第5頁(yè)
已閱讀5頁(yè),還剩99頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

283/104USB接口HID設(shè)備HID(HumanInterfaceDevice,人機(jī)接口設(shè)備)是USB設(shè)備中常用的設(shè)備類(lèi)型,是直接與人交互的USB設(shè)備,例如鍵盤(pán)、鼠標(biāo)與游戲桿等。在USB設(shè)備中,HID設(shè)備的成本較低。另外,HID設(shè)備并不一定要有人機(jī)交互功能,只要符合HID類(lèi)別規(guī)范的設(shè)備都是HID設(shè)備。Wndows操作系統(tǒng)最先支持的HID設(shè)備。在windows98以及后來(lái)的版本中內(nèi)置有HID設(shè)備的驅(qū)動(dòng)程序,應(yīng)用程序可以直接使用這些驅(qū)動(dòng)程序來(lái)與設(shè)備通信。在設(shè)計(jì)一個(gè)USB接口的計(jì)算機(jī)外部設(shè)備時(shí),如果HID類(lèi)型的設(shè)備可以滿(mǎn)足需要,可以將其設(shè)計(jì)為HID類(lèi)型設(shè)備,這樣可以省去比較復(fù)雜的USB驅(qū)動(dòng)程序的編寫(xiě),直接利用Windows操作系統(tǒng)對(duì)標(biāo)準(zhǔn)的HID類(lèi)型USB設(shè)備的支持。HID設(shè)備簡(jiǎn)介HID設(shè)備的特點(diǎn)交換的數(shù)據(jù)儲(chǔ)存在稱(chēng)為報(bào)表(Report)的結(jié)構(gòu)內(nèi),設(shè)備的固件必須支持HlD報(bào)表的格式。主機(jī)通過(guò)控制和中斷傳輸中的傳送和請(qǐng)求報(bào)表來(lái)傳送和接收數(shù)據(jù)。報(bào)表的格式非常靈活。每一筆事務(wù)可以攜帶小量或中量的數(shù)據(jù)。低速設(shè)備每一筆事務(wù)最大是8B,全速設(shè)備每一筆事務(wù)最大是64B,高速設(shè)備每一筆事務(wù)最大是1024B。一個(gè)報(bào)表可以使用多筆事務(wù)。設(shè)備可以在未預(yù)期的時(shí)間傳送信息給主機(jī),例如鍵盤(pán)的按鍵或是鼠標(biāo)的移動(dòng)。所以主機(jī)會(huì)定時(shí)輪詢(xún)?cè)O(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è)備沒(méi)有保證的傳輸速率。如果設(shè)備是設(shè)置在10ms的時(shí)距,事務(wù)之間的時(shí)間可能等于或小于10ms。除非設(shè)備是設(shè)置在全速時(shí)在每個(gè)幀傳輸數(shù)據(jù),或是在高速時(shí)在每個(gè)微幀傳輸數(shù)據(jù)。這是最快的輪詢(xún)速率,所以端點(diǎn)可以保證有正確的帶寬可供使用。HID設(shè)備除了傳送數(shù)據(jù)給主機(jī)外,它也會(huì)從主機(jī)接收數(shù)據(jù)。只要能夠符合HlD類(lèi)別規(guī)范的設(shè)備都可以是HID設(shè)備。設(shè)備除了HlD接口之外,它可能同時(shí)還包含有其他的USB接口。例如影像顯示設(shè)備可能使用HID接口來(lái)做亮度、對(duì)比度的軟件控制,而使用傳統(tǒng)的影像接口來(lái)傳送要顯示的數(shù)據(jù)。USB擴(kuò)音器可以使用實(shí)時(shí)傳輸來(lái)播放語(yǔ)音,同時(shí)使用HID接口來(lái)控制音量、低音等。HID類(lèi)別設(shè)備的規(guī)范文件主要是以下兩份:DeviceClassDefinitionforHumaninterfaceDevicesHIDUsageTables其中前者是HID的基本規(guī)范文件,后者可以是前者的附件,為開(kāi)發(fā)人員提供實(shí)際的控制類(lèi)型的描述。文件是用來(lái)定義讓主機(jī)了解以及使用HID數(shù)據(jù)的數(shù)值。這兩份文件是由USBDeviceWorkingGroup制定的,可以在網(wǎng)址/developers/hidpage/#Class_Definition下載。HID設(shè)備的硬件要求HID接口必須符合DeviceClassDefinitionforHumaninterfaceDevices規(guī)范內(nèi)所定義的HID類(lèi)別的需求。在此文件內(nèi)描述了所需的描述符、傳輸?shù)念l率以及傳輸?shù)念?lèi)型等。為了符合規(guī)范,HID接口的端點(diǎn)與描述符都必須符合數(shù)個(gè)要求。所有的HID傳輸都是使用默認(rèn)控制管道或是一個(gè)中斷管道,HID設(shè)備必須有一個(gè)中斷輸入端點(diǎn)來(lái)傳送數(shù)據(jù)到主機(jī),中斷輸出端點(diǎn)則不是必需的。HID類(lèi)別HID類(lèi)別驅(qū)動(dòng)程序HID類(lèi)別設(shè)備主機(jī)外設(shè)默認(rèn)控制管道中斷管道圖8-1HID傳輸?shù)膫鬏旑?lèi)型表8-1HID設(shè)備的傳輸類(lèi)型傳輸類(lèi)型數(shù)據(jù)來(lái)源數(shù)據(jù)類(lèi)型是否需要管道控制設(shè)備(輸入)沒(méi)有嚴(yán)格時(shí)間限制的數(shù)據(jù)是主機(jī)(輸出)沒(méi)有嚴(yán)格時(shí)間限制的數(shù)據(jù)或是沒(méi)有中斷輸出管道時(shí)的任何數(shù)據(jù)中斷設(shè)備(輸入)定時(shí)或低延遲的數(shù)據(jù)是主機(jī)(輸出)定時(shí)或低延遲的數(shù)據(jù)是主機(jī)與設(shè)備之間所交換的數(shù)據(jù),可以分成兩種類(lèi)型:低延遲的數(shù)據(jù),必須盡快地到達(dá)目的;配置或其他的數(shù)據(jù),沒(méi)有嚴(yán)格時(shí)間限制的需求。中斷管道是控制管道之外的另一種數(shù)據(jù)交換的方式,特別適合使用在接收端需要定時(shí)或是盡可能及時(shí)收到數(shù)據(jù)的時(shí)候。中斷輸入管道攜帶數(shù)據(jù)到主機(jī),中斷輸出管道則是攜帶數(shù)據(jù)到設(shè)備。在總線(xiàn)忙的時(shí)候,控制管道可能會(huì)被延遲,而中斷管道保證會(huì)有可得到的帶寬。HID不需要一定有中斷輸出管道。如果沒(méi)有中斷輸出管道,主機(jī)會(huì)在控制管道上使用HID設(shè)備特有的Set_Report請(qǐng)求來(lái)傳送所有的報(bào)表。HID固件的要求主機(jī)的驅(qū)動(dòng)程序要與HID設(shè)備通信,設(shè)備的固件必須符合下列需求:設(shè)備的描述符必須識(shí)別該設(shè)備包含有HID接口。除了默認(rèn)控制管道外,固件必須另外支持一個(gè)中斷輸入管道。固件必須包含一個(gè)報(bào)表描述符來(lái)定義要傳送與接收的設(shè)備數(shù)據(jù)。如果要傳送數(shù)據(jù),固件必須支持Get_Report控制傳輸與中斷輸入傳輸。如果要接收數(shù)據(jù),固件必須支持Set_Report控制傳輸與選擇性的中斷輸出傳輸。所有的HID數(shù)據(jù)都必須使用定義過(guò)的報(bào)表格式來(lái)定義報(bào)表中數(shù)據(jù)的大小與內(nèi)容。設(shè)備可以支持一個(gè)或多個(gè)報(bào)表。在固件中的一個(gè)報(bào)表描述符用來(lái)描述此報(bào)表,以及如何使用報(bào)表數(shù)據(jù)的信息。在每一個(gè)報(bào)表中的一個(gè)數(shù)值,定義此報(bào)表是一個(gè)輸入(Input)、輸出(Output)或是特征(Feature)報(bào)表。主機(jī)在輸入報(bào)表中接收數(shù)據(jù),在輸出報(bào)表中傳送數(shù)據(jù),特征報(bào)表可以在任何方向傳遞。Windows98以及后來(lái)版本的HID驅(qū)動(dòng)程序使用中斷傳輸來(lái)傳遞輸入報(bào)表。輸出報(bào)表的傳輸類(lèi)型要根據(jù)設(shè)備支持的端點(diǎn)與Windows的版本而定。Windows98Gold只符合HID1.0規(guī)范,它的HID驅(qū)動(dòng)程序使用控制傳輸來(lái)傳遞輸出報(bào)表。Windows98SE、Wndows2000符合HID1.1規(guī)范,HID驅(qū)動(dòng)程序在有中斷輸出端點(diǎn)時(shí)使用中斷傳輸,否則使用控制傳輸來(lái)傳遞輸出報(bào)表。特征報(bào)表都是使用控制傳輸。HID設(shè)備描述符HID設(shè)備連接到USB主機(jī)后,主機(jī)通過(guò)發(fā)送Get_Descriptor請(qǐng)求讀取HID設(shè)備的描述符,了解描述符對(duì)了解USB設(shè)備是至關(guān)重要的。HID設(shè)備的描述符HID設(shè)備除了支持USB設(shè)備的5種標(biāo)準(zhǔn)描述符之外,還支持HID設(shè)備特有的3種描述符。這些描述符是:USB標(biāo)準(zhǔn)描述符:設(shè)備、配置、接口、端點(diǎn)和字符串描述符。HID特有的描述符:HID、報(bào)表(Report)和實(shí)體(Physical)描述符。從描述符的關(guān)聯(lián)關(guān)系看,HID描述符是關(guān)聯(lián)于接口。所以如果一個(gè)HID設(shè)備有2個(gè)端點(diǎn),設(shè)備不需要每個(gè)端點(diǎn)有一個(gè)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描述符可以看出一個(gè)規(guī)律,描述符的第一、二字節(jié)分別是描述符的長(zhǎng)度和類(lèi)型,描述符的類(lèi)型字段(bDescriptorType)表明描述符的種類(lèi),下表列出了不同描述符的類(lèi)型字段數(shù)值。表8-2HID的描述符類(lèi)型描述符應(yīng)用數(shù)值標(biāo)準(zhǔn)設(shè)備Device所有設(shè)備必須有,只能一個(gè)01配置Configuration所有設(shè)備必須有,至少一個(gè)02字符串String可選擇03接口Interface每一個(gè)接口一個(gè)04端點(diǎn)Endpoint除端點(diǎn)0之外的每個(gè)端點(diǎn)一個(gè)05設(shè)備限定Device_Qualiffier同時(shí)支持全速與高速的設(shè)備必須有一個(gè)06Other_Speed_Configuration07Interface_power08類(lèi)別HIDHID設(shè)備必須有21Hub29HID特定報(bào)表ReportHID設(shè)備必須有22實(shí)體Physical可選擇的23對(duì)于一個(gè)HID設(shè)備,設(shè)備描述符與配置描述符沒(méi)有HID特定的信息。其設(shè)備描述符的bDeviceClass和bDeviceSubClass字段的值為0,接口描述符的bInterfaceClass字段值為03,表示設(shè)備的該接口是HID類(lèi)別。在接口描述符中其他包含HID特定信息的字段還有子類(lèi)別碼(blnterfaceSubClass)與協(xié)議碼(blnterfaceProtocol字段)。在接口描述符中子類(lèi)別碼字段等于1表示此設(shè)備支持啟動(dòng)接口(BootInterface)。如果設(shè)備有啟動(dòng)接口,即便主機(jī)的HID沒(méi)有加載驅(qū)動(dòng)程序,設(shè)備也可以使用。這種情形可能發(fā)生在計(jì)算機(jī)是由DOS直接啟動(dòng),在啟動(dòng)時(shí)觀看系統(tǒng)設(shè)置畫(huà)面或使用Wndows的安全模式時(shí)。含有啟動(dòng)接口的鍵盤(pán)或鼠標(biāo)可以使用BIOS或許多主機(jī)支持的默認(rèn)簡(jiǎn)單協(xié)議。HID規(guī)范定義了鍵盤(pán)與鼠標(biāo)的啟動(dòng)接口協(xié)議。如果設(shè)備沒(méi)有啟動(dòng)接口,并且接口描述符中協(xié)議碼字段是1,表示設(shè)備支持鍵盤(pán)接口,協(xié)議碼字段是2,表示支持鼠標(biāo)接口。接口描述符中協(xié)議碼字段是0,表示設(shè)備不支持啟動(dòng)協(xié)議。在HIDUsageTables規(guī)范中定義了鍵盤(pán)與鼠標(biāo)的啟動(dòng)描述符(BootDescriptor)。BIOS不需要從設(shè)備中讀取描述符,因?yàn)樗绬?dòng)協(xié)議,并且假設(shè)設(shè)備支持啟動(dòng)協(xié)議。所以要啟動(dòng)的設(shè)備不需要在固件內(nèi)包含啟動(dòng)接口描述符,它只要在主機(jī)尚未要求在報(bào)表描述符中的定義協(xié)議時(shí)支持啟動(dòng)協(xié)議即可。在操作系統(tǒng)加載HlD驅(qū)動(dòng)程序后會(huì)使用Set_Protocol請(qǐng)求,將設(shè)備由啟動(dòng)協(xié)議轉(zhuǎn)換成報(bào)表協(xié)議。HID描述符HID描述符的主要作用是用來(lái)識(shí)別HID通信所使用的額外描述符。下表是HID描述符結(jié)構(gòu)。表8-3HID描述符結(jié)構(gòu)偏移量字段字節(jié)數(shù)數(shù)值類(lèi)型說(shuō)明0bLength1Numeric描述符字節(jié)數(shù)1bDescriptorType1Constant0x21=HID描述符2bcdHID2NumericHID規(guī)范版本號(hào)(BCD)4bCountryCode1Numeric硬件設(shè)備所在國(guó)家的國(guó)家代碼5bNumDescriptors1Numeric類(lèi)別描述符數(shù)目(至少有一個(gè)報(bào)表描述符)6bDescriptorType1Constant類(lèi)別描述符的類(lèi)型7wDescriptorLength2Numeric報(bào)表描述符的總長(zhǎng)度9[bDescriptorType]...1Constant附加的描述符的類(lèi)型,可選的10[wDescriptorLength]...2Numeric附加的描述符的總長(zhǎng)度,可選的bcdHID:設(shè)備與其描述符所遵循的HID規(guī)范的版本號(hào)碼,此數(shù)值是4個(gè)16進(jìn)位的BCD格式字符。例如版本1.1的bcdHID是0110h。bCountryCode:硬件目的國(guó)家的識(shí)別碼。如果不說(shuō)明,該字段為0。bDescriptorType:HID描述符附屬的描述符的類(lèi)型(報(bào)表或?qū)嶓w)。每一個(gè)HID都必須至少支持一個(gè)報(bào)表描述符。一個(gè)接口可以支持多個(gè)報(bào)表描述符,以及一個(gè)或多個(gè)實(shí)體描述符。HID描述符的偏移量為9和10的bDescriptorType和wDescriptorLength可以重復(fù)存在多個(gè)。報(bào)表描述符報(bào)表描述符定義了執(zhí)行設(shè)備功能的數(shù)據(jù)格式和使用方法。報(bào)表描述符和USB的其他描述符是不一樣的,它不是一個(gè)簡(jiǎn)單的表格,報(bào)表描述符是USB所有描述符中最復(fù)雜的。報(bào)表描述符非常復(fù)雜而有彈性,因?yàn)樗枰幚砀鞣N用途的設(shè)備。報(bào)表的數(shù)據(jù)必須以簡(jiǎn)潔的格式來(lái)儲(chǔ)存,這樣才不會(huì)浪費(fèi)設(shè)備內(nèi)的儲(chǔ)存空間以及數(shù)據(jù)傳輸時(shí)的總線(xiàn)時(shí)間。實(shí)際上可以這樣理解,報(bào)表內(nèi)容的簡(jiǎn)潔,是通過(guò)報(bào)表描述符全面的、復(fù)雜的數(shù)據(jù)描述實(shí)現(xiàn)的。報(bào)表描述符必須先描述數(shù)據(jù)的大小與內(nèi)容。報(bào)表描述符的內(nèi)容與大小因設(shè)備的不同而不同,在進(jìn)行報(bào)表傳輸之前,主機(jī)必須先請(qǐng)求設(shè)備的報(bào)表描述符,只有得到了報(bào)表描述符才可正確解析報(bào)表的數(shù)據(jù)。報(bào)表描述符是報(bào)表描述項(xiàng)目(Item)的集合,每一個(gè)描述項(xiàng)目都有相對(duì)統(tǒng)一的數(shù)據(jù)結(jié)構(gòu),項(xiàng)目很多,通過(guò)編碼實(shí)現(xiàn)。(1)項(xiàng)目報(bào)表描述符由描述HID設(shè)備的數(shù)據(jù)項(xiàng)目(Item)組成,項(xiàng)目的第一個(gè)字節(jié)(項(xiàng)目前綴)由三部分構(gòu)成,即項(xiàng)目類(lèi)型(itemtype)、項(xiàng)目標(biāo)志(itemtag)和項(xiàng)目長(zhǎng)度(itemsize)。其中項(xiàng)目類(lèi)型說(shuō)明項(xiàng)目的數(shù)據(jù)類(lèi)型,項(xiàng)目標(biāo)簽說(shuō)明項(xiàng)目的功能,項(xiàng)目長(zhǎng)度說(shuō)明項(xiàng)目的數(shù)據(jù)部分的長(zhǎng)度。HID的項(xiàng)目有短項(xiàng)目和長(zhǎng)項(xiàng)目?jī)煞N,其中短項(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)目類(lèi)型由bType定義,bType為0、1、2時(shí)分別為Main、Global和Local類(lèi)型。長(zhǎng)項(xiàng)目可以攜帶較多的數(shù)據(jù),其格式如下圖。bDataSize11111110bDataSize1111111076543210位序字段圖8-4HID報(bào)表長(zhǎng)項(xiàng)目格式bLongItemTagData字節(jié)數(shù)1111~255下面是通過(guò)匯編實(shí)現(xiàn)的一個(gè)簡(jiǎn)單的報(bào)表描述符,描述符的每一行是一個(gè)項(xiàng)目,該描述符描述了一個(gè)從設(shè)備接收2個(gè)字節(jié)的輸入報(bào)表和發(fā)送2個(gè)字節(jié)到設(shè)備的輸出報(bào)表。HID_Report_desc_table: db06h,A0h,FFh ;UsagePage(Vendordefined)定義設(shè)備功能 db09h,A5h ;Usage(VendorDefined)定義用法 dbA1h,01h ;Collection(Application)開(kāi)一個(gè)集合 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)目的分類(lèi)報(bào)表的項(xiàng)目有Main、Global和Local三大類(lèi),每一類(lèi)都有多個(gè)不同的項(xiàng)目,實(shí)現(xiàn)不同的描述。Main類(lèi)項(xiàng)目用于定義報(bào)表描述符中的數(shù)據(jù)項(xiàng)。也可以組合其中的若干數(shù)據(jù)項(xiàng)成為一個(gè)集合。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類(lèi)項(xiàng)目實(shí)現(xiàn)對(duì)數(shù)據(jù)的描述,用來(lái)識(shí)別報(bào)表并且描述報(bào)表內(nèi)的數(shù)據(jù),包括數(shù)據(jù)的功能、最大與最小允許值以及數(shù)據(jù)項(xiàng)的大小與數(shù)目等。改變由Main類(lèi)項(xiàng)目生成的項(xiàng)目狀態(tài)表。Global類(lèi)項(xiàng)目描述對(duì)后續(xù)的所有項(xiàng)目有效,除非遇到有新的Global類(lèi)項(xiàng)目。Local類(lèi)項(xiàng)目定義控制的特征,這一類(lèi)項(xiàng)目的作用域不超過(guò)下一個(gè)Main項(xiàng)目,所以在每一Main項(xiàng)目之前可能有多個(gè)Local項(xiàng)目。Local項(xiàng)目用于描述后面的Input、Output和Feature項(xiàng)目。下表列出的是全部的項(xiàng)目的前綴字和簡(jiǎn)要功能說(shuō)明。表8-4HID項(xiàng)目列表項(xiàng)目類(lèi)型項(xiàng)目標(biāo)志(Tag)項(xiàng)目前綴,nn為數(shù)據(jù)長(zhǎng)度功能說(shuō)明Main類(lèi)項(xiàng)目Input100000nn定義輸入報(bào)表,主機(jī)利用該信息解析設(shè)備提供的數(shù)據(jù)。主機(jī)向控制端口發(fā)送Get_Report實(shí)現(xiàn)輸入Output100100nn創(chuàng)建輸出報(bào)表,通過(guò)向設(shè)備發(fā)送Set_Report實(shí)現(xiàn)輸出Feature101100nn定義送往設(shè)備的設(shè)置信息Collection101000nn定義2個(gè)以上數(shù)據(jù)(Input、Output和Feature)的關(guān)系為集合,Collection開(kāi)始一個(gè)集合,之后的EndCollection結(jié)束集合。Collection項(xiàng)目的數(shù)據(jù)部分說(shuō)明Collection的類(lèi)型EndCollection110000nnGlobal類(lèi)項(xiàng)目UsagePage000001nn指定設(shè)備的功能另外由于Usage項(xiàng)目有32位數(shù)據(jù)值,UsagePage項(xiàng)目用于為Usage項(xiàng)目在報(bào)表描述符中占居存儲(chǔ)空間。用于存放后續(xù)的Usage項(xiàng)目的高16位。LogicalMinimum000101nn定義變量或數(shù)組項(xiàng)目的邏輯最小值和最大值LogicalMaximum001001nnPhysicalMinimum001101nn定義變量或數(shù)組項(xiàng)目的物理最小值和最大值,分別和LogicalMinimum、LogicalMaximum對(duì)應(yīng)PhysicalMaximum010001nnUnitExponent010101nn定義數(shù)值是基于10的指數(shù)Unit011001nn單位ReportSize011101nn指定報(bào)表數(shù)據(jù)區(qū)域所包含的位數(shù)ReportID100001nn報(bào)表ID,該項(xiàng)目在報(bào)表中插入一個(gè)字節(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類(lèi)項(xiàng)目Usage000010nn用法索引值,表示對(duì)項(xiàng)目或集合建議的用法,用于當(dāng)一個(gè)項(xiàng)目描述多個(gè)控制,對(duì)每一個(gè)變量和數(shù)組元素都有建議的用法UsageMinimum000110nn定義陣列或位圖中控制操作的第一個(gè)和最后一個(gè)用法UsageMaximum001010nnDesignatorIndex001110nn確定用于控制的實(shí)體,指向物理描述符中的目標(biāo)DesignatorMinimum010010nn定義陣列或位圖目標(biāo)的起始和終止索引值DesignatorMaximum010110nnStringIndex011110nn確定字符串描述符中的索引值StringMinimum100010nn定義用于陣列或位圖控制中字符串序列索引值的最小值和最大值StringMaximum100110nnDelimiter101010nn定義一組Local項(xiàng)目的開(kāi)始和結(jié)束,1=開(kāi)始,0=結(jié)束101010nn–111110nn保留在這些項(xiàng)目中,UsagePage用來(lái)指定設(shè)備的功能,而Usage項(xiàng)目用來(lái)指定個(gè)別報(bào)表的功能。UsagePage項(xiàng)目相當(dāng)于是HID的子集合,Usage相當(dāng)于是UsagePage的子集合。報(bào)表描述符的項(xiàng)目(1)Input、Outpot和Feature項(xiàng)目這3個(gè)項(xiàng)目用來(lái)定義報(bào)表中的數(shù)據(jù)字段。Input項(xiàng)目可以應(yīng)用到任何控制、計(jì)數(shù)器讀數(shù)或其他設(shè)備傳給主機(jī)的信息。一個(gè)輸入報(bào)表包含一個(gè)或多個(gè)Input項(xiàng)目,主機(jī)使用中斷輸入傳輸來(lái)請(qǐng)求輸入報(bào)表。Ouput項(xiàng)目用來(lái)定義主機(jī)傳送給設(shè)備的信息。一個(gè)輸出報(bào)表包含一個(gè)或多個(gè)Outpot項(xiàng)目。輸出報(bào)表包含控制狀態(tài)的數(shù)據(jù)。如果有中斷輸出管道,HID1.1兼容主機(jī)使用中斷輸出傳輸來(lái)傳送輸出報(bào)表,否則使用Set_Report控制請(qǐng)求。Feature項(xiàng)目應(yīng)用到主機(jī)傳送給設(shè)備的信息,或是主機(jī)從設(shè)備讀取Feature項(xiàng)目。一個(gè)特征報(bào)表包含一個(gè)或多個(gè)Feature項(xiàng)目,F(xiàn)eature項(xiàng)目通常是包合影響設(shè)備與其組件整體行為的配置。特征報(bào)表通常是控制可以使用實(shí)際的控制面板調(diào)整的設(shè)置,例如主機(jī)可以使用虛擬控制面板來(lái)讓用戶(hù)選擇控制特征。主機(jī)使用Set_Report與Get_Report請(qǐng)求來(lái)傳送與接收特征報(bào)表。在每一個(gè)Input、Output和Feature項(xiàng)目的前綴字之后是32位描述數(shù)據(jù),目前最多定義了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)說(shuō)明數(shù)據(jù)字段含義說(shuō)明位值名稱(chēng)00Data數(shù)據(jù):表示項(xiàng)目的內(nèi)容是可更改的(讀/寫(xiě))。1Constant常數(shù):表示項(xiàng)目的內(nèi)容是不可更改的(只讀)。10Array數(shù)組:報(bào)告全部控制的狀態(tài)。如在鍵盤(pán)報(bào)表中每一個(gè)鍵在報(bào)表中占一位,報(bào)表傳輸全部鍵的狀態(tài),可以同時(shí)按下任意多個(gè)鍵。1Variable變量:報(bào)告作用中的控制。如在鍵盤(pán)報(bào)表中只報(bào)告按下的鍵的編號(hào),可以同時(shí)按下的鍵的數(shù)目等于報(bào)表的計(jì)數(shù)(Global類(lèi)項(xiàng)目ReportCount)20Absolute絕對(duì):表示數(shù)值以一個(gè)固定值為基準(zhǔn)。游戲桿通常是報(bào)告絕對(duì)數(shù)據(jù)(游戲桿目前的位置)。1Relative相對(duì):表示數(shù)據(jù)的改變以上一個(gè)讀數(shù)為基準(zhǔn)。鼠標(biāo)通常是報(bào)告相對(duì)數(shù)據(jù)(鼠標(biāo)的移動(dòng)位置)。3①0NoWrap如果設(shè)置為1表示回轉(zhuǎn),當(dāng)數(shù)值超過(guò)最小值到最大值的范圍時(shí)將回轉(zhuǎn),如果最小值是0而最大值是10,超過(guò)最大值的下一個(gè)數(shù)值是0。1Wrap4①0Linear線(xiàn)形:表示測(cè)量的數(shù)據(jù)與報(bào)表的數(shù)據(jù)有線(xiàn)性的關(guān)系。1Non-Linear非線(xiàn)性:表示測(cè)量的數(shù)據(jù)與報(bào)表的數(shù)據(jù)沒(méi)有線(xiàn)性的關(guān)系。5①0Preferred優(yōu)選狀態(tài):表示控制在沒(méi)有用戶(hù)交互時(shí)會(huì)回到一個(gè)特定的狀態(tài)。如按鈕就有優(yōu)選狀態(tài),在無(wú)操作時(shí)保持未按下的狀態(tài)。1Non-Preferred非優(yōu)選狀態(tài):它維持在上一個(gè)用戶(hù)選擇的狀態(tài)。如交替的開(kāi)關(guān)就沒(méi)有優(yōu)選狀態(tài)。6①0NoNullPosition無(wú)空狀態(tài)位置:表示控制永遠(yuǎn)在傳送有效的數(shù)據(jù)。1Null空狀態(tài):表示控制支持一個(gè)沒(méi)有傳送有效數(shù)據(jù)的狀態(tài)。如操縱桿可能具有一個(gè)多方向的按鈕開(kāi)關(guān),在沒(méi)有按下時(shí)在空狀態(tài),這時(shí)控制將傳送一個(gè)在LogicalMinimum與LogicalMaximum范圍之外的數(shù)值來(lái)表示它在空狀態(tài)。7②0Non-Volatile不可變的:表示設(shè)備只有在主機(jī)請(qǐng)求時(shí)才改變數(shù)值。當(dāng)主機(jī)傳送一個(gè)報(bào)表并且不要改變不可變項(xiàng)目時(shí),如果該項(xiàng)目是定義成相對(duì)(Relative)的,數(shù)值0表示不改變數(shù)據(jù),如果不可變項(xiàng)目是定義成絕對(duì)(Absolute)的,超出范圍外的數(shù)值則表示不改變數(shù)據(jù)。1Volatile可變的:表示設(shè)備可以自己改變數(shù)值,并不是必須主機(jī)傳送報(bào)表要求給設(shè)備來(lái)改變數(shù)值。例如設(shè)備控制面板可以由主機(jī)軟件傳送一個(gè)報(bào)表給設(shè)備,也可以由用戶(hù)自己按設(shè)備上的實(shí)際按鈕。8①0BitField位字段:表示每一個(gè)位或是一個(gè)字節(jié)內(nèi)的一組位可以代表一份數(shù)據(jù)。1BufferedBytes緩沖字節(jié):表示信息包含一個(gè)或多個(gè)字節(jié),緩沖字節(jié)的報(bào)表大小必須是8。9~31位保留注: ①:該位不能應(yīng)用到數(shù)組。②:只應(yīng)用于Output和Feature項(xiàng)目,對(duì)于Input項(xiàng)目該位保留。(2)Collection和EndCollection項(xiàng)目所有的報(bào)表類(lèi)型都可以使用Collection與EndCollection項(xiàng)目來(lái)將相關(guān)的Main類(lèi)型項(xiàng)目組成群組。這兩個(gè)項(xiàng)目分別用于打開(kāi)和關(guān)閉集合。所有在Collection與EndCollection項(xiàng)目之間的Main類(lèi)型項(xiàng)目都是Collection的一部分。Collection有3種類(lèi)型:Application、Physical與Logical,其項(xiàng)目的數(shù)據(jù)項(xiàng)的值分別為1、0和2。廠商也可以自己定義Collection類(lèi)型,數(shù)據(jù)項(xiàng)的值為80h~FFh保留給廠商定義。EndCollection項(xiàng)目無(wú)數(shù)據(jù)項(xiàng)。ApplicationCollection包含有共同用途的項(xiàng)目或執(zhí)行單一功能的項(xiàng)目。例如鍵盤(pán)的開(kāi)機(jī)描述符將鍵盤(pán)的按鍵與LED指示燈數(shù)據(jù)集合成一個(gè)ApplicationCollection。所有的報(bào)表必須在一個(gè)ApplicationCollection內(nèi)。PhysicalCollection包含在一個(gè)單一幾何點(diǎn)上的數(shù)據(jù)項(xiàng)目,可以將每個(gè)位置的數(shù)據(jù)集合成一個(gè)PhysicalCollection。在設(shè)備報(bào)告多個(gè)傳感器的位置的時(shí)候,使用PhysicalCollection指明不同的數(shù)據(jù)來(lái)自不同的傳感器。LogicalCollection形成一個(gè)數(shù)據(jù)結(jié)構(gòu),包含由Collection所連結(jié)的不同類(lèi)型的項(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é),目前的定義全部都是一個(gè)字節(jié)。UsagePage定義了常用的設(shè)備功能,關(guān)于UsagePage(以及其他項(xiàng)目)的具體定義內(nèi)容,可以查閱HIDUsagetables(/developers/hidpage/#Class_Definition),下表是來(lái)自HIDUsagetables的UsagePage定義。表8-6UsagePage定義PageIDPageName00Undefined01GenericDesktopControls02SimulationControls03VRControls04SportControls05GameControls06GenericDeviceControls07Keyboard/Keypad08LEDs09Button0AOrdinal0BTelephony0CConsumer0DDigitizer0EReserved0FPIDPage10Unicode11-13Reserved14AlphanumericDisplay15-3fReserved40MedicalInstruments41-7FReserved80-83Monitorpages84-87Powerpages88-8BReserved8CBarCodeScannerpage8DScalepage8EMagneticStripeReading(MSR)Devices8FReservedPointofSalepages90CameraControlPage91ArcadeFEFFReservedFF00-FFFFVendor-defined關(guān)于UsagePage的每一個(gè)有效定義項(xiàng),都有一個(gè)相應(yīng)的下一級(jí)定義,如UsagePage的數(shù)據(jù)項(xiàng)數(shù)值為1,則設(shè)備定義為GenericDesktopControls,關(guān)于該類(lèi)設(shè)備的具體功能可以在HIDUsageTables中查到具體的定義。下表是HIDUsageTables中對(duì)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è)備特性,對(duì)于UsagePage的每一項(xiàng)都定義了常用的各種用法。用法說(shuō)明了3種信息,即控制、集合和數(shù)據(jù)??刂普f(shuō)明設(shè)備的狀態(tài),如on/off、Enable/Disable等。集合說(shuō)明控制和數(shù)據(jù)的組合關(guān)系。上表中的用法類(lèi)型(UsageType)描述了應(yīng)用程序如何處理由Main類(lèi)型項(xiàng)目生成的數(shù)據(jù),具體的定義和詳細(xì)說(shuō)明請(qǐng)參閱HIDUsageTables。(4)ReportID項(xiàng)目ReportID放在信息包中報(bào)表數(shù)據(jù)之前,設(shè)備可以支持多個(gè)相同類(lèi)型的報(bào)表,每一個(gè)報(bào)表包含不同的數(shù)據(jù)與其特有的ID。在報(bào)表描述符中,ReportID項(xiàng)目作用于其后續(xù)所有的項(xiàng)目,直到遇到下一個(gè)ReportID為止。如果報(bào)表描述符中沒(méi)有ReportID項(xiàng)目,默認(rèn)的ID值是0,描述符不能定義一個(gè)為0的ReportID,輸入報(bào)表、輸出報(bào)表與特征報(bào)表可以分享同一個(gè)ReportID。在Set_Report和Get_Report請(qǐng)求傳輸中,主機(jī)在設(shè)置事務(wù)的wValue字段的低字節(jié)中指定一個(gè)ReportID。在中斷傳輸中如果接口支持一個(gè)以上的ReportID,ReportID必須是傳送報(bào)表中的第一個(gè)字節(jié)。如果接口只支持?jǐn)?shù)值為0的默認(rèn)ReportID,此ReportID不應(yīng)該在中斷傳輸中隨著報(bào)表一起傳送。(5)LogicalMinimum和LogicalMaximum項(xiàng)目LogicalMinimum與LogicalMaximum項(xiàng)目定義報(bào)表的變量(Variable)或陣列(Array)數(shù)據(jù)的限制范圍,此限制范圍以邏輯單位來(lái)表示。例如設(shè)備報(bào)表的一個(gè)電流值讀數(shù)是500mA,而一個(gè)單位是2mA,則LogicalMaximum值等于250。負(fù)數(shù)值以2的補(bǔ)碼來(lái)表示。如果LogicalMinimum與LogicalMaximum都是正數(shù),就不需要有正負(fù)號(hào)位。不管LogicalMinimum與LogicalMaximum是以有正負(fù)號(hào)或是無(wú)正負(fù)號(hào)的數(shù)值來(lái)表示,設(shè)備都可以正確地傳輸數(shù)據(jù)。數(shù)據(jù)的接收者必須知道數(shù)據(jù)是否可以是負(fù)值。(5)PhysicalMinimum和PhysicalMaximum項(xiàng)目PhysicalMinimum和PhysicalMaximum項(xiàng)目定義數(shù)值的限制范圍,該限制范圍使用Unit項(xiàng)目定義的單位來(lái)表示。上例中設(shè)備報(bào)表的一個(gè)電流值讀數(shù)是500mA,單位是2mA,LogicalMaximum值等于250,而PhysicalMaximum值是500。LogicalMinimum與LogicalMaximum值說(shuō)明了設(shè)備返回?cái)?shù)值的邊界,可以根據(jù)PhysicalMinimum和PhysicalMaximum值對(duì)數(shù)據(jù)進(jìn)行偏移和比例變換。(6)UnitExponent項(xiàng)目UnitExponent項(xiàng)目定義了在使用邏輯范圍和實(shí)際范圍將設(shè)備的返回?cái)?shù)值轉(zhuǎn)換成實(shí)際數(shù)值時(shí),使用10的多少次方對(duì)數(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根據(jù)以上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ù)值部分可以長(zhǎng)達(dá)4字節(jié),按照4位為一段分段,可以分為8個(gè)半字節(jié)段,由高到低分別為半字節(jié)7、半字節(jié)6、…、半字節(jié)0。每一個(gè)半字節(jié)對(duì)應(yīng)不同的基本單位,其數(shù)值表示單位的指數(shù)值,采用4位2的補(bǔ)碼表示,取值范圍是-8~+7之間。從半字節(jié)0~6由下表給出了具體的定義,其中半字節(jié)0表示測(cè)量系統(tǒng),半字節(jié)7保留。例如在半字節(jié)0數(shù)值為1(表示采用線(xiàn)性公制測(cè)量系統(tǒng))的條件下,半字節(jié)1表示長(zhǎng)度(單位為厘米),如果其數(shù)值為1表示厘米,數(shù)值為2表示(厘米)2,成為面積單位。半字節(jié)3表示時(shí)間(單位為秒),如果其數(shù)值為-2,表示(秒)-2。表8-9Unit單位的定義半字節(jié)序號(hào)測(cè)量項(xiàng)目數(shù)值含義012340測(cè)量系統(tǒng)無(wú)線(xiàn)性、公制角度、公制線(xiàn)性、英制角度、英制1長(zhǎng)度厘米半徑英寸度2質(zhì)量克石拉(slug)3時(shí)間秒4溫度開(kāi)式度(Kelvin)華式度5電流安培6亮度燭光7保留雖然表中只是定義了有限的基本單位,但可以通過(guò)這些基本單位的組合派生出大多數(shù)其它的常用單位。例如報(bào)表使用一個(gè)字節(jié)傳送一個(gè)從-20到110華氏度溫度值,可以定義以下報(bào)表描述項(xiàng)目:LogicalMinimum=-128LogicalMaximum=127PhysicalMinimum=-20PhysicalMaximum=110UnitExponent=0Unit=30003hUnit的半字節(jié)0=3選擇英制線(xiàn)性測(cè)量系統(tǒng),半字節(jié)4=3選擇華氏溫度單位。130(110+20)華氏度的數(shù)值范圍線(xiàn)性分布到了256和有效數(shù)值區(qū)域,每一位相當(dāng)于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)表可以有多個(gè)項(xiàng)目,每一個(gè)項(xiàng)目可以有自己的ReportSize和ReportCount項(xiàng)目。(9)Push和Pop項(xiàng)目Push項(xiàng)目將一個(gè)Global項(xiàng)目狀態(tài)表格的副本壓入CPU的堆棧內(nèi)。GIobal項(xiàng)目狀態(tài)表格包含所有之前定義的Gobal項(xià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類(lèi)型項(xiàng)目。Usage項(xiàng)目和Global類(lèi)型的UsagePage項(xiàng)目協(xié)同描述項(xiàng)目或集合的功能。一個(gè)報(bào)表可以指定一個(gè)Usage給許多個(gè)控制,或是指定不同的Usage給每一個(gè)控制。如果一個(gè)報(bào)表項(xiàng)目之前有一個(gè)Usage,此Usage應(yīng)用到該項(xiàng)目的所有控制。如果一個(gè)報(bào)表項(xiàng)目之前有一個(gè)以上的Usage,每一個(gè)Usage應(yīng)用到一個(gè)控制,Usage與控制是按順序結(jié)合的。例如下面報(bào)表描述符的一個(gè)局部,報(bào)表含有2個(gè)輸入字節(jié),第一個(gè)字節(jié)的用法是x,第2個(gè)字節(jié)是y。ReportSize(8)ReportCount(2)Usage(x)Usage(y)Input(Data,Variable,Absolute)如果一個(gè)報(bào)表項(xiàng)目之前有一個(gè)以上的Usage,而且控制的數(shù)目多于Usage的數(shù)目,每一個(gè)Usage與一個(gè)控制對(duì)應(yīng),最后一個(gè)Usage則應(yīng)用到所有剩余的控制。例如在下面報(bào)表包含16個(gè)字節(jié)輸入數(shù)據(jù),第一個(gè)字節(jié)對(duì)應(yīng)用法x,第2個(gè)字節(jié)對(duì)應(yīng)用法y,剩余的14個(gè)字節(jié)對(duì)應(yīng)廠商定義的用法。Usage(x)Usage(y)Usage(Vendordefined)ReportSize(8)ReportCount(16)Input(Data,Variable,Absolute)UsageMinimum和UsageMaximum可以指定一個(gè)Usage給多個(gè)控制或是數(shù)組項(xiàng)目。將從UsageMinimum到UsgaeMaximun定義的用法順序?qū)?yīng)到多個(gè)控制中。例如在一個(gè)鍵盤(pán)描述符中定義的標(biāo)準(zhǔn)鍵盤(pán)的左、右修飾鍵的輸入項(xiàng)目中,使用一個(gè)字節(jié)的8位分別輸入鍵盤(pán)的左、右Ctrl鍵、Shift鍵、Alt鍵和GUI鍵,從HIDUsagetables文檔中的第10節(jié)可以查到關(guān)于鍵盤(pá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接口的鍵盤(pán)描述符范例下面作為一個(gè)例子,介紹一個(gè)USB接口的101鍵盤(pán)的全部描述符。該鍵盤(pán)固件部分由一個(gè)微處理器實(shí)現(xiàn)全部控制功能,下面列出的代碼為微處理器匯編實(shí)現(xiàn)描述符定義。設(shè)備的描述符設(shè)備描述符的代碼如下。;=========================================;Devicedescriptor 設(shè)備描述符;=========================================DEVICE_DESC_DATA:DB0x12 ;bLength=18,該描述符長(zhǎng)度為18字節(jié)DB0x01 ;bDescriptorType=01,表明是設(shè)備描述符DB0x10,0x01 ;bcdUSB,USB設(shè)備版本號(hào)=1.1DB0x00 ;DeviceClass,設(shè)備類(lèi)碼,HID設(shè)備為0,類(lèi)別在接口描述符中定義DB0X00 ;DeviceSubClass,設(shè)備子類(lèi)碼,DeviceClass為0時(shí)該字段必須為0DB0X00 ;bDevicePortocol,協(xié)議碼,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è)備版本號(hào)為1.00DB0x04 ;iManufacturer,廠商字符串的索引值,見(jiàn)字符串描述符DB0x0E ;iProduct,產(chǎn)品字符串的索引值,見(jiàn)字符串描述符DB0x30 ;iSerialNumber,產(chǎn)品序列號(hào)字符串的索引值,見(jiàn)字符串描述符DB0X01 ;bNumConfigurations,配置數(shù)目只有1個(gè)配置描述符配置描述符的代碼如下。;=========================================;Configurationdescriptor配置描述符;=========================================CONFIG_DESC_DATA:DB0x09 ;bLength=9,該描述符長(zhǎng)度為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)識(shí)符DB0x00 ;iCongfiguration=0,配置描述符說(shuō)明字符串的索引值,0表示無(wú)DB0XA0 ;bmAttributes,電源及喚醒設(shè)置,USB1.1版中D7=1,D6=0表示總線(xiàn)供電 ;D5=1表示支持遠(yuǎn)程喚醒DB0X32 ;MaxPower=50,本設(shè)備最大耗電為50X2mA=100mA需要說(shuō)明的是wTotalLength的值,該數(shù)值為配置描述符長(zhǎng)度(9)加上后續(xù)的鍵盤(pán)的接口描述符長(zhǎng)度(9)、端點(diǎn)描述符長(zhǎng)度(7)、HID描述符長(zhǎng)度(9),以及該配置下的鼠標(biāo)的接口描述符長(zhǎng)度(9)、端點(diǎn)描述符長(zhǎng)度(7)、HID描述符長(zhǎng)度(9),共59個(gè)字節(jié)。關(guān)于鼠標(biāo)的相關(guān)描述符在下面的敘述中省略了。接口描述符接口描述符的代碼如下。;=========================================;Interfacedescriptor接口描述符;=========================================InterfaceDescriptor0:DB0x09 ;bLength=9,該描述符長(zhǎng)度DB0x04 ;bDescriptorType=4,表明是接口描述符DB0x00 ;bInterfaceNumber=0,此接口的識(shí)別標(biāo)識(shí)符DB0x00 ;bAlternateSetting=0,表示此接口無(wú)替代設(shè)置值DB0x01 ;bNumEndpoints=1,本接口的端點(diǎn)數(shù)目,HID設(shè)備使用端點(diǎn)1DB0x03 ;bInterfaceClass=3,表示該設(shè)備是HID類(lèi)別DB0x01 ;bInterfaceSubClass=1,表示支持啟動(dòng)接口DB0x01 ;bInterfaceProtocol=1,表示支持鍵盤(pán)協(xié)議DB0x00 ;iInterface=0,接口描述符說(shuō)明字符串的索引值,0表示無(wú)字符串HID描述符HID描述符的代碼如下。;=========================================;HIDdescriptorHID描述符;=========================================HIDDescriptor0:DB0x09 ;bLength=9,該描述符長(zhǎng)度DB0x21 ;bDescriptorType=21h,表明是HID描述符DB0x00,0x01 ;bcdHID=0100,HID規(guī)范版本為1.00DB0x00 ;bCountryCode=0,硬件設(shè)備所在國(guó)家的國(guó)家代碼,0表示未指明DB0x01 ;nNumDescriptors=1,表示支持的描述符有1個(gè),即一個(gè)報(bào)表描述符DB0x22 ;bDescriptorType=22h,描述符類(lèi)別,表示支持的描述符是報(bào)表描述符DB0x3F,0x00 ;wDescriptorLength=63,表示支持的報(bào)表描述符的長(zhǎng)度端點(diǎn)描述符端點(diǎn)描述符的代碼如下。;=========================================;EndPointdescriptor端點(diǎn)描述符;=========================================EndpointDescriptor0:DB0x07 ;bLength=7,該描述符長(zhǎng)度DB0x05 ;bDescriptorType=5,表明是端點(diǎn)描述符DB0x81 ;bEndpointAddress=10000001b,表示1號(hào)輸入端點(diǎn)DB0X03 ;bmAttributes=00000011b,表示中斷類(lèi)型端點(diǎn)DB0x08,0x00 ;wMaxPacketSize=8,端點(diǎn)發(fā)送和接收的最大包尺寸為8DB10 ;bInterval=10,表示中斷端點(diǎn)輪詢(xún)時(shí)間間隔為10ms字符串描述符字符串描述符的代碼如下。;=========================================;Stringdescriptor字符串描述符;=========================================StringDescriptor0:DB0x04 ;bLength=4,字符串描述符0的長(zhǎng)度為4DB0x03 ;bDescriptorType=3,表明是字符串描述符DB0x09,0x00 ;wLANGID=0009h,表明是英語(yǔ)DB0x0A ;bLength=10,字符串描述符的長(zhǎng)度為10DB0x03 ;bDescriptorType=3,表明是字符串描述符DB0x41,0x00,0x43,0x00,0x4D,0x00,0x45,0x00 ;bString=“ACME“,Unicode編碼的字符串DB0x22 ;bLength=34,字符串描述符的長(zhǎng)度為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,字符串描述符的長(zhǎng)度為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)表示報(bào)表定義的是HID鍵盤(pán)DB0xA1,1 ;Collection(1:Application)====================集合開(kāi)始 ; ; 以下定義了鍵盤(pán)的修飾鍵輸入報(bào)表,共有8個(gè)鍵,組成一個(gè)字節(jié) ; 用法見(jiàn)HIDUsageTable中的第10節(jié)中的鍵盤(pán)用法定義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) ; ; 以下定義了一個(gè)保留字節(jié)的輸入報(bào)表DB0x95,1 ; ReportCount(1)DB0x75,8 ; ReportSize(8),DB0x81,1 ; Input(Constant)=ReservedByte ; ; 以下定義了鍵盤(pán)的LED指示燈輸出報(bào)表項(xiàng)目,共有5個(gè)指示燈 ; 用法見(jiàn)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è)完整的字節(jié)DB0x95,1 ; ReportCount(1)DB0x75,3 ; ReportSize(3)DB0x91,1 ; Output(Constant) ; ; 以下定義了鍵盤(pán)的按鍵值輸入報(bào)表項(xiàng)目,共6個(gè)字節(jié),存放鍵編號(hào)(0~101) ; 用法見(jiàn)HIDUsageTable中的第10節(jié)中的鍵盤(pán)用法定義 ; 這樣的設(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é)束通過(guò)上面的報(bào)表描述符的定義,確定了鍵盤(pán)的輸入報(bào)表和輸出報(bào)表的數(shù)據(jù)格式。其中輸入報(bào)表共8個(gè)字節(jié),輸出報(bào)表只有1個(gè)字節(jié)。修飾鍵修飾鍵保留鍵值1鍵值2鍵值3鍵值4鍵值5鍵值6圖8-4鍵盤(pán)的輸入報(bào)表格式字節(jié)0字節(jié)1字節(jié)2字節(jié)3字節(jié)4字節(jié)5字節(jié)6字節(jié)77~57~5圖8-5鍵盤(pán)的輸出報(bào)表格式43210ScrollLock指示燈NnmLock指示燈CapsLock指示燈常數(shù),保留Compose指示燈Kana指示燈字節(jié)0HID的特定請(qǐng)求除了USB設(shè)備的11個(gè)標(biāo)準(zhǔn)請(qǐng)求外,HID規(guī)范另外還定義了6個(gè)HID特定控制請(qǐng)求。所有的HID設(shè)備都必須支持Get_Report請(qǐng)求,同時(shí)支持啟動(dòng)的設(shè)備必須支持Get_Protocol請(qǐng)求和Set_Protocol請(qǐng)求,其他的請(qǐng)求是可選擇的。如果設(shè)備沒(méi)有中斷輸出端點(diǎn),此設(shè)備需要支持Get_Report請(qǐng)求來(lái)從主機(jī)讀取數(shù)據(jù)。在控制傳輸?shù)脑O(shè)置階段的數(shù)據(jù)包中的8個(gè)字節(jié)中的第一字節(jié)bmRequestType的編碼含義參閱第6章中的USB標(biāo)準(zhǔn)請(qǐng)求。第2個(gè)字節(jié)bRequest定義請(qǐng)求的內(nèi)容。wValue因請(qǐng)求的不同而不同。wIndex指明HID所在的接口。表8-10HID特定的請(qǐng)求bmRequestTypebRequest(值)wValuewIndexwLength數(shù)據(jù)階段10100001bGet_Report(1)報(bào)表類(lèi)型,報(bào)表ID接口報(bào)表長(zhǎng)度報(bào)表00100001bSet_Report(9)報(bào)表類(lèi)型,報(bào)表ID接口報(bào)表長(zhǎng)度報(bào)表10100001bGet_Idle(2)0,報(bào)表ID接口1閑置時(shí)間00100001bSet_Idle(10)閑置時(shí)間,報(bào)表ID接口0無(wú)10100001bGet_Protocol(3)0接口10:啟動(dòng)協(xié)議1:報(bào)表協(xié)議00100001bSet_Protocol(11)0:啟動(dòng)協(xié)議1:報(bào)表協(xié)議接口0無(wú)Get_Report請(qǐng)求Get_Report的作用是啟用主機(jī)使用控制傳輸,來(lái)從設(shè)備讀取數(shù)據(jù)。在使用時(shí)wValue字段的高字節(jié)是報(bào)表類(lèi)型,1表示Input報(bào)表,2表示Output報(bào)表,3表示Feature報(bào)表。wValue的低字節(jié)是報(bào)表的ReportID,如果沒(méi)有定義ReportID,該字節(jié)為設(shè)0。在攜帶請(qǐng)求的控制傳輸?shù)臄?shù)據(jù)階段,HID設(shè)備回傳指定的報(bào)表內(nèi)容。HlD規(guī)范不建議使用該請(qǐng)求獲得未經(jīng)定時(shí)的數(shù)據(jù),這樣的數(shù)據(jù)建議使用中斷輸入管道獲得。該請(qǐng)求用來(lái)取得在主機(jī)初始化設(shè)備時(shí)的特征項(xiàng)目狀態(tài)和其他信息。使用開(kāi)機(jī)協(xié)議的主機(jī)可以使用此請(qǐng)求來(lái)獲得按鍵或鼠標(biāo)數(shù)據(jù)。Set_Report請(qǐng)求Set_Report請(qǐng)求的參數(shù)含義和Get_Report一樣,但Set_Report請(qǐng)求的數(shù)據(jù)方向與Get_Report相反,在后面的數(shù)據(jù)階段,主機(jī)傳送報(bào)表到HID設(shè)備,這樣的輸出報(bào)表可以用于復(fù)位設(shè)備的控制,復(fù)位產(chǎn)生的效果取決于對(duì)應(yīng)的控制的類(lèi)型是相對(duì)(Reletive)的還是絕對(duì)(Absolute)的。Set_Idle請(qǐng)求Set_Idle請(qǐng)求的作用是靜默一個(gè)在中斷輸入管道的特定的報(bào)表,直到一個(gè)發(fā)生一個(gè)相關(guān)的事件或過(guò)去了規(guī)定的時(shí)間,當(dāng)數(shù)據(jù)從上一個(gè)報(bào)表后沒(méi)有改變時(shí),可以通過(guò)限制中斷輸入端點(diǎn)的報(bào)表頻率來(lái)節(jié)省傳輸帶寬。HID設(shè)備不是必需支持此請(qǐng)求。wValue字段的高字節(jié)是設(shè)置的閑置時(shí)間,是報(bào)表之間的最大間隔時(shí)間。該字節(jié)為0表示閑置時(shí)間為無(wú)限長(zhǎng),在這種情況下,設(shè)備只有在報(bào)表數(shù)據(jù)有改變時(shí)才傳送報(bào)表,否則設(shè)備傳回一個(gè)NAK。wValue字段的低字節(jié)指示此請(qǐng)求應(yīng)用的報(bào)表的ReportID。如果低字節(jié)是0,此請(qǐng)求應(yīng)用到設(shè)備的所有輸入報(bào)表。閑置時(shí)間以4ms為單位,范圍在4ms~1020ms之間。如果報(bào)表的數(shù)據(jù)自從上一次報(bào)表后有改變,或是接收到一個(gè)請(qǐng)求,設(shè)備會(huì)傳送一個(gè)報(bào)表。如果報(bào)表的數(shù)據(jù)沒(méi)有改變,而且從上一次報(bào)表后過(guò)去的時(shí)間自尚未達(dá)到規(guī)定的閑置時(shí)間,設(shè)備會(huì)傳回一個(gè)NAK。如果報(bào)表的數(shù)據(jù)沒(méi)有改變,而且持續(xù)時(shí)間已經(jīng)達(dá)到的閑置時(shí)間,設(shè)備會(huì)傳送一個(gè)報(bào)表。閑置時(shí)間設(shè)置為0表示無(wú)限長(zhǎng)的閑置時(shí)間,設(shè)備只有在報(bào)表的數(shù)據(jù)有改變時(shí)才會(huì)傳送一個(gè)報(bào)表,對(duì)于其他的中斷輸入請(qǐng)求則是傳回NAK。在檢測(cè)HID設(shè)備時(shí),Wndows的HID驅(qū)動(dòng)程序會(huì)試圖將閑置時(shí)間設(shè)置成0。如果HID設(shè)備不支持此請(qǐng)求,主機(jī)會(huì)收到傳回的Stall。Get_Idle請(qǐng)求Get_Idle請(qǐng)求的作用是過(guò)的設(shè)備的當(dāng)前閑置時(shí)間,在數(shù)據(jù)階段,HID設(shè)備回傳一個(gè)字節(jié)的閑置時(shí)間值。Get_Protocol請(qǐng)求Get_Protocol請(qǐng)求的作用是主機(jī)獲取設(shè)備目前作用的是啟動(dòng)協(xié)議還是報(bào)表協(xié)議。在數(shù)據(jù)階段中設(shè)備回傳的1個(gè)字節(jié)信息包中的數(shù)據(jù)值為0表示啟動(dòng)協(xié)議,為1表示報(bào)表協(xié)議。啟動(dòng)設(shè)備必需支持該請(qǐng)求。Set_Protocol請(qǐng)求Set_Protocol的作用是主機(jī)指定設(shè)備使用啟動(dòng)協(xié)議或報(bào)表協(xié)議。在數(shù)據(jù)階段中主機(jī)傳送的1個(gè)字節(jié)信息包中的數(shù)據(jù)值為0表示指定啟動(dòng)協(xié)議,為1表示指定報(bào)表協(xié)議。啟動(dòng)設(shè)備必需支持該請(qǐng)求。HID程序設(shè)計(jì)HID設(shè)備是Windows系統(tǒng)提供了完善支持的一類(lèi),應(yīng)用程序可以通過(guò)標(biāo)準(zhǔn)的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文件中。HID訪問(wèn)使用的API函數(shù)文件hid.dll中提供了很多個(gè)API,因?yàn)榕cHID設(shè)備通信有一定的復(fù)雜性。首先,在應(yīng)用程序與HID傳輸數(shù)據(jù)之前,應(yīng)用程序必須先識(shí)別該設(shè)備并且讀取它的報(bào)表信息,這些動(dòng)作需要調(diào)用多個(gè)API函數(shù)才可以實(shí)現(xiàn)。應(yīng)用程序需要尋找連接到系統(tǒng)上的是哪些HID設(shè)備,然后讀取每個(gè)設(shè)備的信息直到查找到所需的屬性。如果是客戶(hù)化的設(shè)備,應(yīng)用程序可以尋找特定的廠商與產(chǎn)品ID,或者應(yīng)用程序可以尋找特定類(lèi)型的設(shè)備,例如鍵盤(pán)或鼠標(biāo)。表8-11用于HID設(shè)備的API函數(shù)用于了解HID設(shè)備情況的API函數(shù)(hid.dll)HidD_GetAttributes請(qǐng)求獲得HID設(shè)備的廠商ID、產(chǎn)品ID和版本號(hào)HidD_FreePreparsedData釋放函數(shù)HidD_GetPreparsedData所使用的資源HidD_GetHidGuid請(qǐng)求獲得HID設(shè)備的GUIDHidD_GetIndexString請(qǐng)求獲得由索引識(shí)別的字符串HidD_GetManufactureString請(qǐng)求獲得設(shè)備制造商字符串HidD_GetPhysicalDescriptor請(qǐng)求獲得設(shè)備實(shí)體字符串HidD_GetPreparsedData請(qǐng)求獲得與設(shè)備能力信息相關(guān)的緩沖區(qū)的代號(hào)HidD_GetProductString請(qǐng)求獲得產(chǎn)品字符串HidD_GetSerialNumberString請(qǐng)求獲得產(chǎn)品序列號(hào)字符串HidP_GetButtonCaps請(qǐng)求獲得HID報(bào)表中所有按鈕的能力HidP_GetCaps請(qǐng)求獲得用于描述設(shè)備能力的結(jié)構(gòu)的指針HidP_GetLinkCollectionNotes請(qǐng)求獲得描述在頂層集合中的連接集合(LinkCollection)關(guān)系的結(jié)構(gòu)的數(shù)組HidP_GetSpecificButtonCaps請(qǐng)求獲得報(bào)表中按鈕的能力,該請(qǐng)求可以設(shè)定一個(gè)UsagePage、Usage或是LinkCollectionHidP_GetSpecificValueCaps請(qǐng)求獲得報(bào)表中數(shù)值的能力,該請(qǐng)求可以設(shè)定一個(gè)UsagePage、Usage或是LinkCollectionHidP_GetValueCaps請(qǐng)求獲得HID報(bào)表中所有數(shù)值的能力HidP_MaxUsageListLength請(qǐng)求獲得HID報(bào)表中可以回傳的按鈕的最大數(shù)目,該請(qǐng)求可以設(shè)定一個(gè)UsagePageHidP_UsageListDifference比較兩個(gè)按鈕列表,并且求出在一個(gè)列表中設(shè)定而在另一個(gè)列表中沒(méi)有設(shè)定的按鈕用于從設(shè)備讀取、向設(shè)備傳送報(bào)表的API函數(shù)(hid.dll)HidD_GetFeature從設(shè)備讀取一個(gè)特征報(bào)表HidD_SetFeature向設(shè)備傳送一個(gè)特征報(bào)表HidP_GetButtons從設(shè)備讀取包含每個(gè)按下的按鈕的用法(Usage)的緩沖區(qū)的指針,該請(qǐng)求可以設(shè)定一個(gè)UsagePageHidP_GetButtonEx從設(shè)備讀取包含每個(gè)按下的按鈕的Usage和UsagePage的緩沖區(qū)的指針HidP_GetScaledUsageValue從設(shè)備讀取一個(gè)已經(jīng)經(jīng)過(guò)比例因子調(diào)整的有符號(hào)數(shù)值HidP_GetUsageValue從設(shè)備讀取一個(gè)指向數(shù)值的指針HidP_GetUsageValueArray從設(shè)備讀取包含多個(gè)數(shù)據(jù)項(xiàng)的Usage的數(shù)據(jù)HidP_SetButtons向設(shè)備傳送設(shè)置按鈕的數(shù)據(jù)HidP_SetScaledUsageValue將一個(gè)實(shí)際數(shù)值轉(zhuǎn)換成設(shè)備使用的邏輯數(shù)值,并將其插入到報(bào)表中HidP_SetUsageValue向設(shè)備傳送數(shù)據(jù)HidP_SetUsageValueArray向設(shè)備傳送包含多個(gè)數(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ū)的大小用于查找和識(shí)別設(shè)備的API函數(shù)(setupapi.dll)SetupDiGetClassDevs獲得HID的信息,針對(duì)已安裝的設(shè)備,回傳一個(gè)指向其信息集的代碼SetupDiEnumDeviceInterfaces請(qǐng)求獲得設(shè)備信息群內(nèi)的一個(gè)設(shè)備的信息SetupDiGetDeviceInterfaceDetail請(qǐng)求獲得設(shè)備的路徑SetupDiDestroyDeviceInfoList釋放SetupDiGetClassDevs使用的資源用于打開(kāi)、關(guān)閉設(shè)備和實(shí)現(xiàn)數(shù)據(jù)傳送的API函數(shù)(kernal32.dll)CreatFile取得設(shè)備的路徑后,調(diào)用該函數(shù)獲得設(shè)備代號(hào)WriteFile向設(shè)備傳送輸出報(bào)表ReadFile從設(shè)備讀取輸入報(bào)表CloseHandle關(guān)閉設(shè)備,釋放CreateFile所使用的資源查找HID的過(guò)程在實(shí)現(xiàn)HID的訪問(wèn)之前,首先要查找指定(根據(jù)設(shè)備的廠商ID、產(chǎn)品ID和產(chǎn)品序列號(hào))的HID。查找指定設(shè)備的過(guò)程如下:調(diào)用函數(shù)HidD_GetHidGuid獲得USB設(shè)備的GUID;調(diào)用函數(shù)SetupDiGetClassDevs,獲得一個(gè)包含全部HID信息的結(jié)構(gòu)數(shù)組的指針,下面根據(jù)此數(shù)組逐項(xiàng)查找指定的HID;調(diào)用函數(shù)SetupDiEnumDeviceInterfaces,填寫(xiě)SP_DEVICE_INTERFACE_DATA結(jié)構(gòu)的數(shù)據(jù)項(xiàng),該結(jié)構(gòu)用于識(shí)別一個(gè)HID設(shè)備接口;調(diào)用函數(shù)SetupDiGetDeviceInterfaceDetail,獲得一個(gè)指向該設(shè)備的路徑名;調(diào)用函數(shù)CreateFile,獲得設(shè)備句柄;調(diào)用函數(shù)HidD_GetAttributes,填寫(xiě)HIDD_ATTRIBUTES結(jié)構(gòu)的數(shù)據(jù)項(xiàng),該結(jié)構(gòu)包含設(shè)備的廠商ID、產(chǎn)品ID和產(chǎn)品序列號(hào),比照這些數(shù)值確定該設(shè)備是否是查找的設(shè)備。查找HID的流程如下圖。調(diào)用調(diào)用HidD_GetHidGuid獲得GUID調(diào)用SetupDiGetClassDevs獲得全部HID信息調(diào)用Set

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論