USB HIDЭÒéÖÐÎİæ - USB½Ó¿ÚHIDÉ豸 - ͼÎÄ

µÚ8Õ USB½Ó¿ÚHIDÉ豸

HID£¨Human Interface Device£¬ÈË»ú½Ó¿ÚÉ豸£©ÊÇUSBÉ豸Öг£ÓõÄÉ豸ÀàÐÍ£¬ÊÇÖ±½ÓÓëÈ˽»»¥µÄUSBÉ豸£¬ÀýÈç¼üÅÌ¡¢Êó±êÓëÓÎÏ·¸ËµÈ¡£ÔÚUSBÉ豸ÖУ¬HIDÉ豸µÄ³É±¾½ÏµÍ¡£ÁíÍ⣬HIDÉ豸²¢²»Ò»¶¨ÒªÓÐÈË»ú½»»¥¹¦ÄÜ£¬Ö»Òª·ûºÏHIDÀà±ð¹æ·¶µÄÉ豸¶¼ÊÇHIDÉ豸¡£

Wndows²Ù×÷ϵͳ×îÏÈÖ§³ÖµÄHIDÉ豸¡£ÔÚwindows 98ÒÔ¼°ºóÀ´µÄ°æ±¾ÖÐÄÚÖÃÓÐ HIDÉ豸µÄÇý¶¯³ÌÐò£¬Ó¦ÓóÌÐò¿ÉÒÔÖ±½ÓʹÓÃÕâЩÇý¶¯³ÌÐòÀ´ÓëÉ豸ͨÐÅ¡£

ÔÚÉè¼ÆÒ»¸öUSB½Ó¿ÚµÄ¼ÆËã»úÍⲿÉ豸ʱ£¬Èç¹ûHIDÀàÐ͵ÄÉ豸¿ÉÒÔÂú×ãÐèÒª£¬¿ÉÒÔ½«ÆäÉè¼ÆÎªHIDÀàÐÍÉ豸£¬ÕâÑù¿ÉÒÔʡȥ±È½Ï¸´ÔÓµÄUSBÇý¶¯³ÌÐòµÄ±àд£¬Ö±½ÓÀûÓÃWindows²Ù×÷ϵͳ¶Ô±ê×¼µÄHIDÀàÐÍUSBÉ豸µÄÖ§³Ö¡£

8.1 HIDÉ豸¼ò½é

8.1.1 HIDÉ豸µÄÌØµã

? ½»»»µÄÊý¾Ý´¢´æÔÚ³ÆÎª±¨±í£¨Report£©µÄ½á¹¹ÄÚ£¬É豸µÄ¹Ì¼þ±ØÐëÖ§³ÖHlD±¨±íµÄ

¸ñʽ¡£Ö÷»úͨ¹ý¿ØÖƺÍÖжϴ«ÊäÖеĴ«ËͺÍÇëÇ󱨱íÀ´´«ËͺͽÓÊÕÊý¾Ý¡£±¨±íµÄ¸ñʽ·Ç³£Áé»î¡£

? ÿһ±ÊÊÂÎñ¿ÉÒÔЯ´øÐ¡Á¿»òÖÐÁ¿µÄÊý¾Ý¡£µÍËÙÉ豸ÿһ±ÊÊÂÎñ×î´óÊÇ8B£¬È«ËÙÉè

±¸Ã¿Ò»±ÊÊÂÎñ×î´óÊÇ64B£¬¸ßËÙÉ豸ÿһ±ÊÊÂÎñ×î´óÊÇ1024B¡£Ò»¸ö±¨±í¿ÉÒÔʹÓöà±ÊÊÂÎñ¡£

? É豸¿ÉÒÔÔÚδԤÆÚµÄʱ¼ä´«ËÍÐÅÏ¢¸øÖ÷»ú£¬ÀýÈç¼üÅ̵İ´¼ü»òÊÇÊó±êµÄÒÆ¶¯¡£ËùÒÔ

Ö÷»ú»á¶¨Ê±ÂÖѯÉ豸£¬ÒÔÈ¡µÃ×îеÄÊý¾Ý¡£

? HIDÉ豸µÄ×î´ó´«ÊäËÙ¶ÈÓÐÏÞÖÆ¡£Ö÷»ú¿ÉÒÔ±£Ö¤µÍËÙµÄÖж϶˵ãÿ10msÄÚ×î¶à1

±ÊÊÂÎñ£¬Ã¿Ò»Ãë×î¶àÊÇ800B¡£±£Ö¤È«Ëٶ˵ãÿlmsÒ»±ÊÊÂÎñ£¬Ã¿Ò»Ãë×î¶àÊÇ64000B¡£±£Ö¤¸ßËٶ˵ãÿ125 usÈý±ÊÊÂÎñ£¬Ã¿Ò»Ãë×î¶àÊÇ24.576MB¡£

? HIDÉ豸ûÓб£Ö¤µÄ´«ÊäËÙÂÊ¡£Èç¹ûÉ豸ÊÇÉèÖÃÔÚ10msµÄʱ¾à£¬ÊÂÎñÖ®¼äµÄʱ¼ä

¿ÉÄܵÈÓÚ»òСÓÚ10ms¡£³ý·ÇÉ豸ÊÇÉèÖÃÔÚÈ«ËÙʱÔÚÿ¸öÖ¡´«ÊäÊý¾Ý£¬»òÊÇÔÚ¸ßËÙʱÔÚÿ¸ö΢֡´«ÊäÊý¾Ý¡£ÕâÊÇ×î¿ìµÄÂÖѯËÙÂÊ£¬ËùÒԶ˵ã¿ÉÒÔ±£Ö¤ÓÐÕýÈ·µÄ´ø¿í¿É¹©Ê¹Óá£

HIDÉ豸³ýÁË´«ËÍÊý¾Ý¸øÖ÷»úÍ⣬ËüÒ²»á´ÓÖ÷»ú½ÓÊÕÊý¾Ý¡£Ö»ÒªÄܹ»·ûºÏHlDÀà±ð¹æ·¶µÄÉ豸¶¼¿ÉÒÔÊÇHIDÉ豸¡£

É豸³ýÁËHlD½Ó¿ÚÖ®Í⣬Ëü¿ÉÄÜͬʱ»¹°üº¬ÓÐÆäËûµÄUSB½Ó¿Ú¡£ÀýÈçÓ°ÏñÏÔʾÉ豸¿ÉÄÜʹÓÃHID½Ó¿ÚÀ´×öÁÁ¶È¡¢¶Ô±È¶ÈµÄÈí¼þ¿ØÖÆ£¬¶øÊ¹Óô«Í³µÄÓ°Ïñ½Ó¿ÚÀ´´«ËÍÒªÏÔʾµÄÊý¾Ý¡£USBÀ©ÒôÆ÷¿ÉÒÔʹÓÃʵʱ´«ÊäÀ´²¥·ÅÓïÒô£¬Í¬Ê±Ê¹ÓÃHID½Ó¿ÚÀ´¿ØÖÆÒôÁ¿¡¢µÍÒôµÈ¡£

HIDÀà±ðÉ豸µÄ¹æ·¶ÎļþÖ÷ÒªÊÇÒÔÏÂÁ½·Ý£º

? Device Class Definition for Human interface Devices ? HID Usage Tables

ÆäÖÐǰÕßÊÇHIDµÄ»ù±¾¹æ·¶Îļþ£¬ºóÕß¿ÉÒÔÊÇǰÕߵĸ½¼þ£¬Îª¿ª·¢ÈËÔ±Ìṩʵ¼ÊµÄ¿ØÖÆÀàÐ͵ÄÃèÊö¡£ÎļþÊÇÓÃÀ´¶¨ÒåÈÃÖ÷»úÁ˽âÒÔ¼°Ê¹ÓÃHIDÊý¾ÝµÄÊýÖµ¡£ÕâÁ½·ÝÎļþÊÇÓÉ USB Device Working GroupÖÆ¶¨µÄ£¬¿ÉÒÔÔÚÍøÖ·http://www.usb.org/developers/hidpage/ #Class _DefinitionÏÂÔØ¡£

182 ¼ÆËã»ú¸ß¼¶½Ó¿Úʵ¼ù

8.1.2 HIDÉ豸µÄÓ²¼þÒªÇó

HID½Ó¿Ú±ØÐë·ûºÏDevice Class Definition for Human interface Devices¹æ·¶ÄÚËù¶¨ÒåµÄHIDÀà±ðµÄÐèÇó¡£ÔÚ´ËÎļþÄÚÃèÊöÁËËùÐèµÄÃèÊö·û¡¢´«ÊäµÄƵÂÊÒÔ¼°´«ÊäµÄÀàÐ͵ȡ£ÎªÁË·ûºÏ¹æ·¶£¬HID½Ó¿ÚµÄ¶ËµãÓëÃèÊö·û¶¼±ØÐë·ûºÏÊý¸öÒªÇó¡£

ËùÓеÄHID´«Êä¶¼ÊÇʹÓÃĬÈÏ¿ØÖƹܵÀ»òÊÇÒ»¸öÖжϹܵÀ£¬HIDÉ豸±ØÐëÓÐÒ»¸öÖжÏÊäÈë¶ËµãÀ´´«ËÍÊý¾Ýµ½Ö÷»ú£¬ÖжÏÊä³ö¶ËµãÔò²»ÊDZØÐèµÄ¡£

Ö÷»ú HIDÀà±ð Çý¶¯³ÌÐò ÍâÉè ĬÈÏ¿ØÖƹܵÀ HIDÀà±ð É豸 ÖжϹܵÀ ͼ8-1 HID´«ÊäµÄ´«ÊäÀàÐÍ

±í8-1 HIDÉ豸µÄ´«ÊäÀàÐÍ ´«Êä ÀàÐÍ ¿ØÖÆ ÖÐ¶Ï Êý¾ÝÀ´Ô´ É豸£¨ÊäÈ룩 Ö÷»ú£¨Êä³ö£© É豸£¨ÊäÈ룩 Ö÷»ú£¨Êä³ö£© Êý¾ÝÀàÐÍ Ã»ÓÐÑϸñʱ¼äÏÞÖÆµÄÊý¾Ý ûÓÐÑϸñʱ¼äÏÞÖÆµÄÊý¾Ý »òÊÇûÓÐÖжÏÊä³ö¹ÜµÀʱµÄÈκÎÊý¾Ý ¶¨Ê±»òµÍÑÓ³ÙµÄÊý¾Ý ¶¨Ê±»òµÍÑÓ³ÙµÄÊý¾Ý ÊÇ·ñÐè Òª¹ÜµÀ ÊÇ ÊÇ ÊÇ

Ö÷»úÓëÉ豸֮¼äËù½»»»µÄÊý¾Ý£¬¿ÉÒÔ·Ö³ÉÁ½ÖÖÀàÐÍ£º

? µÍÑÓ³ÙµÄÊý¾Ý£¬±ØÐ뾡¿ìµØµ½´ïÄ¿µÄ£»

? ÅäÖûòÆäËûµÄÊý¾Ý£¬Ã»ÓÐÑϸñʱ¼äÏÞÖÆµÄÐèÇó¡£

ÖжϹܵÀÊÇ¿ØÖƹܵÀÖ®ÍâµÄÁíÒ»ÖÖÊý¾Ý½»»»µÄ·½Ê½£¬ÌرðÊʺÏʹÓÃÔÚ½ÓÊÕ¶ËÐèÒª¶¨Ê±»òÊǾ¡¿ÉÄܼ°Ê±ÊÕµ½Êý¾ÝµÄʱºò¡£ÖжÏÊäÈë¹ÜµÀЯ´øÊý¾Ýµ½Ö÷»ú£¬ÖжÏÊä³ö¹ÜµÀÔòÊÇЯ´øÊý¾Ýµ½É豸¡£ÔÚ×ÜÏßæµÄʱºò£¬¿ØÖƹܵÀ¿ÉÄܻᱻÑÓ³Ù£¬¶øÖжϹܵÀ±£Ö¤»áÓпɵõ½µÄ´ø¿í¡£HID²»ÐèÒªÒ»¶¨ÓÐÖжÏÊä³ö¹ÜµÀ¡£Èç¹ûûÓÐÖжÏÊä³ö¹ÜµÀ£¬Ö÷»ú»áÔÚ¿ØÖƹܵÀÉÏʹÓÃHIDÉè±¸ÌØÓеÄSet_ReportÇëÇóÀ´´«ËÍËùÓеı¨±í¡£

8.1.3 HID¹Ì¼þµÄÒªÇó

Ö÷»úµÄÇý¶¯³ÌÐòÒªÓëHIDÉ豸ͨÐÅ£¬É豸µÄ¹Ì¼þ±ØÐë·ûºÏÏÂÁÐÐèÇó£º

? É豸µÄÃèÊö·û±ØÐëʶ±ð¸ÃÉ豸°üº¬ÓÐHID½Ó¿Ú¡£

? ³ýÁËĬÈÏ¿ØÖƹܵÀÍ⣬¹Ì¼þ±ØÐëÁíÍâÖ§³ÖÒ»¸öÖжÏÊäÈë¹ÜµÀ¡£ ? ¹Ì¼þ±ØÐë°üº¬Ò»¸ö±¨±íÃèÊö·ûÀ´¶¨ÒåÒª´«ËÍÓë½ÓÊÕµÄÉ豸Êý¾Ý¡£

Èç¹ûÒª´«ËÍÊý¾Ý£¬¹Ì¼þ±ØÐëÖ§³ÖGet_Report¿ØÖÆ´«ÊäÓëÖжÏÊäÈë´«Êä¡£Èç¹ûÒª½ÓÊÕÊý¾Ý£¬¹Ì¼þ±ØÐëÖ§³ÖSet_Report¿ØÖÆ´«ÊäÓëÑ¡ÔñÐÔµÄÖжÏÊä³ö´«Êä¡£

ËùÓеÄHIDÊý¾Ý¶¼±ØÐëʹÓö¨Òå¹ýµÄ±¨±í¸ñʽÀ´¶¨Ò屨±íÖÐÊý¾ÝµÄ´óСÓëÄÚÈÝ¡£É豸¿ÉÒÔÖ§³ÖÒ»¸ö»ò¶à¸ö±¨±í¡£Ôڹ̼þÖеÄÒ»¸ö±¨±íÃèÊö·ûÓÃÀ´ÃèÊö´Ë±¨±í£¬ÒÔ¼°ÈçºÎʹÓñ¨±íÊý¾ÝµÄÐÅÏ¢¡£

µÚ8Õ USB½Ó¿ÚHIDÉ豸 183

ÔÚÿһ¸ö±¨±íÖеÄÒ»¸öÊýÖµ£¬¶¨Òå´Ë±¨±íÊÇÒ»¸öÊäÈ루Input£©¡¢Êä³ö£¨Output£©»òÊÇÌØÕ÷£¨Feature£©±¨±í¡£Ö÷»úÔÚÊäÈ뱨±íÖнÓÊÕÊý¾Ý£¬ÔÚÊä³ö±¨±íÖд«ËÍÊý¾Ý£¬ÌØÕ÷±¨±í¿ÉÒÔÔÚÈκη½Ïò´«µÝ¡£

Windows 98ÒÔ¼°ºóÀ´°æ±¾µÄHIDÇý¶¯³ÌÐòʹÓÃÖжϴ«ÊäÀ´´«µÝÊäÈ뱨±í¡£Êä³ö±¨±íµÄ´«ÊäÀàÐÍÒª¸ù¾ÝÉ豸֧³ÖµÄ¶ËµãÓëWindowsµÄ°æ±¾¶ø¶¨¡£Windows 98 GoldÖ»·ûºÏHID 1.0¹æ·¶£¬ËüµÄHIDÇý¶¯³ÌÐòʹÓÿØÖÆ´«ÊäÀ´´«µÝÊä³ö±¨±í¡£Windows 98 SE¡¢Wndows 2000·ûºÏHID 1.1¹æ·¶£¬HIDÇý¶¯³ÌÐòÔÚÓÐÖжÏÊä³ö¶ËµãʱʹÓÃÖжϴ«Ê䣬·ñÔòʹÓÿØÖÆ´«ÊäÀ´´«µÝÊä³ö±¨±í¡£ÌØÕ÷±¨±í¶¼ÊÇʹÓÿØÖÆ´«Êä¡£

8.2 HIDÉ豸ÃèÊö·û

HIDÉ豸Á¬½Óµ½USBÖ÷»úºó£¬Ö÷»úͨ¹ý·¢ËÍGet_DescriptorÇëÇó¶ÁÈ¡HIDÉ豸µÄÃèÊö·û£¬Á˽âÃèÊö·û¶ÔÁ˽âUSBÉ豸ÊÇÖÁ¹ØÖØÒªµÄ¡£

8.2.1 HIDÉ豸µÄÃèÊö·û

HIDÉ豸³ýÁËÖ§³ÖUSBÉ豸µÄ5ÖÖ±ê×¼ÃèÊö·ûÖ®Í⣬»¹Ö§³ÖHIDÉè±¸ÌØÓеÄ3ÖÖÃèÊö·û¡£ÕâЩÃèÊö·ûÊÇ£º

? USB±ê×¼ÃèÊö·û£ºÉ豸¡¢ÅäÖᢽӿڡ¢¶ËµãºÍ×Ö·û´®ÃèÊö·û¡£

? HIDÌØÓеÄÃèÊö·û£ºHID¡¢±¨±í£¨Report£©ºÍʵÌ壨Physical£©ÃèÊö·û¡£ ´ÓÃèÊö·ûµÄ¹ØÁª¹ØÏµ¿´£¬HIDÃèÊö·ûÊǹØÁªÓÚ½Ó¿Ú¡£ËùÒÔÈç¹ûÒ»¸öHIDÉ豸ÓÐ2¸ö¶Ëµã£¬É豸²»ÐèҪÿ¸ö¶ËµãÓÐÒ»¸öHIDÃèÊö·û¡£

½Ó¿ÚÃèÊö·ûInterface HIDÃèÊö·û Hid ¶ËµãÃèÊö·û Endpoint ±¨±íÃèÊö·û Report ʵÌåÃèÊö·û Physical HID¡¢±¨±íºÍʵÌåÃèÊö·ûÊÇHIDÉè±¸ÌØÓеÄÃèÊö·û ͼ8-2 HIDÃèÊö·ûµÄ¹ØÁª¹ØÏµ

´ÓÇ°ÃæµÄUSBÃèÊö·û¿ÉÒÔ¿´³öÒ»¸ö¹æÂÉ£¬ÃèÊö·ûµÄµÚÒ»¡¢¶þ×Ö½Ú·Ö±ðÊÇÃèÊö·ûµÄ³¤¶ÈºÍÀàÐÍ£¬ÃèÊö·ûµÄÀàÐÍ×ֶΣ¨bDescriptorType£©±íÃ÷ÃèÊö·ûµÄÖÖÀ࣬ϱíÁгöÁ˲»Í¬ÃèÊö·ûµÄÀàÐÍ×Ö¶ÎÊýÖµ¡£

±í8-2 HIDµÄÃèÊö·û

184 ¼ÆËã»ú¸ß¼¶½Ó¿Úʵ¼ù ÀàÐÍ ÃèÊö·û É豸 Device ÅäÖà Configuration ×Ö·û´® String ½Ó¿Ú Interface ¶Ëµã Endpoint É豸ÏÞ¶¨ Device_Qualiffier Other_Speed_Configuration Interface_power HID Hub ±¨±í Report ʵÌå Physical Ó¦Óà ËùÓÐÉ豸±ØÐëÓУ¬Ö»ÄÜÒ»¸ö ËùÓÐÉ豸±ØÐëÓУ¬ÖÁÉÙÒ»¸ö ¿ÉÑ¡Ôñ ÿһ¸ö½Ó¿ÚÒ»¸ö ³ý¶Ëµã0Ö®ÍâµÄÿ¸ö¶ËµãÒ»¸ö ͬʱ֧³ÖÈ«ËÙÓë¸ßËÙµÄÉ豸±ØÐëÓÐÒ»¸ö HIDÉ豸±ØÐëÓÐ HIDÉ豸±ØÐëÓÐ ¿ÉÑ¡ÔñµÄ ÊýÖµ 01 02 03 04 05 06 07 08 21 29 22 23 ±ê×¼ Àà±ð HID ÌØ¶¨ ¶ÔÓÚÒ»¸öHIDÉ豸£¬É豸ÃèÊö·ûÓëÅäÖÃÃèÊö·ûûÓÐHIDÌØ¶¨µÄÐÅÏ¢¡£ÆäÉ豸ÃèÊö·ûµÄbDeviceClassºÍbDeviceSubClass×ֶεÄֵΪ0£¬½Ó¿ÚÃèÊö·ûµÄbInterfaceClass×Ö¶ÎֵΪ03£¬±íʾÉ豸µÄ¸Ã½Ó¿ÚÊÇHIDÀà±ð¡£ÔÚ½Ó¿ÚÃèÊö·ûÖÐÆäËû°üº¬HIDÌØ¶¨ÐÅÏ¢µÄ×ֶλ¹ÓÐ×ÓÀà±ðÂ루blnterfaceSubClass£©ÓëЭÒéÂ루blnterfaceProtocol×ֶΣ©¡£

ÔÚ½Ó¿ÚÃèÊö·ûÖÐ×ÓÀà±ðÂë×ֶεÈÓÚ1±íʾ´ËÉ豸֧³ÖÆô¶¯½Ó¿Ú£¨Boot Interface£©¡£Èç¹ûÉ豸ÓÐÆô¶¯½Ó¿Ú£¬¼´±ãÖ÷»úµÄHIDûÓмÓÔØÇý¶¯³ÌÐò£¬É豸Ҳ¿ÉÒÔʹÓá£ÕâÖÖÇéÐοÉÄÜ·¢ÉúÔÚ¼ÆËã»úÊÇÓÉDOSÖ±½ÓÆô¶¯£¬ÔÚÆô¶¯Ê±¹Û¿´ÏµÍ³ÉèÖû­Ãæ»òʹÓÃWndowsµÄ°²È«Ä£Ê½Ê±¡£

º¬ÓÐÆô¶¯½Ó¿ÚµÄ¼üÅÌ»òÊó±ê¿ÉÒÔʹÓÃBIOS»òÐí¶àÖ÷»úÖ§³ÖµÄĬÈϼòµ¥Ð­Òé¡£HID¹æ·¶¶¨ÒåÁ˼üÅÌÓëÊó±êµÄÆô¶¯½Ó¿ÚЭÒé¡£

Èç¹ûÉ豸ûÓÐÆô¶¯½Ó¿Ú£¬²¢ÇÒ½Ó¿ÚÃèÊö·ûÖÐЭÒéÂë×Ö¶ÎÊÇ1£¬±íʾÉ豸֧³Ö¼üÅ̽ӿڣ¬Ð­ÒéÂë×Ö¶ÎÊÇ2£¬±íʾ֧³ÖÊó±ê½Ó¿Ú¡£½Ó¿ÚÃèÊö·ûÖÐЭÒéÂë×Ö¶ÎÊÇ0£¬±íʾÉ豸²»Ö§³ÖÆô¶¯Ð­Òé¡£

ÔÚ HID Usage Tables¹æ·¶Öж¨ÒåÁ˼üÅÌÓëÊó±êµÄÆô¶¯ÃèÊö·û£¨Boot Descriptor£©¡£BIOS²»ÐèÒª´ÓÉ豸ÖжÁÈ¡ÃèÊö·û£¬ÒòΪËüÖªµÀÆô¶¯Ð­Ò飬²¢ÇÒ¼ÙÉèÉ豸֧³ÖÆô¶¯Ð­Òé¡£ËùÒÔÒªÆô¶¯µÄÉ豸²»ÐèÒªÔڹ̼þÄÚ°üº¬Æô¶¯½Ó¿ÚÃèÊö·û£¬ËüÖ»ÒªÔÚÖ÷»úÉÐδҪÇóÔÚ±¨±íÃèÊö·ûÖе͍ÒåЭÒéʱ֧³ÖÆô¶¯Ð­Òé¼´¿É¡£ÔÚ²Ù×÷ϵͳ¼ÓÔØHlDÇý¶¯³ÌÐòºó»áʹÓÃSet_ProtocolÇëÇ󣬽«É豸ÓÉÆô¶¯Ð­Òéת»»³É±¨±íЭÒé¡£

8.2.2 HIDÃèÊö·û

HIDÃèÊö·ûµÄÖ÷Òª×÷ÓÃÊÇÓÃÀ´Ê¶±ðHIDͨÐÅËùʹÓõĶîÍâÃèÊö·û¡£Ï±íÊÇHIDÃèÊö·û½á¹¹¡£

Æ«ÒÆ Á¿ 0 1 2 4 5 6 7 ×Ö¶Î bLength bDescriptorType bcdHID bCountryCode bNumDescriptors bDescriptorType wDescriptorLength ±í8-3 HIDÃèÊö·û½á¹¹ ×Ö½Ú ÊýÖµ ˵Ã÷ Êý ÀàÐÍ 1 Numeric ÃèÊö·û×Ö½ÚÊý 1 Constant 0x21 = HIDÃèÊö·û 2 Numeric HID¹æ·¶°æ±¾ºÅ£¨BCD£© 1 Numeric Ó²¼þÉ豸ËùÔÚ¹ú¼ÒµÄ¹ú¼Ò´úÂë 1 Numeric Àà±ðÃèÊö·ûÊýÄ¿£¨ÖÁÉÙÓÐÒ»¸ö±¨±íÃèÊö·û£© 1 Constant Àà±ðÃèÊö·ûµÄÀàÐÍ 2 Numeric ±¨±íÃèÊö·ûµÄ×ܳ¤¶È µÚ8Õ USB½Ó¿ÚHIDÉ豸 185 9 10 [bDescriptorType]... [wDescriptorLength]... 1 2 Constant ¸½¼ÓµÄÃèÊö·ûµÄÀàÐÍ£¬¿ÉÑ¡µÄ Numeric ¸½¼ÓµÄÃèÊö·ûµÄ×ܳ¤¶È£¬¿ÉÑ¡µÄ bcdHID£ºÉ豸ÓëÆäÃèÊö·ûËù×ñÑ­µÄHID¹æ·¶µÄ°æ±¾ºÅÂ룬´ËÊýÖµÊÇ4¸ö16½øÎ»µÄBCD¸ñʽ×Ö·û¡£ÀýÈç°æ±¾1.1µÄbcdHIDÊÇ0110h¡£

