]> git.donarmstrong.com Git - kiibohd-controller.git/commitdiff
Adding proper remote wake-up support
authorJacob Alexander <haata@kiibohd.com>
Tue, 17 May 2016 08:18:14 +0000 (01:18 -0700)
committerJacob Alexander <haata@kiibohd.com>
Tue, 17 May 2016 08:18:14 +0000 (01:18 -0700)
- Maintains a sleep state variable (may be able to use as a signal in the future)
- On the first keypress, hold the RESUME signal for 10 ms (spec says between 1 and 15 ms)
- Removed some messages that were affecting sleep state

Output/pjrcUSB/arm/usb_dev.c
Output/pjrcUSB/arm/usb_keyboard.c
Output/pjrcUSB/arm/usb_mouse.c
Output/pjrcUSB/output_com.c
Output/usbMuxUart/output_com.c

index 9de5b70eaa493714dab1200dae17ddeeaf522f93..27059b5e161abf3cfb845949e254b2daa01f5d0d 100644 (file)
@@ -171,6 +171,8 @@ static uint8_t reply_buffer[8];
 static uint8_t power_neg_delay;
 static uint32_t power_neg_time;
 
+static uint8_t usb_dev_sleep = 0;
+
 
 
 // ----- Functions -----
@@ -977,6 +979,16 @@ void usb_rx_memory( usb_packet_t *packet )
 
 void usb_tx( uint32_t endpoint, usb_packet_t *packet )
 {
+       // If we have been sleeping, try to wake up host
+       if ( usb_dev_sleep )
+       {
+               // Force wake-up for 10 ms
+               // According to the USB Spec a device must hold resume for at least 1 ms but no more than 15 ms
+               USB0_CTL |= USB_CTL_RESUME;
+               delay(10);
+               USB0_CTL &= ~(USB_CTL_RESUME);
+       }
+
        // Since we are transmitting data, USB will be brought out of sleep/suspend
        // if it's in that state
        // Use the currently set descriptor value
@@ -1257,6 +1269,7 @@ restart:
                        USB_INTEN_STALLEN |
                        USB_INTEN_ERROREN |
                        USB_INTEN_USBRSTEN |
+                       USB_INTEN_RESUMEEN |
                        USB_INTEN_SLEEPEN;
 
                // is this necessary?
@@ -1285,9 +1298,19 @@ restart:
        // The USB Module triggers this interrupt when it detects the bus has been idle for 3 ms
        if ( (status & USB_ISTAT_SLEEP /* 10 */ ) )
        {
-               info_print("Host has requested USB sleep/suspend state");
+               //info_print("Host has requested USB sleep/suspend state");
                Output_update_usb_current( 100 ); // Set to 100 mA
-               USB0_ISTAT = USB_ISTAT_SLEEP;
+               usb_dev_sleep = 1;
+               USB0_ISTAT |= USB_ISTAT_SLEEP;
+       }
+
+       // On USB Resume, unset the usb_dev_sleep so we don't keep sending resume signals
+       if ( (status & USB_ISTAT_RESUME /* 20 */ ) )
+       {
+               //info_print("Host has woken-up/resumed from sleep/suspend state");
+               Output_update_usb_current( *usb_bMaxPower * 2 );
+               usb_dev_sleep = 0;
+               USB0_ISTAT |= USB_ISTAT_RESUME;
        }
 }
 
@@ -1346,6 +1369,9 @@ uint8_t usb_init()
        // Do not check for power negotiation delay until Get Configuration Descriptor
        power_neg_delay = 0;
 
+       // During initialization host isn't sleeping
+       usb_dev_sleep = 0;
+
        return 1;
 }
 
index d362bb34ed66ed897e8e993e1a6b6e6e17a9dcd7..040ef2547340c65a13312f327313f8fc5a318437 100644 (file)
@@ -127,6 +127,7 @@ void usb_keyboard_send()
                {
                        transmit_previous_timeout = 1;
                        warn_print("USB Transmit Timeout...");
+                       USBKeys_Changed = USBKeyChangeState_None; // Indicate packet lost
                        return;
                }
                yield();
index 5de771279c83afa5f6485aa2c63cb5daa3fed10f..c72eed568270b15f9f4c2a881d48e3ae98b7a7ac 100644 (file)
@@ -163,6 +163,12 @@ void usb_mouse_send()
                {
                        transmit_previous_timeout = 1;
                        warn_print("USB Transmit Timeout...");
+
+                        // Clear status and state
+                        USBMouse_Buttons = 0;
+                        USBMouse_Relative_x = 0;
+                        USBMouse_Relative_y = 0;
+                        USBMouse_Changed = 0;
                        return;
                }
                yield();
index 39ee0b0c188262c77ca3b84ffd0f4a5196bce7a8..082c42bc0b47722b6d509dee7222053c19db4206 100644 (file)
@@ -713,10 +713,12 @@ void Output_update_usb_current( unsigned int current )
        // Update USB current
        Output_USBCurrent_Available = current;
 
+       /* XXX Affects sleep states due to USB messages
        unsigned int total_current = Output_current_available();
        info_msg("USB Available Current Changed. Total Available: ");
        printInt32( total_current );
        print(" mA" NL);
+       */
 
        // Send new total current to the Scan Modules
        Scan_currentChange( Output_current_available() );
index 6aa07e933e5ea3ad752f8520337c96ab5ba02677..00fbff68bc3160fecd008f9dc5c7a0105af489b3 100644 (file)
@@ -734,10 +734,12 @@ void Output_update_usb_current( unsigned int current )
        // Update USB current
        Output_USBCurrent_Available = current;
 
+       /* XXX Affects sleep states due to USB messages
        unsigned int total_current = Output_current_available();
        info_msg("USB Available Current Changed. Total Available: ");
        printInt32( total_current );
        print(" mA" NL);
+       */
 
        // Send new total current to the Scan Modules
        Scan_currentChange( Output_current_available() );