diff --git a/digistump-avr/libraries/DigisparkKeyboard/DigiKeyboard.h b/digistump-avr/libraries/DigisparkKeyboard/DigiKeyboard.h index e9cff46..fd796be 100644 --- a/digistump-avr/libraries/DigisparkKeyboard/DigiKeyboard.h +++ b/digistump-avr/libraries/DigisparkKeyboard/DigiKeyboard.h @@ -3,6 +3,9 @@ * * TODO: Make a proper file header. :-) * Modified for Digispark by Digistump + * Added full Keyboard usage values by Danjovic, February 2016 + * Report Buffer extended up to 6 keytrokes simultaneous by Danjovic, March 2016 + * Added LED control by Danjovic, January 2019 */ #ifndef __DigiKeyboard_h__ #define __DigiKeyboard_h__ @@ -14,6 +17,7 @@ #include #include "usbdrv.h" +#include "hidkeys.h" #include "scancode-ascii-table.h" // TODO: Work around Arduino 12 issues better. @@ -22,111 +26,59 @@ typedef uint8_t byte; - -#define BUFFER_SIZE 2 // Minimum of 2: 1 for modifiers + 1 for keystroke - - -static uchar idleRate; // in 4 ms units - - -/* We use a simplifed keyboard report descriptor which does not support the - * boot protocol. We don't allow setting status LEDs and but we do allow - * simultaneous key presses. - * The report descriptor has been created with usb.org's "HID Descriptor Tool" - * which can be downloaded from http://www.usb.org/developers/hidpage/. - * Redundant entries (such as LOGICAL_MINIMUM and USAGE_PAGE) have been omitted - * for the second INPUT item. - */ -const PROGMEM char usbHidReportDescriptor[USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH] = { /* USB report descriptor */ - 0x05, 0x01, // USAGE_PAGE (Generic Desktop) - 0x09, 0x06, // USAGE (Keyboard) - 0xa1, 0x01, // COLLECTION (Application) - 0x05, 0x07, // USAGE_PAGE (Keyboard) - 0x19, 0xe0, // USAGE_MINIMUM (Keyboard LeftControl) - 0x29, 0xe7, // USAGE_MAXIMUM (Keyboard Right GUI) - 0x15, 0x00, // LOGICAL_MINIMUM (0) - 0x25, 0x01, // LOGICAL_MAXIMUM (1) - 0x75, 0x01, // REPORT_SIZE (1) - 0x95, 0x08, // REPORT_COUNT (8) - 0x81, 0x02, // INPUT (Data,Var,Abs) - 0x95, 0x01, // REPORT_COUNT (simultaneous keystrokes) - 0x75, 0x08, // REPORT_SIZE (8) - 0x25, 0x65, // LOGICAL_MAXIMUM (101) - 0x19, 0x00, // USAGE_MINIMUM (Reserved (no event indicated)) - 0x29, 0x65, // USAGE_MAXIMUM (Keyboard Application) - 0x81, 0x00, // INPUT (Data,Ary,Abs) - 0xc0 // END_COLLECTION +typedef struct { + uint8_t modifier; + uint8_t reserved; + uint8_t keycode[6]; +} keyboard_report_t; + +// static keyboard_report_t keyboard_report; // sent to PC + static volatile uchar ledState = 0xff; // received from PC + static uchar idleRate; // repeat rate for keyboards in 4 ms units + + +#define NUM_LOCK (1<<0) +#define CAPS_LOCK (1<<1) +#define SCROLL_LOCK (1<<2) + + + // From Frank Zhao's USB Business Card project +// http://www.frank-zhao.com/cache/usbbusinesscard_details.php +const PROGMEM char usbHidReportDescriptor[USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH] = { + 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 (Keyboard)(Key Codes) + 0x19, 0xe0, // USAGE_MINIMUM (Keyboard LeftControl)(224) + 0x29, 0xe7, // USAGE_MAXIMUM (Keyboard Right GUI)(231) + 0x15, 0x00, // LOGICAL_MINIMUM (0) + 0x25, 0x01, // LOGICAL_MAXIMUM (1) + 0x81, 0x02, // INPUT (Data,Var,Abs) ; Modifier byte + 0x95, 0x01, // REPORT_COUNT (1) + 0x75, 0x08, // REPORT_SIZE (8) + 0x81, 0x03, // INPUT (Cnst,Var,Abs) ; Reserved byte + 0x95, 0x05, // REPORT_COUNT (5) + 0x75, 0x01, // REPORT_SIZE (1) + 0x05, 0x08, // USAGE_PAGE (LEDs) + 0x19, 0x01, // USAGE_MINIMUM (Num Lock) + 0x29, 0x05, // USAGE_MAXIMUM (Kana) + 0x91, 0x02, // OUTPUT (Data,Var,Abs) ; LED report + 0x95, 0x01, // REPORT_COUNT (1) + 0x75, 0x03, // REPORT_SIZE (3) + 0x91, 0x03, // OUTPUT (Cnst,Var,Abs) ; LED report padding + 0x95, 0x06, // REPORT_COUNT (6) + 0x75, 0x08, // REPORT_SIZE (8) + 0x15, 0x00, // LOGICAL_MINIMUM (0) + 0x25, 0x65, // LOGICAL_MAXIMUM (101) + 0x05, 0x07, // USAGE_PAGE (Keyboard)(Key Codes) + 0x19, 0x00, // USAGE_MINIMUM (Reserved (no event indicated))(0) + 0x29, 0x65, // USAGE_MAXIMUM (Keyboard Application)(101) + 0x81, 0x00, // INPUT (Data,Ary,Abs) + 0xc0 // END_COLLECTION }; - - - -/* Keyboard usage values, see usb.org's HID-usage-tables document, chapter - * 10 Keyboard/Keypad Page for more codes. - */ -#define MOD_CONTROL_LEFT (1<<0) -#define MOD_SHIFT_LEFT (1<<1) -#define MOD_ALT_LEFT (1<<2) -#define MOD_GUI_LEFT (1<<3) -#define MOD_CONTROL_RIGHT (1<<4) -#define MOD_SHIFT_RIGHT (1<<5) -#define MOD_ALT_RIGHT (1<<6) -#define MOD_GUI_RIGHT (1<<7) - -#define KEY_A 4 -#define KEY_B 5 -#define KEY_C 6 -#define KEY_D 7 -#define KEY_E 8 -#define KEY_F 9 -#define KEY_G 10 -#define KEY_H 11 -#define KEY_I 12 -#define KEY_J 13 -#define KEY_K 14 -#define KEY_L 15 -#define KEY_M 16 -#define KEY_N 17 -#define KEY_O 18 -#define KEY_P 19 -#define KEY_Q 20 -#define KEY_R 21 -#define KEY_S 22 -#define KEY_T 23 -#define KEY_U 24 -#define KEY_V 25 -#define KEY_W 26 -#define KEY_X 27 -#define KEY_Y 28 -#define KEY_Z 29 -#define KEY_1 30 -#define KEY_2 31 -#define KEY_3 32 -#define KEY_4 33 -#define KEY_5 34 -#define KEY_6 35 -#define KEY_7 36 -#define KEY_8 37 -#define KEY_9 38 -#define KEY_0 39 - -#define KEY_ENTER 40 - -#define KEY_SPACE 44 - -#define KEY_F1 58 -#define KEY_F2 59 -#define KEY_F3 60 -#define KEY_F4 61 -#define KEY_F5 62 -#define KEY_F6 63 -#define KEY_F7 64 -#define KEY_F8 65 -#define KEY_F9 66 -#define KEY_F10 67 -#define KEY_F11 68 -#define KEY_F12 69 - -#define KEY_ARROW_LEFT 0x50 + class DigiKeyboardDevice : public Print { @@ -139,19 +91,20 @@ class DigiKeyboardDevice : public Print { usbInit(); - + sei(); // TODO: Remove the next two lines once we fix // missing first keystroke bug properly. - memset(reportBuffer, 0, sizeof(reportBuffer)); - usbSetInterrupt(reportBuffer, sizeof(reportBuffer)); + memset((void *)&keyboard_report,0,sizeof(keyboard_report)); + usbSetInterrupt((unsigned char*)&keyboard_report, sizeof(keyboard_report)); } - + + void update() { usbPoll(); } - + // delay while updating until we are finished delaying void delay(long milli) { unsigned long last = millis(); @@ -162,48 +115,62 @@ class DigiKeyboardDevice : public Print { update(); } } - + + + // get LED State + uchar getLEDs (void) { + return ledState; + } + + + //sendKeyStroke: sends a key press AND release void sendKeyStroke(byte keyStroke) { sendKeyStroke(keyStroke, 0); } + //sendKeyStroke: sends a key press AND release with modifiers void sendKeyStroke(byte keyStroke, byte modifiers) { + sendKeyPress(keyStroke, modifiers); + // This stops endlessly repeating keystrokes: + sendKeyPress(0,0); + } + + //sendKeyPress: sends a key press only - no release + //to release the key, send again with keyPress=0 + void sendKeyPress(byte keyPress) { + sendKeyPress(keyPress, 0); + } + + //sendKeyPress: sends a key press only, with modifiers - no release + //to release the key, send again with keyPress=0 + void sendKeyPress(byte keyPress, byte modifiers) { while (!usbInterruptIsReady()) { - // Note: We wait until we can send keystroke - // so we know the previous keystroke was + // Note: We wait until we can send keyPress + // so we know the previous keyPress was // sent. usbPoll(); _delay_ms(5); } - - memset(reportBuffer, 0, sizeof(reportBuffer)); - - reportBuffer[0] = modifiers; - reportBuffer[1] = keyStroke; - - usbSetInterrupt(reportBuffer, sizeof(reportBuffer)); - - while (!usbInterruptIsReady()) { - // Note: We wait until we can send keystroke - // so we know the previous keystroke was - // sent. - usbPoll(); - _delay_ms(5); - } - - // This stops endlessly repeating keystrokes: - memset(reportBuffer, 0, sizeof(reportBuffer)); - usbSetInterrupt(reportBuffer, sizeof(reportBuffer)); + + + memset((void *)&keyboard_report,0,sizeof(keyboard_report)); // memset(reportBuffer, 0, sizeof(reportBuffer)); + keyboard_report.modifier = modifiers; // reportBuffer[0] = modifiers; + keyboard_report.keycode[1] = keyPress; // reportBuffer[1] = keyPress; + + usbSetInterrupt((unsigned char*)&keyboard_report, sizeof(keyboard_report)); // usbSetInterrupt(reportBuffer, sizeof(reportBuffer)); + } - + size_t write(uint8_t chr) { uint8_t data = pgm_read_byte_near(ascii_to_scan_code_table + (chr - 8)); sendKeyStroke(data & 0b01111111, data >> 7 ? MOD_SHIFT_RIGHT : 0); return 1; } - + //private: TODO: Make friend? - uchar reportBuffer[2]; // buffer for HID reports [ 1 modifier byte + (len-1) key strokes] + // maximum 6 keystrokes, defined in HID report + + keyboard_report_t keyboard_report; // buffer for HID reports [ 1 modifier byte + (len-1) key strokes] using Print::write; }; @@ -211,37 +178,54 @@ DigiKeyboardDevice DigiKeyboard = DigiKeyboardDevice(); #ifdef __cplusplus extern "C"{ -#endif +#endif // USB_PUBLIC uchar usbFunctionSetup uchar usbFunctionSetup(uchar data[8]) { usbRequest_t *rq = (usbRequest_t *)((void *)data); - usbMsgPtr = DigiKeyboard.reportBuffer; // - if ((rq->bmRequestType & USBRQ_TYPE_MASK) == USBRQ_TYPE_CLASS) { - /* class request type */ - - if (rq->bRequest == USBRQ_HID_GET_REPORT) { - /* wValue: ReportType (highbyte), ReportID (lowbyte) */ - - /* we only have one report type, so don't look at wValue */ - // TODO: Ensure it's okay not to return anything here? - return 0; - - } else if (rq->bRequest == USBRQ_HID_GET_IDLE) { - //usbMsgPtr = &idleRate; - //return 1; - return 0; - - } else if (rq->bRequest == USBRQ_HID_SET_IDLE) { - idleRate = rq->wValue.bytes[1]; - - } - } else { - /* no vendor specific requests implemented */ +// usbMsgPtr = (unsigned char*)&DigiKeyboard.keyboard_report ;//usbMsgPtr = DigiKeyboard.reportBuffer; // + + + if((rq->bmRequestType & USBRQ_TYPE_MASK) == USBRQ_TYPE_CLASS) { + switch(rq->bRequest) { + case USBRQ_HID_GET_REPORT: // send "no keys pressed" if asked here + // wValue: ReportType (highbyte), ReportID (lowbyte) + usbMsgPtr = (unsigned char*)&DigiKeyboard.keyboard_report ;//usbMsgPtr = DigiKeyboard.reportBuffer; // + DigiKeyboard.keyboard_report.modifier = 0; + DigiKeyboard.keyboard_report.keycode[0] = 0; + return sizeof(DigiKeyboard.keyboard_report); + case USBRQ_HID_SET_REPORT: // if wLength == 1, should be LED state + return (rq->wLength.word == 1) ? USB_NO_MSG : 0; + case USBRQ_HID_GET_IDLE: // send idle rate to PC as required by spec + usbMsgPtr = &idleRate; + return 1; + case USBRQ_HID_SET_IDLE: // save idle rate as required by spec + idleRate = rq->wValue.bytes[1]; + return 0; + } } - + return 0; } + #ifdef __cplusplus +} // extern "C" +#endif + +#ifdef __cplusplus +extern "C"{ +#endif + // update LED state + usbMsgLen_t usbFunctionWrite(uint8_t * data, uchar len) { + + if (data[0] == ledState) + return 1; + else + ledState = data[0]; + + return 1; // Data read, not expecting more +} + + #ifdef __cplusplus } // extern "C" #endif diff --git a/digistump-avr/libraries/DigisparkKeyboard/examples/DigiKeyboardLEDs/DigiKeyboardLEDs.ino b/digistump-avr/libraries/DigisparkKeyboard/examples/DigiKeyboardLEDs/DigiKeyboardLEDs.ino new file mode 100644 index 0000000..f1c23da --- /dev/null +++ b/digistump-avr/libraries/DigisparkKeyboard/examples/DigiKeyboardLEDs/DigiKeyboardLEDs.ino @@ -0,0 +1,30 @@ +/*** + * ___ _ _ _ __ _ _ + * | \(_)__ _(_) |/ /___ _ _| |__ ___ __ _ _ _ __| | + * | |) | / _` | | ' +#define KEY_SLASH 0x38 // Keyboard / and ? +#define KEY_CAPS_LOCK 0x39 // Keyboard Caps Lock +#define KEY_F1 0x3A // Keyboard F1 +#define KEY_F2 0x3B // Keyboard F2 +#define KEY_F3 0x3C // Keyboard F3 +#define KEY_F4 0x3D // Keyboard F4 +#define KEY_F5 0x3E // Keyboard F5 +#define KEY_F6 0x3F // Keyboard F6 +#define KEY_F7 0x40 // Keyboard F7 +#define KEY_F8 0x41 // Keyboard F8 +#define KEY_F9 0x42 // Keyboard F9 +#define KEY_F10 0x43 // Keyboard F10 +#define KEY_F11 0x44 // Keyboard F11 +#define KEY_F12 0x45 // Keyboard F12 +#define KEY_PRTSCN 0x46 // Keyboard PrintScreen +#define KEY_SCR_LOCK 0x47 // Keyboard Scroll Lock +#define KEY_PAUSE 0x48 // Keyboard Pause +#define KEY_INSERT 0x49 // Keyboard Insert +#define KEY_HOME 0x4A // Keyboard Home +#define KEY_PAGE_UP 0x4B // Keyboard PageUp +#define KEY_DELETE 0x4C // Keyboard Delete Forward +#define KEY_END 0x4D // Keyboard End +#define KEY_PAGE_DOWN 0x4E // Keyboard PageDown +#define KEY_ARROW_RIGHT 0x4F // Keyboard RightArrow +#define KEY_ARROW_LEFT 0x50 // Keyboard LeftArrow +#define KEY_ARROW_DOWN 0x51 // Keyboard DownArrow +#define KEY_ARROW_UP 0x52 // Keyboard UpArrow + +#define KEY_RIGHT_ARROW 0x4F // Keyboard RightArrow -> Alternative arrow keys names +#define KEY_LEFT_ARROW 0x50 // Keyboard LeftArrow +#define KEY_DOWN_ARROW 0x51 // Keyboard DownArrow +#define KEY_UP_ARROW 0x52 // Keyboard UpArrow + +#define KEY_NUM_LOCK 0x53 // Keypad Num Lock and Clear +#define KEY_KPAD_SLASH 0x54 // Keypad / +#define KEY_KPAD_TIMES 0x55 // Keypad * +#define KEY_KPAD_MINUS 0x56 // Keypad - +#define KEY_KPAD_PLUS 0x57 // Keypad + +#define KEY_KPAD_ENTER 0x58 // Keypad ENTER +#define KEY_KPAD_1 0x59 // Keypad 1 and End +#define KEY_KPAD_2 0x5A // Keypad 2 and Down Arrow +#define KEY_KPAD_3 0x5B // Keypad 3 and PageDn +#define KEY_KPAD_4 0x5C // Keypad 4 and Left Arrow +#define KEY_KPAD_5 0x5D // Keypad 5 +#define KEY_KPAD_6 0x5E // Keypad 6 and Right Arrow +#define KEY_KPAD_7 0x5F // Keypad 7 and Home +#define KEY_KPAD_8 0x60 // Keypad 8 and Up Arrow +#define KEY_KPAD_9 0x61 // Keypad 9 and PageUp +#define KEY_KPAD_0 0x62 // Keypad 0 and Insert +#define KEY_KPAD_DOT 0x63 // Keypad . and Delete +#define KEY_INTL_BACKSLASH 0x64 // Keyboard Non-US \ and | +#define KEY_APPLICATION 0x65 // Keyboard Application +#define KEY_POWER 0x66 // Keyboard Power +#define KEY_KPAD_EQUAL 0x67 // Keypad = +#define KEY_F13 0x68 // Keyboard F13 +#define KEY_F14 0x69 // Keyboard F14 +#define KEY_F15 0x6A // Keyboard F15 +#define KEY_F16 0x6B // Keyboard F16 +#define KEY_F17 0x6C // Keyboard F17 +#define KEY_F18 0x6D // Keyboard F18 +#define KEY_F19 0x6E // Keyboard F19 +#define KEY_F20 0x6F // Keyboard F20 +#define KEY_F21 0x70 // Keyboard F21 +#define KEY_F22 0x71 // Keyboard F22 +#define KEY_F23 0x72 // Keyboard F23 +#define KEY_F24 0x73 // Keyboard F24 +#define KEY_EXECUTE 0x74 // Keyboard Execute +#define KEY_HELP 0x75 // Keyboard Help +#define KEY_MENU 0x76 // Keyboard Menu +#define KEY_SELECT 0x77 // Keyboard Select +#define KEY_STOP 0x78 // Keyboard Stop +#define KEY_AGAIN 0x79 // Keyboard Again +#define KEY_UNDO 0x7A // Keyboard Undo +#define KEY_CUT 0x7B // Keyboard Cut +#define KEY_COPY 0x7C // Keyboard Copy +#define KEY_PASTE 0x7D // Keyboard Paste +#define KEY_FIND 0x7E // Keyboard Find +#define KEY_MUTE 0x7F // Keyboard Mute +#define KEY_VOLUME_UP 0x80 // Keyboard Volume Up +#define KEY_VOLUME_DOWN 0x81 // Keyboard Volume Down +#define KEY_LOCK_CAPS_LOCK 0x82 // Keyboard Locking Caps Lock +#define KEY_LOCK_NUM_LOCK 0x83 // Keyboard Locking Num Lock +#define KEY_LOCK_SCR_LOCK 0x84 // Keyboard Locking Scroll Lock +#define KEY_KPAD_COMMA 0x85 // Keypad Comma +#define KEY_EQUAL_SIGN 0x86 // Keypad Equal Sign +#define KEY_INTL1 0x87 // Keyboard International1 +#define KEY_INTL2 0x88 // Keyboard International2 +#define KEY_INTL3 0x89 // Keyboard International3 +#define KEY_INTL4 0x8A // Keyboard International4 +#define KEY_INTL5 0x8B // Keyboard International5 +#define KEY_INTL6 0x8C // Keyboard International6 +#define KEY_INTL7 0x8D // Keyboard International7 +#define KEY_INTL8 0x8E // Keyboard International8 +#define KEY_INTL9 0x8F // Keyboard International9 +#define KEY_LANG1 0x90 // Keyboard LANG1 +#define KEY_LANG2 0x91 // Keyboard LANG2 +#define KEY_LANG3 0x92 // Keyboard LANG3 +#define KEY_LANG4 0x93 // Keyboard LANG4 +#define KEY_LANG5 0x94 // Keyboard LANG5 +#define KEY_LANG6 0x95 // Keyboard LANG6 +#define KEY_LANG7 0x96 // Keyboard LANG7 +#define KEY_LANG8 0x97 // Keyboard LANG8 +#define KEY_LANG9 0x98 // Keyboard LANG9 +#define KEY_ALT_ERASE 0x99 // Keyboard Alternate Erase +#define KEY_SYSREQ 0x9A // Keyboard SysReq/Attention +#define KEY_CANCEL 0x9B // Keyboard Cancel +#define KEY_CLEAR 0x9C // Keyboard Clear +#define KEY_PRIOR 0x9D // Keyboard Prior +#define KEY_RETURN 0x9E // Keyboard Return +#define KEY_SEPARATOR 0x9F // Keyboard Separator +#define KEY_OUT 0xA0 // Keyboard Out +#define KEY_OPER 0xA1 // Keyboard Oper +#define KEY_CLEAR 0xA2 // Keyboard Clear/Again +#define KEY_CRSEL 0xA3 // Keyboard CrSel/Props +#define KEY_EXSEL 0xA4 // Keyboard ExSel + // Keys 0xA5 to 0xAF reserved +#define KEY_KPAD_00 0xB0 // Keypad 00 +#define KEY_KPAD_000 0xB1 // Keypad 000 +#define KEY_THOUSANDS_SEP 0xB2 // Thousands Separator +#define KEY_DECIMAL_SEP 0xB3 // Decimal Separator +#define KEY_CURRENCY 0xB4 // Currency Unit +#define KEY_SUB_CURRENCY 0xB5 // Currency Sub-unit +#define KEY_KPAD_LEFT_PAREN 0xB6 // Keypad ( +#define KEY_KPAD_RIGHT_PAREN 0xB7 // Keypad ) +#define KEY_KPAD_LEFT_BRACE 0xB8 // Keypad { +#define KEY_KPAD_RIGHT_BRACE 0xB9 // Keypad } +#define KEY_KPAD_TAB 0xBA // Keypad Tab +#define KEY_KPAD_BACKSPACE 0xBB // Keypad Backspace +#define KEY_KPAD_A 0xBC // Keypad A +#define KEY_KPAD_B 0xBD // Keypad B +#define KEY_KPAD_C 0xBE // Keypad C +#define KEY_KPAD_D 0xBF // Keypad D +#define KEY_KPAD_E 0xC0 // Keypad E +#define KEY_KPAD_F 0xC1 // Keypad F +#define KEY_KPAD_XOR 0xC2 // Keypad XOR +#define KEY_KPAD_CARET 0xC3 // Keypad ^ +#define KEY_KPAD_PERCENT 0xC4 // Keypad % +#define KEY_KPAD_LESS_THAN 0xC5 // Keypad < +#define KEY_KPAD_GREAT_THAN 0xC6 // Keypad > +#define KEY_KPAD_AND 0xC7 // Keypad & +#define KEY_KPAD_DBL_AND 0xC8 // Keypad && +#define KEY_KPAD_OR 0xC9 // Keypad | +#define KEY_KPAD_DBL_OR 0xCA // Keypad || +#define KEY_KPAD_COLON 0xCB // Keypad : +#define KEY_KPAD_HASH 0xCC // Keypad # +#define KEY_KPAD_SPACE 0xCD // Keypad Space +#define KEY_KPAD_AT 0xCE // Keypad @ +#define KEY_KPAD_EXCLAMATION 0xCF // Keypad ! +#define KEY_KPAD_MEM_STORE 0xD0 // Keypad Memory Store +#define KEY_KPAD_MEM_RECALL 0xD1 // Keypad Memory Recall +#define KEY_KPAD_MEM_CLEAR 0xD2 // Keypad Memory Clear +#define KEY_KPAD_MEM_ADD 0xD3 // Keypad Memory Add +#define KEY_KPAD_MEM_SUB 0xD4 // Keypad Memory Subtract +#define KEY_KPAD_MEM_MULTIPLY 0xD5 // Keypad Memory Multiply +#define KEY_KPAD_MEM_DIVIDE 0xD6 // Keypad Memory Divide +#define KEY_PLUS_MINUS 0xD7 // Keypad +/- +#define KEY_CLEAR 0xD8 // Keypad Clear +#define KEY_CLEAR_ENTRY 0xD9 // Keypad Clear Entry +#define KEY_BINARY 0xDA // Keypad Binary +#define KEY_OCTAL 0xDB // Keypad Octal +#define KEY_DECIMAL 0xDC // Keypad Decimal +#define KEY_HEXADECIMAL 0xDD // Keypad Hexadecimal + // Keys 0xDE to 0xDF reserved +#define KEY_L_CONTROL 0xE0 // Keyboard LeftControl +#define KEY_L_SHIFT 0xE1 // Keyboard LeftShift +#define KEY_L_ALT 0xE2 // Keyboard LeftAlt +#define KEY_L_GUI 0xE3 // Keyboard Left GUI +#define KEY_R_CONTROL 0xE4 // Keyboard RightControl +#define KEY_R_SHIFT 0xE5 // Keyboard RightShift +#define KEY_R_ALT 0xE6 // Keyboard RightAlt +#define KEY_R_GUI 0xE7 // Keyboard Right GUI + +#endif \ No newline at end of file diff --git a/digistump-avr/libraries/DigisparkKeyboard/usbconfig.h b/digistump-avr/libraries/DigisparkKeyboard/usbconfig.h index 9e99405..65da876 100644 --- a/digistump-avr/libraries/DigisparkKeyboard/usbconfig.h +++ b/digistump-avr/libraries/DigisparkKeyboard/usbconfig.h @@ -138,7 +138,7 @@ section at the end of this file). * The value is in milliamperes. [It will be divided by two since USB * communicates power requirements in units of 2 mA.] */ -#define USB_CFG_IMPLEMENT_FN_WRITE 0 +#define USB_CFG_IMPLEMENT_FN_WRITE 1 /* Set this to 1 if you want usbFunctionWrite() to be called for control-out * transfers. Set it to 0 if you don't need it and want to save a couple of * bytes. @@ -290,7 +290,7 @@ section at the end of this file). * HID class is 3, no subclass and protocol required (but may be useful!) * CDC class is 2, use subclass 2 and protocol 1 for ACM */ -#define USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH 35 +#define USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH 63 // 35 /* Define this to the length of the HID report descriptor, if you implement * an HID device. Otherwise don't define it or define it to 0. * If you use this define, you must add a PROGMEM character array named