bCountryCode£ºÓ²¼þÄ¿µÄ¹ú¼ÒµÄʶ±ðÂë¡£Èç¹û²»ËµÃ÷£¬¸Ã×Ö¶ÎΪ0¡£ bDescriptorType£ºHIDÃèÊö·û¸½ÊôµÄÃèÊö·ûµÄÀàÐÍ£¨±¨±í»òʵÌ壩¡£Ã¿Ò»¸ö HID¶¼±ØÐëÖÁÉÙÖ§³ÖÒ»¸ö±¨±íÃèÊö·û¡£Ò»¸ö½Ó¿Ú¿ÉÒÔÖ§³Ö¶à¸ö±¨±íÃèÊö·û£¬ÒÔ¼°Ò»¸ö»ò¶à¸öʵÌåÃèÊö·û¡£

HIDÃèÊö·ûµÄÆ«ÒÆÁ¿Îª9ºÍ10µÄbDescriptorTypeºÍwDescriptorLength¿ÉÒÔÖØ¸´´æÔÚ¶à¸ö¡£

1. ±¨±íÃèÊö·û

±¨±íÃèÊö·û¶¨ÒåÁËÖ´ÐÐÉ豸¹¦ÄܵÄÊý¾Ý¸ñʽºÍʹÓ÷½·¨¡£

±¨±íÃèÊö·ûºÍUSBµÄÆäËûÃèÊö·ûÊDz»Ò»ÑùµÄ£¬Ëü²»ÊÇÒ»¸ö¼òµ¥µÄ±í¸ñ£¬±¨±íÃèÊö·ûÊÇUSBËùÓÐÃèÊö·ûÖÐ×Ôӵġ£±¨±íÃèÊö·û·Ç³£¸´ÔÓ¶øÓе¯ÐÔ£¬ÒòΪËüÐèÒª´¦Àí¸÷ÖÖÓÃ;µÄÉ豸¡£±¨±íµÄÊý¾Ý±ØÐëÒÔ¼ò½àµÄ¸ñʽÀ´´¢´æ£¬ÕâÑù²Å²»»áÀË·ÑÉ豸ÄڵĴ¢´æ¿Õ¼äÒÔ¼°Êý¾Ý´«ÊäʱµÄ×ÜÏßʱ¼ä¡£

ʵ¼ÊÉÏ¿ÉÒÔÕâÑùÀí½â£¬±¨±íÄÚÈݵļò½à£¬ÊÇͨ¹ý±¨±íÃèÊö·ûÈ«ÃæµÄ¡¢¸´ÔÓµÄÊý¾ÝÃèÊöʵÏֵġ£

±¨±íÃèÊö·û±ØÐëÏÈÃèÊöÊý¾ÝµÄ´óСÓëÄÚÈÝ¡£±¨±íÃèÊö·ûµÄÄÚÈÝÓë´óСÒòÉ豸µÄ²»Í¬¶ø²»Í¬£¬ÔÚ½øÐб¨±í´«Êä֮ǰ£¬Ö÷»ú±ØÐëÏÈÇëÇóÉ豸µÄ±¨±íÃèÊö·û£¬Ö»Óеõ½Á˱¨±íÃèÊö·û²Å¿ÉÕýÈ·½âÎö±¨±íµÄÊý¾Ý¡£

±¨±íÃèÊö·ûÊDZ¨±íÃèÊöÏîÄ¿£¨Item£©µÄ¼¯ºÏ£¬Ã¿Ò»¸öÃèÊöÏîÄ¿¶¼ÓÐÏà¶ÔͳһµÄÊý¾Ý½á¹¹£¬ÏîÄ¿ºÜ¶à£¬Í¨¹ý±àÂëʵÏÖ¡£

£¨1£©ÏîÄ¿

±¨±íÃèÊö·ûÓÉÃèÊöHIDÉ豸µÄÊý¾ÝÏîÄ¿£¨Item£©×é³É£¬ÏîÄ¿µÄµÚÒ»¸ö×Ö½Ú£¨ÏîĿǰ׺£©ÓÉÈý²¿·Ö¹¹³É£¬¼´ÏîÄ¿ÀàÐÍ£¨item type£©¡¢ÏîÄ¿±êÖ¾£¨item tag£©ºÍÏîÄ¿³¤¶È£¨item size£©¡£ÆäÖÐÏîÄ¿ÀàÐÍ˵Ã÷ÏîÄ¿µÄÊý¾ÝÀàÐÍ£¬ÏîÄ¿±êǩ˵Ã÷ÏîÄ¿µÄ¹¦ÄÜ£¬ÏîÄ¿³¤¶È˵Ã÷ÏîÄ¿µÄÊý¾Ý²¿·ÖµÄ³¤¶È¡£

HIDµÄÏîÄ¿ÓжÌÏîÄ¿ºÍ³¤ÏîÄ¿Á½ÖÖ£¬ÆäÖжÌÏîÄ¿µÄ¸ñʽÈçÏÂͼ¡£

λÐò ×Ö¶Î

7 6 5 4 3 2 1 0

Data (¿ÉÒÔÊÇ0¡¢1¡¢2¡¢4¸ö×Ö½Ú) bTag bType bSize ͼ8-3 HID±¨±í¶ÌÏîÄ¿¸ñʽ

¶ÌÏîÄ¿µÄÊý¾Ý×Ö½ÚÊýÓÉbSizeµÄÖµ¶¨Ò壬bSizeΪ0¡¢1¡¢2¡¢3ʱData²¿·ÖµÄ×Ö½ÚÊý·Ö±ðΪ0¡¢1¡¢2¡¢4¸ö×Ö½Ú¡£¶ÌÏîÄ¿µÄÏîÄ¿ÀàÐÍÓÉbType¶¨Ò壬bTypeΪ0¡¢1¡¢2ʱ·Ö±ðΪMain¡¢GlobalºÍLocalÀàÐÍ¡£

³¤ÏîÄ¿¿ÉÒÔЯ´ø½Ï¶àµÄÊý¾Ý£¬Æä¸ñʽÈçÏÂͼ¡£

186 ¼ÆËã»ú¸ß¼¶½Ó¿Úʵ¼ù

λÐò ×Ö¶Î ×Ö½ÚÊý

7 6 5 4 3 2 1 0

Data 1~255 bLongItemTag 1 bDataSize 1 1 1 1 1 1 1 0 1 1 ͼ8-4 HID±¨±í³¤ÏîÄ¿¸ñʽ

ÏîÄ¿ÖеĵÚÒ»¸ö×Ö½ÚΪÉÏͼÖеÄÌØ¶¨ÖµÊ±±íÃ÷¸ÃÏîÄ¿ÊÇÒ»¸ö³¤ÏîÄ¿¡£³¤ÏîÄ¿ÖеÄbDataSize˵Ã÷Data²¿·ÖµÄ×Ö½ÚÊý£¬bLongItemTagÔÚHID¹æ·¶ÖÐûÓж¨Òå¡£

ÏÂÃæÊÇͨ¹ý»ã±àʵÏÖµÄÒ»¸ö¼òµ¥µÄ±¨±íÃèÊö·û£¬ÃèÊö·ûµÄÿһÐÐÊÇÒ»¸öÏîÄ¿£¬¸ÃÃèÊö·ûÃèÊöÁËÒ»¸ö´ÓÉ豸½ÓÊÕ2¸ö×Ö½ÚµÄÊäÈ뱨±íºÍ·¢ËÍ2¸ö×Ö½Úµ½É豸µÄÊä³ö±¨±í¡£

HID_Report_desc_table: db 06h, A0h, FFh ; Usage Page(Vendor defined) ¶¨ÒåÉ豸¹¦ÄÜ db 09h, A5h ; Usage(Vendor Defined) ¶¨ÒåÓ÷¨ db A1h, 01h ; Collection(Application) ¿ªÒ»¸ö¼¯ºÏ db 09H, A6h ; Usage(Vendor defined) ¶¨ÒåÓ÷¨ ; ÊäÈ뱨±í db 09h, A7h ; Usgae(Vendor defined) ¶¨ÒåÓ÷¨ db 15h, 80h ; Logical Minimum ¶¨ÒåÊäÈë×îСֵ=-128 db 25h, 7Fh ; Logical Maximum ¶¨ÒåÊäÈë×î´óÖµ=+27 db 75h, 08h ; Report Size ¶¨Ò屨±íÊý¾ÝÏî´óС=8 db 95h, 02h ; Report Count ¶¨Ò屨±íÊý¾ÝÏò¸öÊý=2 db 81h, 02h ; Input(Data,Variable,Absolute) ÊäÈëÏîÄ¿ ; Êä³ö±¨±í db 09h, A9h ; Usgae(Vendor defined) ¶¨ÒåÓ÷¨ db 15h, 80h ; Logical Minimum ¶¨ÒåÊäÈë×îСֵ=-128 db 25h, 7Fh ; Logical Maximum ¶¨ÒåÊäÈë×î´óÖµ=+27 db 75h, 08h ; Report Size ¶¨Ò屨±íÊý¾ÝÏî´óС=8 db 95h, 02h ; Report Count ¶¨Ò屨±íÊý¾ÝÏò¸öÊý=2 db 91h, 02h ; Output(Data,Variable,Absolute) Êä³öÏîÄ¿ db C0h ; End Collection ¹Ø±Õ¼¯ºÏ

£¨2£©ÏîÄ¿µÄ·ÖÀà

±¨±íµÄÏîÄ¿ÓÐMain¡¢GlobalºÍLocalÈý´óÀ࣬ÿһÀà¶¼Óжà¸ö²»Í¬µÄÏîÄ¿£¬ÊµÏÖ²»Í¬µÄÃèÊö¡£

MainÀàÏîÄ¿ÓÃÓÚ¶¨Ò屨±íÃèÊö·ûÖеÄÊý¾ÝÏî¡£Ò²¿ÉÒÔ×éºÏÆäÖеÄÈô¸ÉÊý¾ÝÏî³ÉΪһ¸ö¼¯ºÏ¡£MainÏîÄ¿¿ÉÒÔ·ÖΪ´øÊý¾ÝµÄMainÏîÄ¿ºÍ²»´øÊý¾ÝµÄMainÏîÄ¿¡£´øÊý¾ÝÏîµÄMainÓÃÓÚÉú³É±¨±íÖеÄÊý¾ÝÏ°üÀ¨Input¡¢OutputºÍFeatureÏîÄ¿¡£²»´øÊý¾ÝµÄMainÏîÄ¿²»Éú³É±¨±íÖеÄÊý¾ÝÏ°üÀ¨CollectionºÍEnd CollectionÏîÄ¿¡£

GlobalÀàÏîĿʵÏÖ¶ÔÊý¾ÝµÄÃèÊö£¬ÓÃÀ´Ê¶±ð±¨±í²¢ÇÒÃèÊö±¨±íÄÚµÄÊý¾Ý£¬°üÀ¨Êý¾ÝµÄ¹¦ÄÜ¡¢×î´óÓë×îСÔÊÐíÖµÒÔ¼°Êý¾ÝÏîµÄ´óСÓëÊýÄ¿µÈ¡£¸Ä±äÓÉMainÀàÏîÄ¿Éú³ÉµÄÏîĿ״̬±í¡£GlobalÀàÏîÄ¿ÃèÊö¶ÔºóÐøµÄËùÓÐÏîÄ¿ÓÐЧ£¬³ý·ÇÓöµ½ÓÐеÄGlobalÀàÏîÄ¿¡£

LocalÀàÏîÄ¿¶¨Òå¿ØÖÆµÄÌØÕ÷£¬ÕâÒ»ÀàÏîÄ¿µÄ×÷ÓÃÓò²»³¬¹ýÏÂÒ»¸öMainÏîÄ¿£¬ËùÒÔÔÚÿһMainÏîĿ֮ǰ¿ÉÄÜÓжà¸öLocalÏîÄ¿¡£LocalÏîÄ¿ÓÃÓÚÃèÊöºóÃæµÄInput¡¢OutputºÍFeatureÏîÄ¿¡£

µÚ8Õ USB½Ó¿ÚHIDÉ豸 187

ϱíÁгöµÄÊÇÈ«²¿µÄÏîÄ¿µÄǰ׺×ֺͼòÒª¹¦ÄÜ˵Ã÷¡£ ÏîÄ¿ ÀàÐÍ ÏîÄ¿±êÖ¾£¨Tag£© Input Main ÀàÏîÄ¿ Output Feature Collection End Collection ±í8-4 HIDÏîÄ¿Áбí ÏîĿǰ׺£¬nn¹¦ÄÜ˵Ã÷ ΪÊý¾Ý³¤¶È ¶¨ÒåÊäÈ뱨±í£¬Ö÷»úÀûÓøÃÐÅÏ¢½âÎöÉ豸ÌṩµÄÊý1000 00 nn ¾Ý¡£Ö÷»úÏò¿ØÖƶ˿ڷ¢ËÍGet_ReportʵÏÖÊäÈë ´´½¨Êä³ö±¨±í£¬Í¨¹ýÏòÉ豸·¢ËÍSet_ReportʵÏÖÊä1001 00 nn ³ö ¶¨ÒåËÍÍùÉ豸µÄÉèÖÃÐÅÏ¢ 1011 00 nn ¶¨Òå2¸öÒÔÉÏÊý¾Ý£¨Input¡¢OutputºÍFeature£©µÄ1010 00 nn ¹ØÏµÎª¼¯ºÏ£¬Collection¿ªÊ¼Ò»¸ö¼¯ºÏ£¬Ö®ºóµÄEnd Collection½áÊø¼¯ºÏ¡£CollectionÏîÄ¿µÄÊý¾Ý²¿·Ö˵1100 00 nn Ã÷CollectionµÄÀàÐÍ 0000 01 nn 0001 01 nn 0010 01 nn 0011 01 nn 0100 01 nn 0101 01 nn 0110 01 nn 0111 01 nn 1000 01 nn 1001 01 nn 1010 01 nn 1011 01 nn 1100 01 nn ¨C 1111 01 nn 0000 10 nn 0001 10 nn 0010 10 nn 0011 10 nn 0100 10 nn 0101 10 nn 0111 10 nn 1000 10 nn 1001 10 nn 1010 10 nn 1010 10 nn ¨C 1111 10 nn Usage Page Logical Minimum Logical Maximum Physical Minimum Global Physical Maximum ÀàÏîUnit Exponent Ä¿ Unit Report Size Report ID Report Count Push Pop Usage Usage Minimum Usage Maximum Designator Index Designator Minimum Designator Maximum String Index String Minimum String Maximum Delimiter Ö¸¶¨É豸µÄ¹¦ÄÜ ÁíÍâÓÉÓÚUsageÏîÄ¿ÓÐ32λÊý¾ÝÖµ£¬Usage PageÏîÄ¿ÓÃÓÚΪUsageÏîÄ¿ÔÚ±¨±íÃèÊö·ûÖÐÕ¼¾Ó´æ´¢¿Õ¼ä¡£ÓÃÓÚ´æ·ÅºóÐøµÄUsageÏîÄ¿µÄ¸ß16λ¡£ ¶¨Òå±äÁ¿»òÊý×éÏîÄ¿µÄÂß¼­×îСֵºÍ×î´óÖµ ¶¨Òå±äÁ¿»òÊý×éÏîÄ¿µÄÎïÀí×îСֵºÍ×î´óÖµ£¬·Ö±ðºÍLogical Minimum¡¢Logical Maximum¶ÔÓ¦ ¶¨ÒåÊýÖµÊÇ»ùÓÚ10µÄÖ¸Êý µ¥Î» Ö¸¶¨±¨±íÊý¾ÝÇøÓòËù°üº¬µÄλÊý ±¨±íID£¬¸ÃÏîÄ¿ÔÚ±¨±íÖвåÈëÒ»¸ö×ֽڵı¨±íID ±¨±íÖÐÊý¾ÝÓòµÄÊýÄ¿ ½«GlobalÏîĿ״̬±íËÍÈë¶ÑÕ» ´Ó¶ÑÕ»»Ö¸´GlobalÏîĿ״̬±í ±£Áô Ó÷¨Ë÷ÒýÖµ£¬±íʾ¶ÔÏîÄ¿»ò¼¯ºÏ½¨ÒéµÄÓ÷¨£¬ÓÃÓÚµ±Ò»¸öÏîÄ¿ÃèÊö¶à¸ö¿ØÖÆ£¬¶Ôÿһ¸ö±äÁ¿ºÍÊý×éÔªËØ¶¼Óн¨ÒéµÄÓ÷¨ ¶¨ÒåÕóÁлòλͼÖпØÖƲÙ×÷µÄµÚÒ»¸öºÍ×îºóÒ»¸öÓ÷¨ È·¶¨ÓÃÓÚ¿ØÖƵÄʵÌ壬ָÏòÎïÀíÃèÊö·ûÖеÄÄ¿±ê ¶¨ÒåÕóÁлòλͼĿ±êµÄÆðʼºÍÖÕÖ¹Ë÷ÒýÖµ È·¶¨×Ö·û´®ÃèÊö·ûÖеÄË÷ÒýÖµ ¶¨ÒåÓÃÓÚÕóÁлòλͼ¿ØÖÆÖÐ×Ö·û´®ÐòÁÐË÷ÒýÖµµÄ×îСֵºÍ×î´óÖµ ¶¨ÒåÒ»×éLocalÏîÄ¿µÄ¿ªÊ¼ºÍ½áÊø£¬1=¿ªÊ¼£¬0=½áÊø ±£Áô Local ÀàÏîÄ¿ ÔÚÕâЩÏîÄ¿ÖУ¬Usage PageÓÃÀ´Ö¸¶¨É豸µÄ¹¦ÄÜ£¬¶øUsageÏîÄ¿ÓÃÀ´Ö¸¶¨¸ö±ð±¨±íµÄ¹¦ÄÜ¡£Usage PageÏîÄ¿Ï൱ÓÚÊÇHIDµÄ×Ó¼¯ºÏ£¬UsageÏ൱ÓÚÊÇUsage PageµÄ×Ó¼¯ºÏ¡£

2. ±¨±íÃèÊö·ûµÄÏîÄ¿

188 ¼ÆËã»ú¸ß¼¶½Ó¿Úʵ¼ù

£¨1£©Input¡¢OutpotºÍFeatureÏîÄ¿

Õâ3¸öÏîÄ¿ÓÃÀ´¶¨Ò屨±íÖеÄÊý¾Ý×ֶΡ£

InputÏîÄ¿¿ÉÒÔÓ¦Óõ½ÈκοØÖÆ¡¢¼ÆÊýÆ÷¶ÁÊý»òÆäËûÉ豸´«¸øÖ÷»úµÄÐÅÏ¢¡£Ò»¸öÊäÈ뱨±í°üº¬Ò»¸ö»ò¶à¸öInputÏîÄ¿£¬Ö÷»úʹÓÃÖжÏÊäÈë´«ÊäÀ´ÇëÇóÊäÈ뱨±í¡£

OuputÏîÄ¿ÓÃÀ´¶¨ÒåÖ÷»ú´«Ë͸øÉ豸µÄÐÅÏ¢¡£Ò»¸öÊä³ö±¨±í°üº¬Ò»¸ö»ò¶à¸öOutpotÏîÄ¿¡£Êä³ö±¨±í°üº¬¿ØÖÆ×´Ì¬µÄÊý¾Ý¡£Èç¹ûÓÐÖжÏÊä³ö¹ÜµÀ£¬HID1.1¼æÈÝÖ÷»úʹÓÃÖжÏÊä³ö´«ÊäÀ´´«ËÍÊä³ö±¨±í£¬·ñÔòʹÓÃSet_Report¿ØÖÆÇëÇó¡£

FeatureÏîĿӦÓõ½Ö÷»ú´«Ë͸øÉ豸µÄÐÅÏ¢£¬»òÊÇÖ÷»ú´ÓÉ豸¶ÁÈ¡FeatureÏîÄ¿¡£Ò»¸öÌØÕ÷±¨±í°üº¬Ò»¸ö»ò¶à¸öFeatureÏîÄ¿£¬FeatureÏîĿͨ³£ÊǰüºÏÓ°ÏìÉ豸ÓëÆä×é¼þÕûÌåÐÐΪµÄÅäÖá£ÌØÕ÷±¨±íͨ³£ÊÇ¿ØÖÆ¿ÉÒÔʹÓÃʵ¼ÊµÄ¿ØÖÆÃæ°åµ÷ÕûµÄÉèÖã¬ÀýÈçÖ÷»ú¿ÉÒÔʹÓÃÐéÄâ¿ØÖÆÃæ°åÀ´ÈÃÓû§Ñ¡Ôñ¿ØÖÆÌØÕ÷¡£Ö÷»úʹÓà Set_ReportÓëGet_ReportÇëÇóÀ´´«ËÍÓë½ÓÊÕÌØÕ÷±¨±í¡£

ÔÚÿһ¸öInput¡¢OutputºÍFeatureÏîÄ¿µÄǰ׺×ÖÖ®ºóÊÇ32λÃèÊöÊý¾Ý£¬Ä¿Ç°×î¶à¶¨ÒåÁË9¸ö룬ÓàµÄλÔòÊDZ£Áô¡£Î»0~8µÄ¶¨ÒåÖÐÖ»ÓÐλ7²»ÄÜÓ¦ÓÃÓÚInputÏîÄ¿£¬³ý´ËÖ®ÍâÆäËûµÄ붨Òå¶¼ÊÊÓ¦ÓÚInput¡¢OutputºÍFeatureÏîÄ¿¡£

λ 0 Öµ 0 1 0 1 1 0 2 1 3 ¢Ù 4 ¢Ù 5 ¢Ù 0 1 0 1 0 1 0 6 ¢Ù 1 ±í8-5 Input¡¢OutputºÍFeatureÏîÄ¿µÄÊý¾ÝÏî˵Ã÷ Êý¾Ý×Ö¶Î º¬Òå˵Ã÷ Ãû³Æ Êý¾Ý£º±íʾÏîÄ¿µÄÄÚÈÝÊǿɸü¸ÄµÄ£¨¶Á/д£©¡£ Data Constant ³£Êý£º±íʾÏîÄ¿µÄÄÚÈÝÊDz»¿É¸ü¸ÄµÄ£¨Ö»¶Á£©¡£ Êý×飺±¨¸æÈ«²¿¿ØÖƵÄ״̬¡£ÈçÔÚ¼üÅ̱¨±íÖÐÿһ¸ö¼üÔÚ±¨±íÖÐArray ռһ룬±¨±í´«ÊäÈ«²¿¼üµÄ״̬£¬¿ÉÒÔͬʱ°´ÏÂÈÎÒâ¶à¸ö¼ü¡£ ±äÁ¿£º±¨¸æ×÷ÓÃÖеĿØÖÆ¡£ÈçÔÚ¼üÅ̱¨±íÖÐÖ»±¨¸æ°´ÏµļüµÄ±àºÅ£¬¿ÉÒÔͬʱ°´ÏµļüµÄÊýÄ¿µÈÓÚ±¨±íµÄ¼ÆÊý£¨GlobalÀàÏîÄ¿Variable Report Count£© ¾ø¶Ô£º±íʾÊýÖµÒÔÒ»¸ö¹Ì¶¨ÖµÎª»ù×¼¡£ÓÎÏ·¸Ëͨ³£ÊDZ¨¸æ¾ø¶ÔÊýAbsolute ¾Ý£¨ÓÎÏ·¸ËĿǰµÄλÖã©¡£ Ïà¶Ô£º±íʾÊý¾ÝµÄ¸Ä±äÒÔÉÏÒ»¸ö¶ÁÊýΪ»ù×¼¡£Êó±êͨ³£ÊDZ¨¸æÏàRelative ¶ÔÊý¾Ý£¨Êó±êµÄÒÆ¶¯Î»Öã©¡£ No Wrap Èç¹ûÉèÖÃΪ1±íʾ»Ø×ª£¬µ±ÊýÖµ³¬¹ý×îСֵµ½×î´óÖµµÄ·¶Î§Ê±½«»Ø×ª£¬Èç¹û×îСֵÊÇ0¶ø×î´óÖµÊÇ10£¬³¬¹ý×î´óÖµµÄÏÂÒ»¸öÊýWrap ÖµÊÇ0¡£ ÏßÐΣº±íʾ²âÁ¿µÄÊý¾ÝÓ뱨±íµÄÊý¾ÝÓÐÏßÐԵĹØÏµ¡£ Linear Non-Linear ·ÇÏßÐÔ£º±íʾ²âÁ¿µÄÊý¾ÝÓ뱨±íµÄÊý¾ÝûÓÐÏßÐԵĹØÏµ¡£ ÓÅѡ״̬£º±íʾ¿ØÖÆÔÚûÓÐÓû§½»»¥Ê±»á»Øµ½Ò»¸öÌØ¶¨µÄ״̬¡£Preferred Èç°´Å¥¾ÍÓÐÓÅѡ״̬£¬ÔÚÎÞ²Ù×÷ʱ±£³Öδ°´ÏµÄ״̬¡£ ·ÇÓÅѡ״̬£ºËüά³ÖÔÚÉÏÒ»¸öÓû§Ñ¡ÔñµÄ״̬¡£Èç½»ÌæµÄ¿ª¹Ø¾ÍNon-Preferred ûÓÐÓÅѡ״̬¡£ No Null Position ÎÞ¿Õ״̬λÖ㺱íʾ¿ØÖÆÓÀÔ¶ÔÚ´«ËÍÓÐЧµÄÊý¾Ý¡£ ¿Õ״̬£º±íʾ¿ØÖÆÖ§³ÖÒ»¸öûÓд«ËÍÓÐЧÊý¾ÝµÄ״̬¡£Èç²Ù×ݸ˿ÉÄܾßÓÐÒ»¸ö¶à·½ÏòµÄ°´Å¥¿ª¹Ø£¬ÔÚûÓа´ÏÂʱÔÚ¿Õ״̬£¬ÕâʱNull State ¿ØÖƽ«´«ËÍÒ»¸öÔÚ Logical MinimumÓëLogical Maximum·¶Î§Ö®ÍâµÄÊýÖµÀ´±íʾËüÔÚ¿Õ״̬¡£ ²»¿É±äµÄ£º±íʾÉ豸ֻÓÐÔÚÖ÷»úÇëÇóʱ²Å¸Ä±äÊýÖµ¡£µ±Ö÷»ú´«ËÍÒ»¸ö±¨±í²¢ÇÒ²»Òª¸Ä±ä²»¿É±äÏîĿʱ£¬Èç¹û¸ÃÏîÄ¿ÊǶ¨Òå³ÉÏà¶ÔNon-Volatile £¨Relative£©µÄ£¬ÊýÖµ0±íʾ²»¸Ä±äÊý¾Ý£¬Èç¹û²»¿É±äÏîÄ¿ÊǶ¨Òå³É¾ø¶Ô£¨Absolute£©µÄ£¬³¬³ö·¶Î§ÍâµÄÊýÖµÔò±íʾ²»¸Ä±äÊý¾Ý¡£ 7 ¢Ú 0 µÚ8Õ USB½Ó¿ÚHIDÉ豸 189 1 Volatile 0 Bit Field 1 Buffered Bytes ¿É±äµÄ£º±íʾÉ豸¿ÉÒÔ×Ô¼º¸Ä±äÊýÖµ£¬²¢²»ÊDZØÐëÖ÷»ú´«Ëͱ¨±íÒªÇó¸øÉ豸À´¸Ä±äÊýÖµ¡£ÀýÈçÉ豸¿ØÖÆÃæ°å¿ÉÒÔÓÉÖ÷»úÈí¼þ´«ËÍÒ»¸ö±¨±í¸øÉ豸£¬Ò²¿ÉÒÔÓÉÓû§×Ô¼º°´É豸ÉϵÄʵ¼Ê°´Å¥¡£ λ×ֶΣº±íʾÿһ¸öλ»òÊÇÒ»¸ö×Ö½ÚÄÚµÄÒ»×éλ¿ÉÒÔ´ú±íÒ»·ÝÊý¾Ý¡£ »º³å×Ö½Ú£º±íʾÐÅÏ¢°üº¬Ò»¸ö»ò¶à¸ö×Ö½Ú£¬»º³å×ֽڵı¨±í´óС±ØÐëÊÇ8¡£ ±£Áô 8 ¢Ù 9~31λ ×¢£º ¢Ù£º¸Ãλ²»ÄÜÓ¦Óõ½Êý×é¡£

