]> git.donarmstrong.com Git - tmk_firmware.git/blobdiff - protocol/pjrc/usb.c
NKRO is disable when SET_PROTOCOL(boot)
[tmk_firmware.git] / protocol / pjrc / usb.c
index f4c6f81f5cf19baf9fc87aff3f5aaa29057a2061..2b267d48004199e581aa16bce0bf53656eda3cfd 100644 (file)
 #include "usb_mouse.h"
 #include "usb_debug.h"
 #include "usb_extra.h"
+#include "led.h"
 #include "print.h"
 #include "util.h"
+#ifdef SLEEP_LED_ENABLE
+#include "sleep_led.h"
+#endif
+#include "suspend.h"
+#include "action.h"
+#include "action_util.h"
 
 
 /**************************************************************************
@@ -100,7 +107,11 @@ static const uint8_t PROGMEM endpoint_config_table[] = {
 #else
         0,                                                                  // 2
 #endif
+#ifdef CONSOLE_ENABLE
        1, EP_TYPE_INTERRUPT_IN,  EP_SIZE(DEBUG_TX_SIZE) | DEBUG_TX_BUFFER, // 3
+#else
+        0,
+#endif
 #ifdef EXTRAKEY_ENABLE
        1, EP_TYPE_INTERRUPT_IN,  EP_SIZE(EXTRA_SIZE)    | EXTRA_BUFFER,    // 4
 #else
@@ -329,8 +340,12 @@ static const uint8_t PROGMEM extra_hid_report_desc[] = {
 #   define MOUSE_HID_DESC_NUM           (KBD_HID_DESC_NUM + 0)
 #endif
 
+#ifdef CONSOLE_ENABLE
 #define DEBUG_HID_DESC_NUM              (MOUSE_HID_DESC_NUM + 1)
 #define DEBUG_HID_DESC_OFFSET           (9+(9+9+7)*DEBUG_HID_DESC_NUM+9)
+#else
+#   define DEBUG_HID_DESC_NUM           (MOUSE_HID_DESC_NUM + 0)
+#endif
 
 #ifdef EXTRAKEY_ENABLE
 #   define EXTRA_HID_DESC_NUM           (DEBUG_HID_DESC_NUM + 1)
@@ -421,6 +436,7 @@ static const uint8_t PROGMEM config1_descriptor[CONFIG1_DESC_SIZE] = {
        1,                                      // bInterval
 #endif
 
+#ifdef CONSOLE_ENABLE
        // interface descriptor, USB spec 9.6.5, page 267-269, Table 9-12
        9,                                      // bLength
        4,                                      // bDescriptorType
@@ -447,6 +463,7 @@ static const uint8_t PROGMEM config1_descriptor[CONFIG1_DESC_SIZE] = {
        0x03,                                   // bmAttributes (0x03=intr)
        DEBUG_TX_SIZE, 0,                       // wMaxPacketSize
        1,                                      // bInterval
+#endif
 
 #ifdef EXTRAKEY_ENABLE
        // interface descriptor, USB spec 9.6.5, page 267-269, Table 9-12
@@ -550,8 +567,10 @@ static const struct descriptor_list_struct {
        {0x2100, MOUSE_INTERFACE, config1_descriptor+MOUSE_HID_DESC_OFFSET, 9},
        {0x2200, MOUSE_INTERFACE, mouse_hid_report_desc, sizeof(mouse_hid_report_desc)},
 #endif
+#ifdef CONSOLE_ENABLE
        {0x2100, DEBUG_INTERFACE, config1_descriptor+DEBUG_HID_DESC_OFFSET, 9},
        {0x2200, DEBUG_INTERFACE, debug_hid_report_desc, sizeof(debug_hid_report_desc)},
+#endif
 #ifdef EXTRAKEY_ENABLE
        {0x2100, EXTRA_INTERFACE, config1_descriptor+EXTRA_HID_DESC_OFFSET, 9},
        {0x2200, EXTRA_INTERFACE, extra_hid_report_desc, sizeof(extra_hid_report_desc)},
@@ -595,7 +614,8 @@ void usb_init(void)
         USB_CONFIG();                          // start USB clock
         UDCON = 0;                             // enable attach resistor
        usb_configuration = 0;
-        UDIEN = (1<<EORSTE)|(1<<SOFE)|(1<<SUSPE);
+        suspend = false;
+        UDIEN = (1<<EORSTE)|(1<<SOFE)|(1<<SUSPE)|(1<<WAKEUPE);
        sei();
 }
 
@@ -631,9 +651,24 @@ ISR(USB_GEN_vect)
 
         intbits = UDINT;
         UDINT = 0;
-        if (intbits & (1<<SUSPI)) {
+        if ((intbits & (1<<SUSPI)) && (UDIEN & (1<<SUSPE)) && usb_configuration) {
+#ifdef SLEEP_LED_ENABLE
+            sleep_led_enable();
+#endif
+            UDIEN &= ~(1<<SUSPE);
+            UDIEN |= (1<<WAKEUPE);
             suspend = true;
-        } else {
+        }
+        if ((intbits & (1<<WAKEUPI)) && (UDIEN & (1<<WAKEUPE)) && usb_configuration) {
+            suspend_wakeup_init();
+#ifdef SLEEP_LED_ENABLE
+            sleep_led_disable();
+            // NOTE: converters may not accept this
+            led_set(host_keyboard_leds());
+#endif
+
+            UDIEN |= (1<<SUSPE);
+            UDIEN &= ~(1<<WAKEUPE);
             suspend = false;
         }
         if (intbits & (1<<EORSTI)) {
@@ -658,20 +693,20 @@ ISR(USB_GEN_vect)
                }
                 /* TODO: should keep IDLE rate on each keyboard interface */
 #ifdef NKRO_ENABLE
