| 0x15, 0x00, // Logical Minimum (0), | 0x15, 0x00, // Logical Minimum (0), | ||||
| 0x25, 0x01, // Logical Maximum (1), | 0x25, 0x01, // Logical Maximum (1), | ||||
| 0x81, 0x02, // Input (Data, Variable, Absolute), ;Modifier keys | 0x81, 0x02, // Input (Data, Variable, Absolute), ;Modifier keys | ||||
| 0x95, 0x08, // Report Count (8), | |||||
| 0x75, 0x01, // Report Size (1), | |||||
| 0x15, 0x00, // Logical Minimum (0), | |||||
| 0x25, 0x01, // Logical Maximum (1), | |||||
| 0x05, 0x0C, // Usage Page (Consumer), | |||||
| 0x09, 0xE9, // Usage (Volume Increment), | |||||
| 0x09, 0xEA, // Usage (Volume Decrement), | |||||
| 0x09, 0xE2, // Usage (Mute), | |||||
| 0x09, 0xCD, // Usage (Play/Pause), | |||||
| 0x09, 0xB5, // Usage (Scan Next Track), | |||||
| 0x09, 0xB6, // Usage (Scan Previous Track), | |||||
| 0x09, 0xB7, // Usage (Stop), | |||||
| 0x09, 0xB8, // Usage (Eject), | |||||
| 0x81, 0x02, // Input (Data, Variable, Absolute), ;Media keys | |||||
| 0x95, 0x01, // Report Count (1), | |||||
| 0x75, 0x08, // Report Size (8), | |||||
| 0x81, 0x03, // Input (Constant), ;Reserved byte | |||||
| 0x95, 0x05, // Report Count (5), | 0x95, 0x05, // Report Count (5), | ||||
| 0x75, 0x01, // Report Size (1), | 0x75, 0x01, // Report Size (1), | ||||
| 0x05, 0x08, // Usage Page (LEDs), | 0x05, 0x08, // Usage Page (LEDs), |
| // 16=right ctrl, 32=right shift, 64=right alt, 128=right gui | // 16=right ctrl, 32=right shift, 64=right alt, 128=right gui | ||||
| uint8_t keyboard_modifier_keys=0; | uint8_t keyboard_modifier_keys=0; | ||||
| // which media keys are currently pressed | |||||
| uint8_t keyboard_media_keys=0; | |||||
| // which keys are currently pressed, up to 6 keys may be down at once | // which keys are currently pressed, up to 6 keys may be down at once | ||||
| uint8_t keyboard_keys[6]={0,0,0,0,0,0}; | uint8_t keyboard_keys[6]={0,0,0,0,0,0}; | ||||
| anybits = keyboard_modifier_keys; | anybits = keyboard_modifier_keys; | ||||
| keyboard_modifier_keys = 0; | keyboard_modifier_keys = 0; | ||||
| anybits |= keyboard_media_keys; | |||||
| keyboard_media_keys = 0; | |||||
| for (i=0; i < 6; i++) { | for (i=0; i < 6; i++) { | ||||
| anybits |= keyboard_keys[i]; | anybits |= keyboard_keys[i]; | ||||
| keyboard_keys[i] = 0; | keyboard_keys[i] = 0; | ||||
| yield(); | yield(); | ||||
| } | } | ||||
| *(tx_packet->buf) = keyboard_modifier_keys; | *(tx_packet->buf) = keyboard_modifier_keys; | ||||
| *(tx_packet->buf + 1) = keyboard_media_keys; | |||||
| *(tx_packet->buf + 1) = 0; | |||||
| memcpy(tx_packet->buf + 2, keyboard_keys, 6); | memcpy(tx_packet->buf + 2, keyboard_keys, 6); | ||||
| tx_packet->len = 8; | tx_packet->len = 8; | ||||
| usb_tx(KEYBOARD_ENDPOINT, tx_packet); | usb_tx(KEYBOARD_ENDPOINT, tx_packet); |
| void usb_keymedia_release_all(void); | void usb_keymedia_release_all(void); | ||||
| #endif | #endif | ||||
| extern uint8_t keyboard_modifier_keys; | extern uint8_t keyboard_modifier_keys; | ||||
| extern uint8_t keyboard_media_keys; | |||||
| extern uint8_t keyboard_keys[6]; | extern uint8_t keyboard_keys[6]; | ||||
| extern uint8_t keyboard_protocol; | extern uint8_t keyboard_protocol; | ||||
| extern uint8_t keyboard_idle_config; | extern uint8_t keyboard_idle_config; | ||||
| void set_key4(uint8_t c) { keyboard_keys[3] = c; } | void set_key4(uint8_t c) { keyboard_keys[3] = c; } | ||||
| void set_key5(uint8_t c) { keyboard_keys[4] = c; } | void set_key5(uint8_t c) { keyboard_keys[4] = c; } | ||||
| void set_key6(uint8_t c) { keyboard_keys[5] = c; } | void set_key6(uint8_t c) { keyboard_keys[5] = c; } | ||||
| void set_media(uint8_t c) { keyboard_media_keys = c; } | |||||
| void set_media(uint16_t c) { | |||||
| if (c == 0) { | |||||
| usb_keymedia_release_all(); | |||||
| } else if (c >= 0xE400 && c <= 0xE7FF) { | |||||
| press(c); | |||||
| } | |||||
| } | |||||
| void send_now(void) { usb_keyboard_send(); } | void send_now(void) { usb_keyboard_send(); } | ||||
| void press(uint16_t n) { usb_keyboard_press_keycode(n); } | void press(uint16_t n) { usb_keyboard_press_keycode(n); } | ||||
| void release(uint16_t n) { usb_keyboard_release_keycode(n); } | void release(uint16_t n) { usb_keyboard_release_keycode(n); } |