¢Ú£ºÖ»Ó¦ÓÃÓÚOutputºÍFeatureÏîÄ¿£¬¶ÔÓÚInputÏîÄ¿¸Ãλ±£Áô¡£

£¨2£©CollectionºÍEnd CollectionÏîÄ¿

ËùÓеı¨±íÀàÐͶ¼¿ÉÒÔʹÓÃCollectionÓë End CollectionÏîÄ¿À´½«Ïà¹ØµÄMainÀàÐÍÏîÄ¿×é³ÉȺ×é¡£ÕâÁ½¸öÏîÄ¿·Ö±ðÓÃÓÚ´ò¿ªºÍ¹Ø±Õ¼¯ºÏ¡£ËùÓÐÔÚCollectionÓëEnd CollectionÏîĿ֮¼äµÄMainÀàÐÍÏîÄ¿¶¼ÊÇ CollectionµÄÒ»²¿·Ö¡£

CollectionÓÐ3ÖÖÀàÐÍ£ºApplication¡¢PhysicalÓëLogical£¬ÆäÏîÄ¿µÄÊý¾ÝÏîµÄÖµ·Ö±ðΪ1¡¢0ºÍ2¡£³§ÉÌÒ²¿ÉÒÔ×Ô¼º¶¨ÒåCollectionÀàÐÍ£¬Êý¾ÝÏîµÄֵΪ80h~FFh±£Áô¸ø³§É̶¨Òå¡£End CollectionÏîÄ¿ÎÞÊý¾ÝÏî¡£

Application Collection°üº¬Óй²Í¬ÓÃ;µÄÏîÄ¿»òÖ´Ðе¥Ò»¹¦ÄܵÄÏîÄ¿¡£ÀýÈç¼üÅ̵Ŀª»úÃèÊö·û½«¼üÅ̵İ´¼üÓëLEDָʾµÆÊý¾Ý¼¯ºÏ³ÉÒ»¸öApplication Collection¡£ËùÓеı¨±í±ØÐëÔÚÒ»¸öApplication CollectionÄÚ¡£

Physical Collection°üº¬ÔÚÒ»¸öµ¥Ò»¼¸ºÎµãÉϵÄÊý¾ÝÏîÄ¿£¬¿ÉÒÔ½«Ã¿¸öλÖõÄÊý¾Ý¼¯ºÏ³ÉÒ»¸ö Physical Collection¡£ÔÚÉ豸±¨¸æ¶à¸ö´«¸ÐÆ÷µÄλÖõÄʱºò£¬Ê¹ÓÃPhysical CollectionÖ¸Ã÷²»Í¬µÄÊý¾ÝÀ´×Ô²»Í¬µÄ´«¸ÐÆ÷¡£

Logical CollectionÐγÉÒ»¸öÊý¾Ý½á¹¹£¬°üº¬ÓÉ CollectionËùÁ¬½áµÄ²»Í¬ÀàÐ͵ÄÏîÄ¿¡£ÀýÈçÊý¾Ý»º³åÇøµÄÄÚÈÝÒÔ¼°»º³åÇøÄÚ×Ö½ÚÊýÄ¿µÄ¼ÆÊý¡£

£¨3£©Usage PageºÍUsageÏîÄ¿

Usage pageÏîÄ¿µÄÊý¾Ý²¿·ÖΪ1~2¸ö×Ö½Ú£¬Ä¿Ç°µÄ¶¨ÒåÈ«²¿¶¼ÊÇÒ»¸ö×Ö½Ú¡£Usage Page¶¨ÒåÁ˳£ÓõÄÉ豸¹¦ÄÜ£¬¹ØÓÚUsage Page£¨ÒÔ¼°ÆäËûÏîÄ¿£©µÄ¾ßÌ嶨ÒåÄÚÈÝ£¬¿ÉÒÔ²éÔÄHID Usage tables£¨http://www.usb.org/developers/hidpage/#Class_Definition£©£¬Ï±íÊÇÀ´×ÔHID Usage tablesµÄUsage Page¶¨Òå¡£

Page ID 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E ±í8-6 Usage Page¶¨Òå Page Name Undefined Generic Desktop Controls Simulation Controls VR Controls Sport Controls Game Controls Generic Device Controls Keyboard/Keypad LEDs Button Ordinal Telephony Consumer Digitizer Reserved 190 ¼ÆËã»ú¸ß¼¶½Ó¿Úʵ¼ù 0F PID Page 10 Unicode 11-13 Reserved 14 Alphanumeric Display 15-3f Reserved 40 Medical Instruments 41-7F Reserved 80-83 Monitor pages 84-87 Power pages 88-8B Reserved 8C Bar Code Scanner page 8D Scale page 8E Magnetic Stripe Reading (MSR) Devices 8F Reserved Point of Sale pages 90 Camera Control Page 91 Arcade Page 92-FEFF Reserved FF00-FFFF Vendor-defined

¹ØÓÚUsage PageµÄÿһ¸öÓÐЧ¶¨ÒåÏ¶¼ÓÐÒ»¸öÏàÓ¦µÄÏÂÒ»¼¶¶¨Ò壬ÈçUsage PageµÄÊý¾ÝÏîÊýֵΪ1£¬ÔòÉ豸¶¨ÒåΪGeneric Desktop Controls£¬¹ØÓÚ¸ÃÀàÉ豸µÄ¾ßÌ幦ÄÜ¿ÉÒÔÔÚHID Usage TablesÖв鵽¾ßÌåµÄ¶¨Ò塣ϱíÊÇHID Usage TablesÖжÔGeneric Desktop ControlsÉ豸µÄ¹¦Äܶ¨Òå¡£

±í8-7 Generic Desktop Controls Ó÷¨¶¨Òå Usage ID 00 01 02 03 04 05 06 07 08 09 0A-2F 30 31 32 33 34 35 36 37 38 39 3A Usage Name Undefined Pointer Mouse Reserved Joystick Game Pad Keyboard Keypad Multi-axis Controller Tablet PC System Controls Reserved X Y Z Rx Ry Rz Slider Dial Wheel Hat switch Counted Buffer Usage Type CP CA CA CA CA CA CA CA DV DV DV DV DV DV DV DV DV DV CL ²ÎÔÄHID Usage TablesÖеÄÏà¹ØÕÂ½Ú 4.1 4.1 4.2 4.3 4.6 3B 3C 3D 3E 3F 40 41 42 43 44 45 46 47 48 49-7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94-9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9-AF B0 B1 B2 B3 B4 B5 B6 B7 B8-FFFF µÚ8Õ USB½Ó¿ÚHIDÉ豸 191 Byte Count DV Motion Wakeup OSC Start OOC 4.3 Select OOC Reserved Vx DV Vy DV Vz DV Vbrx DV 4.3.1 Vbry DV Vbrz DV Vno DV Feature Notification DV,DF 4.8 Resolution Multiplier DV Reserved CA System Control 4.5 System Power Down OSC System Sleep OSC 4.5.1 System Wake Up OSC System Context Menu OSC System Main Menu OSC System App Menu OSC System Menu Help OSC System Menu Exit OSC 4.5 System Menu Select OSC System Menu Right RTC System Menu Left RTC System Menu Up RTC System Menu Down RTC System Cold Restart OSC 4.5.1 System Warm Restart OSC D-pad Up OOC D-pad Down OOC 4.7 D-pad Right OOC D-pad Left OOC Reserved System Dock OSC System Undock OSC 4.5.1 System Setup OSC System Break OSC System Debugger Break OSC 4.9 Application Break OSC Application Debugger Break OSC System Speaker Mute OSC 4.5.1 System Hibernate OSC Reserved System Display Invert OSC System Display Internal OSC System Display External OSC System Display Both OSC 4.10 System Display Dual OSC System Display Toggle Int/Ext OSC System Display Swap OSC Primary/Secondary System Display LCD Autoscale OSC Reserved 192 ¼ÆËã»ú¸ß¼¶½Ó¿Úʵ¼ù

Ó÷¨£¨Usage£©¶¨ÒåÁ˸÷ÖÖ¸÷ÑùÉè±¸ÌØÐÔ£¬¶ÔÓÚUsage PageµÄÿһÏî¶¼¶¨ÒåÁ˳£Óõĸ÷ÖÖÓ÷¨¡£

Ó÷¨ËµÃ÷ÁË3ÖÖÐÅÏ¢£¬¼´¿ØÖÆ¡¢¼¯ºÏºÍÊý¾Ý¡£¿ØÖÆËµÃ÷É豸µÄ״̬£¬Èçon/off¡¢Enable/DisableµÈ¡£¼¯ºÏ˵Ã÷¿ØÖƺÍÊý¾ÝµÄ×éºÏ¹ØÏµ¡£

ÉϱíÖеÄÓ÷¨ÀàÐÍ£¨Usage Type£©ÃèÊöÁËÓ¦ÓóÌÐòÈçºÎ´¦ÀíÓÉMainÀàÐÍÏîÄ¿Éú³ÉµÄÊý¾Ý£¬¾ßÌåµÄ¶¨ÒåºÍÏêϸ˵Ã÷Çë²ÎÔÄHID Usage Tables¡£

£¨4£©Report IDÏîÄ¿

Report ID·ÅÔÚÐÅÏ¢°üÖб¨±íÊý¾Ý֮ǰ£¬É豸¿ÉÒÔÖ§³Ö¶à¸öÏàͬÀàÐ͵ı¨±í£¬Ã¿Ò»¸ö±¨±í°üº¬²»Í¬µÄÊý¾ÝÓëÆäÌØÓеÄID¡£

ÔÚ±¨±íÃèÊö·ûÖУ¬Report IDÏîÄ¿×÷ÓÃÓÚÆäºóÐøËùÓеÄÏîÄ¿£¬Ö±µ½Óöµ½ÏÂÒ»¸öReport IDΪֹ¡£Èç¹û±¨±íÃèÊö·ûÖÐûÓÐReport IDÏîÄ¿£¬Ä¬ÈϵÄIDÖµÊÇ0£¬ÃèÊö·û²»Äܶ¨ÒåÒ»¸öΪ0µÄReport ID£¬ÊäÈ뱨±í¡¢Êä³ö±¨±íÓëÌØÕ÷±¨±í¿ÉÒÔ·ÖÏíͬһ¸öReport ID¡£

ÔÚSet_ReportºÍGet_ReportÇëÇó´«ÊäÖУ¬Ö÷»úÔÚÉèÖÃÊÂÎñµÄ wValue×ֶεĵÍ×Ö½ÚÖÐÖ¸¶¨Ò»¸öReport ID¡£ÔÚÖжϴ«ÊäÖÐÈç¹û½Ó¿ÚÖ§³ÖÒ»¸öÒÔÉ쵀 Report ID£¬Report ID±ØÐëÊÇ´«Ëͱ¨±íÖеĵÚÒ»¸ö×Ö½Ú¡£Èç¹û½Ó¿ÚÖ»Ö§³ÖÊýֵΪ0µÄĬÈÏReport ID£¬´ËReport ID²»Ó¦¸ÃÔÚÖжϴ«ÊäÖÐËæ×ű¨±íÒ»Æð´«ËÍ¡£

£¨5£©Logical MinimumºÍLogical MaximumÏîÄ¿

Logical MinimumÓë Logical MaximumÏîÄ¿¶¨Ò屨±íµÄ±äÁ¿£¨Variable£©»òÕóÁУ¨Array£©Êý¾ÝµÄÏÞÖÆ·¶Î§£¬´ËÏÞÖÆ·¶Î§ÒÔÂß¼­µ¥Î»À´±íʾ¡£ÀýÈçÉ豸±¨±íµÄÒ»¸öµçÁ÷Öµ¶ÁÊýÊÇ500mA£¬¶øÒ»¸öµ¥Î»ÊÇ2mA£¬Ôò Logical MaximumÖµµÈÓÚ250¡£

¸ºÊýÖµÒÔ2µÄ²¹ÂëÀ´±íʾ¡£Èç¹ûLogical MinimumÓëLogical Maximum¶¼ÊÇÕýÊý£¬¾Í²»ÐèÒªÓÐÕý¸ººÅλ¡£²»¹Ü Logical MinimumÓëLogical MaximumÊÇÒÔÓÐÕý¸ººÅ»òÊÇÎÞÕý¸ººÅµÄÊýÖµÀ´±íʾ£¬É豸¶¼¿ÉÒÔÕýÈ·µØ´«ÊäÊý¾Ý¡£Êý¾ÝµÄ½ÓÊÕÕß±ØÐëÖªµÀÊý¾ÝÊÇ·ñ¿ÉÒÔÊǸºÖµ¡£

£¨5£©Physical MinimumºÍPhysical MaximumÏîÄ¿

Physical MinimumºÍPhysical MaximumÏîÄ¿¶¨ÒåÊýÖµµÄÏÞÖÆ·¶Î§£¬¸ÃÏÞÖÆ·¶Î§Ê¹ÓÃUnitÏîÄ¿¶¨ÒåµÄµ¥Î»À´±íʾ¡£ÉÏÀýÖÐÉ豸±¨±íµÄÒ»¸öµçÁ÷Öµ¶ÁÊýÊÇ500mA£¬µ¥Î»ÊÇ2mA£¬ Logical MaximumÖµµÈÓÚ250£¬¶øPhysical MaximumÖµÊÇ500¡£

Logical MinimumÓë Logical Maximumֵ˵Ã÷ÁËÉ豸·µ»ØÊýÖµµÄ±ß½ç£¬¿ÉÒÔ¸ù¾ÝPhysical MinimumºÍPhysical MaximumÖµ¶ÔÊý¾Ý½øÐÐÆ«ÒƺͱÈÀý±ä»»¡£

£¨6£©Unit ExponentÏîÄ¿

Unit ExponentÏîÄ¿¶¨ÒåÁËÔÚʹÓÃÂß¼­·¶Î§ºÍʵ¼Ê·¶Î§½«É豸µÄ·µ»ØÊýֵת»»³Éʵ¼ÊÊýֵʱ£¬Ê¹ÓÃ10µÄ¶àÉٴη½¶ÔÊýÖµ½øÐж¨±ê¡£Unit ExponentµÄÖµµÄ±àÂëΪ4λ²¹Â룬´ú±í10µÄÖ¸Êý·¶Î§ÊÇ-8~+7¡£

±í8-8 Unit Exponent ÊýÖµ±í ´úÂë 00h 01h 02h 03h 04h 05h 06h 07h 08h 09h 0Ah 0Bh 0Ch 0Dh 0Eh 0FH 1 2 3 4 5 6 7 -8 -7 -6 -5 -4 -3 -2 -1 ÊýÖµ 0 ¸ù¾ÝÒÔÉÏ5¸öÏîÄ¿µÄÖµ¿ÉÒÔ»»Ëã³ö±¨±í´«ËÍÊý¾Ý£¨Âß¼­Êý¾Ý£©ÓëÎïÀíÊý¾ÝµÄת»»¹ØÏµ¡£

ÎïÀíÊý¾ÝÖµ = Âß¼­Êý¾ÝÖµ¡Â·Ö±æÂÊ

·Ö±æÂÊ = £¨LogicalMaximum - LogicalMinimum£©¡Â

£¨£¨PhysicalMaximum - PhysicalMinimum£©¡Á10UnitExponent£©

µÚ8Õ USB½Ó¿ÚHIDÉ豸 193

£¨7£©UnitÏîÄ¿

UnitÏîĿָ¶¨±¨±íÊý¾ÝÔÚʹÓÃPhysicalÓëUnit ExponentÏîĿת»»ºóʹÓÃʲô¶ÈÁ¿µ¥Î»£¬ÒÔ¼°µ¥Î»µÄÃÝÖ¸ÊýÖµ¡£UnitµÄÊýÖµ²¿·Ö¿ÉÒÔ³¤´ï4×Ö½Ú£¬°´ÕÕ4λΪһ¶Î·Ö¶Î£¬¿ÉÒÔ·ÖΪ8¸ö°ë×ֽڶΣ¬Óɸߵ½µÍ·Ö±ðΪ°ë×Ö½Ú7¡¢°ë×Ö½Ú6¡¢¡­¡¢°ë×Ö½Ú0¡£Ã¿Ò»¸ö°ë×Ö½Ú¶ÔÓ¦²»Í¬µÄ»ù±¾µ¥Î»£¬ÆäÊýÖµ±íʾµ¥Î»µÄÖ¸ÊýÖµ£¬²ÉÓÃ4λ2µÄ²¹Âë±íʾ£¬È¡Öµ·¶Î§ÊÇ-8~+7Ö®¼ä¡£

´Ó°ë×Ö½Ú0~6ÓÉÏÂ±í¸ø³öÁ˾ßÌåµÄ¶¨Ò壬ÆäÖаë×Ö½Ú0±íʾ²âÁ¿ÏµÍ³£¬°ë×Ö½Ú7±£Áô¡£ÀýÈçÔÚ°ë×Ö½Ú0ÊýֵΪ1£¨±íʾ²ÉÓÃÏßÐÔ¹«ÖƲâÁ¿ÏµÍ³£©µÄÌõ¼þÏ£¬°ë×Ö½Ú1±íʾ³¤¶È£¨µ¥

2

λΪÀåÃ×£©£¬Èç¹ûÆäÊýֵΪ1±íʾÀåÃ×£¬ÊýֵΪ2±íʾ£¨ÀåÃ×£©£¬³ÉÎªÃæ»ýµ¥Î»¡£°ë×Ö½Ú3±íʾʱ¼ä£¨µ¥Î»ÎªÃ룩£¬Èç¹ûÆäÊýֵΪ-2£¬±íʾ£¨Ã룩-2¡£

°ë×Ö½Ú ÐòºÅ 0 1 2 3 4 5 6 7 ²âÁ¿ ÏîÄ¿ ²âÁ¿ÏµÍ³ ³¤¶È ÖÊÁ¿ ʱ¼ä ÎÂ¶È µçÁ÷ ÁÁ¶È ±£Áô 0 ±í8-9 Unit µ¥Î»µÄ¶¨Òå ÊýÖµº¬Òå 1 2 3 4 ÏßÐÔ¡¢¹«ÖÆ ½Ç¶È¡¢¹«ÖÆ ÏßÐÔ¡¢Ó¢ÖÆ ½Ç¶È¡¢Ó¢ÖÆ ÀåÃ× °ë¾¶ Ó¢´ç ¶È ¿Ë ʯÀ­£¨slug£© Ãë ¿ªÊ½¶È£¨Kelvin£© »ªÊ½¶È °²Åà Öò¹â ÎÞ ËäÈ»±íÖÐÖ»ÊǶ¨ÒåÁËÓÐÏ޵Ļù±¾µ¥Î»£¬µ«¿ÉÒÔͨ¹ýÕâЩ»ù±¾µ¥Î»µÄ×éºÏÅÉÉú³ö´ó¶àÊýÆäËüµÄ³£Óõ¥Î»¡£

ÀýÈ籨±íʹÓÃÒ»¸ö×Ö½Ú´«ËÍÒ»¸ö´Ó-20µ½110»ªÊ϶ÈζÈÖµ£¬¿ÉÒÔ¶¨ÒåÒÔϱ¨±íÃèÊöÏîÄ¿£º

Logical Minimum = -128 Logical Maximum = 127 Physical Minimum = -20 Physical Maximum = 110 Unit Exponent = 0 Unit = 30003h

UnitµÄ°ë×Ö½Ú0=3Ñ¡ÔñÓ¢ÖÆÏßÐÔ²âÁ¿ÏµÍ³£¬°ë×Ö½Ú4=3Ñ¡Ôñ»ªÊÏζȵ¥Î»¡£

130£¨110+20£©»ªÊ϶ȵÄÊýÖµ·¶Î§ÏßÐÔ·Ö²¼µ½ÁË256ºÍÓÐЧÊýÖµÇøÓò£¬Ã¿Ò»Î»Ï൱ÓÚ0.51»ªÊ϶ȣ¬ÕâÑù¾ÍÌá¸ßÁË·Ö±æÂÊ¡£

£¨8£©Report SizeºÍReport CountÏîÄ¿

Report SizeÏîĿָ¶¨Input¡¢OutputÓëFeatureÏîÄ¿×ֶεĴóС£¬ÒÔλΪµ¥Î»¡£ Report CountÏîĿָ¶¨Input¡¢OutputÓëFeatureÏîÄ¿°üº¬µÄ×Ö¶ÎÊýÄ¿¡£ ÀýÈçÁ½¸ö8λµÄ×ֶΣ¬Report SizeµÈÓÚ8£¬¶øReport CountµÈÓÚ2¡£8¸ö1λµÄ×ֶΣ¬Report SizeµÈÓÚ1£¬¶ø Report CountµÈÓÚ8¡£

Input¡¢OutputÓëFeatureÏîÄ¿±¨±í¿ÉÒÔÓжà¸öÏîÄ¿£¬Ã¿Ò»¸öÏîÄ¿¿ÉÒÔÓÐ×Ô¼ºµÄReport SizeºÍReport CountÏîÄ¿¡£

£¨9£©PushºÍPopÏîÄ¿

PushÏîÄ¿½«Ò»¸öGlobalÏîĿ״̬±í¸ñµÄ¸±±¾Ñ¹ÈëCPUµÄ¶ÑÕ»ÄÚ¡£GIobalÏîĿ״̬±í¸ñ°üº¬ËùÓÐ֮ǰ¶¨ÒåµÄGobalÏîÄ¿µÄĿǰÉèÖá£

PopÏîÄ¿»Ö¸´Ö®Ç°Ñ¹Èë¶ÑÕ»µÄGlobalÏîĿ״̬µÄ´¢´æ×´Ì¬¡£

194 ¼ÆËã»ú¸ß¼¶½Ó¿Úʵ¼ù

£¨10£©Usage¡¢Usage MinimumºÍUsage MaximumÏîÄ¿

Õâ3¸öÏîÄ¿ÊäÈëLocalÀàÐÍÏîÄ¿¡£

UsageÏîÄ¿ºÍGlobalÀàÐ͵ÄUsage PageÏîĿЭͬÃèÊöÏîÄ¿»ò¼¯ºÏµÄ¹¦ÄÜ¡£ Ò»¸ö±¨±í¿ÉÒÔÖ¸¶¨Ò»¸öUsage¸øÐí¶à¸ö¿ØÖÆ£¬»òÊÇÖ¸¶¨²»Í¬µÄUsage¸øÃ¿Ò»¸ö¿ØÖÆ¡£Èç¹ûÒ»¸ö±¨±íÏîĿ֮ǰÓÐÒ»¸öUsage£¬´ËUsageÓ¦Óõ½¸ÃÏîÄ¿µÄËùÓпØÖÆ¡£Èç¹ûÒ»¸ö±¨±íÏîĿ֮ǰÓÐÒ»¸öÒÔÉϵÄUsage£¬Ã¿Ò»¸öUsageÓ¦Óõ½Ò»¸ö¿ØÖÆ£¬UsageÓë¿ØÖÆÊǰ´Ë³Ðò½áºÏµÄ¡£

ÀýÈçÏÂÃæ±¨±íÃèÊö·ûµÄÒ»¸ö¾Ö²¿£¬±¨±íº¬ÓÐ2¸öÊäÈë×Ö½Ú£¬µÚÒ»¸ö×Ö½ÚµÄÓ÷¨ÊÇx£¬µÚ2¸ö×Ö½ÚÊÇy¡£

Report Size (8) Report Count (2) Usage (x) Usage (y) Input (Data, Variable, Absolute)