-               if (!keyboard_nkro && usb_keyboard_idle_config && (++div4 & 3) == 0) {
+               if (!keyboard_nkro && keyboard_idle && (++div4 & 3) == 0) {
 #else
-               if (usb_keyboard_idle_config && (++div4 & 3) == 0) {
+               if (keyboard_idle && (++div4 & 3) == 0) {
 #endif
                        UENUM = KBD_ENDPOINT;
                        if (UEINTX & (1<<RWAL)) {
                                usb_keyboard_idle_count++;
-                               if (usb_keyboard_idle_count == usb_keyboard_idle_config) {
+                               if (usb_keyboard_idle_count == keyboard_idle) {
                                        usb_keyboard_idle_count = 0;
                                         /* TODO: fix keyboard_report inconsistency */
 /* To avoid Mac SET_IDLE behaviour.
                                        UEDATX = keyboard_report_prev->mods;
                                        UEDATX = 0;
-                                        uint8_t keys = usb_keyboard_protocol ? KBD_REPORT_KEYS : 6;
+                                        uint8_t keys = keyboard_protocol ? KBD_REPORT_KEYS : 6;
                                        for (uint8_t i=0; i<keys; i++) {
                                                UEDATX = keyboard_report_prev->keys[i];
                                        }
@@ -867,13 +902,13 @@ ISR(USB_COM_vect)
                                }
                                if (bRequest == HID_GET_IDLE) {
                                        usb_wait_in_ready();
-                                       UEDATX = usb_keyboard_idle_config;
+                                       UEDATX = keyboard_idle;
                                        usb_send_in();
                                        return;
                                }
                                if (bRequest == HID_GET_PROTOCOL) {
                                        usb_wait_in_ready();
-                                       UEDATX = usb_keyboard_protocol;
+                                       UEDATX = keyboard_protocol;
                                        usb_send_in();
                                        return;
                                }
@@ -887,14 +922,18 @@ ISR(USB_COM_vect)
                                        return;
                                }
                                if (bRequest == HID_SET_IDLE) {
-                                       usb_keyboard_idle_config = (wValue >> 8);
+                                       keyboard_idle = (wValue >> 8);
                                        usb_keyboard_idle_count = 0;
                                        //usb_wait_in_ready();
                                        usb_send_in();
                                        return;
                                }
                                if (bRequest == HID_SET_PROTOCOL) {
-                                       usb_keyboard_protocol = wValue;
+                                       keyboard_protocol = wValue;
+#ifdef NKRO_ENABLE
+                                        keyboard_nkro = !!keyboard_protocol;
+#endif
+                                        clear_keyboard();
                                        //usb_wait_in_ready();
                                        usb_send_in();
                                        return;