From d3b1af9572e123c939fc355474bf12402c86d292 Mon Sep 17 00:00:00 2001 From: tmk Date: Thu, 30 Sep 2010 14:17:01 +0900 Subject: add mouse function. --- .gitignore | 1 + Makefile | 11 +- keymap.h | 2 +- matrix.h | 5 + mykey.c | 127 +++++------ print.c | 1 - print.h | 4 +- usb.c | 693 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ usb.h | 79 +++++++ usb_debug.h | 6 +- usb_device.c | 598 ------------------------------------------------- usb_device.h | 81 ------- usb_keyboard.h | 4 +- usb_keycodes.h | 271 ++++++++++++++++++++++ usb_mouse.c | 62 ++++++ usb_mouse.h | 20 ++ usbkeycodes.h | 275 ----------------------- 17 files changed, 1199 insertions(+), 1041 deletions(-) create mode 100644 usb.c create mode 100644 usb.h delete mode 100644 usb_device.c delete mode 100644 usb_device.h create mode 100644 usb_keycodes.h create mode 100644 usb_mouse.c create mode 100644 usb_mouse.h delete mode 100644 usbkeycodes.h diff --git a/.gitignore b/.gitignore index 293c452390..c25d41d238 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,4 @@ *.lst *.map *.sym +tags diff --git a/Makefile b/Makefile index c9c668d415..1fe3ffa2b1 100644 --- a/Makefile +++ b/Makefile @@ -46,13 +46,14 @@ TARGET = mykey # List C source files here. (C dependencies are automatically generated.) SRC = $(TARGET).c \ - keymap.c \ - matrix.c \ - usb_device.c \ + usb.c \ usb_keyboard.c \ + usb_mouse.c \ usb_debug.c \ - print.c \ - jump_bootloader.c + keymap.c \ + matrix.c \ + jump_bootloader.c \ + print.c # MCU name, you MUST set this to match the board you are using diff --git a/keymap.h b/keymap.h index ac0cc5fea6..6b95fb61f6 100644 --- a/keymap.h +++ b/keymap.h @@ -2,7 +2,7 @@ #define KEYMAP_H 1 #include -#include "usbkeycodes.h" +#include "usb_keycodes.h" int get_layer(void); uint8_t get_keycode(int layer, int row, int col); diff --git a/matrix.h b/matrix.h index d5290916b5..74b5f894b1 100644 --- a/matrix.h +++ b/matrix.h @@ -1,3 +1,6 @@ +#ifndef MATRIX_H +#define MATRIX_H 1 + #include extern uint8_t *matrix; @@ -8,3 +11,5 @@ uint8_t matrix_scan(void); bool matrix_is_modified(void); bool matrix_has_ghost(void); bool matrix_has_ghost_in_row(uint8_t row); + +#endif diff --git a/mykey.c b/mykey.c index 94cbbfb5a1..a295b8c57d 100644 --- a/mykey.c +++ b/mykey.c @@ -30,7 +30,9 @@ #include #include -#include "usb_device.h" +#include "usb.h" +#include "usb_keyboard.h" +#include "usb_mouse.h" #include "print.h" #include "matrix.h" #include "keymap.h" @@ -50,16 +52,9 @@ uint16_t idle_count=0; int main(void) { - bool modified = false; - bool has_ghost = false; - uint8_t key_index = 0; - // set for 16 MHz clock CPU_PRESCALE(0); - matrix_init(); - - // Initialize the USB, and then wait for the host to set configuration. // If the Teensy is powered without a PC connected to the USB port, // this will wait forever. @@ -78,99 +73,85 @@ int main(void) TCCR0B = 0x05; TIMSK0 = (1< 6) { - //Rollover - } + // mouse + print("usb_mouse_move\n"); + usb_mouse_move(10, 0, 0); - usb_keyboard_send(); - - - // variables shared with interrupt routines must be - // accessed carefully so the interrupt routine doesn't - // try to use the variable in the middle of our access - cli(); - //idle_count = 0; - sei(); - } - - // print matrix state for debug - if (modified) { - print_matrix(); - - // LED flush - DDRD |= 1<> 8); phex(idle_count & 0xFF); print("\n"); - print("loop_count: "); phex((loop_count & 0xFF00) >> 8); phex(loop_count & 0xFF); print("\n"); - print_matrix(); - } - // teensy LED flush for debug - if ((loop_count & 0x100) == 0) { - DDRD |= 1< 6) { + //Rollover + } + usb_keyboard_send(); + } } -*/ - - // now the current pins will be the previous, and - // wait a short delay so we're not highly sensitive - // to mechanical "bounce". - _delay_ms(2); loop_count++; + _delay_ms(2); } } diff --git a/print.c b/print.c index 8e46decac4..5395fa3480 100644 --- a/print.c +++ b/print.c @@ -25,7 +25,6 @@ #include #include - #include "print.h" void print_P(const char *s) diff --git a/print.h b/print.h index 9a42462754..d61e5de3e0 100644 --- a/print.h +++ b/print.h @@ -1,5 +1,5 @@ -#ifndef print_h__ -#define print_h__ +#ifndef PRINT_H__ +#define PRINT_H__ 1 #include #include "usb_debug.h" diff --git a/usb.c b/usb.c new file mode 100644 index 0000000000..c910a977ed --- /dev/null +++ b/usb.c @@ -0,0 +1,693 @@ +/* USB Keyboard Plus Debug Channel Example for Teensy USB Development Board + * http://www.pjrc.com/teensy/usb_keyboard.html + * Copyright (c) 2009 PJRC.COM, LLC + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include +#include +#include +#include "usb.h" +#include "usb_keyboard.h" +#include "usb_mouse.h" +#include "usb_debug.h" + + +/************************************************************************** + * + * Configurable Options + * + **************************************************************************/ + +// You can change these to give your code its own name. +#define STR_MANUFACTURER L"t.m.k." +#define STR_PRODUCT L"t.m.k. keyboard" + + +// Mac OS-X and Linux automatically load the correct drivers. On +// Windows, even though the driver is supplied by Microsoft, an +// INF file is needed to load the driver. These numbers need to +// match the INF file. +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0xBABE + + +// USB devices are supposed to implment a halt feature, which is +// rarely (if ever) used. If you comment this line out, the halt +// code will be removed, saving 102 bytes of space (gcc 4.3.0). +// This is not strictly USB compliant, but works with all major +// operating systems. +#define SUPPORT_ENDPOINT_HALT + + + +/************************************************************************** + * + * Endpoint Buffer Configuration + * + **************************************************************************/ + +#define ENDPOINT0_SIZE 32 + +// 0:control endpoint is enabled automatically by controller. +static const uint8_t PROGMEM endpoint_config_table[] = { + // enable, UECFG0X(type, direction), UECFG1X(size, bank, allocation) + 1, EP_TYPE_INTERRUPT_IN, EP_SIZE(KEYBOARD_SIZE) | KEYBOARD_BUFFER, // 1 + 1, EP_TYPE_INTERRUPT_IN, EP_SIZE(MOUSE_SIZE) | MOUSE_BUFFER, // 2 + 1, EP_TYPE_INTERRUPT_IN, EP_SIZE(DEBUG_TX_SIZE) | DEBUG_TX_BUFFER, // 3 + 0, // 4 + 0, // 5 + 0, // 6 +}; + + +/************************************************************************** + * + * Descriptor Data + * + **************************************************************************/ + +// Descriptors are the data that your computer reads when it auto-detects +// this USB device (called "enumeration" in USB lingo). The most commonly +// changed items are editable at the top of this file. Changing things +// in here should only be done by those who've read chapter 9 of the USB +// spec and relevant portions of any USB class specifications! + + +static uint8_t PROGMEM device_descriptor[] = { + 18, // bLength + 1, // bDescriptorType + 0x00, 0x02, // bcdUSB + 0, // bDeviceClass + 0, // bDeviceSubClass + 0, // bDeviceProtocol + ENDPOINT0_SIZE, // bMaxPacketSize0 + LSB(VENDOR_ID), MSB(VENDOR_ID), // idVendor + LSB(PRODUCT_ID), MSB(PRODUCT_ID), // idProduct + 0x00, 0x01, // bcdDevice + 1, // iManufacturer + 2, // iProduct + 0, // iSerialNumber + 1 // bNumConfigurations +}; + +// Keyboard Protocol 1, HID 1.11 spec, Appendix B, page 59-60 +static uint8_t PROGMEM keyboard_hid_report_desc[] = { + 0x05, 0x01, // Usage Page (Generic Desktop), + 0x09, 0x06, // Usage (Keyboard), + 0xA1, 0x01, // Collection (Application), + 0x75, 0x01, // Report Size (1), + 0x95, 0x08, // Report Count (8), + 0x05, 0x07, // Usage Page (Key Codes), + 0x19, 0xE0, // Usage Minimum (224), + 0x29, 0xE7, // Usage Maximum (231), + 0x15, 0x00, // Logical Minimum (0), + 0x25, 0x01, // Logical Maximum (1), + 0x81, 0x02, // Input (Data, Variable, Absolute), ;Modifier byte + 0x95, 0x01, // Report Count (1), + 0x75, 0x08, // Report Size (8), + 0x81, 0x03, // Input (Constant), ;Reserved byte + 0x95, 0x05, // Report Count (5), + 0x75, 0x01, // Report Size (1), + 0x05, 0x08, // Usage Page (LEDs), + 0x19, 0x01, // Usage Minimum (1), + 0x29, 0x05, // Usage Maximum (5), + 0x91, 0x02, // Output (Data, Variable, Absolute), ;LED report + 0x95, 0x01, // Report Count (1), + 0x75, 0x03, // Report Size (3), + 0x91, 0x03, // Output (Constant), ;LED report padding + 0x95, 0x06, // Report Count (6), + 0x75, 0x08, // Report Size (8), + 0x15, 0x00, // Logical Minimum (0), + 0x25, 0x68, // Logical Maximum(104), + 0x05, 0x07, // Usage Page (Key Codes), + 0x19, 0x00, // Usage Minimum (0), + 0x29, 0x68, // Usage Maximum (104), + 0x81, 0x00, // Input (Data, Array), + 0xc0 // End Collection +}; + +// Mouse Protocol 1, HID 1.11 spec, Appendix B, page 59-60, with wheel extension +static uint8_t PROGMEM mouse_hid_report_desc[] = { + 0x05, 0x01, // Usage Page (Generic Desktop) + 0x09, 0x02, // Usage (Mouse) + 0xA1, 0x01, // Collection (Application) + 0x05, 0x09, // Usage Page (Button) + 0x19, 0x01, // Usage Minimum (Button #1) + 0x29, 0x03, // Usage Maximum (Button #3) + 0x15, 0x00, // Logical Minimum (0) + 0x25, 0x01, // Logical Maximum (1) + 0x95, 0x03, // Report Count (3) + 0x75, 0x01, // Report Size (1) + 0x81, 0x02, // Input (Data, Variable, Absolute) + 0x95, 0x01, // Report Count (1) + 0x75, 0x05, // Report Size (5) + 0x81, 0x03, // Input (Constant) + 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, Variable, Relative) + 0x09, 0x38, // Usage (Wheel) + 0x95, 0x01, // Report Count (1), + 0x81, 0x06, // Input (Data, Variable, Relative) + 0xC0 // End Collection +}; + +static uint8_t PROGMEM debug_hid_report_desc[] = { + 0x06, 0x31, 0xFF, // Usage Page 0xFF31 (vendor defined) + 0x09, 0x74, // Usage 0x74 + 0xA1, 0x53, // Collection 0x53 + 0x75, 0x08, // report size = 8 bits + 0x15, 0x00, // logical minimum = 0 + 0x26, 0xFF, 0x00, // logical maximum = 255 + 0x95, DEBUG_TX_SIZE, // report count + 0x09, 0x75, // usage + 0x81, 0x02, // Input (array) + 0xC0 // end collection +}; + +#define CONFIG1_DESC_SIZE (9+(9+9+7)+(9+9+7)+(9+9+7)) +#define KEYBOARD_HID_DESC_OFFSET (9+9) +#define MOUSE_HID_DESC_OFFSET (9+(9+9+7)+9) +#define DEBUG_HID_DESC_OFFSET (9+(9+9+7)+(9+9+7)+9) +static uint8_t PROGMEM config1_descriptor[CONFIG1_DESC_SIZE] = { + // configuration descriptor, USB spec 9.6.3, page 264-266, Table 9-10 + 9, // bLength; + 2, // bDescriptorType; + LSB(CONFIG1_DESC_SIZE), // wTotalLength + MSB(CONFIG1_DESC_SIZE), + 3, // bNumInterfaces + 1, // bConfigurationValue + 0, // iConfiguration + 0xC0, // bmAttributes + 50, // bMaxPower + + // interface descriptor, USB spec 9.6.5, page 267-269, Table 9-12 + 9, // bLength + 4, // bDescriptorType + KEYBOARD_INTERFACE, // bInterfaceNumber + 0, // bAlternateSetting + 1, // bNumEndpoints + 0x03, // bInterfaceClass (0x03 = HID) + 0x01, // bInterfaceSubClass (0x01 = Boot) + 0x01, // bInterfaceProtocol (0x01 = Keyboard) + 0, // iInterface + // HID descriptor, HID 1.11 spec, section 6.2.1 + 9, // bLength + 0x21, // bDescriptorType + 0x11, 0x01, // bcdHID + 0, // bCountryCode + 1, // bNumDescriptors + 0x22, // bDescriptorType + sizeof(keyboard_hid_report_desc), // wDescriptorLength + 0, + // endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13 + 7, // bLength + 5, // bDescriptorType + KEYBOARD_ENDPOINT | 0x80, // bEndpointAddress + 0x03, // bmAttributes (0x03=intr) + KEYBOARD_SIZE, 0, // wMaxPacketSize + 1, // bInterval + + // interface descriptor, USB spec 9.6.5, page 267-269, Table 9-12 + 9, // bLength + 4, // bDescriptorType + MOUSE_INTERFACE, // bInterfaceNumber + 0, // bAlternateSetting + 1, // bNumEndpoints + 0x03, // bInterfaceClass (0x03 = HID) + 0x01, // bInterfaceSubClass (0x01 = Boot) + 0x02, // bInterfaceProtocol (0x02 = Mouse) + 0, // iInterface + // HID descriptor, HID 1.11 spec, section 6.2.1 + 9, // bLength + 0x21, // bDescriptorType + 0x11, 0x01, // bcdHID + 0, // bCountryCode + 1, // bNumDescriptors + 0x22, // bDescriptorType + sizeof(mouse_hid_report_desc), // wDescriptorLength + 0, + // endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13 + 7, // bLength + 5, // bDescriptorType + MOUSE_ENDPOINT | 0x80, // bEndpointAddress + 0x03, // bmAttributes (0x03=intr) + 4, 0, // wMaxPacketSize + 1, // bInterval + + // interface descriptor, USB spec 9.6.5, page 267-269, Table 9-12 + 9, // bLength + 4, // bDescriptorType + DEBUG_INTERFACE, // bInterfaceNumber + 0, // bAlternateSetting + 1, // bNumEndpoints + 0x03, // bInterfaceClass (0x03 = HID) + 0x00, // bInterfaceSubClass + 0x00, // bInterfaceProtocol + 0, // iInterface + // HID descriptor, HID 1.11 spec, section 6.2.1 + 9, // bLength + 0x21, // bDescriptorType + 0x11, 0x01, // bcdHID + 0, // bCountryCode + 1, // bNumDescriptors + 0x22, // bDescriptorType + sizeof(debug_hid_report_desc), // wDescriptorLength + 0, + // endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13 + 7, // bLength + 5, // bDescriptorType + DEBUG_TX_ENDPOINT | 0x80, // bEndpointAddress + 0x03, // bmAttributes (0x03=intr) + DEBUG_TX_SIZE, 0, // wMaxPacketSize + 1 // bInterval +}; + +// If you're desperate for a little extra code memory, these strings +// can be completely removed if iManufacturer, iProduct, iSerialNumber +// in the device desciptor are changed to zeros. +struct usb_string_descriptor_struct { + uint8_t bLength; + uint8_t bDescriptorType; + int16_t wString[]; +}; +static struct usb_string_descriptor_struct PROGMEM string0 = { + 4, + 3, + {0x0409} +}; +static struct usb_string_descriptor_struct PROGMEM string1 = { + sizeof(STR_MANUFACTURER), + 3, + STR_MANUFACTURER +}; +static struct usb_string_descriptor_struct PROGMEM string2 = { + sizeof(STR_PRODUCT), + 3, + STR_PRODUCT +}; + +// This table defines which descriptor data is sent for each specific +// request from the host (in wValue and wIndex). +static struct descriptor_list_struct { + uint16_t wValue; // descriptor type + uint16_t wIndex; + const uint8_t *addr; + uint8_t length; +} PROGMEM descriptor_list[] = { + // DEVICE descriptor + {0x0100, 0x0000, device_descriptor, sizeof(device_descriptor)}, + // CONFIGURATION descriptor + {0x0200, 0x0000, config1_descriptor, sizeof(config1_descriptor)}, + // HID REPORT + {0x2200, KEYBOARD_INTERFACE, keyboard_hid_report_desc, sizeof(keyboard_hid_report_desc)}, + {0x2100, KEYBOARD_INTERFACE, config1_descriptor+KEYBOARD_HID_DESC_OFFSET, 9}, + // HID REPORT + {0x2200, MOUSE_INTERFACE, mouse_hid_report_desc, sizeof(mouse_hid_report_desc)}, + {0x2100, MOUSE_INTERFACE, config1_descriptor+MOUSE_HID_DESC_OFFSET, 9}, + // HID REPORT + {0x2200, DEBUG_INTERFACE, debug_hid_report_desc, sizeof(debug_hid_report_desc)}, + {0x2100, DEBUG_INTERFACE, config1_descriptor+DEBUG_HID_DESC_OFFSET, 9}, + // STRING descriptor + {0x0300, 0x0000, (const uint8_t *)&string0, 4}, + {0x0301, 0x0409, (const uint8_t *)&string1, sizeof(STR_MANUFACTURER)}, + {0x0302, 0x0409, (const uint8_t *)&string2, sizeof(STR_PRODUCT)} +}; +#define NUM_DESC_LIST (sizeof(descriptor_list)/sizeof(struct descriptor_list_struct)) + + +/************************************************************************** + * + * Variables - these are the only non-stack RAM usage + * + **************************************************************************/ + +// zero when we are not configured, non-zero when enumerated +static volatile uint8_t usb_configuration=0; + + +/************************************************************************** + * + * Public Functions - these are the API intended for the user + * + **************************************************************************/ + + +// initialize USB +void usb_init(void) +{ + HW_CONFIG(); + USB_FREEZE(); // enable USB + PLL_CONFIG(); // config PLL + while (!(PLLCSR & (1<= NUM_DESC_LIST) { + UECONX = (1< desc_length) len = desc_length; + do { + // wait for host ready for IN packet + do { + i = UEINTX; + } while (!(i & ((1<= 1 && i <= MAX_ENDPOINT) { + usb_send_in(); + UENUM = i; + if (bRequest == SET_FEATURE) { + UECONX = (1<> 8); + keyboard_idle_count = 0; + //usb_wait_in_ready(); + usb_send_in(); + return; + } + if (bRequest == HID_SET_PROTOCOL) { + keyboard_protocol = wValue; + //usb_wait_in_ready(); + usb_send_in(); + return; + } + } + } + if (wIndex == MOUSE_INTERFACE) { + if (bmRequestType == 0xA1) { + if (bRequest == HID_GET_REPORT) { + usb_wait_in_ready(); + UEDATX = mouse_buttons; + UEDATX = 0; + UEDATX = 0; + UEDATX = 0; + usb_send_in(); + return; + } + if (bRequest == HID_GET_PROTOCOL) { + usb_wait_in_ready(); + UEDATX = mouse_protocol; + usb_send_in(); + return; + } + } + if (bmRequestType == 0x21) { + if (bRequest == HID_SET_PROTOCOL) { + mouse_protocol = wValue; + usb_send_in(); + return; + } + } + } + if (wIndex == DEBUG_INTERFACE) { + if (bRequest == HID_GET_REPORT && bmRequestType == 0xA1) { + len = wLength; + do { + // wait for host ready for IN packet + do { + i = UEINTX; + } while (!(i & ((1< +#include + + +void usb_init(void); // initialize everything +uint8_t usb_configured(void); // is the USB port configured + + + + +#define EP_TYPE_CONTROL 0x00 +#define EP_TYPE_BULK_IN 0x81 +#define EP_TYPE_BULK_OUT 0x80 +#define EP_TYPE_INTERRUPT_IN 0xC1 +#define EP_TYPE_INTERRUPT_OUT 0xC0 +#define EP_TYPE_ISOCHRONOUS_IN 0x41 +#define EP_TYPE_ISOCHRONOUS_OUT 0x40 + +#define EP_SINGLE_BUFFER 0x02 +#define EP_DOUBLE_BUFFER 0x06 + +#define EP_SIZE(s) ((s) == 64 ? 0x30 : \ + ((s) == 32 ? 0x20 : \ + ((s) == 16 ? 0x10 : \ + 0x00))) + +#define MAX_ENDPOINT 4 + +#define LSB(n) (n & 255) +#define MSB(n) ((n >> 8) & 255) + +#if defined(__AVR_AT90USB162__) +#define HW_CONFIG() +#define PLL_CONFIG() (PLLCSR = ((1< -#include "usb_device.h" +#include "usb.h" -#define DEBUG_INTERFACE 1 -#define DEBUG_TX_ENDPOINT 4 +#define DEBUG_INTERFACE 2 +#define DEBUG_TX_ENDPOINT 3 #define DEBUG_TX_SIZE 32 #define DEBUG_TX_BUFFER EP_DOUBLE_BUFFER diff --git a/usb_device.c b/usb_device.c deleted file mode 100644 index 1d790f043c..0000000000 --- a/usb_device.c +++ /dev/null @@ -1,598 +0,0 @@ -/* USB Keyboard Plus Debug Channel Example for Teensy USB Development Board - * http://www.pjrc.com/teensy/usb_keyboard.html - * Copyright (c) 2009 PJRC.COM, LLC - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -#include -#include -#include "usb_device.h" -#include "usb_keyboard.h" -#include "usb_debug.h" - - -/************************************************************************** - * - * Configurable Options - * - **************************************************************************/ - -// You can change these to give your code its own name. -#define STR_MANUFACTURER L"t.m.k." -#define STR_PRODUCT L"t.m.k. keyboard" - - -// Mac OS-X and Linux automatically load the correct drivers. On -// Windows, even though the driver is supplied by Microsoft, an -// INF file is needed to load the driver. These numbers need to -// match the INF file. -#define VENDOR_ID 0xFEED -#define PRODUCT_ID 0xBABE - - -// USB devices are supposed to implment a halt feature, which is -// rarely (if ever) used. If you comment this line out, the halt -// code will be removed, saving 102 bytes of space (gcc 4.3.0). -// This is not strictly USB compliant, but works with all major -// operating systems. -#define SUPPORT_ENDPOINT_HALT - - - -/************************************************************************** - * - * Endpoint Buffer Configuration - * - **************************************************************************/ - -#define ENDPOINT0_SIZE 32 - -static const uint8_t PROGMEM endpoint_config_table[] = { - 0, - 0, - 1, EP_TYPE_INTERRUPT_IN, EP_SIZE(KEYBOARD_SIZE) | KEYBOARD_BUFFER, - 1, EP_TYPE_INTERRUPT_IN, EP_SIZE(DEBUG_TX_SIZE) | DEBUG_TX_BUFFER -}; - - -/************************************************************************** - * - * Descriptor Data - * - **************************************************************************/ - -// Descriptors are the data that your computer reads when it auto-detects -// this USB device (called "enumeration" in USB lingo). The most commonly -// changed items are editable at the top of this file. Changing things -// in here should only be done by those who've read chapter 9 of the USB -// spec and relevant portions of any USB class specifications! - - -static uint8_t PROGMEM device_descriptor[] = { - 18, // bLength - 1, // bDescriptorType - 0x00, 0x02, // bcdUSB - 0, // bDeviceClass - 0, // bDeviceSubClass - 0, // bDeviceProtocol - ENDPOINT0_SIZE, // bMaxPacketSize0 - LSB(VENDOR_ID), MSB(VENDOR_ID), // idVendor - LSB(PRODUCT_ID), MSB(PRODUCT_ID), // idProduct - 0x00, 0x01, // bcdDevice - 1, // iManufacturer - 2, // iProduct - 0, // iSerialNumber - 1 // bNumConfigurations -}; - -// Keyboard Protocol 1, HID 1.11 spec, Appendix B, page 59-60 -static uint8_t PROGMEM keyboard_hid_report_desc[] = { - 0x05, 0x01, // Usage Page (Generic Desktop), - 0x09, 0x06, // Usage (Keyboard), - 0xA1, 0x01, // Collection (Application), - 0x75, 0x01, // Report Size (1), - 0x95, 0x08, // Report Count (8), - 0x05, 0x07, // Usage Page (Key Codes), - 0x19, 0xE0, // Usage Minimum (224), - 0x29, 0xE7, // Usage Maximum (231), - 0x15, 0x00, // Logical Minimum (0), - 0x25, 0x01, // Logical Maximum (1), - 0x81, 0x02, // Input (Data, Variable, Absolute), ;Modifier byte - 0x95, 0x01, // Report Count (1), - 0x75, 0x08, // Report Size (8), - 0x81, 0x03, // Input (Constant), ;Reserved byte - 0x95, 0x05, // Report Count (5), - 0x75, 0x01, // Report Size (1), - 0x05, 0x08, // Usage Page (LEDs), - 0x19, 0x01, // Usage Minimum (1), - 0x29, 0x05, // Usage Maximum (5), - 0x91, 0x02, // Output (Data, Variable, Absolute), ;LED report - 0x95, 0x01, // Report Count (1), - 0x75, 0x03, // Report Size (3), - 0x91, 0x03, // Output (Constant), ;LED report padding - 0x95, 0x06, // Report Count (6), - 0x75, 0x08, // Report Size (8), - 0x15, 0x00, // Logical Minimum (0), - 0x25, 0x68, // Logical Maximum(104), - 0x05, 0x07, // Usage Page (Key Codes), - 0x19, 0x00, // Usage Minimum (0), - 0x29, 0x68, // Usage Maximum (104), - 0x81, 0x00, // Input (Data, Array), - 0xc0 // End Collection -}; - -static uint8_t PROGMEM debug_hid_report_desc[] = { - 0x06, 0x31, 0xFF, // Usage Page 0xFF31 (vendor defined) - 0x09, 0x74, // Usage 0x74 - 0xA1, 0x53, // Collection 0x53 - 0x75, 0x08, // report size = 8 bits - 0x15, 0x00, // logical minimum = 0 - 0x26, 0xFF, 0x00, // logical maximum = 255 - 0x95, DEBUG_TX_SIZE, // report count - 0x09, 0x75, // usage - 0x81, 0x02, // Input (array) - 0xC0 // end collection -}; - -#define CONFIG1_DESC_SIZE (9+9+9+7+9+9+7) -#define KEYBOARD_HID_DESC_OFFSET (9+9) -#define DEBUG_HID_DESC_OFFSET (9+9+9+7+9) -static uint8_t PROGMEM config1_descriptor[CONFIG1_DESC_SIZE] = { - // configuration descriptor, USB spec 9.6.3, page 264-266, Table 9-10 - 9, // bLength; - 2, // bDescriptorType; - LSB(CONFIG1_DESC_SIZE), // wTotalLength - MSB(CONFIG1_DESC_SIZE), - 2, // bNumInterfaces - 1, // bConfigurationValue - 0, // iConfiguration - 0xC0, // bmAttributes - 50, // bMaxPower - // interface descriptor, USB spec 9.6.5, page 267-269, Table 9-12 - 9, // bLength - 4, // bDescriptorType - KEYBOARD_INTERFACE, // bInterfaceNumber - 0, // bAlternateSetting - 1, // bNumEndpoints - 0x03, // bInterfaceClass (0x03 = HID) - 0x01, // bInterfaceSubClass (0x01 = Boot) - 0x01, // bInterfaceProtocol (0x01 = Keyboard) - 0, // iInterface - // HID interface descriptor, HID 1.11 spec, section 6.2.1 - 9, // bLength - 0x21, // bDescriptorType - 0x11, 0x01, // bcdHID - 0, // bCountryCode - 1, // bNumDescriptors - 0x22, // bDescriptorType - sizeof(keyboard_hid_report_desc), // wDescriptorLength - 0, - // endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13 - 7, // bLength - 5, // bDescriptorType - KEYBOARD_ENDPOINT | 0x80, // bEndpointAddress - 0x03, // bmAttributes (0x03=intr) - KEYBOARD_SIZE, 0, // wMaxPacketSize - 1, // bInterval - // interface descriptor, USB spec 9.6.5, page 267-269, Table 9-12 - 9, // bLength - 4, // bDescriptorType - DEBUG_INTERFACE, // bInterfaceNumber - 0, // bAlternateSetting - 1, // bNumEndpoints - 0x03, // bInterfaceClass (0x03 = HID) - 0x00, // bInterfaceSubClass - 0x00, // bInterfaceProtocol - 0, // iInterface - // HID interface descriptor, HID 1.11 spec, section 6.2.1 - 9, // bLength - 0x21, // bDescriptorType - 0x11, 0x01, // bcdHID - 0, // bCountryCode - 1, // bNumDescriptors - 0x22, // bDescriptorType - sizeof(debug_hid_report_desc), // wDescriptorLength - 0, - // endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13 - 7, // bLength - 5, // bDescriptorType - DEBUG_TX_ENDPOINT | 0x80, // bEndpointAddress - 0x03, // bmAttributes (0x03=intr) - DEBUG_TX_SIZE, 0, // wMaxPacketSize - 1 // bInterval -}; - -// If you're desperate for a little extra code memory, these strings -// can be completely removed if iManufacturer, iProduct, iSerialNumber -// in the device desciptor are changed to zeros. -struct usb_string_descriptor_struct { - uint8_t bLength; - uint8_t bDescriptorType; - int16_t wString[]; -}; -static struct usb_string_descriptor_struct PROGMEM string0 = { - 4, - 3, - {0x0409} -}; -static struct usb_string_descriptor_struct PROGMEM string1 = { - sizeof(STR_MANUFACTURER), - 3, - STR_MANUFACTURER -}; -static struct usb_string_descriptor_struct PROGMEM string2 = { - sizeof(STR_PRODUCT), - 3, - STR_PRODUCT -}; - -// This table defines which descriptor data is sent for each specific -// request from the host (in wValue and wIndex). -static struct descriptor_list_struct { - uint16_t wValue; // descriptor type - uint16_t wIndex; - const uint8_t *addr; - uint8_t length; -} PROGMEM descriptor_list[] = { - // DEVICE descriptor - {0x0100, 0x0000, device_descriptor, sizeof(device_descriptor)}, - // CONFIGURATION descriptor - {0x0200, 0x0000, config1_descriptor, sizeof(config1_descriptor)}, - // HID REPORT - {0x2200, KEYBOARD_INTERFACE, keyboard_hid_report_desc, sizeof(keyboard_hid_report_desc)}, - {0x2100, KEYBOARD_INTERFACE, config1_descriptor+KEYBOARD_HID_DESC_OFFSET, 9}, - // HID REPORT - {0x2200, DEBUG_INTERFACE, debug_hid_report_desc, sizeof(debug_hid_report_desc)}, - {0x2100, DEBUG_INTERFACE, config1_descriptor+DEBUG_HID_DESC_OFFSET, 9}, - // STRING descriptor - {0x0300, 0x0000, (const uint8_t *)&string0, 4}, - {0x0301, 0x0409, (const uint8_t *)&string1, sizeof(STR_MANUFACTURER)}, - {0x0302, 0x0409, (const uint8_t *)&string2, sizeof(STR_PRODUCT)} -}; -#define NUM_DESC_LIST (sizeof(descriptor_list)/sizeof(struct descriptor_list_struct)) - - -/************************************************************************** - * - * Variables - these are the only non-stack RAM usage - * - **************************************************************************/ - -// zero when we are not configured, non-zero when enumerated -static volatile uint8_t usb_configuration=0; - - -/************************************************************************** - * - * Public Functions - these are the API intended for the user - * - **************************************************************************/ - - -// initialize USB -void usb_init(void) -{ - HW_CONFIG(); - USB_FREEZE(); // enable USB - PLL_CONFIG(); // config PLL - while (!(PLLCSR & (1<= NUM_DESC_LIST) { - UECONX = (1< desc_length) len = desc_length; - do { - // wait for host ready for IN packet - do { - i = UEINTX; - } while (!(i & ((1<= 1 && i <= MAX_ENDPOINT) { - usb_send_in(); - UENUM = i; - if (bRequest == SET_FEATURE) { - UECONX = (1<> 8); - keyboard_idle_count = 0; - //usb_wait_in_ready(); - usb_send_in(); - return; - } - if (bRequest == HID_SET_PROTOCOL) { - keyboard_protocol = wValue; - //usb_wait_in_ready(); - usb_send_in(); - return; - } - } - } - if (wIndex == DEBUG_INTERFACE) { - if (bRequest == HID_GET_REPORT && bmRequestType == 0xA1) { - len = wLength; - do { - // wait for host ready for IN packet - do { - i = UEINTX; - } while (!(i & ((1< -#include -#include "usb_keyboard.h" -#include "usb_debug.h" - - -void usb_init(void); // initialize everything -uint8_t usb_configured(void); // is the USB port configured - - - - -#define EP_TYPE_CONTROL 0x00 -#define EP_TYPE_BULK_IN 0x81 -#define EP_TYPE_BULK_OUT 0x80 -#define EP_TYPE_INTERRUPT_IN 0xC1 -#define EP_TYPE_INTERRUPT_OUT 0xC0 -#define EP_TYPE_ISOCHRONOUS_IN 0x41 -#define EP_TYPE_ISOCHRONOUS_OUT 0x40 - -#define EP_SINGLE_BUFFER 0x02 -#define EP_DOUBLE_BUFFER 0x06 - -#define EP_SIZE(s) ((s) == 64 ? 0x30 : \ - ((s) == 32 ? 0x20 : \ - ((s) == 16 ? 0x10 : \ - 0x00))) - -#define MAX_ENDPOINT 4 - -#define LSB(n) (n & 255) -#define MSB(n) ((n >> 8) & 255) - -#if defined(__AVR_AT90USB162__) -#define HW_CONFIG() -#define PLL_CONFIG() (PLLCSR = ((1< -#include "usb_device.h" +#include "usb.h" #define KEYBOARD_INTERFACE 0 -#define KEYBOARD_ENDPOINT 3 +#define KEYBOARD_ENDPOINT 1 #define KEYBOARD_SIZE 8 #define KEYBOARD_BUFFER EP_DOUBLE_BUFFER diff --git a/usb_keycodes.h b/usb_keycodes.h new file mode 100644 index 0000000000..95160398d8 --- /dev/null +++ b/usb_keycodes.h @@ -0,0 +1,271 @@ +/* + * 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 + + +enum keycodes { + KB_NO = 0, + KB_ROLL_OVER, + KB_POST_FAIL, + KB_UNDEFINED, + KB_A, + KB_B, + KB_C, + KB_D, + KB_E, + KB_F, + KB_G, + KB_H, + KB_I, + KB_J, + KB_K, + KB_L, + KB_M, /* 0x10 */ + KB_N, + KB_O, + KB_P, + KB_Q, + KB_R, + KB_S, + KB_T, + KB_U, + KB_V, + KB_W, + KB_X, + KB_Y, + KB_Z, + KB_1, + KB_2, + KB_3, /* 0x20 */ + KB_4, + KB_5, + KB_6, + KB_7, + KB_8, + KB_9, + KB_0, + KB_ENTER, + KB_ESCAPE, + KB_BSPACE, + KB_TAB, + 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_CAPSLOCK, + KB_F1, + KB_F2, + KB_F3, + KB_F4, + KB_F5, + KB_F6, + KB_F7, /* 0x40 */ + KB_F8, + KB_F9, + KB_F10, + KB_F11, + KB_F12, + KB_PSCREEN, + KB_SCKLOCK, + KB_BREAK, + KB_INSERT, + KB_HOME, + KB_PGUP, + KB_DELETE, + KB_END, + KB_PGDOWN, + KB_RIGHT, + KB_LEFT, /* 0x50 */ + KB_DOWN, + KB_UP, + KB_NUMLOCK, + KP_SLASH, + KP_ASTERISK, + KP_MINUS, + KP_PLUS, + KP_ENTER, + KP_1, + KP_2, + KP_3, + KP_4, + KP_5, + KP_6, + KP_7, + KP_8, /* 0x60 */ + KP_9, + KP_0, + KP_DOT, + KB_NONUS_BSLASH, /* Non-US \ and | */ + KB_APPLICATION, + KB_POWER, + KP_EQUAL, + KB_F13, + KB_F14, + KB_F15, + KB_F16, + KB_F17, + KB_F18, + KB_F19, + KB_F20, + KB_F21, /* 0x70 */ + KB_F22, + KB_F23, + KB_F24, + KB_EXECUTE, + KB_HELP, + KB_MENU, + KB_SELECT, + KB_STOP, + KB_AGAIN, + KB_UNDO, + KB_CUT, + 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 */ + KP_COMMA, + KP_EQUAL_AS400, /* equal sign on AS/400 */ + KB_INT1, + KB_INT2, + KB_INT3, + KB_INT4, + KB_INT5, + KB_INT6, + KB_INT7, + KB_INT8, + KB_INT9, + KB_LANG1, /* 0x90 */ + KB_LANG2, + KB_LANG3, + KB_LANG4, + KB_LANG5, + KB_LANG6, + KB_LANG7, + KB_LANG8, + KB_LANG9, + KB_ALT_ERASE, + KB_SYSREQ, + KB_CANCEL, + KB_CLEAR, + KB_PRIOR, + KB_RETURN, + KB_SEPARATOR, + KB_OUT, + KB_OPER, + KB_CLEAR_AGAIN, + KB_CRSEL, + KB_EXSEL, + + KP_00 = 0xB0, + KP_000, + KB_THOUSANDS_SEPARATOR, + KB_DECIMAL_SEPARATOR, + CURRENCY_UNIT, + CURRENCY_SUB_UNIT, + KP_LPAREN, + KP_RPAREN, + KP_LCBRACKET, /* { */ + KP_RCBRACKET, /* } */ + KP_TAB, + KP_BSPACE, + KP_A, + KP_B, + KP_C, + KP_D, + KP_E, + KP_F, + KP_XOR, + KP_HAT, + KP_PERC, + KP_LT, + KP_GT, + KP_AND, + KP_LAZYAND, + KP_OR, + KP_LAZYOR, + KP_COLON, + KP_HASH, + KP_SPACE, + KP_ATMARK, + KP_EXCLAMATION, + KP_MEM_STORE, + KP_MEM_RECALL, + KP_MEM_CLEAR, + KP_MEM_ADD, + KP_MEM_SUB, + KP_MEM_MUL, + KP_MEM_DIV, + KP_PLUS_MINUS, + KP_CLEAR, + KP_CLEAR_ENTRY, + KP_BINARY, + KP_OCTAL, + KP_DECIMAL, + 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 */ + + /* extensions for internal use */ + FN_0 = 0xF0, + FN_1, + FN_2, + FN_3, +}; + +#endif /* USB_KEYCODES_H */ diff --git a/usb_mouse.c b/usb_mouse.c new file mode 100644 index 0000000000..539f2edd37 --- /dev/null +++ b/usb_mouse.c @@ -0,0 +1,62 @@ +#include +#include +#include "usb_mouse.h" + + +// which buttons are currently pressed +uint8_t mouse_buttons=0; + +// protocol setting from the host. We use exactly the same report +// either way, so this variable only stores the setting since we +// are required to be able to report which setting is in use. +uint8_t mouse_protocol=1; + + +// Set the mouse buttons. To create a "click", 2 calls are needed, +// one to push the button down and the second to release it +int8_t usb_mouse_buttons(uint8_t left, uint8_t middle, uint8_t right) +{ + uint8_t mask=0; + + if (left) mask |= 1; + if (middle) mask |= 4; + if (right) mask |= 2; + mouse_buttons = mask; + return usb_mouse_move(0, 0, 0); +} + +// Move the mouse. x, y and wheel are -127 to 127. Use 0 for no movement. +int8_t usb_mouse_move(int8_t x, int8_t y, int8_t wheel) +{ + uint8_t intr_state, timeout; + + if (!usb_configured()) return -1; + if (x == -128) x = -127; + if (y == -128) y = -127; + if (wheel == -128) wheel = -127; + intr_state = SREG; + cli(); + UENUM = MOUSE_ENDPOINT; + timeout = UDFNUML + 50; + while (1) { + // are we ready to transmit? + if (UEINTX & (1< +#include "usb.h" + + +#define MOUSE_INTERFACE 1 +#define MOUSE_ENDPOINT 2 +#define MOUSE_SIZE 8 +#define MOUSE_BUFFER EP_DOUBLE_BUFFER + +extern uint8_t mouse_buttons; +extern uint8_t mouse_protocol; + + +int8_t usb_mouse_buttons(uint8_t left, uint8_t middle, uint8_t right); +int8_t usb_mouse_move(int8_t x, int8_t y, int8_t wheel); + +#endif diff --git a/usbkeycodes.h b/usbkeycodes.h deleted file mode 100644 index b0e7058363..0000000000 --- a/usbkeycodes.h +++ /dev/null @@ -1,275 +0,0 @@ -/* Some modified from Keyboard Upgrade 0.3.0 - * 2010/08/22 - */ -/* - * 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 USBKEYCODES_H -#define USBKEYCODES_H - -/* - * The USB keycodes are enumerated here - the first part is simply - * an enumeration of the allowed scan-codes used for USB HID devices. - */ -/* - * see 10 Keyboard/Keypad Page(0x07) - * http://www.usb.org/developers/devclass_docs/Hut1_12.pdf - */ -enum keycodes { - KB_NO = 0, - KB_ROLL_OVER, - KB_POST_FAIL, - KB_UNDEFINED, - KB_A, - KB_B, - KB_C, - KB_D, - KB_E, - KB_F, - KB_G, - KB_H, - KB_I, - KB_J, - KB_K, - KB_L, - KB_M, /* 0x10 */ - KB_N, - KB_O, - KB_P, - KB_Q, - KB_R, - KB_S, - KB_T, - KB_U, - KB_V, - KB_W, - KB_X, - KB_Y, - KB_Z, - KB_1, - KB_2, - KB_3, /* 0x20 */ - KB_4, - KB_5, - KB_6, - KB_7, - KB_8, - KB_9, - KB_0, - KB_ENTER, - KB_ESCAPE, - KB_BSPACE, - KB_TAB, - 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_CAPSLOCK, - KB_F1, - KB_F2, - KB_F3, - KB_F4, - KB_F5, - KB_F6, - KB_F7, /* 0x40 */ - KB_F8, - KB_F9, - KB_F10, - KB_F11, - KB_F12, - KB_PSCREEN, - KB_SCKLOCK, - KB_BREAK, - KB_INSERT, - KB_HOME, - KB_PGUP, - KB_DELETE, - KB_END, - KB_PGDOWN, - KB_RIGHT, - KB_LEFT, /* 0x50 */ - KB_DOWN, - KB_UP, - KB_NUMLOCK, - KP_SLASH, - KP_ASTERISK, - KP_MINUS, - KP_PLUS, - KP_ENTER, - KP_1, - KP_2, - KP_3, - KP_4, - KP_5, - KP_6, - KP_7, - KP_8, /* 0x60 */ - KP_9, - KP_0, - KP_DOT, - KB_NONUS_BSLASH, /* Non-US \ and | */ - KB_APPLICATION, - KB_POWER, - KP_EQUAL, - KB_F13, - KB_F14, - KB_F15, - KB_F16, - KB_F17, - KB_F18, - KB_F19, - KB_F20, - KB_F21, /* 0x70 */ - KB_F22, - KB_F23, - KB_F24, - KB_EXECUTE, - KB_HELP, - KB_MENU, - KB_SELECT, - KB_STOP, - KB_AGAIN, - KB_UNDO, - KB_CUT, - 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 */ - KP_COMMA, - KP_EQUAL_AS400, /* equal sign on AS/400 */ - KB_INT1, - KB_INT2, - KB_INT3, - KB_INT4, - KB_INT5, - KB_INT6, - KB_INT7, - KB_INT8, - KB_INT9, - KB_LANG1, /* 0x90 */ - KB_LANG2, - KB_LANG3, - KB_LANG4, - KB_LANG5, - KB_LANG6, - KB_LANG7, - KB_LANG8, - KB_LANG9, - KB_ALT_ERASE, - KB_SYSREQ, - KB_CANCEL, - KB_CLEAR, - KB_PRIOR, - KB_RETURN, - KB_SEPARATOR, - KB_OUT, - KB_OPER, - KB_CLEAR_AGAIN, - KB_CRSEL, - KB_EXSEL, - - KP_00 = 0xB0, - KP_000, - KB_THOUSANDS_SEPARATOR, - KB_DECIMAL_SEPARATOR, - CURRENCY_UNIT, - CURRENCY_SUB_UNIT, - KP_LPAREN, - KP_RPAREN, - KP_LCBRACKET, /* { */ - KP_RCBRACKET, /* } */ - KP_TAB, - KP_BSPACE, - KP_A, - KP_B, - KP_C, - KP_D, - KP_E, - KP_F, - KP_XOR, - KP_HAT, - KP_PERC, - KP_LT, - KP_GT, - KP_AND, - KP_LAZYAND, - KP_OR, - KP_LAZYOR, - KP_COLON, - KP_HASH, - KP_SPACE, - KP_ATMARK, - KP_EXCLAMATION, - KP_MEM_STORE, - KP_MEM_RECALL, - KP_MEM_CLEAR, - KP_MEM_ADD, - KP_MEM_SUB, - KP_MEM_MUL, - KP_MEM_DIV, - KP_PLUS_MINUS, - KP_CLEAR, - KP_CLEAR_ENTRY, - KP_BINARY, - KP_OCTAL, - KP_DECIMAL, - 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 */ - - /* function keys */ - FN_0 = 0xF0, - FN_1, - FN_2, - FN_3, -}; - -#endif /* USBKEYCODES_H */ -- cgit v1.2.3