Èç¹ûÒ»¸ö±¨±íÏîĿ֮ǰÓÐÒ»¸öÒÔÉϵÄUsage£¬¶øÇÒ¿ØÖƵÄÊýÄ¿¶àÓÚUsageµÄÊýÄ¿£¬Ã¿Ò»¸öUsageÓëÒ»¸ö¿ØÖƶÔÓ¦£¬×îºóÒ»¸öUsageÔòÓ¦Óõ½ËùÓÐÊ£ÓàµÄ¿ØÖÆ¡£

ÀýÈçÔÚÏÂÃæ±¨±í°üº¬16¸ö×Ö½ÚÊäÈëÊý¾Ý£¬µÚÒ»¸ö×Ö½Ú¶ÔÓ¦Ó÷¨x£¬µÚ2¸ö×Ö½Ú¶ÔÓ¦Ó÷¨y£¬Ê£ÓàµÄ14¸ö×Ö½Ú¶ÔÓ¦³§É̶¨ÒåµÄÓ÷¨¡£

Usage (x) Usage (y) Usage (Vendor defined) Report Size (8) Report Count (16) Input (Data, Variable, Absolute)

Usage MinimumºÍUsage Maximum¿ÉÒÔÖ¸¶¨Ò»¸ö Usage¸ø¶à¸ö¿ØÖÆ»òÊÇÊý×éÏîÄ¿¡£½«´ÓUsage Minimumµ½Usgae Maximun¶¨ÒåµÄÓ÷¨Ë³Ðò¶ÔÓ¦µ½¶à¸ö¿ØÖÆÖС£

ÀýÈçÔÚÒ»¸ö¼üÅÌÃèÊö·ûÖж¨ÒåµÄ±ê×¼¼üÅ̵Ä×ó¡¢ÓÒÐÞÊμüµÄÊäÈëÏîÄ¿ÖУ¬Ê¹ÓÃÒ»¸ö×Ö½ÚµÄ8λ·Ö±ðÊäÈë¼üÅ̵Ä×ó¡¢ÓÒCtrl¼ü¡¢Shift¼ü¡¢Alt¼üºÍGUI¼ü£¬´ÓHID Usage tablesÎĵµÖеĵÚ10½Ú¿ÉÒԲ鵽¹ØÓÚ¼üÅÌÓ÷¨µÄ¶¨Ò壬ÆäÖÐÉÏÊö8¸öÐÞÊμüµÄÓ÷¨¶¨ÒåֵΪ224µ½231¡£ÒÔÏÂÊDZ¨±íÃèÊö·ûµÄÐÞÊμü²¿·ÖÃèÊö¡£

Usage Page (1) ; 1 = Generic Desktop Controls Usage (6) ; 6 = Keyboard Collection (1) ; 1 = Application Usage Page (7) ; 7 = Keyboard/Keypad Usage Minimum (224) Usage Maximum (231) Logical Minimum (0) Logical Maximum (1) Report Size (1) Report Count (8) Input (Data, Variable, Absolute) ¡­¡­

8.3 USB½Ó¿ÚµÄ¼üÅÌÃèÊö·û·¶Àý

µÚ8Õ USB½Ó¿ÚHIDÉ豸 195

ÏÂÃæ×÷Ϊһ¸öÀý×Ó£¬½éÉÜÒ»¸öUSB½Ó¿ÚµÄ101¼üÅ̵ÄÈ«²¿ÃèÊö·û¡£¸Ã¼üÅ̹̼þ²¿·ÖÓÉÒ»¸ö΢´¦ÀíÆ÷ʵÏÖÈ«²¿¿ØÖƹ¦ÄÜ£¬ÏÂÃæÁгöµÄ´úÂëΪ΢´¦ÀíÆ÷»ã±àʵÏÖÃèÊö·û¶¨Òå¡£

8.3.1 É豸µÄÃèÊö·û

É豸ÃèÊö·ûµÄ´úÂëÈçÏ¡£

;========================================= ; Device descriptor É豸ÃèÊö·û

;========================================= DEVICE_DESC_DATA: DB 0x12 ; bLength = 18£¬¸ÃÃèÊö·û³¤¶ÈΪ18×Ö½Ú DB 0x01 ; bDescriptorType = 01£¬±íÃ÷ÊÇÉ豸ÃèÊö·û DB 0x10, 0x01 ; bcdUSB£¬USBÉ豸°æ±¾ºÅ=1.1 DB 0x00 ; DeviceClass£¬É豸ÀàÂ룬HIDÉ豸Ϊ0£¬Àà±ðÔÚ½Ó¿ÚÃèÊö·ûÖж¨Òå DB 0X00 ; DeviceSubClass£¬É豸×ÓÀàÂ룬DeviceClassΪ0ʱ¸Ã×ֶαØÐëΪ0 DB 0X00 ; bDevicePortocol£¬Ð­ÒéÂ룬DeviceClassΪ0ʱ¸Ã×ֶαØÐëΪ0 DB 0x08 ; bMaxPacketSize0£¬¶Ëµã0µÄ×î´ó°ü³ß´ç DB 0xFF, 0xFF ; bVendor£¬³§ÉÌID£¬ÓÉUSBʵÏÖÕßÂÛ̳ȷ¶¨µÄ DB 0x01, 0x00 ; bProduct£¬²úÆ·ID

DB 0x00, 0x01 ; bcdDevice£¬É豸°æ±¾ºÅΪ1.00 DB 0x04 ; iManufacturer£¬³§ÉÌ×Ö·û´®µÄË÷ÒýÖµ£¬¼û×Ö·û´®ÃèÊö·û DB 0x0E ; iProduct£¬²úÆ·×Ö·û´®µÄË÷ÒýÖµ£¬¼û×Ö·û´®ÃèÊö·û DB 0x30 ; iSerialNumber£¬²úÆ·ÐòÁкÅ×Ö·û´®µÄË÷ÒýÖµ£¬¼û×Ö·û´®ÃèÊö·û DB 0X01 ; bNumConfigurations£¬ÅäÖÃÊýĿֻÓÐ1¸ö

8.3.2 ÅäÖÃÃèÊö·û

ÅäÖÃÃèÊö·ûµÄ´úÂëÈçÏ¡£

;========================================= ; Configuration descriptor ÅäÖÃÃèÊö·û ;========================================= CONFIG_DESC_DATA: DB 0x09 ; bLength=9£¬¸ÃÃèÊö·û³¤¶ÈΪ9×Ö½Ú DB 0x02 ; bDescriptorType = 02£¬±íÃ÷ÊÇÅäÖÃÃèÊö·û DB 0x3B, 0x00 ; wTotalLength = 59£¬ÅäÖᢽӿڡ¢¶ËµãºÍHIDÃèÊö·ûµÄ×ܺÍ×Ö½ÚÊý DB 0x02 ; bNumInterfaces = 2£¬±¾ÅäÖÃÖ§³ÖµÄ½Ó¿ÚÊýĿΪ2¸ö DB 0x01 ; bConfigurationValue = 1£¬±¾ÅäÖÃÃèÊö·ûµÄ±êʶ·û DB 0x00 ; iCongfiguration = 0£¬ÅäÖÃÃèÊö·û˵Ã÷×Ö·û´®µÄË÷ÒýÖµ£¬0±íʾÎÞ DB 0XA0 ; bmAttributes£¬µçÔ´¼°»½ÐÑÉèÖã¬USB1.1°æÖÐD7=1£¬D6=0±íʾ×ÜÏß¹©µç ; D5=1±íʾ֧³ÖÔ¶³Ì»½ÐÑ DB 0X32 ; MaxPower = 50£¬±¾É豸×î´óºÄµçΪ50X2mA=100mA ÐèҪ˵Ã÷µÄÊÇwTotalLengthµÄÖµ£¬¸ÃÊýֵΪÅäÖÃÃèÊö·û³¤¶È£¨9£©¼ÓÉϺóÐøµÄ¼üÅ̵ĽӿÚÃèÊö·û³¤¶È£¨9£©¡¢¶ËµãÃèÊö·û³¤¶È£¨7£©¡¢HIDÃèÊö·û³¤¶È£¨9£©£¬ÒÔ¼°¸ÃÅäÖÃϵÄÊó±êµÄ½Ó¿ÚÃèÊö·û³¤¶È£¨9£©¡¢¶ËµãÃèÊö·û³¤¶È£¨7£©¡¢HIDÃèÊö·û³¤¶È£¨9£©£¬¹²59¸ö×Ö½Ú¡£¹ØÓÚÊó±êµÄÏà¹ØÃèÊö·ûÔÚÏÂÃæµÄÐðÊöÖÐÊ¡ÂÔÁË¡£

196 ¼ÆËã»ú¸ß¼¶½Ó¿Úʵ¼ù

8.3.3 ½Ó¿ÚÃèÊö·û

½Ó¿ÚÃèÊö·ûµÄ´úÂëÈçÏ¡£

;========================================= ; Interface descriptor ½Ó¿ÚÃèÊö·û ;========================================= InterfaceDescriptor0: DB 0x09 ; bLength = 9£¬¸ÃÃèÊö·û³¤¶È DB 0x04 ; bDescriptorType = 4£¬±íÃ÷ÊǽӿÚÃèÊö·û DB 0x00 ; bInterfaceNumber = 0£¬´Ë½Ó¿ÚµÄʶ±ð±êʶ·û DB 0x00 ; bAlternateSetting = 0£¬±íʾ´Ë½Ó¿ÚÎÞÌæ´úÉèÖÃÖµ DB 0x01 ; bNumEndpoints = 1£¬±¾½Ó¿ÚµÄ¶ËµãÊýÄ¿£¬HIDÉ豸ʹÓö˵ã1 DB 0x03 ; bInterfaceClass = 3£¬±íʾ¸ÃÉ豸ÊÇHIDÀà±ð DB 0x01 ; bInterfaceSubClass = 1£¬±íʾ֧³ÖÆô¶¯½Ó¿Ú DB 0x01 ; bInterfaceProtocol = 1£¬±íʾ֧³Ö¼üÅÌЭÒé DB 0x00 ; iInterface = 0£¬½Ó¿ÚÃèÊö·û˵Ã÷×Ö·û´®µÄË÷ÒýÖµ£¬0±íʾÎÞ×Ö·û´® 8.3.4 HIDÃèÊö·û

HIDÃèÊö·ûµÄ´úÂëÈçÏ¡£

;========================================= ; HID descriptor HIDÃèÊö·û ;========================================= HIDDescriptor0: DB 0x09 ; bLength = 9£¬¸ÃÃèÊö·û³¤¶È DB 0x21 ; bDescriptorType = 21h£¬±íÃ÷ÊÇHIDÃèÊö·û DB 0x00, 0x01 ; bcdHID = 0100£¬HID¹æ·¶°æ±¾Îª1.00 DB 0x00 ; bCountryCode = 0£¬Ó²¼þÉ豸ËùÔÚ¹ú¼ÒµÄ¹ú¼Ò´úÂ룬0±íʾδָÃ÷ DB 0x01 ; nNumDescriptors = 1£¬±íʾ֧³ÖµÄÃèÊö·ûÓÐ1¸ö£¬¼´Ò»¸ö±¨±íÃèÊö·û DB 0x22 ; bDescriptorType = 22h£¬ÃèÊö·ûÀà±ð£¬±íʾ֧³ÖµÄÃèÊö·ûÊDZ¨±íÃèÊö·û DB 0x3F, 0x00 ; wDescriptorLength = 63£¬±íʾ֧³ÖµÄ±¨±íÃèÊö·ûµÄ³¤¶È 8.3.5 ¶ËµãÃèÊö·û

¶ËµãÃèÊö·ûµÄ´úÂëÈçÏ¡£

;========================================= ; EndPoint descriptor ¶ËµãÃèÊö·û ;========================================= EndpointDescriptor0: DB 0x07 ; bLength = 7£¬¸ÃÃèÊö·û³¤¶È DB 0x05 ; bDescriptorType = 5£¬±íÃ÷ÊǶ˵ãÃèÊö·û DB 0x81 ; bEndpointAddress = 1000 0001b£¬±íʾ1ºÅÊäÈë¶Ëµã DB 0X03 ; bmAttributes = 00000011b£¬±íʾÖжÏÀàÐͶ˵ã DB 0x08, 0x00 ; wMaxPacketSize = 8£¬¶Ëµã·¢ËͺͽÓÊÕµÄ×î´ó°ü³ß´çΪ8 DB 10 ; bInterval = 10£¬±íʾÖж϶˵ãÂÖѯʱ¼ä¼ä¸ôΪ10ms 8.3.6 ×Ö·û´®ÃèÊö·û

×Ö·û´®ÃèÊö·ûµÄ´úÂëÈçÏ¡£

µÚ8Õ USB½Ó¿ÚHIDÉ豸 197

;========================================= ; String descriptor ×Ö·û´®ÃèÊö·û

;========================================= StringDescriptor0: DB 0x04 ; bLength = 4£¬×Ö·û´®ÃèÊö·û0µÄ³¤¶ÈΪ4 DB 0x03 ; bDescriptorType = 3£¬±íÃ÷ÊÇ×Ö·û´®ÃèÊö·û DB 0x09, 0x00 ; wLANGID = 0009h£¬±íÃ÷ÊÇÓ¢Óï DB 0x0A ; bLength = 10£¬×Ö·û´®ÃèÊö·ûµÄ³¤¶ÈΪ10 DB 0x03 ; bDescriptorType = 3£¬±íÃ÷ÊÇ×Ö·û´®ÃèÊö·û DB 0x41, 0x00, 0x43, 0x00, 0x4D, 0x00, 0x45, 0x00 ; bString = ¡°ACME¡°£¬Unicode±àÂëµÄ×Ö·û´® DB 0x22 ; bLength = 34£¬×Ö·û´®ÃèÊö·ûµÄ³¤¶ÈΪ34 DB 0x03 ; bDescriptorType = 3£¬±íÃ÷ÊÇ×Ö·û´®ÃèÊö·û DB 0x4C, 0x00, 0x6F, 0x00, 0x63, 0x00, 0x61, 0x00 DB 0x74, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x20, 0x00 DB 0x4B, 0x00, 0x65, 0x00, 0x79, 0x00, 0x62, 0x00 DB 0x6F, 0x00, 0x61, 0x00, 0x72, 0x00, 0x64, 0x00 ; bString = ¡°Locator Keyboard¡°£¬Unicode±àÂëµÄ×Ö·û´® DB 0x0E ; bLength = 14£¬×Ö·û´®ÃèÊö·ûµÄ³¤¶ÈΪ14 DB 0x03 ; bDescriptorType = 3£¬±íÃ÷ÊÇ×Ö·û´®ÃèÊö·û DB 0x41, 0x00, 0x42, 0x00, 0x43, 0x00, 0x21, 0x00 DB 0x22, 0x00, 0x23, 0x00 ; bString = ¡°ABC123¡°£¬Unicode±àÂëµÄ×Ö·û´®

8.3.7 ±¨±íÃèÊö·û

±¨±íÃèÊö·ûµÄ´úÂëÈçÏ¡£

;========================================= ;HID Reports Descriptor ±¨±íÃèÊö·û

;========================================= DB 0x05, 1 ; Usage Page (1: Generic Desktop) DB 0x09, 6 ; Usage (6: Keyboard) ±íʾ±¨±í¶¨ÒåµÄÊÇHID¼üÅÌ DB 0xA1, 1 ; Collection (1: Application) ====================¼¯ºÏ¿ªÊ¼ ; ; ÒÔ϶¨ÒåÁ˼üÅ̵ÄÐÞÊμüÊäÈ뱨±í£¬¹²ÓÐ8¸ö¼ü£¬×é³ÉÒ»¸ö×Ö½Ú ; Ó÷¨¼ûHID Usage TableÖеĵÚ10½ÚÖеļüÅÌÓ÷¨¶¨Òå DB 0x05, 7 ; Usage page (7: Key Codes) DB 0x19, 224 ; Usage Minimum (224) DB 0x29, 231 ; Usage Maximum (231) DB 0x15, 0 ; Logical Minimum (0) DB 0x25, 1 ; Logical Maximum (1) DB 0x75, 1 ; Report Size (1) DB 0x95, 8 ; Report Count (8) DB 0x81, 2 ; Input (Data,Variable,Absolute) ; ; ÒÔ϶¨ÒåÁËÒ»¸ö±£Áô×Ö½ÚµÄÊäÈ뱨±í DB 0x95, 1 ; Report Count (1) DB 0x75, 8 ; Report Size (8), DB 0x81, 1 ; Input (Constant) = Reserved Byte ; ; ÒÔ϶¨ÒåÁ˼üÅ̵ÄLEDָʾµÆÊä³ö±¨±íÏîÄ¿£¬¹²ÓÐ5¸öָʾµÆ ; Ó÷¨¼ûHID Usage TableÖеĵÚ11½ÚÖеÄLEDÓ÷¨¶¨Òå DB 0x95, 5 ; Report Count (5) DB 0x75, 1 ; Report Size (1)

