Added PS/2 multimeda key support.
HID Consumer page and System control are also supported now. merged mediakey branch: d53a356cd2011b461843a5c7c1527a61692893c1
This commit is contained in:
		
							parent
							
								
									af85b6bba6
								
							
						
					
					
						commit
						6d45e05ede
					
				
					 10 changed files with 447 additions and 350 deletions
				
			
		
							
								
								
									
										37
									
								
								host.h
									
										
									
									
									
								
							
							
						
						
									
										37
									
								
								host.h
									
										
									
									
									
								
							|  | @ -7,7 +7,7 @@ | |||
| /* report id */ | ||||
| #define REPORT_ID_MOUSE     1 | ||||
| #define REPORT_ID_SYSTEM    2 | ||||
| #define REPORT_ID_AUDIO     3 | ||||
| #define REPORT_ID_CONSUMER  3 | ||||
| 
 | ||||
| /* keyboard Modifiers in boot protocol report */ | ||||
| #define BIT_LCTRL   (1<<0) | ||||
|  | @ -30,15 +30,30 @@ | |||
| #define MOUSE_BTN4 (1<<3) | ||||
| #define MOUSE_BTN5 (1<<4) | ||||
| 
 | ||||
| // Consumer Page(0x0C) Consumer Control(0x01)
 | ||||
| #define AUDIO_VOL_UP		(1<<0) | ||||
| #define AUDIO_VOL_DOWN		(1<<1) | ||||
| #define AUDIO_MUTE		(1<<2) | ||||
| // Consumer Page(0x0C)
 | ||||
| #define AUDIO_MUTE              0x00E2 | ||||
| #define AUDIO_VOL_UP            0x00E9 | ||||
| #define AUDIO_VOL_DOWN          0x00EA | ||||
| #define TRANSPORT_NEXT_TRACK    0x00B5 | ||||
| #define TRANSPORT_PREV_TRACK    0x00B6 | ||||
| #define TRANSPORT_STOP          0x00B7 | ||||
| #define TRANSPORT_PLAY_PAUSE    0x00CD | ||||
| #define AL_CC_CONFIG            0x0183 | ||||
| #define AL_EMAIL                0x018A | ||||
| #define AL_CALCULATOR           0x0192 | ||||
| #define AL_LOCAL_BROWSER        0x0194 | ||||
| #define AC_SEARCH               0x0221 | ||||
| #define AC_HOME                 0x0223 | ||||
| #define AC_BACK                 0x0224 | ||||
| #define AC_FORWARD              0x0225 | ||||
| #define AC_STOP                 0x0226 | ||||
| #define AC_REFRESH              0x0227 | ||||
| #define AC_BOOKMARKS            0x022A | ||||
| 
 | ||||
| // Generic Desktop Page(0x01) System Control(0x80)
 | ||||
| #define SYSTEM_POWER_DOWN	(1<<0) | ||||
| #define SYSTEM_SLEEP		(1<<1) | ||||
| #define SYSTEM_WAKE_UP		(1<<2) | ||||
| // Generic Desktop Page(0x01)
 | ||||
| #define SYSTEM_POWER_DOWN       0x0081 | ||||
| #define SYSTEM_SLEEP            0x0082 | ||||
| #define SYSTEM_WAKE_UP          0x0083 | ||||
| 
 | ||||
| 
 | ||||
| #if defined(HOST_PJRC) | ||||
|  | @ -94,8 +109,8 @@ void host_send_keyboard_report(void); | |||
| void host_mouse_send(report_mouse_t *report); | ||||
| #endif | ||||
| #ifdef USB_EXTRA_ENABLE | ||||
| void host_system_send(uint8_t data); | ||||
| void host_audio_send(uint8_t data); | ||||
| void host_system_send(uint16_t data); | ||||
| void host_consumer_send(uint16_t data); | ||||
| #endif | ||||
| 
 | ||||
| #endif | ||||
|  |  | |||
							
								
								
									
										74
									
								
								keyboard.c
									
										
									
									
									
								
							
							
						
						
									
										74
									
								
								keyboard.c
									
										
									
									
									
								
							|  | @ -31,6 +31,9 @@ void keyboard_init(void) | |||
| void keyboard_proc(void) | ||||
| { | ||||
|     uint8_t fn_bits = 0; | ||||
| #ifdef USB_EXTRA_ENABLE | ||||
|     uint16_t consumer_code = 0; | ||||
| #endif | ||||
| 
 | ||||
|     matrix_scan(); | ||||
| 
 | ||||
|  | @ -64,20 +67,8 @@ void keyboard_proc(void) | |||
|                 fn_bits |= FN_BIT(code); | ||||
|             } | ||||
| #ifdef USB_EXTRA_ENABLE | ||||
|             // audio control & system control
 | ||||
