µÚ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