198 ¼ÆËã»ú¸ß¼¶½Ó¿Úʵ¼ù DB 0x05, 8 ; Usage Page (Page# for LEDs) DB 0x19, 1 ; Usage Minimum (1) DB 0x29, 5 ; Usage Maximum (5) DB 0x91, 2 ; Output (Data, Variable, Absolute) ; ; ÒÔ϶¨ÒåÁË3¸öÌî³ä룬ÓëÇ°ÃæµÄ5¸öLEDָʾµÆÊý¾Ý×é³ÉÒ»¸öÍêÕûµÄ×Ö½Ú DB 0x95, 1 ; Report Count (1) DB 0x75, 3 ; Report Size (3) DB 0x91, 1 ; Output (Constant) ; ; ÒÔ϶¨ÒåÁ˼üÅ̵İ´¼üÖµÊäÈ뱨±íÏîÄ¿£¬¹²6¸ö×Ö½Ú£¬´æ·Å¼ü±àºÅ£¨0~101£© ; Ó÷¨¼ûHID Usage TableÖеĵÚ10½ÚÖеļüÅÌÓ÷¨¶¨Òå £» ÕâÑùµÄÉè¼Æ¿ÉÒÔÔÊÐíÒ»´ÎÊäÈë6¸ö°´¼üµÄ¼üÖµ DB 0x95, 6 ; Report Count (6) DB 0x75, 8 ; Report Size (8) DB 0x15, 0 ; Logical Minimum (0) DB 0x25, 101 ; Logical Maximum (101) DB 0x05, 7 ; Usage Page (7: Key Codes) DB 0x19, 0 ; Usage Minimum (0) DB 0x29, 101 ; Usage Maximum (101) DB 0x81, 0 ; Input (Data, Array)

DB 0xC0 ; End_Collection ================================ ¼¯ºÏ½áÊø

ͨ¹ýÉÏÃæµÄ±¨±íÃèÊö·ûµÄ¶¨Ò壬ȷ¶¨Á˼üÅ̵ÄÊäÈ뱨±íºÍÊä³ö±¨±íµÄÊý¾Ý¸ñʽ¡£ÆäÖÐÊäÈ뱨±í¹²8¸ö×Ö½Ú£¬Êä³ö±¨±íÖ»ÓÐ1¸ö×Ö½Ú¡£

¼üÖµ6 ×Ö½Ú7

¼üÖµ5 ×Ö½Ú6

¼üÖµ4 ¼üÖµ3 ¼üÖµ2 ×Ö½Ú3

¼üÖµ1 ±£Áô ÐÞÊμü ×Ö½Ú0

×Ö½Ú5 ×Ö½Ú4 ×Ö½Ú2 ×Ö½Ú1

ͼ8-4 ¼üÅ̵ÄÊäÈ뱨±í¸ñʽ

7~5 4 3 2 1 0 ×Ö½Ú0 Nnm Lock ָʾµÆ Caps Lock ָʾµÆ Scroll Lock ָʾµÆ Compose ָʾµÆ Kana ָʾµÆ ³£Êý£¬±£Áô ͼ8-5 ¼üÅ̵ÄÊä³ö±¨±í¸ñʽ

µÚ8Õ USB½Ó¿ÚHIDÉ豸 199

8.4 HIDµÄÌØ¶¨ÇëÇó

³ýÁËUSBÉ豸µÄ11¸ö±ê×¼ÇëÇóÍ⣬HID¹æ·¶ÁíÍ⻹¶¨ÒåÁË6¸öHIDÌØ¶¨¿ØÖÆÇëÇó¡£ËùÓеÄHIDÉ豸¶¼±ØÐëÖ§³ÖGet_ReportÇëÇó£¬Í¬Ê±Ö§³ÖÆô¶¯µÄÉ豸±ØÐëÖ§³ÖGet_ProtocolÇëÇóºÍSet_ProtocolÇëÇ󣬯äËûµÄÇëÇóÊÇ¿ÉÑ¡ÔñµÄ¡£Èç¹ûÉ豸ûÓÐÖжÏÊä³ö¶Ëµã£¬´ËÉ豸ÐèÒªÖ§³ÖGet_ReportÇëÇóÀ´´ÓÖ÷»ú¶ÁÈ¡Êý¾Ý¡£

ÔÚ¿ØÖÆ´«ÊäµÄÉèÖý׶εÄÊý¾Ý°üÖеÄ8¸ö×Ö½ÚÖеĵÚÒ»×Ö½ÚbmRequestTypeµÄ±àÂ뺬Òå²ÎÔĵÚ6ÕÂÖеÄUSB±ê×¼ÇëÇó¡£µÚ2¸ö×Ö½ÚbRequest¶¨ÒåÇëÇóµÄÄÚÈÝ¡£wValueÒòÇëÇóµÄ²»Í¬¶ø²»Í¬¡£wIndexÖ¸Ã÷HIDËùÔڵĽӿڡ£

±í8-10 HIDÌØ¶¨µÄÇëÇó bmRequestType bRequest £¨Öµ£© 1 01 00001b 0 01 00001b 1 01 00001b 0 01 00001b 1 01 00001b 0 01 00001b Get_Report (1) Set_Report (9) Get_Idle (2) Set_Idle (10) Get_Protocol (3) Set_Protocol (11) wValue wIndex wLength Êý¾Ý½×¶Î ±¨±í ±¨±í ÏÐÖÃʱ¼ä ÎÞ 0: Æô¶¯Ð­Òé 1: ±¨±íЭÒé ÎÞ ±¨±íÀàÐÍ£¬±¨±íID ½Ó¿Ú ±¨±í³¤¶È ±¨±íÀàÐÍ£¬±¨±íID ½Ó¿Ú ±¨±í³¤¶È 0£¬±¨±íID ½Ó¿Ú 1 0 1 0 ÏÐÖÃʱ¼ä£¬±¨±íID ½Ó¿Ú 0 0: Æô¶¯Ð­Òé 1: ±¨±íЭÒé ½Ó¿Ú ½Ó¿Ú 8.4.1 Get_ReportÇëÇó

Get_ReportµÄ×÷ÓÃÊÇÆôÓÃÖ÷»úʹÓÿØÖÆ´«Ê䣬À´´ÓÉ豸¶ÁÈ¡Êý¾Ý¡£

ÔÚʹÓÃʱwValue×ֶεĸß×Ö½ÚÊDZ¨±íÀàÐÍ£¬1±íʾInput±¨±í£¬2±íʾOutput±¨±í£¬3±íʾFeature±¨±í¡£wValueµÄµÍ×Ö½ÚÊDZ¨±íµÄReport ID£¬Èç¹ûûÓж¨ÒåReport ID£¬¸Ã×Ö½ÚΪÉè0¡£

ÔÚЯ´øÇëÇóµÄ¿ØÖÆ´«ÊäµÄÊý¾Ý½×¶Î£¬HIDÉ豸»Ø´«Ö¸¶¨µÄ±¨±íÄÚÈÝ¡£

HlD¹æ·¶²»½¨ÒéʹÓøÃÇëÇó»ñµÃδ¾­¶¨Ê±µÄÊý¾Ý£¬ÕâÑùµÄÊý¾Ý½¨ÒéʹÓÃÖжÏÊäÈë¹ÜµÀ»ñµÃ¡£

¸ÃÇëÇóÓÃÀ´È¡µÃÔÚÖ÷»ú³õʼ»¯É豸ʱµÄÌØÕ÷ÏîĿ״̬ºÍÆäËûÐÅÏ¢¡£Ê¹Óÿª»úЭÒéµÄÖ÷»ú¿ÉÒÔʹÓôËÇëÇóÀ´»ñµÃ°´¼ü»òÊó±êÊý¾Ý¡£

8.4.2 Set_ReportÇëÇó

Set_ReportÇëÇóµÄ²ÎÊýº¬ÒåºÍGet_ReportÒ»Ñù£¬µ«Set_ReportÇëÇóµÄÊý¾Ý·½ÏòÓëGet_ReportÏà·´£¬ÔÚºóÃæµÄÊý¾Ý½×¶Î£¬Ö÷»ú´«Ëͱ¨±íµ½HIDÉ豸£¬ÕâÑùµÄÊä³ö±¨±í¿ÉÒÔÓÃÓÚ¸´Î»É豸µÄ¿ØÖÆ£¬¸´Î»²úÉúµÄЧ¹ûÈ¡¾öÓÚ¶ÔÓ¦µÄ¿ØÖƵÄÀàÐÍÊÇÏà¶Ô£¨Reletive£©µÄ»¹ÊǾø¶Ô£¨Absolute£©µÄ¡£

8.4.3 Set_IdleÇëÇó

Set_IdleÇëÇóµÄ×÷ÓÃÊǾ²Ä¬Ò»¸öÔÚÖжÏÊäÈë¹ÜµÀµÄÌØ¶¨µÄ±¨±í£¬Ö±µ½Ò»¸ö·¢ÉúÒ»¸öÏà¹ØµÄʼþ»ò¹ýÈ¥Á˹涨µÄʱ¼ä£¬µ±Êý¾Ý´ÓÉÏÒ»¸ö±¨±íºóûÓиıäʱ£¬¿ÉÒÔͨ¹ýÏÞÖÆÖжÏÊäÈë¶ËµãµÄ±¨±íƵÂÊÀ´½ÚÊ¡´«Êä´ø¿í¡£HIDÉ豸²»ÊDZØÐèÖ§³Ö´ËÇëÇó¡£

wValue×ֶεĸß×Ö½ÚÊÇÉèÖõÄÏÐÖÃʱ¼ä£¬ÊDZ¨±íÖ®¼äµÄ×î´ó¼ä¸ôʱ¼ä¡£¸Ã×Ö½ÚΪ0±íʾÏÐÖÃʱ¼äΪÎÞÏÞ³¤£¬ÔÚÕâÖÖÇé¿öÏ£¬É豸ֻÓÐÔÚ±¨±íÊý¾ÝÓиıäʱ²Å´«Ëͱ¨±í£¬·ñÔò

200 ¼ÆËã»ú¸ß¼¶½Ó¿Úʵ¼ù

É豸´«»ØÒ»¸öNAK¡£

wValue×ֶεĵÍ×Ö½Úָʾ´ËÇëÇóÓ¦Óõı¨±íµÄReport ID¡£Èç¹ûµÍ×Ö½ÚÊÇ0£¬´ËÇëÇóÓ¦Óõ½É豸µÄËùÓÐÊäÈ뱨±í¡£

ÏÐÖÃʱ¼äÒÔ4msΪµ¥Î»£¬·¶Î§ÔÚ4ms¡«1020msÖ®¼ä¡£Èç¹û±¨±íµÄÊý¾Ý×Ô´ÓÉÏÒ»´Î±¨±íºóÓиı䣬»òÊǽÓÊÕµ½Ò»¸öÇëÇó£¬É豸»á´«ËÍÒ»¸ö±¨±í¡£

Èç¹û±¨±íµÄÊý¾ÝûÓиı䣬¶øÇÒ´ÓÉÏÒ»´Î±¨±íºó¹ýÈ¥µÄʱ¼ä×ÔÉÐδ´ïµ½¹æ¶¨µÄÏÐÖÃʱ¼ä£¬É豸»á´«»ØÒ»¸öNAK¡£Èç¹û±¨±íµÄÊý¾ÝûÓиı䣬¶øÇÒ³ÖÐøÊ±¼äÒѾ­´ïµ½µÄÏÐÖÃʱ¼ä£¬É豸»á´«ËÍÒ»¸ö±¨±í¡£

ÏÐÖÃʱ¼äÉèÖÃΪ0±íʾÎÞÏÞ³¤µÄÏÐÖÃʱ¼ä£¬É豸ֻÓÐÔÚ±¨±íµÄÊý¾ÝÓиıäʱ²Å»á´«ËÍÒ»¸ö±¨±í£¬¶ÔÓÚÆäËûµÄÖжÏÊäÈëÇëÇóÔòÊÇ´«»ØNAK¡£

ÔÚ¼ì²âHIDÉ豸ʱ£¬WndowsµÄHIDÇý¶¯³ÌÐò»áÊÔͼ½«ÏÐÖÃʱ¼äÉèÖóÉ0¡£Èç¹ûHIDÉ豸²»Ö§³Ö´ËÇëÇó£¬Ö÷»ú»áÊÕµ½´«»ØµÄStall¡£

8.4.4 Get_IdleÇëÇó

Get_IdleÇëÇóµÄ×÷ÓÃÊǹýµÄÉ豸µÄµ±Ç°ÏÐÖÃʱ¼ä£¬ÔÚÊý¾Ý½×¶Î£¬HIDÉ豸»Ø´«Ò»¸ö×Ö½ÚµÄÏÐÖÃʱ¼äÖµ¡£

8.4.5 Get_ProtocolÇëÇó

Get_ProtocolÇëÇóµÄ×÷ÓÃÊÇÖ÷»ú»ñÈ¡É豸Ŀǰ×÷ÓõÄÊÇÆô¶¯Ð­Ò黹ÊDZ¨±íЭÒé¡£ ÔÚÊý¾Ý½×¶ÎÖÐÉ豸»Ø´«µÄ1¸ö×Ö½ÚÐÅÏ¢°üÖеÄÊý¾ÝֵΪ0±íʾÆô¶¯Ð­Ò飬Ϊ1±íʾ±¨±íЭÒé¡£

Æô¶¯É豸±ØÐèÖ§³Ö¸ÃÇëÇó¡£

8.4.6 Set_ProtocolÇëÇó

Set_ProtocolµÄ×÷ÓÃÊÇÖ÷»úÖ¸¶¨É豸ʹÓÃÆô¶¯Ð­Òé»ò±¨±íЭÒé¡£

ÔÚÊý¾Ý½×¶ÎÖÐÖ÷»ú´«Ë͵Ä1¸ö×Ö½ÚÐÅÏ¢°üÖеÄÊý¾ÝֵΪ0±íʾָ¶¨Æô¶¯Ð­Ò飬Ϊ1±íʾָ¶¨±¨±íЭÒé¡£

Æô¶¯É豸±ØÐèÖ§³Ö¸ÃÇëÇó¡£

8.5 HID³ÌÐòÉè¼Æ

HIDÉ豸ÊÇWindowsϵͳÌṩÁËÍêÉÆÖ§³ÖµÄÒ»À࣬ӦÓóÌÐò¿ÉÒÔͨ¹ý±ê×¼µÄAPIº¯Êýµ÷Óã¬ÊµÏÖÓëHIDÉ豸µÄͨÐÅ¡£WindowsϵͳÌṩÁ˼¸Ç§¸öAPIº¯Êý£¬×÷ΪӦÓóÌÐòÓë²Ù×÷ϵͳµÄ½Ó¿Ú£¬ÓëHIDÏà¹ØµÄAPIº¯Êý±»·â×°ÔÚhid.dll¡¢setupapi.dllºÍkernal32.dllÎļþÖС£

8.5.1 HID·ÃÎÊʹÓõÄAPIº¯Êý

Îļþhid.dllÖÐÌṩÁ˺ܶà¸öAPI£¬ÒòΪÓëHIDÉ豸ͨÐÅÓÐÒ»¶¨µÄ¸´ÔÓÐÔ¡£Ê×ÏÈ£¬ÔÚÓ¦ÓóÌÐòÓëHID´«ÊäÊý¾Ý֮ǰ£¬Ó¦ÓóÌÐò±ØÐëÏÈʶ±ð¸ÃÉ豸²¢ÇÒ¶ÁÈ¡ËüµÄ±¨±íÐÅÏ¢£¬ÕâЩ¶¯×÷ÐèÒªµ÷Óöà¸öAPIº¯Êý²Å¿ÉÒÔʵÏÖ¡£Ó¦ÓóÌÐòÐèҪѰÕÒÁ¬½Óµ½ÏµÍ³ÉϵÄÊÇÄÄЩHIDÉ豸£¬È»ºó¶Áȡÿ¸öÉ豸µÄÐÅÏ¢Ö±µ½²éÕÒµ½ËùÐèµÄÊôÐÔ¡£Èç¹ûÊǿͻ§»¯µÄÉ豸£¬Ó¦ÓóÌÐò¿ÉÒÔѰÕÒÌØ¶¨µÄ³§ÉÌÓë²úÆ·ID£¬»òÕßÓ¦ÓóÌÐò¿ÉÒÔѰÕÒÌØ¶¨ÀàÐ͵ÄÉ豸£¬ÀýÈç¼üÅÌ»òÊó±ê¡£

µÚ8Õ USB½Ó¿ÚHIDÉ豸 201

±í8-11 ÓÃÓÚHIDÉ豸µÄAPIº¯Êý ÓÃÓÚÁ˽âHIDÉ豸Çé¿öµÄAPIº¯Êý£¨hid.dll£© HidD_GetAttributes ÇëÇó»ñµÃHIDÉ豸µÄ³§ÉÌID¡¢²úÆ·IDºÍ°æ±¾ºÅ HidD_FreePreparsedData Êͷź¯ÊýHidD_GetPreparsedDataËùʹÓõÄ×ÊÔ´ HidD_GetHidGuid ÇëÇó»ñµÃHIDÉ豸µÄGUID HidD_GetIndexString ÇëÇó»ñµÃÓÉË÷Òýʶ±ðµÄ×Ö·û´® HidD_GetManufactureString ÇëÇó»ñµÃÉè±¸ÖÆÔìÉÌ×Ö·û´® HidD_GetPhysicalDescriptor ÇëÇó»ñµÃÉ豸ʵÌå×Ö·û´® HidD_GetPreparsedData ÇëÇó»ñµÃÓëÉ豸ÄÜÁ¦ÐÅÏ¢Ïà¹ØµÄ»º³åÇøµÄ´úºÅ HidD_GetProductString ÇëÇó»ñµÃ²úÆ·×Ö·û´® HidD_GetSerialNumberString ÇëÇó»ñµÃ²úÆ·ÐòÁкÅ×Ö·û´® HidP_GetButtonCaps ÇëÇó»ñµÃHID±¨±íÖÐËùÓа´Å¥µÄÄÜÁ¦ HidP_GetCaps ÇëÇó»ñµÃÓÃÓÚÃèÊöÉ豸ÄÜÁ¦µÄ½á¹¹µÄÖ¸Õë HidP_GetLinkCollectionNotes ÇëÇó»ñµÃÃèÊöÔÚ¶¥²ã¼¯ºÏÖеÄÁ¬½Ó¼¯ºÏ£¨Link Collection£©¹ØÏµµÄ½á¹¹µÄÊý×é HidP_GetSpecificButtonCaps ÇëÇó»ñµÃ±¨±íÖа´Å¥µÄÄÜÁ¦£¬¸ÃÇëÇó¿ÉÒÔÉ趨һ¸öUsage Page¡¢Usage»òÊÇLink Collection HidP_GetSpecificValueCaps ÇëÇó»ñµÃ±¨±íÖÐÊýÖµµÄÄÜÁ¦£¬¸ÃÇëÇó¿ÉÒÔÉ趨һ¸öUsage Page¡¢Usage»òÊÇLink Collection HidP_GetValueCaps ÇëÇó»ñµÃHID±¨±íÖÐËùÓÐÊýÖµµÄÄÜÁ¦ HidP_MaxUsageListLength ÇëÇó»ñµÃHID±¨±íÖпÉÒԻش«µÄ°´Å¥µÄ×î´óÊýÄ¿£¬¸ÃÇëÇó¿ÉÒÔÉ趨һ¸öUsage Page HidP_UsageListDifference ±È½ÏÁ½¸ö°´Å¥ÁÐ±í£¬²¢ÇÒÇó³öÔÚÒ»¸öÁбíÖÐÉ趨¶øÔÚÁíÒ»¸öÁбíÖÐûÓÐÉ趨µÄ°´Å¥ ÓÃÓÚ´ÓÉ豸¶ÁÈ¡¡¢ÏòÉ豸´«Ëͱ¨±íµÄAPIº¯Êý£¨hid.dll£© HidD_GetFeature ´ÓÉ豸¶Áȡһ¸öÌØÕ÷±¨±í HidD_SetFeature ÏòÉ豸´«ËÍÒ»¸öÌØÕ÷±¨±í HidP_GetButtons ´ÓÉ豸¶ÁÈ¡°üº¬Ã¿¸ö°´Ïµİ´Å¥µÄÓ÷¨£¨Usage£©µÄ»º³åÇøµÄÖ¸Õ룬¸ÃÇëÇó¿ÉÒÔÉ趨һ¸öUsage Page HidP_GetButtonEx ´ÓÉ豸¶ÁÈ¡°üº¬Ã¿¸ö°´Ïµİ´Å¥µÄUsageºÍUsage PageµÄ»º³åÇøµÄÖ¸Õë HidP_GetScaledUsageValue ´ÓÉ豸¶Áȡһ¸öÒѾ­¾­¹ý±ÈÀýÒò×Óµ÷ÕûµÄÓзûºÅÊýÖµ HidP_GetUsageValue ´ÓÉ豸¶Áȡһ¸öÖ¸ÏòÊýÖµµÄÖ¸Õë HidP_GetUsageValueArray ´ÓÉ豸¶ÁÈ¡°üº¬¶à¸öÊý¾ÝÏîµÄUsageµÄÊý¾Ý HidP_SetButtons ÏòÉ豸´«ËÍÉèÖð´Å¥µÄÊý¾Ý HidP_SetScaledUsageValue ½«Ò»¸öʵ¼ÊÊýֵת»»³ÉÉ豸ʹÓõÄÂß¼­ÊýÖµ£¬²¢½«Æä²åÈëµ½±¨±íÖÐ HidP_SetUsageValue ÏòÉ豸´«ËÍÊý¾Ý HidP_SetUsageValueArray ÏòÉ豸´«ËͰüº¬¶à¸öÊý¾ÝÏîµÄUsageµÄÊý¾Ý HidD_FlushQueue Çå¿ÕÊäÈ뻺³åÇø HidD_GetNumInputBuffer »ñµÃÇý¶¯³ÌÐòÓÃÓÚ´æ´¢ÊäÈ뱨±íµÄ»·Ðλº³åÇøµÄ´óС£¬Ä¬ÈÏÖµÊÇ8 HidD_SetNumInputBuffer ÉèÖÃÇý¶¯³ÌÐòÓÃÓÚ´æ´¢ÊäÈ뱨±íµÄ»·Ðλº³åÇøµÄ´óС ÓÃÓÚ²éÕÒºÍʶ±ðÉ豸µÄAPIº¯Êý£¨setupapi.dll£© SetupDiGetClassDevs »ñµÃHIDµÄÐÅÏ¢£¬Õë¶ÔÒѰ²×°µÄÉ豸£¬»Ø´«Ò»¸öÖ¸ÏòÆäÐÅÏ¢¼¯µÄ´úÂë SetupDiEnumDeviceInterfaces ÇëÇó»ñµÃÉ豸ÐÅϢȺÄÚµÄÒ»¸öÉ豸µÄÐÅÏ¢ SetupDiGetDeviceInterfaceDetail ÇëÇó»ñµÃÉ豸µÄ·¾¶ SetupDiDestroyDeviceInfoList ÊÍ·ÅSetupDiGetClassDevsʹÓõÄ×ÊÔ´ ÓÃÓÚ´ò¿ª¡¢¹Ø±ÕÉ豸ºÍʵÏÖÊý¾Ý´«Ë͵ÄAPIº¯Êý£¨kernal32.dll£© CreatFile È¡µÃÉ豸µÄ·¾¶ºó£¬µ÷Óøú¯Êý»ñµÃÉ豸´úºÅ 202 ¼ÆËã»ú¸ß¼¶½Ó¿Úʵ¼ù WriteFile ÏòÉ豸´«ËÍÊä³ö±¨±í ReadFile ´ÓÉ豸¶ÁÈ¡ÊäÈ뱨±í CloseHandle ¹Ø±ÕÉ豸£¬ÊÍ·ÅCreateFileËùʹÓõÄ×ÊÔ´

8.5.2 ²éÕÒHIDµÄ¹ý³Ì

ÔÚʵÏÖHIDµÄ·ÃÎÊ֮ǰ£¬Ê×ÏÈÒª²éÕÒÖ¸¶¨£¨¸ù¾ÝÉ豸µÄ³§ÉÌID¡¢²úÆ·IDºÍ²úÆ·ÐòÁкţ©µÄHID¡£²éÕÒÖ¸¶¨É豸µÄ¹ý³ÌÈçÏ£º

? µ÷Óú¯ÊýHidD_GetHidGuid»ñµÃUSBÉ豸µÄGUID£»

? µ÷Óú¯ÊýSetupDiGetClassDevs£¬»ñµÃÒ»¸ö°üº¬È«²¿HIDÐÅÏ¢µÄ½á¹¹Êý×éµÄÖ¸Õ룬ÏÂÃæ¸ù¾Ý´ËÊý×éÖðÏî²éÕÒÖ¸¶¨µÄHID£»

? µ÷Óú¯ÊýSetupDiEnumDeviceInterfaces£¬ÌîдSP_DEVICE_INTERFACE_DATA½á¹¹µÄÊý¾ÝÏ¸Ã½á¹¹ÓÃÓÚʶ±ðÒ»¸öHIDÉ豸½Ó¿Ú£»

? µ÷Óú¯ÊýSetupDiGetDeviceInterfaceDetail£¬»ñµÃÒ»¸öÖ¸Ïò¸ÃÉ豸µÄ·¾¶Ãû£» ? µ÷Óú¯ÊýCreateFile£¬»ñµÃÉ豸¾ä±ú£»

? µ÷Óú¯ÊýHidD_GetAttributes£¬ÌîдHIDD_ATTRIBUTES½á¹¹µÄÊý¾ÝÏ¸Ã½á¹¹°üº¬É豸µÄ³§ÉÌID¡¢²úÆ·IDºÍ²úÆ·ÐòÁкţ¬±ÈÕÕÕâЩÊýֵȷ¶¨¸ÃÉ豸ÊÇ·ñÊDzéÕÒµÄÉ豸¡£

²éÕÒHIDµÄÁ÷³ÌÈçÏÂͼ¡£

µÚ8Õ USB½Ó¿ÚHIDÉ豸 203

¿ªÊ¼ µ÷ÓÃHidD_GetHidGuid»ñµÃGUID µ÷ÓÃSetupDiGetClassDevs»ñµÃÈ«²¿HIDÐÅÏ¢ µ÷ÓÃSetupDiEnumDeviceInterfaces»ñµÃÌØ¶¨HIDʶ±ðÐÅÏ¢ µ÷ÓÃSetupDiGetDeviceInterfaceDetail»ñµÃÌØ¶¨HID·¾¶Ãû µ÷ÓÃCreateFile»ñµÃÌØ¶¨HID¾ä±ú µ÷ÓÃHidD_GetAttributes»ñµÃÌØ¶¨HIDµÄ³§ÉÌID¡¢²úÆ·ID ÕÒµ½Ö¸¶¨HID£¿ No No ²éÕÒÍê±Ï£¿ Yes ½áÊø Yes ͼ8-6 ²éÕÒÉ豸µÄÁ÷³Ì

ÏÂÃæ½éÉÜVBʵÏֵIJéÕÒ¹ý³Ì¡£ (1) »ñµÃGUID

Ó¦ÓóÌÐòÒªÓëHIDÉ豸ͨÐÅ֮ǰ£¬±ØÐëÏÈ»ñµÃHIDÀà±ðµÄGUID£¨Globally Unique Indentifer£©¡£GUIDÊÇÒ»¸ö128λµÄÊýÖµ£¬Ã¿¸ö¶ÔÏó¶¼ÓÐΩһµÄGUID¡£HIDÀà±ðµÄGUID°üº¬ÔÚhidclass.hÎĵµÄÚ£¬¿ÉÒÔ½ÓÒýÓ㬻òÊÇʹÓà HidD_GetHidGuidº¯ÊýÀ´È¡µÃHIDÀà±ðµÄ GUID¡£

? º¯ÊýÉùÃ÷ Public Declare Function HidD_GetHidGuid Lib \) As Long ? GUID½á¹¹ËµÃ÷ Public Type GUID Data1 As Long Data2 As Integer Data3 As Integer 204 ¼ÆËã»ú¸ß¼¶½Ó¿Úʵ¼ù Data4(7) As Byte End Type ? ±äÁ¿ËµÃ÷ Dim HidGuid as GUID ? µ÷Óà Call HidD_GetHidGuid(HidGuid) (2) »ñµÃHIDµÄ½á¹¹Êý×é

µÃµ½GUIDºóµ÷ÓÃSetupDiGetClassDevsº¯Êý´«»ØËùÓÐÒѾ­Á¬½Ó²¢ÇÒ¼ì²â¹ýµÄHID°üº¬ÆäÐÅÏ¢µÄ½á¹¹Êý×éµÄµØÖ·¡£

? º¯ÊýÉùÃ÷

Public Declare Function SetupDiGetClassDevs Lib \\ ByRef ClassGuid As GUID, _ ByVal Enumerator As String, _ ByVal hwndParent As Long, _ ByVal Flags As Long) _ As Long ? ³£Á¿ËµÃ÷

Public Const DIGCF_PRESENT = &H2

Public Const DIGCF_DEVICEINTERFACE = &H10

? µ÷ÓÃ

hDevInfoSet = SetupDiGetClassDevs( HidGuid, _ ?ͨ¹ýHidD_GetHidGuidº¯Êý»ñµÃGUID vbNullString, _ 0, _ (DIFCG_PRESENT or DIFCG_DEVICEINTERFACE) _ )

¸Ãº¯ÊýµÄClassGuid²ÎÊýֵΪͨ¹ýHidD_GetHidGuidº¯Êý»ñµÃGUID¡£EnumeratorÓëhwndParent²ÎÊýûÓÐÓõ½£¬Flags²ÎÊýÊÇÁ½¸ö¶¨ÒåÔÚsetupapi.hÎĵµÄÚµÄϵͳ³£Êý¡£´úÂëÖеÄFlags³£Êý¸æËßSetupDiGetClassDevsº¯ÊýֻѰÕÒĿǰ´æÔÚ£¨Á¬½Ó²¢ÇÒ¼ì²â¹ý£©µÄÉ豸½Ó¿Ú£¬²¢ÇÒÊÇHIDÀà±ðµÄ³ÉÔ±¡£

·µ»ØÖµhDevlnfoSetÊǰüº¬ËùÓÐÁ¬½Ó²¢ÇÒ¼ì²âµ½µÄÈ«²¿HIDµÄÐÅÏ¢µÄ½á¹¹Êý×éµÄµØÖ·¡£ÔÚ³ÌÐòÖв¢²»ÐèÒª·ÃÎÊhDevInfoSetµÄÔªËØ£¬Ö»ÐèÒª½«hDevlnfSetÖµ´«¸øSetupDiEnumDeviceInterfacesº¯Êý¼´¿É¡£

µ±³ÌÐò²»ÔÙÐèÒªhDevInfoSetÖ¸ÏòµÄÊý×éʱ£¬Ó¦¸Ãµ÷Óà SetupDiDestroyDeviceInfo Listº¯ÊýÀ´ÊÍ·Å×ÊÔ´¡£

ÏÂÃæÔÚhDevInfoSetÖ¸ÏòµÄ½á¹¹Êý×éÖвéÕÒ¡£ (3) ʶ±ðHID½Ó¿Ú

½ÓÏÂÀ´µ÷ÓÃSetupDiEnumDeviceInterfaces£¬ÌîдSP_DEVICE_INTERFACE_DATA½á¹¹µÄÊý¾ÝÏ¸Ã½á¹¹ÓÃÓÚʶ±ðÒ»¸öHIDÉ豸½Ó¿Ú¡£

? º¯ÊýÉùÃ÷ Public Declare Function SetupDiEnumDeviceInterfaces Lib \ ByVal DeviceInfoSet As Long, _ µÚ8Õ USB½Ó¿ÚHIDÉ豸 205

ByVal DeviceInfoData As Long, _

ByRef InterfaceClassGuid As GUID, _ ByVal MemberIndex As Long, _

ByRef DeviceInterfaceData As SP_DEVICE_INTERFACE_DATA _ )As Long

? ½á¹¹¶¨Òå

Public Type SP_DEVICE_INTERFACE_DATA cbSize As Long

InterfaceClassGuid As GUID Flags As Long Reserved As Long End Type

? ±äÁ¿ËµÃ÷

Dim Result as Long

Dim MemberIndex as Long

Dim MyDeviceInterfaceData as SP_DEVICE_INTERFACE_DATA

? µ÷ÓÃ

MyDeviceInterfaceData.cbSize = LenB(MyDeviceInterfaceData) MemberIndex = 0

Result = SetupDiEnumDeviceInterfaces( DeviceInfoSet, _ ?SetupDiGetClassDevsµÄ·µ»ØÖµ 0, _ HidGuid, _ ?ͨ¹ýHidD_GetHidGuidº¯Êý»ñµÃµÄGUID MemberIndex, _ ?µÚÒ»´Îµ÷ÓÃÉèÖÃΪ0 MyDeviceInterfaceData _ )

²ÎÊýcbSizeÊÇSP_DEVICE_INTERFACE_DATA½á¹¹µÄ´óС£¬ÒÔ×Ö½ÚΪµ¥Î»¡£ÔÚµ÷ÓÃSetupDiEnumDeviceInterfacesº¯Êý֮ǰ£¬cbSize±ØÐë´¢´æÔڽṹÄÚÀ´µ±×ö´«µÝµÄ²ÎÊý¡£

²ÎÊýHidGuidºÍDeviceInfoSetÊǺ¯Êý֮ǰµÄ´«»ØÖµ¡£

DeviceInfoDataÊÇSP_DEVICE_INTERFACE_DATA½á¹¹µÄÖ¸Õ룬ÓÃÀ´ÏÞÖÆ¼ì²âÌØ¶¨É豸µÄ½Ó¿Ú¡£MemberIndexÊÇDeviceInfoSetÊý×éµÄË÷ÒýÖµ£¬ÔÚ±éÀúÕû¸öÊý×éµÄÑ­»·ÖÐMemberIndexµÝÔö¡£MyDeviceInterfaceDataÊǻش«µÄ½á¹¹£¬ÓÃÀ´Ê¶±ðHIDµÄÒ»¸ö½Ó¿Ú¡£

(4) »ñµÃÉ豸·¾¶

ÏÂÃæÍ¨¹ýµ÷ÓÃSetupDiGetDeviceInterfaceDetailº¯ÊýÓÃÀ´»ñµÃÁíÍâÒ»¸ö½á¹¹£ºSP_DEVICE_INTERFACE_DETAIL_DATA¡£´Ë½á¹¹Óëǰһ¸öº¯ÊýSetupDiEnumDeviceInterfacesËùʶ±ðµÄÉ豸½Ó¿ÚÓйء£½á¹¹µÄDevicePath³ÉÔ±ÊÇÒ»¸öÉ豸·¾¶£¬Ó¦ÓóÌÐò¿ÉÒÔÓôË·¾¶À´ÊµÏÖÓë¸ÃÉ豸µÄͨÐÅ¡£

? º¯ÊýÉùÃ÷£º Public Declare Function SetupDiGetDeviceInterfaceDetail Lib \ Alias \ ByVal DeviceInfoSet As Long, _ ByRef DeviceInterfaceData As SP_DEVICE_INTERFACE_DATA, _ ByVal DeviceInterfaceDetailData As Long, _ ByVal DeviceInterfaceDetailDataSize As Long, _ ByRef RequiredSize As Long, _ ByVal DeviceInfoData As Long _ ) As Long 206 ¼ÆËã»ú¸ß¼¶½Ó¿Úʵ¼ù

