#ifndef usb_keyboard_serial_h__
#define usb_keyboard_serial_h__
+// ----- Includes -----
+
// Compiler Includes
#include <stdint.h>
#include "output_com.h"
+
// ----- Function Declarations -----
// Basic USB Configuration
#define KEYBOARD_NKRO_INTERFACE 0
#define KEYBOARD_NKRO_ENDPOINT 1
-#define KEYBOARD_NKRO_SIZE 128
+#define KEYBOARD_NKRO_SIZE 64
#define KEYBOARD_NKRO_HID_BUFFER EP_DOUBLE_BUFFER
#define KEYBOARD_INTERFACE 1
18, // bLength
1, // bDescriptorType
0x00, 0x02, // bcdUSB
- 0, // bDeviceClass
+ 0x00, // bDeviceClass - Composite device, 0x00 is required for Windows
0, // bDeviceSubClass
0, // bDeviceProtocol
ENDPOINT0_SIZE, // bMaxPacketSize0
1 // bNumConfigurations
};
+// Specify only a single USB speed
+static const uint8_t PROGMEM device_qualifier_descriptor[] = {
+ 0
+};
+
+// Disable USB debug descriptor
+static const uint8_t PROGMEM usb_debug_descriptor[] = {
+ 0
+};
+
// Keyboard Protocol 1, HID 1.11 spec, Appendix B, page 59-60
static const uint8_t PROGMEM keyboard_hid_report_desc[] = {
// Keyboard Collection
// See http://www.usb.org/developers/hidpage/Hut1_12v2.pdf Chapter 10
// Or Macros/PartialMap/usb_hid.h
//
+ // 50 must be excluded due to a Linux bug with bitmaps (not useful anyways)
// 165-175 are reserved/unused as well as 222-223 and 232-65535
// 224-231 are used for modifiers (see above)
//
+ // Compatibility Notes:
+ // - Using a second endpoint for a boot mode device helps with compatibility
+ // - DO NOT use Padding in the descriptor for bitfields
+ // (Mac OSX silently fails... Windows/Linux work correctly)
+ //
// Packing of bitmaps are as follows:
- // 4-164 : 20 bytes + 1 Report ID byte (0x04-0xA4)
- // 176-221 : 6 bytes + 1 Report ID byte (0xB0-0xDD) (45 bits + 3 padding bits for 6 bytes total)
+ // 4-49 : 6 bytes + 1 Report ID byte (0x04-0x31) ( 46 bits + 2 padding bits for 6 bytes total)
+ // 51-164 : 20 bytes + 1 Report ID byte (0x33-0xA4) (114 bits + 6 padding bits for 15 bytes total)
+ // 176-221 : 6 bytes + 1 Report ID byte (0xB0-0xDD) ( 46 bits + 2 padding bits for 6 bytes total)
//
- // 4-164 (20 bytes/160 bits)
+ // 4-49 (6 bytes/46 bits)
0x85, 0x03, // Report ID (3),
0x75, 0x01, // Report Size (1),
- 0x95, 0xA0, // Report Count (160),
+ 0x95, 0x2E, // Report Count (46),
0x15, 0x00, // Logical Minimum (0),
0x25, 0x01, // Logical Maximum (1),
0x05, 0x07, // Usage Page (Key Codes),
0x19, 0x04, // Usage Minimum (4),
- 0x29, 0xA4, // Usage Maximum (164),
+ 0x29, 0x31, // Usage Maximum (49),
0x81, 0x02, // Input (Data, Variable, Absolute, Bitfield),
- // 176-221 (45 bits)
+ // Should pad 2 bits according to the spec, but OSX doesn't like this -HaaTa
+
+ // 51-164 (15 bytes/160 bits)
0x85, 0x04, // Report ID (4),
0x75, 0x01, // Report Size (1),
+ 0x95, 0xA0, // Report Count (160),
+ 0x15, 0x00, // Logical Minimum (0),
+ 0x25, 0x01, // Logical Maximum (1),
+ 0x05, 0x07, // Usage Page (Key Codes),
+ 0x19, 0x33, // Usage Minimum (51),
+ 0x29, 0xA4, // Usage Maximum (164),
+ 0x81, 0x02, // Input (Data, Variable, Absolute, Bitfield),
+
+ // Should pad 6 bits according to the spec, but OSX doesn't like this -HaaTa
+
+ // 176-221 (6 bytes/46 bits)
+ 0x85, 0x05, // Report ID (5),
+ 0x75, 0x01, // Report Size (1),
0x95, 0x2D, // Report Count (45),
0x15, 0x00, // Logical Minimum (0),
0x25, 0x01, // Logical Maximum (1),
0x29, 0xDD, // Usage Maximum (221),
0x81, 0x02, // Input (Data, Variable, Absolute, Bitfield),
- // 176-221 Padding (3 bits)
- 0x75, 0x03, // Report Size (3),
- 0x95, 0x01, // Report Count (1),
- 0x81, 0x03, // Input (Constant),
+ // Should pad 2 bits according to the spec, but OSX doesn't like this -HaaTa
+
0xc0, // End Collection - Keyboard
// System Control Collection
0x05, 0x01, // Usage Page (Generic Desktop),
0x09, 0x80, // Usage (System Control),
0xA1, 0x01, // Collection (Application),
- 0x85, 0x05, // Report ID (5),
+ 0x85, 0x06, // Report ID (6),
0x75, 0x08, // Report Size (8),
0x95, 0x01, // Report Count (1),
0x16, 0x81, 0x00, // Logical Minimum (129),
0x05, 0x0c, // Usage Page (Consumer),
0x09, 0x01, // Usage (Consumer Control),
0xA1, 0x01, // Collection (Application),
- 0x85, 0x06, // Report ID (6),
+ 0x85, 0x07, // Report ID (7),
0x75, 0x10, // Report Size (16),
0x95, 0x01, // Report Count (1),
0x16, 0x20, 0x00, // Logical Minimum (32),
9, // bLength
0x21, // bDescriptorType
0x11, 0x01, // bcdHID
- 33, // bCountryCode - Setting to 0/Undefined
+ 0, // bCountryCode - Setting to 0/Undefined
1, // bNumDescriptors
0x22, // bDescriptorType
// wDescriptorLength
} PROGMEM descriptor_list[] = {
{0x0100, 0x0000, device_descriptor, sizeof(device_descriptor)},
{0x0200, 0x0000, config1_descriptor, sizeof(config1_descriptor)},
+ {0x0600, 0x0000, device_qualifier_descriptor, sizeof(device_qualifier_descriptor)},
+ {0x0A00, 0x0000, usb_debug_descriptor, sizeof(usb_debug_descriptor)},
{0x2200, KEYBOARD_INTERFACE, keyboard_hid_report_desc, sizeof(keyboard_hid_report_desc)},
{0x2100, KEYBOARD_INTERFACE, config1_descriptor + KEYBOARD_HID_DESC_OFFSET, 9},
{0x2200, KEYBOARD_NKRO_INTERFACE, keyboard_nkro_hid_report_desc, sizeof(keyboard_nkro_hid_report_desc)},
#define NUM_DESC_LIST (sizeof(descriptor_list)/sizeof(struct descriptor_list_struct))
+
#endif // usb_keyboard_serial_h__