|             else if (code == KB_MUTE) { | ||||
|                 host_audio_send(AUDIO_MUTE); | ||||
|                 _delay_ms(500); | ||||
|                 host_audio_send(0); | ||||
|             } else if (code == KB_VOLU) { | ||||
|                 host_audio_send(AUDIO_VOL_UP); | ||||
|                 _delay_ms(200); | ||||
|                 host_audio_send(0); | ||||
|             } else if (code == KB_VOLD) { | ||||
|                 host_audio_send(AUDIO_VOL_DOWN); | ||||
|                 _delay_ms(200); | ||||
|                 host_audio_send(0); | ||||
|             } else if (code == KB_PWR) { | ||||
|             // System Control
 | ||||
|             else if (code == KB_SYSTEM_POWER) { | ||||
| #ifdef HOST_PJRC | ||||
|                 if (suspend && remote_wakeup) { | ||||
|                     usb_remote_wakeup(); | ||||
|  | @ -87,7 +78,57 @@ void keyboard_proc(void) | |||
| #else | ||||
|                 host_system_send(SYSTEM_POWER_DOWN); | ||||
| #endif | ||||
|                 _delay_ms(1000); | ||||
|                 host_system_send(0); | ||||
|                 _delay_ms(500); | ||||
|             } else if (code == KB_SYSTEM_SLEEP) { | ||||
|                 host_system_send(SYSTEM_SLEEP); | ||||
|                 host_system_send(0); | ||||
|                 _delay_ms(500); | ||||
|             } else if (code == KB_SYSTEM_WAKE) { | ||||
|                 host_system_send(SYSTEM_WAKE_UP); | ||||
|                 host_system_send(0); | ||||
|                 _delay_ms(500); | ||||
|             } | ||||
|             // Consumer Page
 | ||||
|             else if (code == KB_AUDIO_MUTE) { | ||||
|                 consumer_code = AUDIO_MUTE; | ||||
|             } else if (code == KB_AUDIO_VOL_UP) { | ||||
|                 consumer_code = AUDIO_VOL_UP; | ||||
|             } else if (code == KB_AUDIO_VOL_DOWN) { | ||||
|                 consumer_code = AUDIO_VOL_DOWN; | ||||
|             } | ||||
|             else if (code == KB_MEDIA_NEXT_TRACK) { | ||||
|                 consumer_code = TRANSPORT_NEXT_TRACK; | ||||
|             } else if (code == KB_MEDIA_PREV_TRACK) { | ||||
|                 consumer_code = TRANSPORT_PREV_TRACK; | ||||
|             } else if (code == KB_MEDIA_STOP) { | ||||
|                 consumer_code = TRANSPORT_STOP; | ||||
|             } else if (code == KB_MEDIA_PLAY_PAUSE) { | ||||
|                 consumer_code = TRANSPORT_PLAY_PAUSE; | ||||
|             } else if (code == KB_MEDIA_SELECT) { | ||||
|                 consumer_code = AL_CC_CONFIG; | ||||
|             } | ||||
|             else if (code == KB_MAIL) { | ||||
|                 consumer_code = AL_EMAIL; | ||||
|             } else if (code == KB_CALCULATOR) { | ||||
|                 consumer_code = AL_CALCULATOR; | ||||
|             } else if (code == KB_MY_COMPUTER) { | ||||
|                 consumer_code = AL_LOCAL_BROWSER; | ||||
|             } | ||||
|             else if (code == KB_WWW_SEARCH) { | ||||
|                 consumer_code = AC_SEARCH; | ||||
|             } else if (code == KB_WWW_HOME) { | ||||
|                 consumer_code = AC_HOME; | ||||
|             } else if (code == KB_WWW_BACK) { | ||||
|                 consumer_code = AC_BACK; | ||||
|             } else if (code == KB_WWW_FORWARD) { | ||||
|                 consumer_code = AC_FORWARD; | ||||
|             } else if (code == KB_WWW_STOP) { | ||||
|                 consumer_code = AC_STOP; | ||||
|             } else if (code == KB_WWW_REFRESH) { | ||||
|                 consumer_code = AC_REFRESH; | ||||
|             } else if (code == KB_WWW_FAVORITES) { | ||||
|                 consumer_code = AC_BOOKMARKS; | ||||
|             } | ||||
| #endif | ||||
|             else if (IS_KEY(code)) { | ||||
|  | @ -113,6 +154,9 @@ void keyboard_proc(void) | |||
|     // TODO: should send only when changed from last report
 | ||||
|     if (matrix_is_modified()) { | ||||
|         host_send_keyboard_report(); | ||||
| #ifdef USB_EXTRA_ENABLE | ||||
|         host_consumer_send(consumer_code); | ||||
| #endif | ||||
| #ifdef DEBUG_LED | ||||
|         // LED flash for debug
 | ||||
|         DEBUG_LED_CONFIG; | ||||
|  |  | |||
							
								
								
									
										10
									
								
								pjrc/host.c
									
										
									
									
									
								
							
							
						
						
									
										10
									
								
								pjrc/host.c
									
										
									
									
									
								
							|  | @ -117,14 +117,18 @@ void host_mouse_send(report_mouse_t *report) | |||
| #endif | ||||
| 
 | ||||
| #ifdef USB_EXTRA_ENABLE | ||||
| void host_system_send(uint8_t data) | ||||
| void host_system_send(uint16_t data) | ||||
| { | ||||
|     usb_extra_system_send(data); | ||||
| } | ||||
| 
 | ||||
| void host_audio_send(uint8_t data) | ||||
| void host_consumer_send(uint16_t data) | ||||
| { | ||||
|     usb_extra_audio_send(data); | ||||
|     static uint16_t last_data = 0; | ||||
|     if (data == last_data) return; | ||||
|     last_data = data; | ||||
| 
 | ||||
|     usb_extra_consumer_send(data); | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
|  |  | |||
							
								
								
									
										169
									
								
								pjrc/usb.c
									
										
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										169
									
								
								pjrc/usb.c
									
										
									
									
									
										
										
										Executable file → Normal file
									
								
							|  | @ -219,76 +219,53 @@ static uint8_t PROGMEM keyboard2_hid_report_desc[] = { | |||
| // http://www.keil.com/forum/15671/
 | ||||
| // http://www.microsoft.com/whdc/device/input/wheel.mspx
 | ||||
| static uint8_t PROGMEM mouse_hid_report_desc[] = { | ||||
|     0x05, 0x01,        // USAGE_PAGE (Generic Desktop)
 | ||||
|     0x09, 0x02,        // USAGE (Mouse)
 | ||||
|     0xa1, 0x01,        // COLLECTION (Application)
 | ||||
|     0x09, 0x02,        //   USAGE (Mouse)
 | ||||
|     0xa1, 0x02,        //   COLLECTION (Logical)
 | ||||
|     0x09, 0x01,        //     USAGE (Pointer)
 | ||||
|     0xa1, 0x00,        //     COLLECTION (Physical)
 | ||||
|                        // ------------------------------  Buttons
 | ||||
|     0x05, 0x09,        //       USAGE_PAGE (Button)
 | ||||
|     0x19, 0x01,        //       USAGE_MINIMUM (Button 1)
 | ||||
|     0x29, 0x05,        //       USAGE_MAXIMUM (Button 5)
 | ||||
|     0x15, 0x00,        //       LOGICAL_MINIMUM (0)
 | ||||
|     0x25, 0x01,        //       LOGICAL_MAXIMUM (1)
 | ||||
|     0x75, 0x01,        //       REPORT_SIZE (1)
 | ||||
|     0x95, 0x05,        //       REPORT_COUNT (5)
 | ||||
|     0x81, 0x02,        //       INPUT (Data,Var,Abs)
 | ||||
|                        // ------------------------------  Padding
 | ||||
|     0x75, 0x03,        //       REPORT_SIZE (3)
 | ||||
|     0x95, 0x01,        //       REPORT_COUNT (1)
 | ||||
|     0x81, 0x03,        //       INPUT (Cnst,Var,Abs)
 | ||||
|                        // ------------------------------  X,Y position
 | ||||
|     0x05, 0x01,        //       USAGE_PAGE (Generic Desktop)
 | ||||
|     0x09, 0x30,        //       USAGE (X)
 | ||||
|     0x09, 0x31,        //       USAGE (Y)
 | ||||
|     0x15, 0x81,        //       LOGICAL_MINIMUM (-127)
 | ||||
|     0x25, 0x7f,        //       LOGICAL_MAXIMUM (127)
 | ||||
|     0x75, 0x08,        //       REPORT_SIZE (8)
 | ||||
|     0x95, 0x02,        //       REPORT_COUNT (2)
 | ||||
|     0x81, 0x06,        //       INPUT (Data,Var,Rel)
 | ||||
|     0xa1, 0x02,        //       COLLECTION (Logical)
 | ||||
|                        // ------------------------------  Vertical wheel res multiplier
 | ||||
|     0x09, 0x48,        //         USAGE (Resolution Multiplier)
 | ||||
|     0x15, 0x00,        //         LOGICAL_MINIMUM (0)
 | ||||
|     0x25, 0x01,        //         LOGICAL_MAXIMUM (1)
 | ||||
|     0x35, 0x01,        //         PHYSICAL_MINIMUM (1)
 | ||||
|     0x45, 0x04,        //         PHYSICAL_MAXIMUM (4)
 | ||||
|     0x75, 0x02,        //         REPORT_SIZE (2)
 | ||||
|     0x95, 0x01,        //         REPORT_COUNT (1)
 | ||||
|     0xa4,              //         PUSH
 | ||||
|     0xb1, 0x02,        //         FEATURE (Data,Var,Abs)
 | ||||
|                        // ------------------------------  Vertical wheel
 | ||||
|     0x09, 0x38,        //         USAGE (Wheel)
 | ||||
|     0x15, 0x81,        //         LOGICAL_MINIMUM (-127)
 | ||||
|     0x25, 0x7f,        //         LOGICAL_MAXIMUM (127)
 | ||||
|     0x35, 0x00,        //         PHYSICAL_MINIMUM (0)        - reset physical
 | ||||
|     0x45, 0x00,        //         PHYSICAL_MAXIMUM (0)
 | ||||
|     0x75, 0x08,        //         REPORT_SIZE (8)
 | ||||
|     0x81, 0x06,        //         INPUT (Data,Var,Rel)
 | ||||
|     0xc0,              //       END_COLLECTION
 | ||||
|     0xa1, 0x02,        //       COLLECTION (Logical)
 | ||||
|                        // ------------------------------  Horizontal wheel res multiplier
 | ||||
|     0x09, 0x48,        //         USAGE (Resolution Multiplier)
 | ||||
|     0xb4,              //         POP
 | ||||
|     0xb1, 0x02,        //         FEATURE (Data,Var,Abs)
 | ||||
|                        // ------------------------------  Padding for Feature report
 | ||||
|     0x35, 0x00,        //         PHYSICAL_MINIMUM (0)        - reset physical
 | ||||
|     0x45, 0x00,        //         PHYSICAL_MAXIMUM (0)
 | ||||
|     0x75, 0x04,        //         REPORT_SIZE (4)
 | ||||
|     0xb1, 0x03,        //         FEATURE (Cnst,Var,Abs)
 | ||||
|                        // ------------------------------  Horizontal wheel
 | ||||
|     0x05, 0x0c,        //         USAGE_PAGE (Consumer Devices)
 | ||||
|     0x0a, 0x38, 0x02,  //         USAGE (AC Pan)
 | ||||
|     0x15, 0x81,        //         LOGICAL_MINIMUM (-127)
 | ||||
|     0x25, 0x7f,        //         LOGICAL_MAXIMUM (127)
 | ||||
|     0x75, 0x08,        //         REPORT_SIZE (8)
 | ||||
|     0x81, 0x06,        //         INPUT (Data,Var,Rel)
 | ||||
|     0xc0,              //       END_COLLECTION
 | ||||
|     0xc0,              //     END_COLLECTION
 | ||||
|     0xc0,              //   END_COLLECTION
 | ||||
|     0xc0               // END_COLLECTION
 | ||||
|     /* mouse */ | ||||
|     0x05, 0x01,                    // USAGE_PAGE (Generic Desktop)
 | ||||
|     0x09, 0x02,                    // USAGE (Mouse)
 | ||||
|     0xa1, 0x01,                    // COLLECTION (Application)
 | ||||
|     //0x85, REPORT_ID_MOUSE,         //   REPORT_ID (1)
 | ||||
|     0x09, 0x01,                    //   USAGE (Pointer)
 | ||||
|     0xa1, 0x00,                    //   COLLECTION (Physical)
 | ||||
|                                    // ----------------------------  Buttons
 | ||||
|     0x05, 0x09,                    //     USAGE_PAGE (Button)
 | ||||
|     0x19, 0x01,                    //     USAGE_MINIMUM (Button 1)
 | ||||
|     0x29, 0x05,                    //     USAGE_MAXIMUM (Button 5)
 | ||||
|     0x15, 0x00,                    //     LOGICAL_MINIMUM (0)
 | ||||
|     0x25, 0x01,                    //     LOGICAL_MAXIMUM (1)
 | ||||
|     0x75, 0x01,                    //     REPORT_SIZE (1)
 | ||||
|     0x95, 0x05,                    //     REPORT_COUNT (5)
 | ||||
|     0x81, 0x02,                    //     INPUT (Data,Var,Abs)
 | ||||
|     0x75, 0x03,                    //     REPORT_SIZE (3)
 | ||||
|     0x95, 0x01,                    //     REPORT_COUNT (1)
 | ||||
|     0x81, 0x03,                    //     INPUT (Cnst,Var,Abs)
 | ||||
|                                    // ----------------------------  X,Y position
 | ||||
|     0x05, 0x01,                    //     USAGE_PAGE (Generic Desktop)
 | ||||
|     0x09, 0x30,                    //     USAGE (X)
 | ||||
|     0x09, 0x31,                    //     USAGE (Y)
 | ||||
|     0x15, 0x81,                    //     LOGICAL_MINIMUM (-127)
 | ||||
|     0x25, 0x7f,                    //     LOGICAL_MAXIMUM (127)
 | ||||
|     0x75, 0x08,                    //     REPORT_SIZE (8)
 | ||||
|     0x95, 0x02,                    //     REPORT_COUNT (2)
 | ||||
|     0x81, 0x06,                    //     INPUT (Data,Var,Rel)
 | ||||
|                                    // ----------------------------  Vertical wheel
 | ||||
|     0x09, 0x38,                    //     USAGE (Wheel)
 | ||||
|     0x15, 0x81,                    //     LOGICAL_MINIMUM (-127)
 | ||||
|     0x25, 0x7f,                    //     LOGICAL_MAXIMUM (127)
 | ||||
|     0x35, 0x00,                    //     PHYSICAL_MINIMUM (0)        - reset physical
 | ||||
|     0x45, 0x00,                    //     PHYSICAL_MAXIMUM (0)
 | ||||
|     0x75, 0x08,                    //     REPORT_SIZE (8)
 | ||||
|     0x95, 0x01,                    //     REPORT_COUNT (1)
 | ||||
|     0x81, 0x06,                    //     INPUT (Data,Var,Rel)
 | ||||
|                                    // ----------------------------  Horizontal wheel
 | ||||
|     0x05, 0x0c,                    //     USAGE_PAGE (Consumer Devices)
 | ||||
|     0x0a, 0x38, 0x02,              //     USAGE (AC Pan)
 | ||||
|     0x15, 0x81,                    //     LOGICAL_MINIMUM (-127)
 | ||||
|     0x25, 0x7f,                    //     LOGICAL_MAXIMUM (127)
 | ||||
|     0x75, 0x08,                    //     REPORT_SIZE (8)
 | ||||
|     0x95, 0x01,                    //     REPORT_COUNT (1)
 | ||||
|     0x81, 0x06,                    //     INPUT (Data,Var,Rel)
 | ||||
|     0xc0,                          //   END_COLLECTION
 | ||||
|     0xc0,                          // END_COLLECTION
 | ||||
| }; | ||||
| #endif | ||||
| 
 | ||||
|  | @ -309,38 +286,32 @@ static uint8_t PROGMEM debug_hid_report_desc[] = { | |||
| // audio controls & system controls
 | ||||
| // http://www.microsoft.com/whdc/archive/w2kbd.mspx
 | ||||
| static uint8_t PROGMEM extra_hid_report_desc[] = { | ||||
|     0x05, 0x0c,                    // USAGE_PAGE (Consumer Devices)
 | ||||
|     0x09, 0x01,                    // USAGE (Consumer Control)
 | ||||
|     0xa1, 0x01,                    // COLLECTION (Application)
 | ||||
|     0x85, 0x01,                    //   REPORT_ID (1)
 | ||||
|     0x09, 0xe9,                    //   USAGE (Volume Up)
 | ||||
|     0x09, 0xea,                    //   USAGE (Volume Down)
 | ||||
|     0x15, 0x00,                    //   LOGICAL_MINIMUM (0)
 | ||||
|     0x25, 0x01,                    //   LOGICAL_MAXIMUM (1)
 | ||||
|     0x75, 0x01,                    //   REPORT_SIZE (1)
 | ||||
|     0x95, 0x02,                    //   REPORT_COUNT (2)
 | ||||
|     0x81, 0x02,                    //   INPUT (Data,Var,Abs)
 | ||||
|     0x09, 0xe2,                    //   USAGE (Mute)
 | ||||
|     0x15, 0x00,                    //   LOGICAL_MINIMUM (0)
 | ||||
|     0x25, 0x01,                    //   LOGICAL_MAXIMUM (1)
 | ||||
|     0x75, 0x01,                    //   REPORT_SIZE (1)
 | ||||
|     0x95, 0x01,                    //   REPORT_COUNT (1)
 | ||||
|     0x81, 0x06,                    //   INPUT (Data,Var,Rel)
 | ||||
|     0x95, 0x05,                    //   REPORT_COUNT (5)
 | ||||
|     0x81, 0x07,                    //   INPUT (Cnst,Var,Abs)
 | ||||
|     0xc0,                          // END_COLLECTION
 | ||||
| 
 | ||||
|     /* system control */ | ||||
|     0x05, 0x01,                    // USAGE_PAGE (Generic Desktop)
 | ||||
|     0x09, 0x80,                    // USAGE (System Control)
 | ||||
|     0xa1, 0x01,                    // COLLECTION (Application)
 | ||||
|     0x85, 0x02,                    //   REPORT_ID (2)
 | ||||
|     0x19, 0x81,                    //   USAGE_MINIMUM (System Power Down)
 | ||||
|     0x29, 0x83,                    //   USAGE_MAXIMUM (System Wake Up)
 | ||||
|     0x95, 0x03,                    //   REPORT_COUNT (3)
 | ||||
|     0x81, 0x06,                    //   INPUT (Data,Var,Rel)
 | ||||
|     0x95, 0x05,                    //   REPORT_COUNT (5)
 | ||||
|     0x81, 0x07,                    //   INPUT (Cnst,Var,Rel)
 | ||||
|     0xc0                           // END_COLLECTION
 | ||||
|     0x85, REPORT_ID_SYSTEM,        //   REPORT_ID (2)
 | ||||
|     0x15, 0x01,                    //   LOGICAL_MINIMUM (0x1)
 | ||||
|     0x25, 0xb7,                    //   LOGICAL_MAXIMUM (0xb7)
 | ||||
|     0x19, 0x01,                    //   USAGE_MINIMUM (0x1)
 | ||||
|     0x29, 0xb7,                    //   USAGE_MAXIMUM (0xb7)
 | ||||
|     0x75, 0x10,                    //   REPORT_SIZE (16)
 | ||||
|     0x95, 0x01,                    //   REPORT_COUNT (1)
 | ||||
|     0x81, 0x00,                    //   INPUT (Data,Array,Abs)
 | ||||
|     0xc0,                          // END_COLLECTION
 | ||||
|     /* consumer */ | ||||
|     0x05, 0x0c,                    // USAGE_PAGE (Consumer Devices)
 | ||||
|     0x09, 0x01,                    // USAGE (Consumer Control)
 | ||||
|     0xa1, 0x01,                    // COLLECTION (Application)
 | ||||
|     0x85, REPORT_ID_CONSUMER,      //   REPORT_ID (3)
 | ||||
|     0x15, 0x01,                    //   LOGICAL_MINIMUM (0x1)
 | ||||
|     0x26, 0x9c, 0x02,              //   LOGICAL_MAXIMUM (0x29c)
 | ||||
|     0x19, 0x01,                    //   USAGE_MINIMUM (0x1)
 | ||||
|     0x2a, 0x9c, 0x02,              //   USAGE_MAXIMUM (0x29c)
 | ||||
|     0x75, 0x10,                    //   REPORT_SIZE (16)
 | ||||
|     0x95, 0x01,                    //   REPORT_COUNT (1)
 | ||||
|     0x81, 0x00,                    //   INPUT (Data,Array,Abs)
 | ||||
|     0xc0,                          // END_COLLECTION
 | ||||
| }; | ||||
| #endif | ||||
| 
 | ||||
|  |  | |||
|  | @ -1,8 +1,10 @@ | |||
| #include <util/delay.h> | ||||
| #include <avr/interrupt.h> | ||||
| #include "host.h" | ||||
| #include "usb_extra.h" | ||||
| 
 | ||||
| 
 | ||||
| int8_t usb_extra_send(uint8_t report_id, uint8_t bits) | ||||
| int8_t usb_extra_send(uint8_t report_id, uint16_t data) | ||||
| { | ||||
| 	uint8_t intr_state, timeout; | ||||
| 
 | ||||
|  | @ -26,19 +28,20 @@ int8_t usb_extra_send(uint8_t report_id, uint8_t bits) | |||
| 	} | ||||
| 
 | ||||
| 	UEDATX = report_id; | ||||
| 	UEDATX = bits; | ||||
|         UEDATX = data&0xFF; | ||||
|         UEDATX = (data>>8)&0xFF; | ||||
| 
 | ||||
| 	UEINTX = 0x3A; | ||||
| 	SREG = intr_state; | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| int8_t usb_extra_audio_send(uint8_t bits) | ||||
| int8_t usb_extra_consumer_send(uint16_t bits) | ||||
| { | ||||
| 	return usb_extra_send(1, bits); | ||||
| 	return usb_extra_send(REPORT_ID_CONSUMER, bits); | ||||
| } | ||||
| 
 | ||||
| int8_t usb_extra_system_send(uint8_t bits) | ||||
| int8_t usb_extra_system_send(uint16_t bits) | ||||
| { | ||||
| 	return usb_extra_send(2, bits); | ||||
| 	return usb_extra_send(REPORT_ID_SYSTEM, bits); | ||||
| } | ||||
|  |  | |||
|  | @ -13,22 +13,11 @@ | |||
| 
 | ||||
| #define EXTRA_INTERFACE		3 | ||||
| #define EXTRA_ENDPOINT		4 | ||||
| #define EXTRA_SIZE		2 | ||||
| #define EXTRA_SIZE		8 | ||||
| #define EXTRA_BUFFER		EP_DOUBLE_BUFFER | ||||
| 
 | ||||
| 
 | ||||
| // Consumer Page(0x0C) Consumer Control(0x01)
 | ||||
| #define AUDIO_VOL_UP		(1<<0) | ||||
| #define AUDIO_VOL_DOWN		(1<<1) | ||||
| #define AUDIO_MUTE		(1<<2) | ||||
| 
 | ||||
| // Generic Desktop Page(0x01) System Control(0x80)
 | ||||
| #define SYSTEM_POWER_DOWN	(1<<0) | ||||
| #define SYSTEM_SLEEP		(1<<1) | ||||
| #define SYSTEM_WAKE_UP		(1<<2) | ||||
| 
 | ||||
| 
 | ||||
| int8_t usb_extra_audio_send(uint8_t bits); | ||||
| int8_t usb_extra_system_send(uint8_t bits); | ||||
| int8_t usb_extra_consumer_send(uint16_t bits); | ||||
| int8_t usb_extra_system_send(uint16_t bits); | ||||
| 
 | ||||
| #endif | ||||
|  |  | |||
|  | @ -133,4 +133,34 @@ needs a bit of your effort at this time. | |||
|     ), | ||||
| 
 | ||||
| 
 | ||||
| Multimedia keys | ||||
| --------------- | ||||
| Following lists PS/2 special keys supported by Windows. | ||||
| http://msdn.microsoft.com/en-us/windows/hardware/gg463372.aspx | ||||
| 
 | ||||
| Key                         PS/2(Set2)      HID | ||||
| --------------------------------------------------- | ||||
| System Power                E0 37           01 0081 | ||||
| System Sleep                E0 3F           01 0082 | ||||
| System Wake                 E0 5E           01 0083 | ||||
| System Mute                 E0 23           0C 00E2 | ||||
| Volume Up                   E0 32           0C 00E9 | ||||
| Volume Down                 E0 21           0C 00EA | ||||
| Scan Next Track             E0 4D           0C 00B5 | ||||
| Scan Previous Track         E0 15           0C 00B6 | ||||
| Stop                        E0 3B           0C 00B7 | ||||
| Play/Pause                  E0 34           0C 00CD | ||||
| Media Select                E0 50           0C 0183 | ||||
| Mail                        E0 48           0C 018A | ||||
| Calculator                  E0 2B           0C 0192 | ||||
| My Computer                 E0 40           0C 0194 | ||||
| WWW Search                  E0 10           0C 0221 | ||||
| WWW Home                    E0 3A           0C 0223 | ||||
| WWW Back                    E0 38           0C 0224 | ||||
| WWW Forward                 E0 30           0C 0225 | ||||
| WWW Stop                    E0 28           0C 0226 | ||||
| WWW Refresh                 E0 20           0C 0227 | ||||
| WWW Favorites               E0 18           0C 022A | ||||
| 
 | ||||
| 
 | ||||
| EOF | ||||
|  |  | |||
|  | @ -13,15 +13,23 @@ | |||
| 
 | ||||
| #define KEYCODE(layer, row, col) (pgm_read_byte(&keymaps[(layer)][(row)][(col)])) | ||||
| 
 | ||||
| // Convert physical keyboard layout to matrix array.
 | ||||
| // This is a macro to define keymap easily in keyboard layout form.
 | ||||
| #define KEYMAP( \ | ||||
|     K76,  K05,K06,K04,K0C, K03,K0B,K83,K0A, K01,K09,K78,K07, KFC,K7E,KFE,      KB7,KBF,KDE, \ | ||||
| 
 | ||||
| // The keymap is a 32*8 matrix which convert a PS/2 scancode into a USB keycode.
 | ||||
| // See matrix.c for the detail of matrix.
 | ||||
| #define KEYMAP_ALL( \ | ||||
|     K76,K05,K06,K04,K0C,K03,K0B,K83,K0A,K01,K09,K78,K07,     KFC,K7E,KFE,                   \ | ||||
|     K0E,K16,K1E,K26,K25,K2E,K36,K3D,K3E,K46,K45,K4E,K55,K66, KF0,KEC,KFD,  K77,KCA,K7C,K7B, \ | ||||
|     K0D,K15,K1D,K24,K2D,K2C,K35,K3C,K43,K44,K4D,K54,K5B,K5D, KF1,KE9,KFA,  K6C,K75,K7D,     \ | ||||
|     K58,K1C,K1B,K23,K2B,K34,K33,K3B,K42,K4B,K4C,K52,    K5A,               K6B,K73,K74,K79, \ | ||||
|     K12,K1A,K22,K21,K2A,K32,K31,K3A,K41,K49,K4A,        K59,     KF5,      K69,K72,K7A,     \ | ||||
|     K14,K9F,K11,        K29,                K91,KA7,KAF,K94, KEB,KF2,KF4,  K70,    K71,KDA  \ | ||||
|     K14,K9F,K11,        K29,                K91,KA7,KAF,K94, KEB,KF2,KF4,  K70,    K71,KDA, \ | ||||
|                                                                                             \ | ||||
|     KB7, KBF, KDE,           /* System Power, Sleep, Wake */                                \ | ||||
|     KA3, KB2, KA1,           /* Mute, Volume Up, Volume Down */                             \ | ||||
|     KCD, K95, KBB, KB4, KD0, /* Next, Previous, Stop, Pause, Media Select */                \ | ||||
|     KC8, KAB, KC0,           /* Mail, Calculator, My Computer */                            \ | ||||
|     K90, KBA, KB8, KB0,      /* WWW Search, Home, Back, Forward */                          \ | ||||
|     KA8, KA0, K98            /* WWW Stop, Refresh, Favorites */                             \ | ||||
| ) { \ | ||||
|     { KB_NO,    KB_##K01, KB_NO,    KB_##K03, KB_##K04, KB_##K05, KB_##K06, KB_##K07 }, \ | ||||
|     { KB_NO,    KB_##K09, KB_##K0A, KB_##K0B, KB_##K0C, KB_##K0D, KB_##K0E, KB_NO    }, \ | ||||
|  | @ -41,15 +49,15 @@ | |||
|     { KB_##K78, KB_##K79, KB_##K7A, KB_##K7B, KB_##K7C, KB_##K7D, KB_##K7E, KB_NO    }, \ | ||||
|     { KB_NO,    KB_NO,    KB_NO,    KB_##K83, KB_NO,    KB_NO,    KB_NO,    KB_NO    }, \ | ||||
|     { KB_NO,    KB_NO,    KB_NO,    KB_NO,    KB_NO,    KB_NO,    KB_NO,    KB_NO    }, \ | ||||
|     { KB_NO,    KB_##K91, KB_NO,    KB_NO,    KB_##K94, KB_NO,    KB_NO,    KB_NO    }, \ | ||||
|     { KB_NO,    KB_NO,    KB_NO,    KB_NO,    KB_NO,    KB_NO,    KB_NO,    KB_##K9F }, \ | ||||
|     { KB_NO,    KB_NO,    KB_NO,    KB_NO,    KB_NO,    KB_NO,    KB_NO,    KB_##KA7 }, \ | ||||
|     { KB_NO,    KB_NO,    KB_NO,    KB_NO,    KB_NO,    KB_NO,    KB_NO,    KB_##KAF }, \ | ||||
|     { KB_NO,    KB_NO,    KB_NO,    KB_NO,    KB_NO,    KB_NO,    KB_NO,    KB_##KB7 }, \ | ||||
|     { KB_NO,    KB_NO,    KB_NO,    KB_NO,    KB_NO,    KB_NO,    KB_NO,    KB_##KBF }, \ | ||||
|     { KB_NO,    KB_NO,    KB_NO,    KB_NO,    KB_NO,    KB_NO,    KB_NO,    KB_NO    }, \ | ||||
|     { KB_NO,    KB_NO,    KB_##KCA, KB_NO,    KB_NO,    KB_NO,    KB_NO,    KB_NO    }, \ | ||||
|     { KB_NO,    KB_NO,    KB_NO,    KB_NO,    KB_NO,    KB_NO,    KB_NO,    KB_NO    }, \ | ||||
|     { KB_##K90, KB_##K91, KB_NO,    KB_NO,    KB_##K94, KB_##K95, KB_NO,    KB_NO    }, \ | ||||
|     { KB_##K98, KB_NO,    KB_NO,    KB_NO,    KB_NO,    KB_NO,    KB_NO,    KB_##K9F }, \ | ||||
|     { KB_##KA0, KB_##KA1, KB_NO,    KB_##KA3, KB_NO,    KB_NO,    KB_NO,    KB_##KA7 }, \ | ||||
|     { KB_##KA8, KB_NO,    KB_NO,    KB_##KAB, KB_NO,    KB_NO,    KB_NO,    KB_##KAF }, \ | ||||
|     { KB_##KB0, KB_NO,    KB_##KB2, KB_NO,    KB_##KB4, KB_NO,    KB_NO,    KB_##KB7 }, \ | ||||
|     { KB_##KB8, KB_NO,    KB_##KBA, KB_##KBB, KB_NO,    KB_NO,    KB_NO,    KB_##KBF }, \ | ||||
|     { KB_##KC0, KB_NO,    KB_NO,    KB_NO,    KB_NO,    KB_NO,    KB_NO,    KB_NO    }, \ | ||||
|     { KB_##KC8, KB_NO,    KB_##KCA, KB_NO,    KB_NO,    KB_##KCD, KB_NO,    KB_NO    }, \ | ||||
|     { KB_##KD0, KB_NO,    KB_NO,    KB_NO,    KB_NO,    KB_NO,    KB_NO,    KB_NO    }, \ | ||||
|     { KB_NO,    KB_NO,    KB_##KDA, KB_NO,    KB_NO,    KB_NO,    KB_##KDE, KB_NO    }, \ | ||||
|     { KB_NO,    KB_NO,    KB_NO,    KB_NO,    KB_NO,    KB_NO,    KB_NO,    KB_NO    }, \ | ||||
|     { KB_NO,    KB_##KE9, KB_NO,    KB_##KEB, KB_##KEC, KB_NO,    KB_NO,    KB_NO    }, \ | ||||
|  | @ -57,6 +65,30 @@ | |||
|     { KB_NO,    KB_NO,    KB_##KFA, KB_NO,    KB_##KFC, KB_##KFD, KB_##KFE, KB_NO    }, \ | ||||
| } | ||||
| 
 | ||||
| #define KEYMAP( \ | ||||
|     K76,K05,K06,K04,K0C,K03,K0B,K83,K0A,K01,K09,K78,K07,     KFC,K7E,KFE,                   \ | ||||
|     K0E,K16,K1E,K26,K25,K2E,K36,K3D,K3E,K46,K45,K4E,K55,K66, KF0,KEC,KFD,  K77,KCA,K7C,K7B, \ | ||||
|     K0D,K15,K1D,K24,K2D,K2C,K35,K3C,K43,K44,K4D,K54,K5B,K5D, KF1,KE9,KFA,  K6C,K75,K7D,     \ | ||||
|     K58,K1C,K1B,K23,K2B,K34,K33,K3B,K42,K4B,K4C,K52,    K5A,               K6B,K73,K74,K79, \ | ||||
|     K12,K1A,K22,K21,K2A,K32,K31,K3A,K41,K49,K4A,        K59,     KF5,      K69,K72,K7A,     \ | ||||
|     K14,K9F,K11,        K29,                K91,KA7,KAF,K94, KEB,KF2,KF4,  K70,    K71,KDA  \ | ||||
| ) \ | ||||
| KEYMAP_ALL( \ | ||||
|     K76,K05,K06,K04,K0C,K03,K0B,K83,K0A,K01,K09,K78,K07,     KFC,K7E,KFE,                   \ | ||||
|     K0E,K16,K1E,K26,K25,K2E,K36,K3D,K3E,K46,K45,K4E,K55,K66, KF0,KEC,KFD,  K77,KCA,K7C,K7B, \ | ||||
|     K0D,K15,K1D,K24,K2D,K2C,K35,K3C,K43,K44,K4D,K54,K5B,K5D, KF1,KE9,KFA,  K6C,K75,K7D,     \ | ||||
|     K58,K1C,K1B,K23,K2B,K34,K33,K3B,K42,K4B,K4C,K52,    K5A,               K6B,K73,K74,K79, \ | ||||
|     K12,K1A,K22,K21,K2A,K32,K31,K3A,K41,K49,K4A,        K59,     KF5,      K69,K72,K7A,     \ | ||||
|     K14,K9F,K11,        K29,                K91,KA7,KAF,K94, KEB,KF2,KF4,  K70,    K71,KDA, \ | ||||
|                                                                                             \ | ||||
|     SYSTEM_POWER, SYSTEM_SLEEP, SYSTEM_WAKE,                                                \ | ||||
|     AUDIO_MUTE, AUDIO_VOL_UP, AUDIO_VOL_DOWN,                                               \ | ||||
|     MEDIA_NEXT_TRACK, MEDIA_PREV_TRACK, MEDIA_STOP, MEDIA_PLAY_PAUSE, MEDIA_SELECT,         \ | ||||
|     MAIL, CALCULATOR, MY_COMPUTER,                                                          \ | ||||
|     WWW_SEARCH, WWW_HOME, WWW_BACK, WWW_FORWARD,                                            \ | ||||
|     WWW_STOP, WWW_REFRESH, WWW_FAVORITES                                                    \ | ||||
| ) | ||||
| 
 | ||||
| 
 | ||||
| // Assign Fn key(0-7) to a layer to which switch with the Fn key pressed.
 | ||||
| static const uint8_t PROGMEM fn_layer[] = { | ||||
|  | @ -102,61 +134,67 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | |||
|      */ | ||||
|     /* 0: default */ | ||||
|     KEYMAP( | ||||
|     ESC, F1,  F2,  F3,  F4,  F5,  F6,  F7,  F8,  F9,  F10, F11, F12,           PSCR,SLCK,BRK,          PWR, F13, F14, | ||||
|     ESC, F1,  F2,  F3,  F4,  F5,  F6,  F7,  F8,  F9,  F10, F11, F12,           PSCR,SLCK,BRK, | ||||
|     GRV, 1,   2,   3,   4,   5,   6,   7,   8,   9,   0,   MINS,EQL, BSPC,     INS, HOME,PGUP,    NLCK,PSLS,PAST,PMNS, | ||||
|     TAB, Q,   W,   E,   R,   T,   Y,   U,   I,   O,   P,   LBRC,RBRC,BSLS,     DEL, END, PGDN,    P7,  P8,  P9, | ||||
|     CAPS,FN2, S,   D,   F,   G,   H,   J,   K,   L,   FN0, QUOT,     ENT,                         P4,  P5,  P6,  PPLS, | ||||
|     LSFT,Z,   X,   C,   V,   B,   N,   M,   COMM,DOT, FN1,           RSFT,          UP,           P1,  P2,  P3, | ||||
|     LCTL,LGUI,LALT,          SPC,                     RALT,RGUI,APP, RCTL,     LEFT,DOWN,RGHT,    P0,       PDOT,PENT | ||||
|     ), | ||||
| 
 | ||||
|     /* 1: plain Qwerty without layer switching */ | ||||
|     KEYMAP( | ||||
|     ESC, F1,  F2,  F3,  F4,  F5,  F6,  F7,  F8,  F9,  F10, F11, F12,           PSCR,SLCK,BRK,          PWR, F13, F14, | ||||
|     ESC, F1,  F2,  F3,  F4,  F5,  F6,  F7,  F8,  F9,  F10, F11, F12,           PSCR,SLCK,BRK, | ||||
|     GRV, 1,   2,   3,   4,   5,   6,   7,   8,   9,   0,   MINS,EQL, BSPC,     INS, HOME,PGUP,    NLCK,PSLS,PAST,PMNS, | ||||
|     TAB, Q,   W,   E,   R,   T,   Y,   U,   I,   O,   P,   LBRC,RBRC,BSLS,     DEL, END, PGDN,    P7,  P8,  P9, | ||||
|     CAPS,A,   S,   D,   F,   G,   H,   J,   K,   L,   SCLN,QUOT,     ENT,                         P4,  P5,  P6,  PPLS, | ||||
|     LSFT,Z,   X,   C,   V,   B,   N,   M,   COMM,DOT, SLSH,          RSFT,          UP,           P1,  P2,  P3, | ||||
|     LCTL,LGUI,LALT,          SPC,                     RALT,RGUI,APP, RCTL,     LEFT,DOWN,RGHT,    P0,       PDOT,PENT | ||||
|     ), | ||||
| 
 | ||||
|     /* 2: Colemak http://colemak.com */ | ||||
|     KEYMAP( | ||||
|     ESC, F1,  F2,  F3,  F4,  F5,  F6,  F7,  F8,  F9,  F10, F11, F12,           PSCR,SLCK,BRK,          PWR, F13, F14, | ||||
|     ESC, F1,  F2,  F3,  F4,  F5,  F6,  F7,  F8,  F9,  F10, F11, F12,           PSCR,SLCK,BRK, | ||||
|     GRV, 1,   2,   3,   4,   5,   6,   7,   8,   9,   0,   MINS,EQL, BSPC,     INS, HOME,PGUP,    NLCK,PSLS,PAST,PMNS, | ||||
|     TAB, Q,   W,   F,   P,   G,   J,   L,   U,   Y,   SCLN,LBRC,RBRC,BSLS,     DEL, END, PGDN,    P7,  P8,  P9, | ||||
|     BSPC,A,   R,   S,   T,   D,   H,   N,   E,   I,   O,   QUOT,     ENT,                         P4,  P5,  P6,  PPLS, | ||||
|     LSFT,Z,   X,   C,   V,   B,   K,   M,   COMM,DOT, SLSH,          RSFT,          UP,           P1,  P2,  P3, | ||||
|     LCTL,LGUI,LALT,          SPC,                     RALT,RGUI,APP, RCTL,     LEFT,DOWN,RGHT,    P0,       PDOT,PENT | ||||
|     ), | ||||
| 
 | ||||
|     /* 3: Dvorak http://en.wikipedia.org/wiki/Dvorak_Simplified_Keyboard */ | ||||
|     KEYMAP( | ||||
|     ESC, F1,  F2,  F3,  F4,  F5,  F6,  F7,  F8,  F9,  F10, F11, F12,           PSCR,SLCK,BRK,          PWR, F13, F14, | ||||
|     ESC, F1,  F2,  F3,  F4,  F5,  F6,  F7,  F8,  F9,  F10, F11, F12,           PSCR,SLCK,BRK, | ||||
|     GRV, 1,   2,   3,   4,   5,   6,   7,   8,   9,   0,   LBRC,RBRC,BSPC,     INS, HOME,PGUP,    NLCK,PSLS,PAST,PMNS, | ||||
|     TAB, QUOT,COMM,DOT, P,   Y,   F,   G,   C,   R,   L,   SLSH,EQL, BSLS,     DEL, END, PGDN,    P7,  P8,  P9, | ||||
|     CAPS,A,   O,   E,   U,   I,   D,   H,   T,   N,   S,   MINS,     ENT,                         P4,  P5,  P6,  PPLS, | ||||
|     LSFT,SCLN,Q,   J,   K,   X,   B,   M,   W,   V,   Z,             RSFT,          UP,           P1,  P2,  P3, | ||||
|     LCTL,LGUI,LALT,          SPC,                     RALT,RGUI,APP, RCTL,     LEFT,DOWN,RGHT,    P0,       PDOT,PENT | ||||
|     ), | ||||
| 
 | ||||
|     /* 4: Workman http://viralintrospection.wordpress.com/2010/09/06/a-different-philosophy-in-designing-keyboard-layouts/ */ | ||||
|     KEYMAP( | ||||
|     ESC, F1,  F2,  F3,  F4,  F5,  F6,  F7,  F8,  F9,  F10, F11, F12,           PSCR,SLCK,BRK,          PWR, F13, F14, | ||||
|     ESC, F1,  F2,  F3,  F4,  F5,  F6,  F7,  F8,  F9,  F10, F11, F12,           PSCR,SLCK,BRK, | ||||
|     GRV, 1,   2,   3,   4,   5,   6,   7,   8,   9,   0,   MINS,EQL, BSPC,     INS, HOME,PGUP,    NLCK,PSLS,PAST,PMNS, | ||||
|     TAB, Q,   D,   R,   W,   B,   J,   F,   U,   P,   SCLN,LBRC,RBRC,BSLS,     DEL, END, PGDN,    P7,  P8,  P9, | ||||
|     BSPC,A,   S,   H,   T,   G,   Y,   N,   E,   O,   I,   QUOT,     ENT,                         P4,  P5,  P6,  PPLS, | ||||
|     LSFT,Z,   X,   M,   C,   V,   K,   L,   COMM,DOT, SLSH,          RSFT,          UP,           P1,  P2,  P3, | ||||
|     LCTL,LGUI,LALT,          SPC,                     RALT,RGUI,APP, RCTL,     LEFT,DOWN,RGHT,    P0,       PDOT,PENT | ||||
|     ), | ||||
| 
 | ||||
|     /* 5: Mouse keys */ | ||||
|     KEYMAP( | ||||
|     ESC, F1,  F2,  F3,  F4,  F5,  F6,  F7,  F8,  F9,  F10, F11, F12,           PSCR,SLCK,BRK,          PWR, F13, F14, | ||||
|     ESC, F1,  F2,  F3,  F4,  F5,  F6,  F7,  F8,  F9,  F10, F11, F12,           PSCR,SLCK,BRK, | ||||
|     ESC, F1,  F2,  F3,  F4,  F5,  F6,  F7,  F8,  F8,  F10, F11, F12, BSPC,     INS, HOME,PGUP,    NLCK,PSLS,PAST,PMNS, | ||||
|     TAB, WH_L,WH_D,MS_U,WH_U,WH_R,WH_L,WH_D,WH_U,WH_R,NO,  NO,  NO,  BSLS,     DEL, END, PGDN,    P7,  P8,  P9, | ||||
|     CAPS,FN2, MS_L,MS_D,MS_R,NO,  MS_L,MS_D,MS_U,MS_R,FN0, NO,       ENT,                         P4,  P5,  P6,  PPLS, | ||||
|     LSFT,VOLD,VOLU,MUTE,BTN2,BTN3,BTN2,BTN1,VOLD,VOLU,MUTE,          RSFT,          UP,           P1,  P2,  P3, | ||||
|     LCTL,LGUI,LALT,          BTN1,                    RALT,RGUI,APP, RCTL,     LEFT,DOWN,RGHT,    P0,       PDOT,PENT | ||||
|     ), | ||||
| 
 | ||||
|     /* 6: Cursor keys */ | ||||
|     KEYMAP( | ||||
|     ESC, F1,  F2,  F3,  F4,  F5,  F6,  F7,  F8,  F9,  F10, F11, F12,           PSCR,SLCK,BRK,          PWR, F13, F14, | ||||
|     ESC, F1,  F2,  F3,  F4,  F5,  F6,  F7,  F8,  F9,  F10, F11, F12,           PSCR,SLCK,BRK, | ||||
|     ESC, F1,  F2,  F3,  F4,  F5,  F6,  F7,  F8,  F8,  F10, F11, F12, BSPC,     INS, HOME,PGUP,    NLCK,PSLS,PAST,PMNS, | ||||
|     TAB, NO,  NO,  NO,  NO,  NO,  HOME,PGDN,PGUP,END, NO,  NO,  NO,  BSLS,     DEL, END, PGDN,    P7,  P8,  P9, | ||||
|     CAPS,NO,  NO,  NO,  NO,  NO,  LEFT,DOWN,UP,  RGHT,NO,  NO,       ENT,                         P4,  P5,  P6,  PPLS, | ||||
|  |  | |||
							
								
								
									
										211
									
								
								usb_keycodes.h
									
										
									
									
									
								
							
							
						
						
									
										211
									
								
								usb_keycodes.h
									
										
									
									
									
								
							|  | @ -1,43 +1,13 @@ | |||
| /* 
 | ||||
|  * Key codes from HID Keyboard/Keypad Page | ||||
|  * http://www.usb.org/developers/devclass_docs/Hut1_12.pdf
 | ||||
|  * | ||||
|  * Based on Keyboard Upgrade v0.3.0 http://github.com/rhomann/kbupgrade
 | ||||
|  */ | ||||
| /*
 | ||||
|  * Keyboard Upgrade -- Firmware for homebrew computer keyboard controllers. | ||||
|  * Copyright (C) 2009  Robert Homann | ||||
|  * | ||||
|  * Based on RUMP (http://mg8.org/rump/), Copyright (C) 2008  Chris Lee
 | ||||
|  * | ||||
|  * Based on c64key (http://symlink.dk/projects/c64key/),
 | ||||
|  * Copyright (C) 2006-2007  Mikkel Holm Olsen | ||||
|  * | ||||
|  * Based on HID-Test by Christian Starkjohann, Objective Development | ||||
|  * | ||||
|  * This file is part of the Keyboard Upgrade package. | ||||
|  * | ||||
|  * This program is free software; you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  * the Free Software Foundation; either version 2 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, but | ||||
|  * WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with the Keyboard Upgrade package; if not, write to the | ||||
|  * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, | ||||
|  * MA  02110-1301  USA | ||||
|  */ | ||||
| #ifndef USB_KEYCODES_H | ||||
| #define USB_KEYCODES_H | ||||
| 
 | ||||
| 
 | ||||
| #define IS_ERROR(code)           (KB_ROLL_OVER <= (code) && (code) <= KB_UNDEFINED) | ||||
| #define IS_KEY(code)             (KB_A         <= (code) && (code) <= KB_KP_HEXADECIMAL) | ||||
| #define IS_KEY(code)             (KB_A         <= (code) && (code) <= KB_EXSEL) | ||||
| #define IS_MOD(code)             (KB_LCTRL     <= (code) && (code) <= KB_RGUI) | ||||
| #define IS_FN(code)              (KB_FN0       <= (code) && (code) <= KB_FN7) | ||||
| #define IS_MOUSEKEY(code)        (KB_MS_UP     <= (code) && (code) <= KB_MS_WH_RIGHT) | ||||
|  | @ -49,9 +19,7 @@ | |||
| #define FN_BIT(code)  (1<<((code) - KB_FN0)) | ||||
| 
 | ||||
| 
 | ||||
| //
 | ||||
| // Short names
 | ||||
| //
 | ||||
| /* Short names */ | ||||
| #define KB_LCTL KB_LCTRL | ||||
| #define KB_RCTL KB_RCTRL | ||||
| #define KB_LSFT KB_LSHIFT | ||||
|  | @ -79,20 +47,17 @@ | |||
| #define KB_SLSH KB_SLASH | ||||
| #define KB_SCLN KB_SCOLON | ||||
| #define KB_QUOT KB_QUOTE | ||||
| #define KB_PWR  KB_POWER | ||||
| #define KB_VOLU KB_VOLUP | ||||
| #define KB_VOLD KB_VOLDOWN | ||||
| #define KB_APP  KB_APPLICATION | ||||
| #define KB_NUHS KB_NONUS_HASH | ||||
| #define KB_NUBS KB_NONUS_BSLASH | ||||
| // for Japanese
 | ||||
| /* for Japanese */ | ||||
| #define KB_RO   KB_INT1 | ||||
| #define KB_KANA KB_INT2 | ||||
| #define KB_JYEN KB_INT3 | ||||
| #define KB_HENK KB_INT4 | ||||
| #define KB_MHEN KB_INT5 | ||||
| #define KB_ZEHA KB_GRAVE | ||||
| // Keypad
 | ||||
| /* Keypad */ | ||||
| #define KB_P1   KB_KP_1 | ||||
| #define KB_P2   KB_KP_2 | ||||
| #define KB_P3   KB_KP_3 | ||||
|  | @ -110,7 +75,7 @@ | |||
| #define KB_PPLS KB_KP_PLUS | ||||
| #define KB_PEQL KB_KP_EQUAL | ||||
| #define KB_PENT KB_KP_ENTER | ||||
| // Mousekey
 | ||||
| /* Mousekey */ | ||||
| #define KB_MS_U KB_MS_UP | ||||
| #define KB_MS_D KB_MS_DOWN | ||||
| #define KB_MS_L KB_MS_LEFT | ||||
|  | @ -124,8 +89,69 @@ | |||
| #define KB_WH_D KB_MS_WH_DOWN | ||||
| #define KB_WH_L KB_MS_WH_LEFT | ||||
| #define KB_WH_R KB_MS_WH_RIGHT | ||||
| /* Sytem Control & Consumer usage */ | ||||
| #define KB_PWR  KB_SYSTEM_POWER | ||||
| #define KB_MUTE KB_AUDIO_MUTE | ||||
| #define KB_VOLU KB_AUDIO_VOL_UP | ||||
| #define KB_VOLD KB_AUDIO_VOL_DOWN | ||||
| 
 | ||||
| 
 | ||||
| /* Special keycode */ | ||||
| enum special_keycodes { | ||||
|     /* System Control */ | ||||
|     KB_SYSTEM_POWER = 0xB0, | ||||
|     KB_SYSTEM_SLEEP, | ||||
|     KB_SYSTEM_WAKE, | ||||
| 
 | ||||
|     /* Consumer Page */ | ||||
|     KB_AUDIO_MUTE, | ||||
|     KB_AUDIO_VOL_UP, | ||||
|     KB_AUDIO_VOL_DOWN, | ||||
|     KB_MEDIA_NEXT_TRACK, | ||||
|     KB_MEDIA_PREV_TRACK, | ||||
|     KB_MEDIA_STOP, | ||||
|     KB_MEDIA_PLAY_PAUSE, | ||||
|     KB_MEDIA_SELECT, | ||||
|     KB_MAIL, | ||||
|     KB_CALCULATOR, | ||||
|     KB_MY_COMPUTER, | ||||
|     KB_WWW_SEARCH, | ||||
|     KB_WWW_HOME, | ||||
|     KB_WWW_BACK,        /* 0xC0 */ | ||||
|     KB_WWW_FORWARD, | ||||
|     KB_WWW_STOP, | ||||
|     KB_WWW_REFRESH, | ||||
|     KB_WWW_FAVORITES, | ||||
| 
 | ||||
|     /* reserve 0xE0-E7 for Modifiers */ | ||||
| 
 | ||||
|     /* Layer Switching */ | ||||
|     KB_FN0 = 0xE8, | ||||
|     KB_FN1, | ||||
|     KB_FN2, | ||||
|     KB_FN3, | ||||
|     KB_FN4, | ||||
|     KB_FN5, | ||||
|     KB_FN6, | ||||
|     KB_FN7, | ||||
| 
 | ||||
|     /* Mousekey */ | ||||
|     KB_MS_UP = 0xF0, | ||||
|     KB_MS_DOWN, | ||||
|     KB_MS_LEFT, | ||||
|     KB_MS_RIGHT, | ||||
|     KB_MS_BTN1, | ||||
|     KB_MS_BTN2, | ||||
|     KB_MS_BTN3, | ||||
|     KB_MS_BTN4, | ||||
|     KB_MS_BTN5, | ||||
|     /* Mousekey wheel */ | ||||
|     KB_MS_WH_UP, | ||||
|     KB_MS_WH_DOWN, | ||||
|     KB_MS_WH_LEFT, | ||||
|     KB_MS_WH_RIGHT, | ||||
| }; | ||||
| 
 | ||||
| enum keycodes { | ||||
|     KB_NO = 0, | ||||
|     KB_ROLL_OVER, | ||||
|  | @ -143,7 +169,7 @@ enum keycodes { | |||
|     KB_J, | ||||
|     KB_K, | ||||
|     KB_L, | ||||
|     KB_M,       /* 0x10 */ | ||||
|     KB_M,               /* 0x10 */ | ||||
|     KB_N, | ||||
|     KB_O, | ||||
|     KB_P, | ||||
|  | @ -159,7 +185,7 @@ enum keycodes { | |||
|     KB_Z, | ||||
|     KB_1, | ||||
|     KB_2, | ||||
|     KB_3,       /* 0x20 */ | ||||
|     KB_3,               /* 0x20 */ | ||||
|     KB_4, | ||||
|     KB_5, | ||||
|     KB_6, | ||||
|  | @ -174,16 +200,16 @@ enum keycodes { | |||
|     KB_SPACE, | ||||
|     KB_MINUS, | ||||
|     KB_EQUAL, | ||||
|     KB_LBRACKET,          /* [ */ | ||||
|     KB_RBRACKET,          /* ] */ | ||||
|     KB_BSLASH,            /* \ (and |) */ | ||||
|     KB_NONUS_HASH,        /* Non-US # and ~ */ | ||||
|     KB_SCOLON,            /* ; (and :) */ | ||||
|     KB_QUOTE,             /* ' and " */ | ||||
|     KB_GRAVE,             /* Grave accent and tilde */ | ||||
|     KB_COMMA,             /* , and < */ | ||||
|     KB_DOT,               /* . and > */ | ||||
|     KB_SLASH,             /* / and ? */ | ||||
|     KB_LBRACKET, | ||||
|     KB_RBRACKET,        /* 0x30 */ | ||||
|     KB_BSLASH,          /* \ (and |) */ | ||||
|     KB_NONUS_HASH,      /* Non-US # and ~ */ | ||||
|     KB_SCOLON,          /* ; (and :) */ | ||||
|     KB_QUOTE,           /* ' and " */ | ||||
|     KB_GRAVE,           /* Grave accent and tilde */ | ||||
|     KB_COMMA,           /* , and < */ | ||||
|     KB_DOT,             /* . and > */ | ||||
|     KB_SLASH,           /* / and ? */ | ||||
|     KB_CAPSLOCK, | ||||
|     KB_F1, | ||||
|     KB_F2, | ||||
|  | @ -191,7 +217,7 @@ enum keycodes { | |||
|     KB_F4, | ||||
|     KB_F5, | ||||
|     KB_F6, | ||||
|     KB_F7,      /* 0x40 */ | ||||
|     KB_F7,              /* 0x40 */ | ||||
|     KB_F8, | ||||
|     KB_F9, | ||||
|     KB_F10, | ||||
|  | @ -207,7 +233,7 @@ enum keycodes { | |||
|     KB_END, | ||||
|     KB_PGDOWN, | ||||
|     KB_RIGHT, | ||||
|     KB_LEFT,    /* 0x50 */ | ||||
|     KB_LEFT,            /* 0x50 */ | ||||
|     KB_DOWN, | ||||
|     KB_UP, | ||||
|     KB_NUMLOCK, | ||||
|  | @ -223,11 +249,11 @@ enum keycodes { | |||
|     KB_KP_5, | ||||
|     KB_KP_6, | ||||
|     KB_KP_7, | ||||
|     KB_KP_8,       /* 0x60 */ | ||||
|     KB_KP_8,            /* 0x60 */ | ||||
|     KB_KP_9, | ||||
|     KB_KP_0, | ||||
|     KB_KP_DOT, | ||||
|     KB_NONUS_BSLASH,      /* Non-US \ and | */ | ||||
|     KB_NONUS_BSLASH,    /* Non-US \ and | */ | ||||
|     KB_APPLICATION, | ||||
|     KB_POWER, | ||||
|     KB_KP_EQUAL, | ||||
|  | @ -239,7 +265,7 @@ enum keycodes { | |||
|     KB_F18, | ||||
|     KB_F19, | ||||
|     KB_F20, | ||||
|     KB_F21,     /* 0x70 */ | ||||
|     KB_F21,             /* 0x70 */ | ||||
|     KB_F22, | ||||
|     KB_F23, | ||||
|     KB_F24, | ||||
|  | @ -254,14 +280,14 @@ enum keycodes { | |||
|     KB_COPY, | ||||
|     KB_PASTE, | ||||
|     KB_FIND, | ||||
|     KB_MUTE, | ||||
|     KB_VOLUP,   /* 0x80 */ | ||||
|     KB_VOLDOWN, | ||||
|     KB_LOCKING_CAPS,      /* locking Caps Lock */ | ||||
|     KB_LOCKING_NUM,       /* locking Num Lock */ | ||||
|     KB_LOCKING_SCROLL,    /* locking Scroll Lock */ | ||||
|     KB__MUTE, | ||||
|     KB__VOLUP,          /* 0x80 */ | ||||
|     KB__VOLDOWN, | ||||
|     KB_LOCKING_CAPS,    /* locking Caps Lock */ | ||||
|     KB_LOCKING_NUM,     /* locking Num Lock */ | ||||
|     KB_LOCKING_SCROLL,  /* locking Scroll Lock */ | ||||
|     KB_KP_COMMA, | ||||
|     KB_KP_EQUAL_AS400,       /* equal sign on AS/400 */ | ||||
|     KB_KP_EQUAL_AS400,  /* equal sign on AS/400 */ | ||||
|     KB_INT1, | ||||
|     KB_INT2, | ||||
|     KB_INT3, | ||||
|  | @ -271,7 +297,7 @@ enum keycodes { | |||
|     KB_INT7, | ||||
|     KB_INT8, | ||||
|     KB_INT9, | ||||
|     KB_LANG1,    /* 0x90 */ | ||||
|     KB_LANG1,           /* 0x90 */ | ||||
|     KB_LANG2, | ||||
|     KB_LANG3, | ||||
|     KB_LANG4, | ||||
|  | @ -287,12 +313,13 @@ enum keycodes { | |||
|     KB_PRIOR, | ||||
|     KB_RETURN, | ||||
|     KB_SEPARATOR, | ||||
|     KB_OUT, | ||||
|     KB_OUT,             /* 0xA0 */ | ||||
|     KB_OPER, | ||||
|     KB_CLEAR_AGAIN, | ||||
|     KB_CRSEL, | ||||
|     KB_EXSEL, | ||||
| 
 | ||||
|     /* NOTE: uses 0xB0-DF for special keycodes */ | ||||
|     KB_KP_00 = 0xB0, | ||||
|     KB_KP_000, | ||||
|     KB_THOUSANDS_SEPARATOR, | ||||
|  | @ -301,15 +328,15 @@ enum keycodes { | |||
|     KB_CURRENCY_SUB_UNIT, | ||||
|     KB_KP_LPAREN, | ||||
|     KB_KP_RPAREN, | ||||
|     KB_KP_LCBRACKET,         /* { */ | ||||
|     KB_KP_RCBRACKET,         /* } */ | ||||
|     KB_KP_LCBRACKET,    /* { */ | ||||
|     KB_KP_RCBRACKET,    /* } */ | ||||
|     KB_KP_TAB, | ||||
|     KB_KP_BSPACE, | ||||
|     KB_KP_A, | ||||
|     KB_KP_B, | ||||
|     KB_KP_C, | ||||
|     KB_KP_D, | ||||
|     KB_KP_E, | ||||
|     KB_KP_E,            /* 0xC0 */ | ||||
|     KB_KP_F, | ||||
|     KB_KP_XOR, | ||||
|     KB_KP_HAT, | ||||
|  | @ -325,7 +352,7 @@ enum keycodes { | |||
|     KB_KP_SPACE, | ||||
|     KB_KP_ATMARK, | ||||
|     KB_KP_EXCLAMATION, | ||||
|     KB_KP_MEM_STORE, | ||||
|     KB_KP_MEM_STORE,    /* 0xD0 */ | ||||
|     KB_KP_MEM_RECALL, | ||||
|     KB_KP_MEM_CLEAR, | ||||
|     KB_KP_MEM_ADD, | ||||
|  | @ -340,41 +367,17 @@ enum keycodes { | |||
|     KB_KP_DECIMAL, | ||||
|     KB_KP_HEXADECIMAL, | ||||
| 
 | ||||
|     /* modifiers */ | ||||
|     KB_LCTRL = 0xE0,    /* 0x01 */ | ||||
|     KB_LSHIFT,          /* 0x02 */ | ||||
|     KB_LALT,            /* 0x04 */ | ||||
|     KB_LGUI,            /* 0x08 */ | ||||
|     KB_RCTRL,           /* 0x10 */ | ||||
|     KB_RSHIFT,          /* 0x20 */ | ||||
|     KB_RALT,            /* 0x40 */ | ||||
|     KB_RGUI,            /* 0x80 */ | ||||
|     /* Modifiers */ | ||||
|     KB_LCTRL = 0xE0, | ||||
|     KB_LSHIFT, | ||||
|     KB_LALT, | ||||
|     KB_LGUI, | ||||
|     KB_RCTRL, | ||||
|     KB_RSHIFT, | ||||
|     KB_RALT, | ||||
|     KB_RGUI, | ||||
| 
 | ||||
|     /* extensions for internal use */ | ||||
|     KB_FN0 = 0xE8, | ||||
|     KB_FN1, | ||||
|     KB_FN2, | ||||
|     KB_FN3, | ||||
|     KB_FN4, | ||||
|     KB_FN5, | ||||
|     KB_FN6, | ||||
|     KB_FN7, | ||||
|     // Mousekey move
 | ||||
|     KB_MS_UP = 0xF0, | ||||
|     KB_MS_DOWN, | ||||
|     KB_MS_LEFT, | ||||
|     KB_MS_RIGHT, | ||||
|     // Mousekey buttons
 | ||||
|     KB_MS_BTN1 = 0xF4, | ||||
|     KB_MS_BTN2, | ||||
|     KB_MS_BTN3, | ||||
|     KB_MS_BTN4, | ||||
|     KB_MS_BTN5, | ||||
|     // Mousekey wheel
 | ||||
|     KB_MS_WH_UP, | ||||
|     KB_MS_WH_DOWN, | ||||
|     KB_MS_WH_LEFT, | ||||
|     KB_MS_WH_RIGHT, | ||||
|     /* NOTE: uses 0xE8-FF for special keycodes */ | ||||
| }; | ||||
| 
 | ||||
| #endif /* USB_KEYCODES_H */ | ||||
|  |  | |||
							
								
								
									
										154
									
								
								vusb/host.c
									
										
									
									
									
								
							
							
						
						
									
										154
									
								
								vusb/host.c
									
										
									
									
									
								
							|  | @ -146,10 +146,12 @@ void host_mouse_send(report_mouse_t *report) | |||
| #endif | ||||
| 
 | ||||
| #ifdef USB_EXTRA_ENABLE | ||||
| void host_system_send(uint8_t data) | ||||
| void host_system_send(uint16_t data) | ||||
| { | ||||
|     static uint8_t report[] = { REPORT_ID_SYSTEM, 0 }; | ||||
|     report[1] = data; | ||||
|     // Not need static?
 | ||||
|     static uint8_t report[] = { REPORT_ID_SYSTEM, 0, 0 }; | ||||
|     report[1] = data&0xFF; | ||||
|     report[2] = (data>>8)&0xFF; | ||||
|     if (usbInterruptIsReady3()) { | ||||
|         usbSetInterrupt3((void *)&report, sizeof(report)); | ||||
|     } else { | ||||
|  | @ -157,10 +159,16 @@ void host_system_send(uint8_t data) | |||
|     } | ||||
| } | ||||
| 
 | ||||
| void host_audio_send(uint8_t data) | ||||
| void host_consumer_send(uint16_t data) | ||||
| { | ||||
|     static uint8_t report[] = { REPORT_ID_AUDIO, 0 }; | ||||
|     report[1] = data; | ||||
|     static uint16_t last_data = 0; | ||||
|     if (data == last_data) return; | ||||
|     last_data = data; | ||||
| 
 | ||||
|     // Not need static?
 | ||||
|     static uint8_t report[] = { REPORT_ID_CONSUMER, 0, 0 }; | ||||
|     report[1] = data&0xFF; | ||||
|     report[2] = (data>>8)&0xFF; | ||||
|     if (usbInterruptIsReady3()) { | ||||
|         usbSetInterrupt3((void *)&report, sizeof(report)); | ||||
|     } else { | ||||
|  | @ -293,85 +301,77 @@ PROGMEM uchar keyboard_hid_report[] = { | |||
|  */ | ||||
| PROGMEM uchar mouse_hid_report[] = { | ||||
|     /* mouse */ | ||||
|     0x05, 0x01,        // USAGE_PAGE (Generic Desktop)
 | ||||
|     0x09, 0x02,        // USAGE (Mouse)
 | ||||
|     0xa1, 0x01,        // COLLECTION (Application)
 | ||||
|     0x85, 0x01,        //   REPORT_ID (1)
 | ||||
|     0x09, 0x01,        //   USAGE (Pointer)
 | ||||
|     0xa1, 0x00,        //   COLLECTION (Physical)
 | ||||
|                        // ----------------------------  Buttons
 | ||||
|     0x05, 0x09,        //     USAGE_PAGE (Button)
 | ||||
|     0x19, 0x01,        //     USAGE_MINIMUM (Button 1)
 | ||||
|     0x29, 0x05,        //     USAGE_MAXIMUM (Button 5)
 | ||||
|     0x15, 0x00,        //     LOGICAL_MINIMUM (0)
 | ||||
|     0x25, 0x01,        //     LOGICAL_MAXIMUM (1)
 | ||||
|     0x75, 0x01,        //     REPORT_SIZE (1)
 | ||||
|     0x95, 0x05,        //     REPORT_COUNT (5)
 | ||||
|     0x81, 0x02,        //     INPUT (Data,Var,Abs)
 | ||||
|                        // ----------------------------  Padding
 | ||||
|     0x75, 0x03,        //     REPORT_SIZE (3)
 | ||||
|     0x95, 0x01,        //     REPORT_COUNT (1)
 | ||||
|     0x81, 0x03,        //     INPUT (Cnst,Var,Abs)
 | ||||
|                        // ----------------------------  X,Y position
 | ||||
|     0x05, 0x01,        //     USAGE_PAGE (Generic Desktop)
 | ||||
|     0x09, 0x30,        //     USAGE (X)
 | ||||
|     0x09, 0x31,        //     USAGE (Y)
 | ||||
|     0x15, 0x81,        //     LOGICAL_MINIMUM (-127)
 | ||||
|     0x25, 0x7f,        //     LOGICAL_MAXIMUM (127)
 | ||||
|     0x75, 0x08,        //     REPORT_SIZE (8)
 | ||||
|     0x95, 0x02,        //     REPORT_COUNT (2)
 | ||||
|     0x81, 0x06,        //     INPUT (Data,Var,Rel)
 | ||||
|                        // ----------------------------  Vertical wheel
 | ||||
|     0x09, 0x38,        //     USAGE (Wheel)
 | ||||
|     0x15, 0x81,        //     LOGICAL_MINIMUM (-127)
 | ||||
|     0x25, 0x7f,        //     LOGICAL_MAXIMUM (127)
 | ||||
|     0x35, 0x00,        //     PHYSICAL_MINIMUM (0)        - reset physical
 | ||||
|     0x45, 0x00,        //     PHYSICAL_MAXIMUM (0)
 | ||||
|     0x75, 0x08,        //     REPORT_SIZE (8)
 | ||||
|     0x95, 0x01,        //     REPORT_COUNT (1)
 | ||||
|     0x81, 0x06,        //     INPUT (Data,Var,Rel)
 | ||||
|                        // ----------------------------  Horizontal wheel
 | ||||
|     0x05, 0x0c,        //     USAGE_PAGE (Consumer Devices)
 | ||||
|     0x0a, 0x38, 0x02,  //     USAGE (AC Pan)
 | ||||
|     0x15, 0x81,        //     LOGICAL_MINIMUM (-127)
 | ||||
|     0x25, 0x7f,        //     LOGICAL_MAXIMUM (127)
 | ||||
|     0x75, 0x08,        //     REPORT_SIZE (8)
 | ||||
|     0x95, 0x01,        //     REPORT_COUNT (1)
 | ||||
|     0x81, 0x06,        //     INPUT (Data,Var,Rel)
 | ||||
|     0xc0,              //   END_COLLECTION
 | ||||
|     0xc0,              // END_COLLECTION
 | ||||
|     /* system */ | ||||
|     0x05, 0x01,                    // USAGE_PAGE (Generic Desktop)
 | ||||
|     0x09, 0x02,                    // USAGE (Mouse)
 | ||||
|     0xa1, 0x01,                    // COLLECTION (Application)
 | ||||
|     0x85, REPORT_ID_MOUSE,         //   REPORT_ID (1)
 | ||||
|     0x09, 0x01,                    //   USAGE (Pointer)
 | ||||
|     0xa1, 0x00,                    //   COLLECTION (Physical)
 | ||||
|                                    // ----------------------------  Buttons
 | ||||
|     0x05, 0x09,                    //     USAGE_PAGE (Button)
 | ||||
|     0x19, 0x01,                    //     USAGE_MINIMUM (Button 1)
 | ||||
|     0x29, 0x05,                    //     USAGE_MAXIMUM (Button 5)
 | ||||
|     0x15, 0x00,                    //     LOGICAL_MINIMUM (0)
 | ||||
|     0x25, 0x01,                    //     LOGICAL_MAXIMUM (1)
 | ||||
|     0x75, 0x01,                    //     REPORT_SIZE (1)
 | ||||
|     0x95, 0x05,                    //     REPORT_COUNT (5)
 | ||||
|     0x81, 0x02,                    //     INPUT (Data,Var,Abs)
 | ||||
|     0x75, 0x03,                    //     REPORT_SIZE (3)
 | ||||
|     0x95, 0x01,                    //     REPORT_COUNT (1)
 | ||||
|     0x81, 0x03,                    //     INPUT (Cnst,Var,Abs)
 | ||||
|                                    // ----------------------------  X,Y position
 | ||||
|     0x05, 0x01,                    //     USAGE_PAGE (Generic Desktop)
 | ||||
|     0x09, 0x30,                    //     USAGE (X)
 | ||||
|     0x09, 0x31,                    //     USAGE (Y)
 | ||||
|     0x15, 0x81,                    //     LOGICAL_MINIMUM (-127)
 | ||||
|     0x25, 0x7f,                    //     LOGICAL_MAXIMUM (127)
 | ||||
|     0x75, 0x08,                    //     REPORT_SIZE (8)
 | ||||
|     0x95, 0x02,                    //     REPORT_COUNT (2)
 | ||||
|     0x81, 0x06,                    //     INPUT (Data,Var,Rel)
 | ||||
|                                    // ----------------------------  Vertical wheel
 | ||||
|     0x09, 0x38,                    //     USAGE (Wheel)
 | ||||
|     0x15, 0x81,                    //     LOGICAL_MINIMUM (-127)
 | ||||
|     0x25, 0x7f,                    //     LOGICAL_MAXIMUM (127)
 | ||||
|     0x35, 0x00,                    //     PHYSICAL_MINIMUM (0)        - reset physical
 | ||||
|     0x45, 0x00,                    //     PHYSICAL_MAXIMUM (0)
 | ||||
|     0x75, 0x08,                    //     REPORT_SIZE (8)
 | ||||
|     0x95, 0x01,                    //     REPORT_COUNT (1)
 | ||||
|     0x81, 0x06,                    //     INPUT (Data,Var,Rel)
 | ||||
|                                    // ----------------------------  Horizontal wheel
 | ||||
|     0x05, 0x0c,                    //     USAGE_PAGE (Consumer Devices)
 | ||||
|     0x0a, 0x38, 0x02,              //     USAGE (AC Pan)
 | ||||
|     0x15, 0x81,                    //     LOGICAL_MINIMUM (-127)
 | ||||
|     0x25, 0x7f,                    //     LOGICAL_MAXIMUM (127)
 | ||||
|     0x75, 0x08,                    //     REPORT_SIZE (8)
 | ||||
|     0x95, 0x01,                    //     REPORT_COUNT (1)
 | ||||
|     0x81, 0x06,                    //     INPUT (Data,Var,Rel)
 | ||||
|     0xc0,                          //   END_COLLECTION
 | ||||
|     0xc0,                          // END_COLLECTION
 | ||||
|     /* system control */ | ||||
|     0x05, 0x01,                    // USAGE_PAGE (Generic Desktop)
 | ||||
|     0x09, 0x80,                    // USAGE (System Control)
 | ||||
|     0xa1, 0x01,                    // COLLECTION (Application)
 | ||||
|     0x85, 0x02,                    //   REPORT_ID (2)
 | ||||
|     0x19, 0x81,                    //   USAGE_MINIMUM (System Power Down)
 | ||||
|     0x29, 0x83,                    //   USAGE_MAXIMUM (System Wake Up)
 | ||||
|     0x75, 0x01,                    //   REPORT_SIZE (1)
 | ||||
|     0x95, 0x03,                    //   REPORT_COUNT (3)
 | ||||
|     0x81, 0x06,                    //   INPUT (Data,Var,Rel)
 | ||||
|     0x95, 0x05,                    //   REPORT_COUNT (5)
 | ||||
|     0x81, 0x07,                    //   INPUT (Cnst,Var,Rel)
 | ||||
|     0x85, REPORT_ID_SYSTEM,        //   REPORT_ID (2)
 | ||||
|     0x15, 0x01,                    //   LOGICAL_MINIMUM (0x1)
 | ||||
|     0x25, 0xb7,                    //   LOGICAL_MAXIMUM (0xb7)
 | ||||
|     0x19, 0x01,                    //   USAGE_MINIMUM (0x1)
 | ||||
|     0x29, 0xb7,                    //   USAGE_MAXIMUM (0xb7)
 | ||||
|     0x75, 0x10,                    //   REPORT_SIZE (16)
 | ||||
|     0x95, 0x01,                    //   REPORT_COUNT (1)
 | ||||
|     0x81, 0x00,                    //   INPUT (Data,Array,Abs)
 | ||||
|     0xc0,                          // END_COLLECTION
 | ||||
|     /* audio */ | ||||
|     /* consumer */ | ||||
|     0x05, 0x0c,                    // USAGE_PAGE (Consumer Devices)
 | ||||
|     0x09, 0x01,                    // USAGE (Consumer Control)
 | ||||
|     0xa1, 0x01,                    // COLLECTION (Application)
 | ||||
|     0x85, 0x03,                    //   REPORT_ID (3)
 | ||||
|     0x09, 0xe9,                    //   USAGE (Volume Up)
 | ||||
|     0x09, 0xea,                    //   USAGE (Volume Down)
 | ||||
|     0x15, 0x00,                    //   LOGICAL_MINIMUM (0)
 | ||||
|     0x25, 0x01,                    //   LOGICAL_MAXIMUM (1)
 | ||||
|     0x75, 0x01,                    //   REPORT_SIZE (1)
 | ||||
|     0x95, 0x02,                    //   REPORT_COUNT (2)
 | ||||
|     0x81, 0x02,                    //   INPUT (Data,Var,Abs)
 | ||||
|     0x09, 0xe2,                    //   USAGE (Mute)
 | ||||
|     0x15, 0x00,                    //   LOGICAL_MINIMUM (0)
 | ||||
|     0x25, 0x01,                    //   LOGICAL_MAXIMUM (1)
 | ||||
|     0x85, REPORT_ID_CONSUMER,      //   REPORT_ID (3)
 | ||||
|     0x15, 0x01,                    //   LOGICAL_MINIMUM (0x1)
 | ||||
|     0x26, 0x9c, 0x02,              //   LOGICAL_MAXIMUM (0x29c)
 | ||||
|     0x19, 0x01,                    //   USAGE_MINIMUM (0x1)
 | ||||
|     0x2a, 0x9c, 0x02,              //   USAGE_MAXIMUM (0x29c)
 | ||||
|     0x75, 0x10,                    //   REPORT_SIZE (16)
 | ||||
|     0x95, 0x01,                    //   REPORT_COUNT (1)
 | ||||
|     0x81, 0x06,                    //   INPUT (Data,Var,Rel)
 | ||||
|     0x95, 0x05,                    //   REPORT_COUNT (5)
 | ||||
|     0x81, 0x07,                    //   INPUT (Cnst,Var,Abs)
 | ||||
|     0x81, 0x00,                    //   INPUT (Data,Array,Abs)
 | ||||
|     0xc0,                          // END_COLLECTION
 | ||||
| }; | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 tmk
						tmk