? ½á¹¹ÉùÃ÷

Public Type SP_DEVICE_INTERFACE_DETAIL_DATA cbSize As Long

DevicePath As Byte End Type

? ±äÁ¿¶¨Òå

Dim Needed as Long, DetailData as long

Dim MyDeviceInterfaceDetailData As SP_DEVICE_INTERFACE_DETAIL_DATA Dim DetailDataBuffer() as Byte Dim DevicePathName As String

? µ÷ÓÃ

MyDeviceInterfaceData.cbSize = LenB(MyDeviceInterfaceData)

Result = SetupDiGetDeviceInterfaceDetailA( DeviceInfoSet, _ DeviceInterfaceData, _ 0, _ 0, _ Needed, _ 0 _ )

DetailData = needed

MyDeviceInterfaceDetailData.cbSize = Len(MyDeviceInterfaceDetailData) ReDim DetailDataBuffer(Needed)

Call RtlMoveMemory(DetailDataBuffer(0), MyDeviceInterfaceDetailData, 4) Result = SetupDiGetDeviceInterfaceDetailA( DeviceInfoSet, _ DeviceInterfaceData, _ VarPtr(DetailDataBuffer(0)), _ DetailData, _ Needed, _ 0 _ )

? ת»»³É×Ö·û´®£¬ÔÙת»»³ÉUnicode²¢´ÓÖÐɾ³ý4¸ö×Ö·ûµÃµ½É豸·¾¶ DevicePathName = Cstr(DetailDataBuffer())

DevicePathName = StrCovn(DevicePathName, vbUnicode)

DevicePathName = Right$(DevicePathName, Len(DevicePathName)-4)

DeviceInterfaceDetailDataSize°üº¬DeviceInterfaceData½á¹¹µÄ´óС£¬ÒÔ×Ö½ÚΪµ¥Î»¡£µ«ÊÇ£¬ÔÚµ÷ÓÃSetupDiGetDeviceInterfaceDetailº¯Êý֮ǰÎÞ·¨ÖªµÀ´ËÊýÖµµÄ´óС£¬Èç¹ûûÓÐDeviceInterfaceDetailDataSizeº¯Êý£¬SetupDiGetDeviceInterfaceDetailº¯Êý²»»á´«»ØËùÐèµÄ½á¹¹¡£

Õâ¸öÎÊÌâµÄ½â¾ö·½Ê½ÊÇÁ½´Îµ÷ÓÃSetupDiGetDeviceInterfaceDetailº¯Êý¡£µÚÒ»´Îµ÷ÓÃʱGetLastErrorº¯Êý»á´«»Ø´íÎóÐÅÏ¢£¬¼´£ºThe data erea passed to a system call is too small£¬µ«ÊÇRequireSize²ÎÊý»á°üº¬ÕýÈ·µÄDeviceInterfaceDetailDataSizeÊýÖµ¡£Ôٴε÷ÓÃʱ´«µÝ´Ë´«»ØÖµ£¬º¯Êý¾Í»áÖ´Ðгɹ¦¡£

(5) »ñµÃÉ豸¾ä±ú

È¡µÃÉ豸µÄ·¾¶ÒԺ󣬾ͿÉÒÔ×¼±¸¿ªÊ¼ÓëÉ豸ͨÐÅ¡£Ê¹ÓÃCreateFileÀ´´ò¿ªÒ»¸öHIDÉ豸£¬²¢ÇÒÈ¡µÃ´ËÉ豸µÄ¾ä±ú£¬Ê¹ÓÃÉ豸µÄ¾ä±úÀ´ÓëÉ豸½»»»Êý¾Ý¡£µ±²»ÔÙÐèÒª·ÃÎÊ´ËÉ豸ʱ£¬Ó¦¸Ãµ÷ÓÃCIoseHandleº¯ÊýÀ´¹Ø±ÕÉ豸²¢ÊÍ·Åϵͳ×ÊÔ´¡£

µÚ8Õ USB½Ó¿ÚHIDÉ豸 207

? º¯ÊýÉùÃ÷£º

Public Declare Function CreateFile Lib \ ByVal lpFileName As String, _ ByVal dwDesiredAccess As Long, _ ByVal dwShareMode As Long, _

ByRef lpSecurityAttributes As Long, _ ByVal dwCreationDisposition As Long, _ ByVal dwFlagsAndAttributes As Long, _ ByVal hTemplateFile As Long _ ) As Long

? ³£Á¿¶¨Òå

Public Const GENERIC_READ = &H80000000 Public Const GENERIC_WRITE = &H40000000 Public Const FILE_SHARE_READ = &H1 Public Const FILE_SHARE_WRITE = &H2 Public Const OPEN_EXISTING = 3

? µ÷ÓÃ

HidDevice = CreateFile( _ DevicePathName, _

GENERIC_READ Or GENERIC_WRITE, _

(FILE_SHARE_READ Or FILE_SHARE_WRITE), _ 0, _

OPEN_EXISTING, _ 0, _ 0 )

(6) »ñµÃÉ豸µÄ³§ÉÌID¡¢²úÆ·IDºÍ²úÆ·ÐòÁкÅ

Ҫʶ±ðÒ»¸öÉ豸ÊÇ·ñÊÇËùÒªµÄÉ豸£¬Ö»Òª±È½Ï´ËÉ豸µÄ³§ÉÌÓë²úÆ·ID ¼´¿É¡£

HidD_GetAttributesº¯ÊýÓÃÀ´È¡µÃÒ»¸ö°üº¬³§ÉÌÓë²úÆ·IDÒÔ¼°²úÆ·µÄ°æ±¾ºÅÂëµÄ½á¹¹¡£

? º¯ÊýÉùÃ÷

Public Declare Function HidD_GetAttributes Lib \ByVal HidDeviceObject As Long, _

ByRef Attributes As HIDD_ATTRIBUTES _ ) As Long

? ½á¹¹ËµÃ÷

Public Type HIDD_ATTRIBUTES Size As Long

VendorID As Integer ?³§ÉÌID ProductID As Integer ?²úÆ·ID VersionNumber As Integer ?²úÆ·°æ±¾ºÅ End Type

? ±äÁ¿¶¨Òå

Dim DeviceAttributes As HIDD_ATTRIBUTES

? µ÷ÓÃ

DeviceAttributes.Size = LenB(DeviceAttributes) Result = HidD_GetAttributes( _ HidDevice, _ ?ÓÉCreateFileº¯Êý·µ»Ø DeviceAttributes )

208 ¼ÆËã»ú¸ß¼¶½Ó¿Úʵ¼ù HidDeviceÊÇÓÉ CreateFileº¯ÊýËù´«»ØµÄÉ豸¾ä±ú¡£Èç¹ûCreateFileº¯Êý´«»ØµÄÊÇ·ÇÁãÖµ£¬DeviceAttributes½á¹¹¾Í»áÌîдÕýÈ·Öµ¡£Ó¦ÓóÌÐò¿ÉÒÔÓÉDeviceAttributes½á¹¹È¡µÃ³§ÉÌID¡¢²úÆ·IDÒÔ¼°²úÆ·µÄ°æ±¾ºÅÂë¡£

Èç¹û³§ÉÌÓë²úÆ·ID²»ÊÇÏë²éÕҵģ¬Ó¦ÓóÌÐòÓ¦¸ÃʹÓÃCloseHandleº¯ÊýÀ´¹Ø±Õ¸ÃÉ豸£¬È»ºóÒÆµ½ÏÂÒ»¸öSetupDiEnumDeviceInterfacesËù¼ì²âµ½µÄÏÂÒ»¸öHlD¼ÌÐø²éÕÒ¡£µ±Ó¦ÓóÌÐò¼ì²âµ½Ö¸¶¨µÄÉ豸»òÊǼì²âÍêÈ«²¿HID£¬ËüÓ¦¸Ãµ÷ÓÃ

SetupDiDestroyDeviceInfoListº¯ÊýÀ´ÊÍ·ÅSetupDiGetClassDevsº¯ÊýËù±£ÁôµÄ×ÊÔ´¡£

8.5.3 »ñµÃHIDµÄÄÜÁ¦

»ñµÃÉ豸µÄÄÜÁ¦ÊÇ¿ÉÒÔ½øÒ»²½Á˽âHIDµÄÊֶΣ¬µ«²»ÊDZØÐëµÄ¡£Èç¹ûÔÚ²éÕÒÉ豸ʱ£¬Èç¹ûͨ¹ý³§ÉÌID¡¢²úÆ·IDºÍ²úÆ·ÐòÁкſÉÒÔÈ·¶¨Ìض¨µÄÉ豸£¬Ò»°ãÊÇÒÑÖªÉ豸µÄϸ½ÚÐÅÏ¢ÁË¡£Èç¹û²»Í¨¹ý³§ÉÌID¡¢²úÆ·IDºÍ²úÆ·ÐòÁкÅÈ·¶¨É豸£¬ÁíÒ»¸ö·½·¨ÊÇͨ¹ý»ñµÃÉ豸ÄÜÁ¦À´È·¶¨É豸¡£

»ñµÃHIDµÄÄÜÁ¦µÄ¹ý³ÌÖ÷Òª¾­¹ýÒÔϼ¸¸ö²½Ö裺

? ÏÈʹÓÃHidD_GetPreparsedDataº¯Êý»ñµÃÒ»¸ö°üº¬É豸ÄÜÁ¦ÐÅÏ¢µÄ»º³åÇøµÄÖ¸

Õ룬µ÷ÓÃHidP_GetCaps»ñµÃÃèÊöHIDµÄÄÜÁ¦µÄÊý¾Ý½á¹¹£» ? µ÷ÓÃHidP_GetValueCapsÈ¡µÃÃèÊöÄÜÁ¦µÄÊýÖµ¡£ (1) »ñµÃÃèÊöHIDÄÜÁ¦µÄÊý¾Ý½á¹¹

? º¯ÊýÉùÃ÷ Public Declare Function HidD_GetPreparsedData Lib \ ByVal HidDeviceObject As Long, _ ByRef PreparsedData As Long ) As Long ? ±äÁ¿¶¨Òå Dim PreparsedData As Long ? µ÷Óà Result = HidD_GetPreparsedData (HidDevice, _ ? ÓÉCreateFile»ñµÃµÄÉ豸¾ä±ú PreparsedData _ ) PreparsedDataÊÇÒ»¸ö°üº¬Êý¾ÝµÄ»º³åÇøµÄÖ¸Õë¡£³ÌÐò²¢²»ÐèÒª·ÃÎÊ»º³åÇøÄÚµÄÊý¾Ý£¬Ö»ÐèÒª½«»º³åÇøµÄ¿ªÊ¼µØÖ·´«µÝ¸øÆäËûµÄAPIº¯Êý¡£µ±Ó¦ÓóÌÐò²»ÔÙÐèÒªPreparsedDataʱ£¬ËüÓ¦¸Ãµ÷ÓÃHidD_FreePreparsedDataº¯ÊýÀ´ÊÍ·Åϵͳ×ÊÔ´¡£

½ÓÏÂÀ´µ÷ÓÃHidP_GetCaps£¬¸Ãº¯Êý´«»ØÒ»¸ö½á¹¹£¬ÀïÃæ°üº¬É豸ÄÜÁ¦µÄÐÅÏ¢£¬°üÀ¨É豸µÄUsage Page¡¢Usage¡¢±¨±í³¤¶ÈÒÔ¼°°´Å¥ÄÜÁ¦ºÍÊýÖµÄÜÁ¦µÈµÄÊýÄ¿¡£Èç¹û²»Ê¹Óó§ÉÌÓë²úÆ·IDÀ´Ê¶ÁíÉ豸£¬HidP_GetCapsº¯Êý´«»ØµÄÉ豸ÄÜÁ¦ÐÅÏ¢¿ÉÒÔ°ïÖú¾ö¶¨ÊÇ·ñ¼ÌÐøÓë´ËÉ豸ͨÐÅ¡£

? º¯ÊýÉùÃ÷ Public Declare Function HidP_GetCaps Lib \ ByVal PreparsedData As Long, _ ByRef Capabilities As HIDP_CAPS ) As Long ? ½á¹¹¶¨Òå Public Type HIDP_CAPS µÚ8Õ USB½Ó¿ÚHIDÉ豸 209

Usage As Integer ? Ó÷¨ UsagePage As Integer ? Ó÷¨Ò³ InputReportByteLength As Integer ? ÊäÈ뱨±í³¤¶È OutputReportByteLength As Integer ? Êä³ö±¨±í³¤¶È FeatureReportByteLength As Integer ? ÌØÕ÷±¨±í³¤¶È Reserved(16) As Integer

NumberLinkCollectionNodes As Integer ? Óɺ¯ÊýHidP_GetLinkCollectionNodes ? ·µ»ØµÄ¶¥²ã¼¯ºÏÁ¬½ÓÊýÄ¿ NumberInputButtonCaps As Integer ? Óɺ¯ÊýHidP_GetButtonCaps·µ»ØµÄ

? °üº¬ÊäÈë°´Å¥ÄÜÁ¦µÄ½á¹¹HIDP_BUTTON_ ? CAPSµÄÊýÄ¿ NumberInputValueCaps As Integer ? Óɺ¯ÊýHidP_GetValueCaps·µ»ØµÄ

? °üº¬ÊäÈëÊýÖµÄÜÁ¦µÄ½á¹¹HIDP_VALUE_ ¡® CAPSµÄÊýÄ¿ NumberInputDataIndices As Integer ? ÔÚÊäÈ뱨±íÖÐÓйذ´¼üºÍÊýÖµµÄÊý¾Ý

? ָʾÆ÷£¨Data Indices£©µÄÊýÄ¿ NumberOutputButtonCaps As Integer ? Óɺ¯ÊýHidP_GetButtonCaps·µ»ØµÄ

? °üº¬Êä³ö°´Å¥ÄÜÁ¦µÄ½á¹¹HIDP_BUTTON_ ? CAPSµÄÊýÄ¿ NumberOutputValueCaps As Integer ? Óɺ¯ÊýHidP_GetValueCaps·µ»ØµÄ

? °üº¬Êä³öÊýÖµÄÜÁ¦µÄ½á¹¹HIDP_VALUE_ ¡® CAPSµÄÊýÄ¿ NumberOutputDataIndices As Integer ? ÔÚÊä³ö±¨±íÖÐÓйذ´¼üºÍÊýÖµµÄÊý¾Ý ? ָʾÆ÷£¨Data Indices£©µÄÊýÄ¿ NumberFeatureButtonCaps As Integer ? Óɺ¯ÊýHidP_GetButtonCaps·µ»ØµÄ

? °üº¬ÌØÕ÷°´Å¥ÄÜÁ¦µÄ½á¹¹HIDP_BUTTON_ ? CAPSµÄÊýÄ¿ NumberFeatureValueCaps As Integer ? Óɺ¯ÊýHidP_GetValueCaps·µ»ØµÄ

? °üº¬ÌØÕ÷ÊýÖµÄÜÁ¦µÄ½á¹¹HIDP_VALUE_ ¡® CAPSµÄÊýÄ¿ NumberFeatureDataIndices As Integer ? ÔÚÌØÕ÷±¨±íÖÐÓйذ´¼üºÍÊýÖµµÄÊý¾Ý ? ָʾÆ÷£¨Data Indices£©µÄÊýÄ¿ End Type

? ±äÁ¿¶¨Òå

Dim Capabilities As HIDP_CAPS

? µ÷ÓÃ

Result = HidP_GetCaps (_ PreparsedData, _ ? Óɺ¯ÊýHidD_GetPreparsedData¶¨Òå Capabilities )

HidP_GetCapsº¯ÊýÌîдCapabilities½á¹¹ÖеÄÊý¾ÝÏCapabilities½á¹¹³ÉԱ˵Ã÷ÁËHIDµÄ»ù±¾ÐÅÏ¢¡£ÕâЩÐÅÏ¢°üÀ¨£º

? Ó÷¨Ò³ºÍÓ÷¨£ºUsagePage¡¢Usage£»

? ÊäÈë¡¢Êä³öºÍÌØÕ÷±¨±í³¤¶È£ºInputReportByteLength¡¢

OutputReportByteLengthºÍ FeatureReportByteLength£»

? Óɺ¯ÊýHidP_GetLinkCollectionNodes·µ»ØµÄ¶¥²ã¼¯ºÏÁ¬½ÓÊýÄ¿

NumberLinkCollectionNodes

? ÔÚÊäÈë¡¢Êä³öºÍÌØÕ÷±¨±íµÄ°´Å¥¡¢ÊýÖµºÍÊý¾ÝָʾÆ÷µÄµÄÊýÄ¿¡£

210 ¼ÆËã»ú¸ß¼¶½Ó¿Úʵ¼ù

(2) »ñµÃÃèÊöHIDÊýÖµÄÜÁ¦µÄÊý¾Ý½á¹¹

ͨ¹ýHidP_GetCaps»ñµÃµÄHIDµÄ»ù±¾ÄÜÁ¦ÐÅÏ¢²»ÊÇÄÜ´ÓÉ豸µÃµ½È«²¿ÐÅÏ¢£¬»¹¿ÉÒÔµ÷ÓÃÁíÒ»¸öº¯ÊýHidP_GetValueCap£¬¸Ãº¯Êý¿ÉÒÔ»ñµÃ±¨±íÃèÊö·ûÖеÄÊýÖµºÍ°´Å¥µÄÄÜÁ¦¡£HidP_GetValueCap·µ»ØµÄÊǰüº¬Á˱¨±íÃèÊö·ûÖÐÈ«²¿ÊýÖµÐÅÏ¢µÄ½á¹¹µÄÖ¸Õë¡£

? º¯ÊýÉùÃ÷

Public Declare Function HidP_GetValueCaps Lib \ ByVal ReportType As Integer, _ ByRef ValueCaps As Byte, _ ByRef ValueCapsLength As Integer, _ ByVal PreparsedData As Long _ ) As Long

? ReportType³£Á¿¶¨Òå

Public Const HidP_Input = 0 Public Const HidP_Output = 1 Public Const HidP_Feature = 2

Public Type HidP_Value_Caps UsagePage As Integer ReportID As Byte IsAlias As Long BitField As Integer LinkCollection As Integer LinkUsage As Integer LinkUsagePage As Integer IsRange As Long IsStringRange As Long IsDesignatorRange As Long IsAbsolute As Long HasNull As Long Reserved As Byte BitSize As Integer ReportCount As Integer Reserved2 As Integer Reserved3 As Integer Reserved4 As Integer Reserved5 As Integer Reserved6 As Integer LogicalMin As Long LogicalMax As Long PhysicalMin As Long PhysicalMax As Long UsageMin As Integer UsageMax As Integer StringMin As Integer StringMax As Integer DesignatorMin As Integer DesignatorMax As Integer DataIndexMin As Integer DataIndexMax As Integer End Type

? ±äÁ¿¶¨Òå

Dim ValueCaps(1023) As Byte ? µ÷ÓÃ

Result = HidP_GetValueCaps (_ HidP_Input, _

µÚ8Õ USB½Ó¿ÚHIDÉ豸 211 ValueCaps(0), _ Capabilities.NumberInputValueCaps, _ PreparsedData ) (3) Êä³ö±¨±íµ½É豸

µ±Ó¦ÓóÌÐòÈ¡µÃHIDÉ豸µÄ¾ä±ú£¬²¢ÇÒÖªµÀÊä³ö±¨±íµÄ×Ö½ÚÊýÄ¿ºó£¬Ëü¾Í¿ÉÒÔ´«ËÍÊä³ö±¨±í¸ø´ËÉ豸¡£Ó¦ÓóÌÐòÏȽ«Òª´«Ë͵ÄÊý¾Ý¸´ÖƵ½Ò»¸ö»º³åÇøÄÚ£¬È»ºóµ÷ÓÃWriteFileº¯Êý¡£»º³åÇøµÄ´óСµÈÓÚHidP_GetCapsº¯Êý·µ»ØµÄHIDP_CAPS½á¹¹µÄOutputReportByte LengthÊôÐÔÖµ¡£Õâ¸ö´óСֵµÈÓÚ±¨±íµÄ×Ö½Ú´óС£¬ÔÙ¼ÓÉÏÒ»¸ö×Ö½ÚµÄReport ID¡£Report IDÊÇ»º³åÇøµÄµÚÒ»¸ö×Ö½Ú¡£

HlDÇý¶¯³ÌÐòÓÃÀ´È·¶¨Êä³ö±¨±íµÄ´«ÊäÀàÐÍ£¬¸ù¾ÝWindowsµÄ°æ±¾ÒÔ¼°HID½Ó¿ÚÓÐÎÞÖжÏÊä³ö¶Ëµã¶ø¶¨¡£Ó¦ÓóÌÐò²»ÐèÒª¸ÉÔ¤£¬µÍ½×µÄÇý¶¯³ÌÐò»á×Ô¶¯´¦Àí¡£

? º¯ÊýÉùÃ÷

Public Declare Function WriteFile Lib \ ByVal hFile As Long, _ ByRef lpBuffer As Byte, _ ByVal nNumberOfBytesToWrite As Long, _ ByRef lpNumberOfBytesWritten As Long, _ ByVal lpOverlapped As Long _ ) As Long

? ±äÁ¿¶¨Òå

Dim SendBuffer() As Byte

Dim OutputReportData(7) As Byte Dim Count as Long

? µ÷ÓÃ

ReDim SendBuffer(Capabilities.OutputReportByteLength - 1) SendBuffer(0) = 0 ? Report ID

? ½«×¼±¸µÄÊý¾Ý´ÓOutputReportData¸´ÖƵ½SendBuffer

For Count = 1 To Capabilities.OutputReportByteLength - 1 SendBuffer(Count) = OutputReportData(Count - 1) Next Count

NumberOfBytesWritten = 0 Result = WriteFile( _ HidDevice, _ ? ÓÉCreateFileº¯Êý·µ»ØµÄÉ豸¾ä±ú SendBuffer(0), _ ? Êä³ö±¨±í»º´æ CLng(Capabilities.OutputReportByteLength), _ ? ÒªÊä³ö×Ö½ÚÊý NumberOfBytesWritten, _ ? ʵ¼ÊÊä³öµÄ×Ö½ÚÊý

0 )

Èç¹ûº¯Êý·µ»ØµÄResultÊýÖµ²»µÈÓÚÁ㣬±íʾº¯Êý³É¹¦Ö´ÐС£

Èç¹û½Ó¿ÚÖ»Ö§³ÖÊýֵΪ0µÄReport ID£¬Õâ¸öReport ID²¢²»´«ËÍ£¬µ«ÐèÒª³öÏÖÔÚÓ¦ÓóÌÐò´«¸øWriteFileº¯ÊýµÄ»º³åÇøÄÚ¡£

WriteFileº¯ÊýÔÚHIDͨÐÅÖÐ×î³£·¢ÉúµÄ´íÎóÊÇCRC error¡£´Ë´íÎó±íʾÖ÷»ú¿ØÖÆÆ÷ÊÔͼҪ´«Ëͱ¨±í£¬µ«ÊÇûÓдÓÉ豸ÊÕµ½Ô¤ÆÚµÄÏìÓ¦¡£Í¨³£¸Ã´íÎó²»ÊÇ·¢ÉúÔÚCRC¼ÆËãʱËù¼ì²âµ½µÄ´íÎ󣬶øÊÇÒòΪÖ÷»úûÓÐÊÕµ½¹Ì¼þÔ¤ÆÚµÄÏìÓ¦¡£

(4) ´ÓÉ豸ÊäÈë³ö±¨±í

µ±Ó¦ÓóÌÐòÈ¡µÃHIDÉ豸µÄ¾ä±ú£¬²¢ÇÒÖªµÀÊäÈ뱨±íµÄ×Ö½ÚÊýÄ¿ºó£¬¾Í¿ÉÒÔ´Ó´ËÉ豸¶ÁÈ¡ÊäÈ뱨±í¡£Ó¦ÓóÌÐòÏÈÉùÃ÷Ò»¸ö»º³åÇøÀ´´¢´æÊý¾Ý£¬È»ºóµ÷ÓÃReadFileº¯Êý¡£ÓÃÀ´´¢

212 ¼ÆËã»ú¸ß¼¶½Ó¿Úʵ¼ù

´æÊý¾ÝµÄ»º³åÇø´óСµÈÓÚHidP_GetCapsº¯ÊýËù·µ»ØµÄHIDP_CAPS½á¹¹µÄInputReport

ByteLengthÊôÐÔÖµ¡£

? º¯ÊýÉùÃ÷

Public Declare Function ReadFile Lib \ ByVal hFile As Long, _ ByRef lpBuffer As Byte, _ ByVal nNumberOfBytesToRead As Long, _ ByRef lpNumberOfBytesRead As Long, _ ByVal lpOverlapped As Long _ ) As Long

? ±äÁ¿¶¨Òå Dim Count

Dim NumberOfBytesRead As Long Dim ReadBuffer() As Byte ? ÊäÈ뻺³åÇø£¬×Ö½Ú0ΪReport ID ReDim ReadBuffer(Capabilities.InputReportByteLength - 1)

? µ÷ÓÃ

Result = ReadFile( _ HidDevice, _ ? ÓÉCreateFileº¯Êý·µ»ØµÄÉ豸¾ä±ú ReadBuffer(0), _ ? ÊäÈ뻺³åÇøÊ×µØÖ· CLng(Capabilities.InputReportByteLength), _ ? Òª¶ÁÈ¡µÄ×Ö½ÚÊý NumberOfBytesRead, _ ? ¶Áµ½µÄ×Ö½ÚÊý

0 )

ReadBuffer×Ö½ÚÊý×é°üº¬±¨±íµÄÊý¾Ý¡£Èç¹ûº¯Êý·µ»ØµÄResultÊýÖµ²»µÈÓÚÁ㣬±íʾº¯Êý³É¹¦Ö´ÐС£

ͨ¹ýReadFile¶ÁÈ¡µÄ»º³åÇøµÄµÚÒ»¸ö×Ö½ÚÊÇReport ID£¬ºóÐøÊÇ´ÓÉ豸¶ÁÈ¡µÄ±¨±íÊý¾Ý¡£Èç¹û½Ó¿ÚÖ»Ö§³ÖÒ»¸öReport ID£¬´ËReport ID²»ÔÚ×ÜÏßÉÏ´«Ê䣬µ«»á³öÏÖÔÚReadBuffer»º³åÇøÄÚ¡£

µ÷ÓÃReadFileº¯Êý²»»áÁ¢¿Ì¿ªÊ¼×ÜÏßÉϵĴ«Ê䣬ֻÊÇÖ÷»úÔÚ¶¨Ê±µÄÖжÏÊäÈë´«ÊäÖжÁȡһ¸ö±¨±í¡£Èç¹ûûÓÐδ¶ÁÈ¡µÄ±¨±í£¬¾ÍµÈ´ýÏÂÒ»¸ö´«ÊäÍê³É¡£Ö÷»úÔÚ¼ì²âÉ豸ºó¿ªÊ¼ÇëÇó±¨±í£¬µ±HlDÇý¶¯³ÌÐò¼ÓÔØºó£¬Çý¶¯³ÌÐò½«±¨±í´¢´æÔÚ»·×´»º³åÇøÄÚ¡£µ±»º³åÇøÒѾ­ÌîÂú²¢ÓÐеı¨±íµ½´ïʱ£¬¾ÉµÄ±¨±í»á±»¸²¸Ç¡£µ÷ÓÃReadFileº¯Êý»á¶ÁÈ¡»º³åÇøÄÚ×î¾ÉµÄ±¨±í¡£

ÔÚWindows 98 SEÒÔ¼°ºóÀ´µÄ°æ±¾ÖУ¬Ä¬ÈϵĻ·×´»º³åÇø³ß´çÊÇ8¸ö±¨±í¡£Ó¦ÓóÌÐò¿ÉÒÔʹÓÃHidD_SetNumInputBuffersº¯ÊýÀ´ÉèÖûº³åÇøµÄ´óС¡£Èç¹ûÓ¦ÓóÌÐòûÓÐÆµ·±µÄÇëÇó±¨±í£¬ÓÐЩ±¨±í¾Í»á¶ªÊ§¡£Èç¹û²»ÏëÒª¶ªÊ§±¨±í£¬¾ÍÓ¦¸Ã¸ÄÓÃÌØÕ÷±¨±í¡£

Èç¹û±¨±íµÄÊý¾Ý´ÓÉÏÒ»´Î´«Êäºó¾ÍûÓиı䣬ÏÐÖÃËÙÂʾö¶¨É豸ÊÇ·ñÒª´«Ëͱ¨±í¡£ÔÚ¼ì²âÉ豸ʱHlDÇý¶¯³ÌÐò»áÊÔͼ½«É豸µÄÏÐÖÃËÙÂÊÉèÖÃΪ0£¬Õâ±íʾ³ý·Ç±¨±íµÄÊý¾ÝÓиıä·ñÔòHID²»»á´«Ëͱ¨±í¡£Ã»ÓпÉÒԸıäÏÐÖÃËÙÂʵÄAPIº¯Êý¡£

Èç¹ûÉ豸¾Ü¾ø½«ÏÐÖÃËÙÂÊÉèÖÃΪ0£¬¿ÉÒÔ´«»ØStallÀ´ÏìÓ¦Set_IdleÇëÇóÀ´Í¨ÖªÖ÷»úÉ豸²»Ö§³Ö¸ÃÇëÇó¡£

Èç¹ûÉ豸²»Ö§³ÖSet_IdleÇëÇ󣬶øÇÒÓ¦ÓóÌÐòÖ»Òª¶Áȡһ´Î±¨±í£¬¹Ì¼þ¿ÉÒÔÉèÖóÉÖ»´«ËÍÒ»´Î±¨±í¡£ÔÚËͱ¨±íºó£¬¹Ì¼þ¿ÉÒÔÉèÖö˵㴫»ØNAKÀ´ÏìÓ¦ÊäÈëÁîÅÆÐÅÏ¢°ü¡£Èç¹ûÉ豸ÓÐеÄÊý¾ÝÒª´«ËÍ£¬¹Ì¼þ¿ÉÒÔÉèÖö˵ãÀ´´«»Ø¸ÃÊý¾Ý¡£·ñÔòÉ豸»áÔÚÖ÷»úÂÖѯ¶Ëµãʱ¼ÌÐø´«ËÍÏàͬµÄ±¨±í£¬Ó¦ÓóÌÐòÒ²»áÖØ¸´µØ¶ÁÈ¡ÏàͬµÄ±¨±í¡£

µÚ8Õ USB½Ó¿ÚHIDÉ豸 213

ÉÏÃæ³ÌÐòÖÐReadFileµÄ×îºóÒ»¸ö²ÎÊýΪ0£¬±íʾReadFileµ÷ÓÃÊÇ×èÈûµÄ¡£µ±Ó¦ÓóÌÐòÔÚ»·Ðλº³åÇøÎª¿Õʱµ÷ÓÃReadFile£¬Ó¦ÓóÌÐò½«»á±»¹ÒÆð£¬Ö±µ½ÓÐÊäÈ뱨±íΪֹ£¬·ñÔòÖ»Äܰ´ÏÂCtrl£«Alt£«DelÀ´¹Ø±ÕÓ¦ÓóÌÐò£¬»òÊÇ´Ó×ÜÏßÉÏÒÆ³ýÉ豸¡£

²ÉÓöàÏ̷߳½Ê½±à³Ì¿ÉÒԽϺõĽâ¾öÕâ¸öÎÊÌ⣬ÔÚÁíÒ»¸öÏß³ÌÖе÷ÓÃReadFile¿ÉÒÔ±ÜÃâÖ÷Ï̱߳»¹ÒÆð£¬ÔÚʹÓÃVisual Basic±àд¶àÏß³ÌÓ¦ÓóÌÐò»áÓöµ½À§ÄÑ£¬ÕâÊÇÒòΪVisual Basic±¾Éí²»Ö§³Ö¶àÏ̡߳£¶øÔÚVisual C++±àдAPI·½Ê½Í¨ÐųÌÐòʱ¿ÉÒÔ²ÉÓöàÏ̷߳½Ê½£¬ReadFileº¯Êýµ÷Ó÷¢ÉúÔÚÒ»¸ö¶ÀÁ¢µÄỊ̈߳¬ÕâÑù¿ÉÒÔʵÏÖÖØµþI/O²Ù×÷¡£

½â¾öµÄ°ì·¨Ö®Ò»ÊDZ£Ö¤É豸ÓÀÔ¶ÓÐÊý¾Ý´«ËÍ£¬¿ÉÒÔ½«¹Ì¼þÉè¼ÆÎªÊäÈë¶ËµãÓÀÔ¶ÆôÓò¢ÇÒ×¼±¸ÏìÓ¦ÒªÇó¡£Èç¹ûûÓÐеÄÊý¾Ý´«ËÍ£¬É豸¿ÉÒÔ´«ËÍÉÏÒ»´ÎµÄÊý¾Ý£¬»òÊÇ´«»ØÒ»¸öÌØ¶¨´úÂëÀ´Ö¸Ê¾Ã»ÓÐеÄÊý¾Ý¡£

Ò²¿ÉÒÔ²ÉÓÃÕâÑùµÄ·½·¨£¬ÔÚµ÷ÓÃReadFile֮ǰ£¬Ó¦ÓóÌÐòÏȵ÷ÓÃWriteFileÀ´´«ËÍÒ»¸ö±¨±í£¬±¨±íÄÚ¿ÉÒÔ°üº¬Ò»¸öÌØ¶¨´úÂëÀ´¸æË߹̼þ×¼±¸´«ËÍÊý¾Ý£¬ÕâÑùµ±Ó¦ÓóÌÐòµ÷ÓÃReadFileʱ£¬É豸µÄ¶Ëµã¾Í»áÆôÓò¢ÇÒÓÐÊý¾Ý×¼±¸´«ËÍ¡£

±È½ÏºÃµÄ·½·¨ÊÇʹÓÃReadFileµÄÖØµþÑ¡Ïî¡£ÔÚÖØµþµÄ¶ÁȡʱReadFileº¯Êý»áÁ¢¼´·µ»Ø£¨¼´Ê¹Ã»ÓпɶÁÊý¾Ý£©£¬È»ºóÓ¦ÓóÌÐòµ÷Óà WaitForSingleObjectº¯ÊýÀ´¶ÁÈ¡Êý¾Ý¡£WaitForSingleObjectº¯Êý¿ÉÒÔÉèÖÃÔÝÍ££¬Èç¹ûÊý¾ÝÔÚÖ¸¶¨Ê±¼äÄÚÉÐδµÖ´ï£¬´Ëº¯Êý»á´«»ØÒ»¸öÂëÀ´Ö¸Ê¾´ËÇé¿ö£¬È»ºóÓ¦ÓóÌÐò¿ÉÒÔʹÓÃCancelIoº¯ÊýÀ´È¡Ïû¶ÁÈ¡¶¯×÷¡£

ҪʹÓÃÖØµþI/O£¬CreateFileº¯Êý±ØÐëÔÚdwFlagsAndAttributes²ÎÊýÖд«µÝÒ»¸öÖØµþµÄ½á¹¹¡£Ó¦ÓóÌÐòµ÷ÓÃCreateEventº¯Êý½¨Á¢Ò»¸öʼþ¶ÔÏó£¬ÔÚReadFileÍê³Éºó´Ëʼþ¶ÔÏó»á±»ÉèÖóÉÐźÅ״̬¡£µ±Ó¦ÓóÌÐòµ÷ÓÃReadFileʱ£¬Ëü´«µÝÒ»¸öÖØµþ½á¹¹µÄÖ¸Õë£¬ÖØµþ½á¹¹µÄhEvent²ÎÊýÊÇÒ»¸öʼþ¶ÔÏóµÄ´úºÅ¡£Ó¦ÓóÌÐòµ÷Óà WaitForSingleObjectº¯ÊýÀ´´«µÝ´Ëʼþ´úºÅ£¬ÒÔ¼°Ò»¸öÒÔmsΪµ¥Î»µÄÖ¸¶¨Ê±¼ä¼ä¸ô¡£ÔÚ¶ÁÈ¡µ½Êý¾Ý»òµ½´ï¸Ãʱ¼ä¼ä¸ôʱ£¬´Ëº¯Êý²Å·µ»Ø¡£

? º¯ÊýÉùÃ÷

Public Declare Function ReadFile Lib \ ByVal hFile As Long, _ ByRef lpBuffer As Byte, _ ByVal nNumberOfBytesToRead As Long, _ ByRef lpNumberOfBytesRead As Long, _ ByVal lpOverlapped As Long _ ) As Long

Public Declare Function CreateEvent Lib \ ByVal SecurityAttributes As Long, _ ByVal bManualReset As Long, _ ByVal bInitialState As Long, _ ByVal lpName As String ) As Long

Public Declare Function WaitForSingleObject Lib ¡°kernal32.dll¡± (_ ByVal hHandle as Long, _ ByVal dwMilliseconds as Long ) as Long

? ÖØµþ½á¹¹ÉùÃ÷

Public Type OVERLAPPED Internal as Long InternalHigh as Long Offset as Long OffsetHigh as Long hEvent as Long

214 ¼ÆËã»ú¸ß¼¶½Ó¿Úʵ¼ù End Type

? ³£Á¿¶¨Òå

Public Const FILE_FLAG_OVERLAPPED = &H40000000

? ±äÁ¿¶¨Òå

Dim EventObject as Long

Dim HIDOverlapped as OVERLAPPED

? ²¿·Ö´úÂë

EventObject = CreatEvent (0&, True, True, ¡°¡±) HIDOverlapped.hEvent = EventObject HIDOverlapped.Offset = 0

HIDOverlapped.OffsetHigh = 0

HidDevice = CreateFile( _ DevicePathName, _

GENERIC_READ Or GENERIC_WRITE, _

(FILE_SHARE_READ Or FILE_SHARE_WRITE), _ 0, _

OPEN_EXISTING, _ FILE_FLAG_OVERLAPPED, _ 0

) ? »ñµÃHIDÉ豸¾ä±ú

Result = ReadFile( _ HidDevice, _ ? ÓÉCreateFileº¯Êý·µ»ØµÄÉ豸¾ä±ú ReadBuffer(0), _ ? ÊäÈ뻺³åÇøÊ×µØÖ· CLng(Capabilities.InputReportByteLength), _ ? Òª¶ÁÈ¡µÄ×Ö½ÚÊý NumberOfBytesRead, _ ? ¶Áµ½µÄ×Ö½ÚÊý

HIDOverlapped

) ? ¶ÁÈ¡±¨±í£¬Í¬Ê±´«ËÍÒ»¸öÖ¸Õëµ½ÖØµþ½á¹¹

Result = WaitForSingleObject (EventObject, 5000) ? µÈ´ýReadFileÍê³É£¬³¬Ê±¼ä¸ôÉèΪ5Ãë

(5) ÌØÕ÷±¨±íµÄ´«ËÍ

Ó¦ÓóÌÐòµ÷ÓÃHidD_SetFeatureº¯Êý´«ËÍÒ»¸öÌØÕ÷±¨±íµ½É豸¡£

? º¯ÊýÉùÃ÷ Public Declare Function HidD_SetFeature Lib \ ByVal HidDeviceObject As Long, _ ByRef ReportBuffer As Byte, _ ByVal ReportBufferLength As Long ) As Long ? µ÷Óà Result = HidD_SetFeature( _ HidDevice, _ ? ÓÉCreateFileº¯Êý·µ»ØµÄÉ豸¾ä±ú SendBuffer(0), _ ? Êä³ö»º³åÇøÊ×µØÖ· CLng(Capabilities.FeatureReportByteLength) ? ÌØÕ÷±¨±í³¤¶È×Ö½ÚÊý ) µÚ8Õ USB½Ó¿ÚHIDÉ豸 215

APIº¯ÊýHidD_GetFeatureÓÃÓÚ´ÓÉ豸¶ÁÈ¡ÌØÕ÷±¨±í£¬Í¨¹ý¶Ô¸ÃAPIº¯ÊýµÄµ÷Óã¬Ö÷»ú¿ØÖÆÆ÷ÒÔ¿ØÖÆ´«ÊäËͳöGet_FeatureÇëÇ󣬲¢ÔÚÊý¾Ý½×¶Î£¬É豸»Ø´«ÌØÕ÷±¨±í¡£

? º¯ÊýÉùÃ÷ Public Declare Function HidD_GetFeature Lib \ ByVal HidDeviceObject As Long, _ ByRef ReportBuffer As Byte, _ ByVal ReportBufferLength As Long ) As Long ? µ÷Óà Result = HidD_GetFeature( _ HidDevice, _ ? ÓÉCreateFileº¯Êý·µ»ØµÄÉ豸¾ä±ú ReadBuffer(0), _ ? Êä³ö»º³åÇøÊ×µØÖ· CLng(Capabilities.FeatureReportByteLength) ? ÌØÕ÷±¨±í³¤¶È×Ö½ÚÊý ) (6) ¹Ø±ÕÉ豸

µ±½áÊøÓëHIDµÄͨÐÅ£¬ÐèÒªµ÷ÓÃCloseHandleº¯Êý¹Ø±ÕͨÐÅ

? º¯ÊýÉùÃ÷ Public Declare Function CloseHandle Lib \ ByVal hObject As Long _ ) As Long ? µ÷Óà Result = CloseHandle(HidDevice) 8.6 HIDʵÑé

±¾½Ú½éÉÜͨ¹ý¸ß¼¶½Ó¿ÚʵÑę́½øÐеÄÒ»¸öHID±à³ÌʵÑé¡£

ÔÚUSBÉ豸Èí¼þµÄ¿ª·¢¹ý³ÌÖУ¬½èÖúÓÚһЩ¹¤¾ßÈí¼þµÄ²âÊÔ»á¶ÔUSBÉ豸µÄÐÅÏ¢»ñÈ¡ºÍͨÐŹý³ÌÓÖ¸üÉîÈëµÄÀí½â¡£USB²âÊÔÈí¼þÓкܶ࣬ÈçUSBView¡¢BusHoundµÈ£¬ÏÂÃæÕë¶ÔÒ»¸ö¾ßÌåµÄHIDÉ豸µÄAPIͨÐÅÈí¼þµÄ¿ª·¢£¬¶ÔÕâÁ½¸ö¹¤¾ßÈí¼þ×÷Ò»¼òµ¥½éÉÜ¡£

¸ß¼¶½Ó¿ÚʵÑę́ÖУ¬ÓÐÒ»¸öHIDʵÑ飬ÔÚ¸ÃʵÑéÖУ¬ÊµÑę́ͨ¹ý¹Ì¼þÈí¼þÉè¼ÆÁËÒ»¸ö¼òµ¥µÄHID·ÂÕæÉ豸£¬ÔÚPCµÄAPIͨÐÅÈí¼þµÄ¿ª·¢¹ý³ÌÖУ¬¿ÉÒÔ½èÖúUSB¹¤¾ßÈí¼þ¶ÔʵÑę́µÄHIDÉ豸½øÐвâÊÔ¡£

8.6.1 »ñµÃÃèÊö·û

½«¸ß¼¶½Ó¿ÚʵÑę́ͨ¹ýUSBµçÀÂÓëPCÁ¬½Óºó£¬ÔÚʵÑę́ÉÏͨ¹ý²Ëµ¥Ñ¡ÔñHIDʵÑ飬ʵÑę́ÏÔʾÆ÷ÏÔʾÆ÷ÉÏ»áÏÔʾHIDʵÑé½çÃæ¡£

ʵÑę́µÄHIDʵÑéÊÇÒ»¸öΪÁËѧϰHID±à³Ì¶ø×¨ÃÅÉè¼ÆµÄÒ»¸ö¼òµ¥µÄHID·ÂÕæÉ豸£¬É豸ÖÐÉè¼ÆÁË8¸ö¼Ä´æÆ÷£¨R1~R8£©£¬¿ÉÒÔͨ¹ýUSB½Ó¿ÚÓëÖ÷»ú½»»»Êý¾Ý¡£ÆäÖÐR1ºÍR2Á½¸ö¼Ä´æÆ÷Ö»ÊÇÊý¾Ý´æ´¢µ¥Ôª£¬Ö÷»ú¿ÉÒÔ¶ÔÕâÁ½¸ö¼Ä´æÆ÷½øÐи½Öµ£¬Ò²¿ÉÒÔ¶ÁÈ¡¼Ä´æÆ÷µÄÖµ¡£¼Ä´æÆ÷R3~R8¹¹³ÉÁËÒ»¸öÈÕÆÚºÍʱÖÓ£¬6¸ö¼Ä´æÆ÷µÄÖµ·Ö±ð±íʾÄê¡¢Ô¡¢ÈÕ¡¢Ê±¡¢·Ö¡¢Ã롣ʱÖÓÔÚµ±Ç°ÖµµÄ»ù´¡ÉÏÔËÐУ¬¿ÉÒÔͨ¹ýÖ÷»ú¶ÔʱÖÓ½øÐÐÉèÖã¬Ò²¿ÉÒÔ¶ÁÈ¡µ±Ç°µÄʱÖÓÖµ¡£

ÔÚʵÑę́ÉÏÉè¼ÆÁË×Ô¶¯»Ø´«¹¦ÄÜ£¬Èç¹û×Ô¶¯»Ø´«´ò¿ª£¬Ê±ÖÓÿһÃëÏòÖ÷»ú´«ËÍÒ»´Î±¨

216 ¼ÆËã»ú¸ß¼¶½Ó¿Úʵ¼ù

±í¡£ÊµÑę́¿ÉÒÔÏÔʾ·¢ËͺͽÓÊÕµÄÓÐЧÊý¾Ý×Ö½ÚÊý¡£

==========USB½Ó¿Ú´«Êä¿ØÖÆÊµÑé========== ¼Ä´æÆ÷ R1£º00000000 = 00H R2£º00000000 = 00H ʱÖÓ 00 Äê 01 Ô 01 ÈÕ 00 µã 00 ·Ö 00 Ãë R3 R4 R5 R6 R7 R8 ʱÖÓ×Ô¶¯»Ø´«£º¹Ø±Õ USB:¿ØÖÆÄ£Ê½ ´«Ê伯Êý£ºÊÕ0000 ·¢0000 ÖÐ¶Ï ´ò¿ª ¼ÆÊý ½áÊø ½øÈë »Ø´« ÇåÁã ʵÑé ͼ8-7 ¸ß¼¶½Ó¿ÚʵÑę́HIDʵÑé½çÃæ

USBViewÊÇMicrosoftÌṩµÄÒ»¸ö¼òµ¥µÄUSB²âÊÔÈí¼þ£¬¸Ã¹¤¾ßÈí¼þÊÇÒ»¸öÍêÈ«µÄÂÌÉ«Èí¼þ£¬Ö»ÓÐÒ»¸öEXE³ÌÐòÎĽ«£¬²»ÐèÒª°²×°£¬ÔÚWindows»·¾³ÏÂÖ±½ÓÔËÐС£

USBViewÆäÖ÷Òª¹¦ÄÜÊÇ»ñµÃUSBÉ豸µÄ¸÷¸öÃèÊö·û¡£

¿ÉÒÔÔËÐÐUSBView»ñµÃʵÑę́·ÂÕæµÄHIDÉ豸µÄÃèÊö·û£¬ÔËÐÐUSBViewºóÏÔʾÒÔϳÌÐò½çÃæ¡£

ͼ8-8 USBViewÔËÐнçÃæ

´°¿ÚµÄ×ó²àÏÔʾȫ²¿µÄUSBÉ豸Á¬½ÓÊ÷£¬ÔÚÆäÖÐÕÒµ½Ò»¸öÏÔʾ¡°USBÈËÌ幤³ÌѧÉ豸¡±µÄ·ÖÖ§£¬Ñ¡ÖкóÓҲര¿ÚÏÔʾȫ²¿µÄ£¨±¨±íÃèÊö·û³ýÍ⣩ÃèÊö·û¡£USBViewÏÔʾµÄ¸ß¼¶½Ó¿ÚʵÑę́µÄHID·ÂÕæÉ豸µÄÃèÊö·ûÈçÏ¡£

Device Descriptor: bcdUSB: bDeviceClass: 0x0110 0x00 bDeviceSubClass: bDeviceProtocol: bMaxPacketSize0: idVendor: idProduct: bcdDevice: iManufacturer: iProduct: iSerialNumber: bNumConfigurations:

ConnectionStatus: DeviceConnected Current Config Value: 0x01 Device Bus Speed: Full Device Address: 0x02 Open Pipes: 4

Endpoint Descriptor: bEndpointAddress: 0x81 Transfer Type: Bulk wMaxPacketSize: 0x0010 (16) bInterval: 0x0A

Endpoint Descriptor: bEndpointAddress: 0x01 Transfer Type: Bulk wMaxPacketSize: 0x0010 (16) bInterval: 0x0A

Endpoint Descriptor: bEndpointAddress: 0x82 Transfer Type: Interrupt wMaxPacketSize: 0x0040 (64) bInterval: 0x01

Endpoint Descriptor: bEndpointAddress: 0x02 Transfer Type: Interrupt wMaxPacketSize: 0x0040 (64) bInterval: 0x01

µÚ8Õ USB½Ó¿ÚHIDÉ豸 217 0x00 0x00 0x10 (16) 0x045E (Microsoft Corporation) 0x930A 0x0100 0x01 0x02 0x03 0x01

8.6.2 É豸µÄ³õʼ»¯

ÔÚ½«¸ß¼¶½Ó¿ÚʵÑę́Á¬½Óµ½¼ÆËã»ú²¢²Ù×÷ʵÑę́½øÈëHID½Ó¿ÚʵÑéºó£¬Windowsϵͳ»á·¢ÏÖÉ豸²¢¶ÁÈ¡É豸µÄ¸÷ÖÖÃèÊö·û£¬¿ÉÒÔͨ¹ýÒ»¸öUSB¹¤¾ßÈí¼þ½ØÈ¡WindowsºÍÉ豸֮¼äµÄÇëÇóÓ¦´ð¹ý³Ì¡£¹¤¾ßÈí¼þBusHound¿ÉÒÔʵÏÖÕâ¸ö¹¦ÄÜ¡£

BunHoundÊÇÒ»¸ö¹¦ÄÜÈ«ÃæµÄ×ÜÏß·ÖÎöÒÇÈí¼þ£¬¿ÉÒÔʵÏÖ¶Ô¼ÆËã»úͨ¹ý¸÷ÖÖ½Ó¿ÚÁ¬½ÓµÄÉ豸µÄͨÐŹý³Ì½øÐнØÈ¡ºÍ·ÖÎö¡£Í¼8-9ÊÇBusHoundµÄÉ豸Á¬½ÓÊ÷£¨Devices£©½çÃæ¡£

µ±¸ß¼¶½Ó¿ÚʵÑę́Óë¼ÆËã»úͨ¹ýUSB½Ó¿ÚÁ¬½Ó²¢²Ù×÷ʵÑę́½øÈëHIDʵÑ飬¿ÉÒÔÔÚBusHoundµÄÉ豸Á¬½ÓÊ÷ÖÐÕÒµ½Ò»¸ö¡°USBÈËÌ幤³ÌѧÉ豸¡±ÏîÄ¿¡£Ñ¡ÖиÃÏîÄ¿¿ÉÒÔʵÏÖ¶ÔÉ豸µÄͨÐŹý³ÌµÄ½ØÈ¡¡£

Ñ¡Öи߼¶½Ó¿ÚʵÑę́µÄHIDÉ豸Ï½øÈëµ½²É¼¯£¨Capture£©½çÃæ£¬ÏÈ¿ØÖÆÊµÑę́Í˳öHIDʵÑ飬°´BusHoundµÄ²É¼¯½çÃæµÄStop°´Å¥£¬ÔÙ°´Run°´Å¥£¬È»ºó¿ØÖÆÊµÑę́½øÈëHIDʵÑé½çÃæ¡£Windowsϵͳ·¢ÏÖÉ豸²¢ÇëÇóÉ豸µÄ¸÷ÖÖÃèÊö·û£¬È»ºóÍê³É¶ÔÉ豸µÄ±ØÒªµÄÉèÖã¬BusHound¿ÉÒԲɼ¯µ½ÒÔÉÏͨÐŹý³Ì¡£

218 ¼ÆËã»ú¸ß¼¶½Ó¿Úʵ¼ù

ͼ8-9 BusHoundµÄÉ豸Ê÷ÏÔʾ½çÃæ

ͼ8-10 BusHoundµÄ²É¼¯ÏÔʾ½çÃæ

µÚ8Õ USB½Ó¿ÚHIDÉ豸 219

ÏÂÃæ·ÖÎöBusHound½ØÈ¡µÄÊý¾ÝÄÚÈÝ¡£ ? Ö÷»ú·¢ËÍ£º80 06 00 01 00 00 12 00 Get_DescriptorÇëÇó£¬ÇëÇóÉ豸»Ø´«É豸ÃèÊö·û¡£

? É豸·¢ËÍ£º12 01 10 01 00 00 00 10 5e 04 0a 93 00 01 01 02 03 01 É豸ÃèÊö·ûÄÚÈÝ£ºUSB°æ±¾=1.1¡¢Àà±ð/ЭÒéÂë=0¡¢EP0µÄ×î´ó°ü³ß´ç=10¡¢

VID=045E¡¢PID=930A¡¢°æ±¾=1.0¡¢³§ÉÌ¡¢²úÆ·ºÍÐòÁкÅ×Ö·û´®Ë÷Òý¡¢ÅäÖÃÊý=1¡£ ? Ö÷»ú·¢ËÍ£º80 06 00 02 00 00 09 00

Get_DescriptorÇëÇó£¬ÇëÇóÉ豸»Ø´«ÅäÖÃÃèÊö·û¡£ ? É豸·¢ËÍ£º09 02 37 00 01 01 04 80 32

ÅäÖÃÃèÊö·ûÄÚÈÝ£º¸ÃÃèÊö·û¼°ºóÐøÃèÊö·û×ܳ¤¶È=55¡¢Ö§³Ö½Ó¿ÚÊý=1¡¢ÅäÖñêʾ·û=1¡¢×ÜÏß¹©µç¡¢×î´ó100mA¡£ ? Ö÷»ú·¢ËÍ£º80 06 00 02 00 00 37 00

Get_DescriptorÇëÇó£¬ÇëÇóÉ豸»Ø´«ÅäÖᢽӿڡ¢HIDºÍ¶ËµãÃèÊö·û¡£

? É豸·¢ËÍ£º09 02 37 00 01 01 04 80 32 09 04 00 00 04 03 00 00 05 09 21 01 01 00

01 22 34 00 07 05 81 02 10 00 0a 07 05 01 02 10 00 0a 07 05 82 03 40 00 01 07 05 02 03 40 00 01 °´Ë³ÐòΪ£º 9×Ö½ÚÅäÖÃÃèÊö·û£ºº¬ÒåͬÉÏ¡£

9×Ö½Ú½Ó¿ÚÃèÊö·û£º±êʾ·û=0¡¢Ö§³ÖµÄ¶Ëµã=4¡¢Àà±ð=HID¡£

9×Ö½ÚHIDÃèÊö·û£º°æ±¾=1.01¡¢ÓÐ1¸ö±¨±íÃèÊö·û£¨³¤¶ÈΪ52£© 7×ֽڶ˵ãÃèÊö·û£º1ºÅÅúÁ¿ÊäÈ룬°ü³ß´ç=16¡£ 7×ֽڶ˵ãÃèÊö·û£º1ºÅÅúÁ¿Êä³ö£¬°ü³ß´ç=16¡£

7×ֽڶ˵ãÃèÊö·û£º2ºÅÖжÏÊäÈ룬°ü³ß´ç=64¡¢1msÂÖѯ¡£ 7×ֽڶ˵ãÃèÊö·û£º2ºÅÖжÏÊä³ö£¬°ü³ß´ç=64¡¢1msÂÖѯ¡£ ? Ö÷»ú·¢ËÍ£º00 09 01 00 00 00 00 00

Set_ConfiguationÇëÇó£¬ÅäÖúÅ=1¡£ ? Ö÷»ú·¢ËÍ£º21 0a 00 00 00 00 00 00 Set_IdleÇëÇó£¬É趨¼ä¸ôʱ¼äΪ0¡£ ? É豸·¢ËÍ£º04 00 00 c0

STALL£¬²»Ö§³ÖÇëÇó¡£

? Ö÷»ú·¢ËÍ£º81 06 00 22 00 00 74 00

Get_DescriptorÇëÇó£¬ÇëÇóÉ豸»Ø´«±¨±íÃèÊö·û¡£

? É豸·¢ËÍ£º06 a0 ff 09 01 a1 01 09 02 a1 00 06 a1 ff 09 03 09 04 15 80 25 7f 35 00

45 ff 75 08 95 40 81 02 09 05 09 06 15 80 25 7f 35 00 45 ff 75 08 95 40 91 02 c0 c0 ±¨±íÃèÊö·û¡£

8.6.3 HID²âÊÔ³ÌÐòµÄʵÏÖ

ʹÓÃVisual Basic±àдһ¸öÕë¶Ô¸ß¼¶½Ó¿ÚʵÑę́µÄÓ¦ÓóÌÐò£¬ÊµÏÖÓëÉ豸µÄͨÐÅ¡£¸Ã²âÊÔ³ÌÐòʵÏÖÒÔϹ¦ÄÜ£º

? ²éÕÒÉ豸£º¸ù¾ÝÖ¸¶¨µÄVIDºÍPIDʵÏÖÉ豸²éÕÒ£» ? »ñµÃÉ豸ÄÜÁ¦£ºµ÷ÓÃÏàÓ¦µÄAPI£¬»ñµÃÉ豸µÄÄÜÁ¦£»

? ·¢Ëͱ¨±í£º½«½çÃæÊäÈëµÄR1~R8µÄÊýÖµ°´ÕÕ±¨±íµÄÖ¸¶¨¸ñʽ´«Ë͵½É豸£» ? ½ÓÊÕ±¨±í£º½«É豸µÄ½çÃæÏÔʾµÄR1~R8µÄÊýÖµ¶ÁÈ¡µ½Ó¦ÓóÌÐò£» ? ÏÔʾAPIº¯Êýµ÷ÓÃÐÅÏ¢£ºÏÔʾÿһ¸öAPIº¯ÊýµÄµ÷Óýá¹û£» ? ¹Ø±ÕÉ豸¡£

220 ¼ÆËã»ú¸ß¼¶½Ó¿Úʵ¼ù

ÏÂͼÊdzÌÐòÔËÐеĽçÃæÏÔʾ¡£

ͼ8-11 Õë¶ÔʵÑę́µÄHID²âÊÔ³ÌÐòÏÔʾ½çÃæ

ÔÚ»ñµÃÄÜÁ¦µÄAPIº¯ÊýµÄµ÷Óýá¹ûÖУ¬ÊäÈ뱨±íºÍÊä³ö±¨±íµÄ³¤¶ÈΪ65×Ö½Ú£¬ÔÚ·¢ËͺͽÓÊÕ±¨±íʱµÄ³¤¶ÈÉ趨¶¼ÐèÒªÉèΪ65¡£µ«ÔÚ¸ÃʵÑéÖÐÕæÕýÓõ½µÄÓÐЧÊý¾ÝÖ»ÓÐ8¸ö¼Ä´æÆ÷µÄÊý¾Ý£¬Õ¼ÓÃÆäÖеÄ8¸ö×Ö½Ú£¬±¨±íµÄÊ××Ö½Ú£¨µÚ0¸ö£©Îª0£¬±íʾReport ID¡£µÚ1¡¢2¸ö×Ö½Ú·Ö±ð55h¡¢AAhΪÓû§¶¨ÒåµÄ±êʾ×Ö¡£µÚ3¡¢4×Ö½ÚΪÓû§¶¨ÒåÃüÁî±àÂ룬Êä³ö±¨±íÖÐΪ01¡¢08£¬ÊäÈ뱨±íÖÐΪ02¡¢08¡£´ÓµÚ5µ½µÚ12×Ö½Ú˳ÐòΪR1¡¢R2¡¢¡­R8µÄÖµ¡£Ö®ºóµÄÊý¾ÝΪ±£Áô×Ö½Ú¡£ 'HID²éÕÒ¡¢ÄÜÁ¦¼ì²â¡¢ÊäÈ뱨±í¡¢Êä³ö±¨±íÑÝʾ³ÌÐò 'ÐÞ¸Ä×ÔÐíÓÀºÍµÄ¡¶½éÃæÉè¼ÆÓëʵϰ ʹÓÃBisual Basic¡· Option Explicit '±äÁ¿¶¨Òå ****************************************************************************** Dim Capabilities As HIDP_CAPS Dim DataString As String Dim DetailData As Long Dim DetailDataBuffer() As Byte Dim DeviceAttributes As HIDD_ATTRIBUTES Dim DevicePathName As String Dim DeviceInfoSet As Long Dim ErrorString As String Dim HidDevice As Long µÚ8Õ USB½Ó¿ÚHIDÉ豸 221

Dim LastDevice As Boolean

Dim MyDeviceDetected As Boolean

Dim MyDeviceInfoData As SP_DEVINFO_DATA

Dim MyDeviceInterfaceDetailData As SP_DEVICE_INTERFACE_DETAIL_DATA Dim MyDeviceInterfaceData As SP_DEVICE_INTERFACE_DATA Dim Needed As Long

Dim OutputReportData(7) As Byte Dim PreparsedData As Long Dim Result As Long Dim Timeout As Boolean

Dim MyVendorID As Long 'VID¡¢PID Dim MyProductID As Long

'************************************************************************************** '²éÕÒÈ«²¿µÄHIDÉ豸£¬Ö±µ½ÕÒµ½VID¡¢PID·ûºÏµÄÒ»¸öHID 'Èç¹ûÕÒµ½£¬MyDeviceDetectedΪTrue

'**************************************************************************************

Function FindTheHid() As Boolean

Dim Count As Integer Dim GUIDString As String Dim HidGuid As GUID Dim MemberIndex As Long

LastDevice = False

MyDeviceDetected = False

'µ÷Óà HidD_GetHidGuid º¯Êý»ñµÃGUID

Result = HidD_GetHidGuid(HidGuid)

Call DisplayResultOfAPICall(\

GUIDString = Hex$(HidGuid.Data1) & \

For Count = 0 To 7

If HidGuid.Data4(Count) >= &H10 Then

GUIDString = GUIDString & Hex$(HidGuid.Data4(Count)) & \ Else

GUIDString = GUIDString & \ End If Next Count

lstResults.AddItem \ GUID for system HIDs: \lstResults.AddItem \ \

'µ÷Óà SetupDiGetClassDevs º¯Êý»ñµÃÖ¸ÏòHIDÐÅÏ¢¼¯µÄÖ¸Õë

DeviceInfoSet = SetupDiGetClassDevs(HidGuid, vbNullString, 0, (DIGCF_PRESENT Or DIGCF_DEVICEINTERFACE))

Call DisplayResultOfAPICall(\DataString = GetDataString(DeviceInfoSet, 32)

lstResults.AddItem \ DeviceInfoSet:\

'ÏÂÃæÑ­»·£¬´ÓMemberIndex=0¿ªÊ¼£¬²éÕÒÖ¸¶¨HID MemberIndex = 0

222 ¼ÆËã»ú¸ß¼¶½Ó¿Úʵ¼ù Do

'µ÷Óà SetupDiEnumDeviceInterfaces º¯Êý»ñµÃ SP_DEVICE_INTERFACE_DATA ½á¹¹Ö¸Õë

MyDeviceInterfaceData.cbSize = LenB(MyDeviceInterfaceData)

Result = SetupDiEnumDeviceInterfaces(DeviceInfoSet, 0, HidGuid, MemberIndex, MyDeviceInterfaceData)

Call DisplayResultOfAPICall(\ If Result = 0 Then LastDevice = True

'Èç¹ûµ÷Óóɹ¦ If Result <> 0 Then

'ÏÔʾ»ñµÃµÄÐÅÏ¢

lstResults.AddItem \ DeviceInfoSet for device #\ lstResults.AddItem \ cbSize = \ lstResults.AddItem \ InterfaceClassGuid.Data1 _ = \ lstResults.AddItem \ InterfaceClassGuid.Data2 _ = \ lstResults.AddItem \ InterfaceClassGuid.Data3 _ = \ lstResults.AddItem \ Flags = \

'µ÷Óà SetupDiGetDeviceInterfaceDetailº¯Êý£¬»ñµÃSP_DEVICE_INTERFACE_DETAIL_DATA½á¹¹ '×¢Ò⣺¸Ãº¯ÊýÐèÒªµ÷ÓÃÁ½´Î£¬×îºó»ñµÃÉ豸·¾¶

MyDeviceInfoData.cbSize = Len(MyDeviceInfoData)

Result = SetupDiGetDeviceInterfaceDetail(DeviceInfoSet, MyDeviceInterfaceData, 0, 0, Needed, 0)

DetailData = Needed

Call DisplayResultOfAPICall(\ lstResults.AddItem \ (OK to say too small)\

lstResults.AddItem \ Required buffer size for the data: \

'´æ´¢½á¹¹µÄ³¤¶È

MyDeviceInterfaceDetailData.cbSize = Len(MyDeviceInterfaceDetailData)

ReDim DetailDataBuffer(Needed)

'´æ´¢½á¹¹µÄǰ4ºÍ×Ö½Ú£¬cbSize

Call RtlMoveMemory(DetailDataBuffer(0), MyDeviceInterfaceDetailData, 4)

'ÔÙÒ»´Îµ÷ÓÃ

Result = SetupDiGetDeviceInterfaceDetail(DeviceInfoSet, _ MyDeviceInterfaceData, VarPtr(DetailDataBuffer(0)), DetailData, Needed, 0)

Call DisplayResultOfAPICall(\

lstResults.AddItem \ MyDeviceInterfaceDetailData.cbSize: \

DevicePathName = CStr(DetailDataBuffer())

DevicePathName = StrConv(DevicePathName, vbUnicode) 'ת»»³ÉUnicode DevicePathName = Right$(DevicePathName, Len(DevicePathName) - 4) 'ɾ³ý4¸ö×Ö½Ú lstResults.AddItem \ Device pathname: \ lstResults.AddItem \ \

'µ÷Óà CreateFile º¯Êý£¬»ñµÃÉ豸¾ä±ú£ºHidDevice

µÚ8Õ USB½Ó¿ÚHIDÉ豸 223

HidDevice = CreateFile(DevicePathName, GENERIC_READ Or GENERIC_WRITE, _ (FILE_SHARE_READ Or FILE_SHARE_WRITE), 0, OPEN_EXISTING, 0, 0)

Call DisplayResultOfAPICall(\

lstResults.AddItem \ Returned handle: \

'µ÷Óà HidD_GetAttributes »ñµÃHIDµÄVID¡¢PID

DeviceAttributes.Size = LenB(DeviceAttributes)

Result = HidD_GetAttributes(HidDevice, DeviceAttributes)

Call DisplayResultOfAPICall(\ If Result <> 0 Then

lstResults.AddItem \ HIDD_ATTRIBUTES structure filled without error.\ Else

lstResults.AddItem \ Error in filling HIDD_ATTRIBUTES structure.\ End If

lstResults.AddItem \ Structure size: \

lstResults.AddItem \ Vendor ID: \ lstResults.AddItem \ Product ID: \

lstResults.AddItem \ Version Number: \

'¿´¿´ÊDz»ÊÇÖ¸¶¨µÄVID¡¢PID

If (DeviceAttributes.VendorID = MyVendorID) And (DeviceAttributes.ProductID = MyProductID) Then lstResults.AddItem \ My device detected \

lstResults.AddItem \ -------------------------------------------------------------------------------------------\ lblHID.Caption = \ MyDeviceDetected = True cmdGetCaps.Enabled = True cmdClose.Enabled = True txtVendorID.Enabled = False txtProductID.Enabled = False Else

MyDeviceDetected = False

Result = CloseHandle(HidDevice)

DisplayResultOfAPICall (\ End If End If

MemberIndex = MemberIndex + 1 '×¼±¸²éÕÒÏÂÒ»¸ö

Loop Until (LastDevice = True) Or (MyDeviceDetected = True)

End Function

'************************************************************************************** '»ñµÃÉÏÒ»¸öAPIº¯ÊýµÄÖ´ÐÐÐÅÏ¢

'**************************************************************************************

Private Function GetErrorString(ByVal LastError As Long) As String

Dim Bytes As Long

Dim ErrorString As String ErrorString = String$(129, 0)

Bytes = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, 0&, LastError, 0, ErrorString$, 128, 0)

If Bytes > 2 Then 'È¥µôÆäÖеĻسµ GetErrorString = Left$(ErrorString, Bytes - 2)

224 ¼ÆËã»ú¸ß¼¶½Ó¿Úʵ¼ù End If

End Function

'************************************************************************************** 'Çå³ýÊý¾ÝÓòÏÔʾ

'**************************************************************************************

Private Sub cmdClear_Click()

txtR1.Text = \txtR2.Text = \txtYear.Text = \txtMonth.Text = \txtDay.Text = \txtHour.Text = \txtMinute.Text = \txtSecond.Text = \End Sub

'************************************************************************************** '²éÕÒHID

'**************************************************************************************

Private Sub cmdFindHID_Click() Call FindTheHid End Sub

'************************************************************************************** 'ÏÔʾAPIº¯ÊýµÄÖ´Ðнá¹û

'**************************************************************************************

Private Sub DisplayResultOfAPICall(FunctionName As String)

Dim ErrorString As String lstResults.AddItem \

ErrorString = GetErrorString(Err.LastDllError) lstResults.AddItem FunctionName

lstResults.AddItem \ Result = \End Sub

'************************************************************************************** '³ÌÐò³õʼ»¯

'**************************************************************************************

Private Sub Form_Load() frmMain.Show

tmrDelay.Enabled = False lstResults.Clear

MyVendorID = &H45E MyProductID = &H930A End Sub

'************************************************************************************** '»ñµÃHIDµÄÄÜÁ¦ÐÅÏ¢

'**************************************************************************************

Private Sub cmdGetCaps_click()

µÚ8Õ USB½Ó¿ÚHIDÉ豸 225

Dim ppData(29) As Byte Dim ppDataString As Variant

'µ÷Óà HidD_GetPreparsedData »ñµÃÒ»¸ö»º³åÇøÖ¸Õë

Result = HidD_GetPreparsedData(HidDevice, PreparsedData) Call DisplayResultOfAPICall(\

Result = RtlMoveMemory(ppData(0), PreparsedData, 30) Call DisplayResultOfAPICall(\

ppDataString = ppData()

ppDataString = StrConv(ppDataString, vbUnicode)

'µ÷Óà HidP_GetCaps »ñµÃHID_CAPS ½á¹¹Êý¾Ý

Result = HidP_GetCaps(PreparsedData, Capabilities)

Call DisplayResultOfAPICall(\lstResults.AddItem \ Last error: \

lstResults.AddItem \ Usage: \

lstResults.AddItem \ Usage Page: \

lstResults.AddItem \ Input Report Byte Length: \lstResults.AddItem \ Output Report Byte Length: \lstResults.AddItem \ Feature Report Byte Length: \

lstResults.AddItem \ Number of Link Collection Nodes: \lstResults.AddItem \ Number of Input Button Caps: \lstResults.AddItem \ Number of Input Value Caps: \lstResults.AddItem \ Number of Input Data Indices: \lstResults.AddItem \ Number of Output Button Caps: \lstResults.AddItem \ Number of Output Value Caps: \lstResults.AddItem \ Number of Output Data Indices: \lstResults.AddItem \ Number of Feature Button Caps: \lstResults.AddItem \ Number of Feature Value Caps: \lstResults.AddItem \ Number of Feature Data Indices: \

'µ÷Óà HidP_GetValueCaps »ñµÃHIDÄÜÁ¦µÄÊýÖµ

Dim ValueCaps(1023) As Byte

Result = HidP_GetValueCaps(HidP_Input, ValueCaps(0), Capabilities.NumberInputValueCaps, PreparsedData)

Call DisplayResultOfAPICall(\

lstResults.AddItem \ -------------------------------------------------------------------------------------------\lblCaps.Caption = \

cmdTrans.Enabled = True cmdReceive.Enabled = True End Sub

'************************************************************************************** 'Êä³ö±¨±íµ½HID

'**************************************************************************************

Private Sub cmdTrans_Click()

Dim Count As Integer

Dim NumberOfBytesToSend As Long

226 ¼ÆËã»ú¸ß¼¶½Ó¿Úʵ¼ù Dim NumberOfBytesWritten As Long Dim SendBuffer() As Byte

ReDim SendBuffer(Capabilities.OutputReportByteLength - 1)

'Ìîд±¨±íÊý¾Ýµ½Êý×éSendBuffer Count = 0

SendBuffer(Count) = 0 'µÚÒ»‚€Î»Ôª½MÊÇReport ID Count = Count + 1

SendBuffer(Count) = &H55 Count = Count + 1

SendBuffer(Count) = &HAA Count = Count + 1

SendBuffer(Count) = &H1 Count = Count + 1

SendBuffer(Count) = &H8 Count = Count + 1

SendBuffer(Count) = Val(\Count = Count + 1

SendBuffer(Count) = Val(\Count = Count + 1

SendBuffer(Count) = Val(txtYear.Text) Count = Count + 1

SendBuffer(Count) = Val(txtMonth.Text) Count = Count + 1

SendBuffer(Count) = Val(txtDay.Text) Count = Count + 1

SendBuffer(Count) = Val(txtHour.Text) Count = Count + 1

SendBuffer(Count) = Val(txtMinute.Text) Count = Count + 1

SendBuffer(Count) = Val(txtSecond.Text) Count = Count + 1

'µ÷Óà WriteFile º¯Êý,·¢Ëͱ¨±í

NumberOfBytesWritten = 0

Result = WriteFile(HidDevice, SendBuffer(0), CLng(Capabilities.OutputReportByteLength), NumberOfBytesWritten, 0)

Call DisplayResultOfAPICall(\

lstResults.AddItem \ Output Report\End Sub

'************************************************************************************** '´ÓHID¶ÁÈ¡±¨±í

'×¢Ò⣺ÒÔÏ´úÂëΪ·ÇÖØµþµ÷Ó㬱ØÐë±£Ö¤HIDÊä³ö±¨±í

'**************************************************************************************

Private Sub cmdReceive_click()

Dim Count

Dim NumberOfBytesRead As Long Dim ReadBuffer() As Byte

ReDim ReadBuffer(Capabilities.InputReportByteLength - 1)

'µ÷Óà ReadFile º¯Êý£¬¶ÁÈ¡±¨±í

Result = ReadFile(HidDevice, ReadBuffer(0), CLng(Capabilities.InputReportByteLength), NumberOfBytesRead, 0)

Call DisplayResultOfAPICall(\

lstResults.AddItem \ Input Report\

µÚ8Õ USB½Ó¿ÚHIDÉ豸 227

'½«ÊäÈ뱨±íµÄÊý¾ÝÌîдµ½ÏÔʾ½éÃæµÄÏàÓ¦Êý¾ÝÓò txtR1.Text = Hex$(ReadBuffer(5)) txtR2.Text = Hex$(ReadBuffer(6))

txtYear.Text = IIf(ReadBuffer(7) < 10, \txtMonth.Text = IIf(ReadBuffer(8) < 10, \txtDay.Text = IIf(ReadBuffer(9) < 10, \txtHour.Text = IIf(ReadBuffer(10) < 10, \txtMinute.Text = IIf(ReadBuffer(11) < 10, \txtSecond.Text = IIf(ReadBuffer(12) < 10, \End Sub

'************************************************************************************** '¹Ø±ÕÉ豸£¬ÊÍ·Å×ÊÔ´

'**************************************************************************************

Private Sub cmdClose_Click()

'µ÷Óà CloseHandle ¹Ø±ÕHID

Result = CloseHandle(HidDevice)

Call DisplayResultOfAPICall(\

'µ÷Óà SetupDiDestroyDeviceInfoListºÍHidD_FreePreparsedData ÊÍ·ÅÕ¼ÓõÄ×ÊÔ´

Result = SetupDiDestroyDeviceInfoList(DeviceInfoSet) Call DisplayResultOfAPICall(\Result = HidD_FreePreparsedData(PreparsedData)

Call DisplayResultOfAPICall(\

lstResults.Clear

cmdClose.Enabled = False cmdGetCaps.Enabled = False cmdTrans.Enabled = False cmdReceive.Enabled = False lblHID.Caption = \lblCaps.Caption = \

txtVendorID.Enabled = True txtProductID.Enabled = True End Sub

'************************************************************************************** '½«µ±Ç°ÈÕÆÚºÍʱ¼äÌîдµ½½çÃæµÄÊý¾ÝÓò

'**************************************************************************************

Private Sub cmdNow_Click()

txtHour.Text = IIf(Hour(Now()) < 10, \

txtMinute.Text = IIf(Minute(Now()) < 10, \txtSecond.Text = IIf(Second(Now()) < 10, \

txtYear.Text = IIf((Year(Now()) - 2000) < 10, \txtMonth.Text = IIf(Month(Now()) < 10, \txtDay.Text = IIf(Day(Now()) < 10, \End Sub

'************************************************************************************** '»ñµÃÐÅÏ¢×Ö·û´®

'**************************************************************************************

228 ¼ÆËã»ú¸ß¼¶½Ó¿Úʵ¼ù Private Function GetDataString(Address As Long, Bytes As Long) As String Dim Offset As Integer Dim Result$ Dim ThisByte As Byte For Offset = 0 To Bytes - 1 Call RtlMoveMemory(ByVal VarPtr(ThisByte), ByVal Address + Offset, 1) If (ThisByte And &HF0) = 0 Then Result$ = Result$ & \ End If Result$ = Result$ & Hex$(ThisByte) & \Next Offset GetDataString = Result$ End Function

ÁªÏµ¿Í·þ£º779662525#qq.com(#Ìæ»»Îª@)