changeset 439:68e19d7c953e

Adding proper remote wake-up support - 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
author Jacob Alexander <haata@kiibohd.com>
date Tue, 17 May 2016 01:18:14 -0700
parents f10c2dad7f55
children 94ef7b561d7d e013b0a2a638
files 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
diffstat 5 files changed, 39 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/Output/pjrcUSB/arm/usb_dev.c	Mon May 16 23:25:08 2016 -0700
+++ b/Output/pjrcUSB/arm/usb_dev.c	Tue May 17 01:18:14 2016 -0700
@@ -171,6 +171,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_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 @@
 			USB_INTEN_STALLEN |
 			USB_INTEN_ERROREN |
 			USB_INTEN_USBRSTEN |
+			USB_INTEN_RESUMEEN |
 			USB_INTEN_SLEEPEN;
 
 		// is this necessary?
@@ -1285,9 +1298,19 @@
 	// 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 @@
 	// 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;
 }
 
--- a/Output/pjrcUSB/arm/usb_keyboard.c	Mon May 16 23:25:08 2016 -0700
+++ b/Output/pjrcUSB/arm/usb_keyboard.c	Tue May 17 01:18:14 2016 -0700
@@ -127,6 +127,7 @@
 		{
 			transmit_previous_timeout = 1;
 			warn_print("USB Transmit Timeout...");
+			USBKeys_Changed = USBKeyChangeState_None; // Indicate packet lost
 			return;
 		}
 		yield();
--- a/Output/pjrcUSB/arm/usb_mouse.c	Mon May 16 23:25:08 2016 -0700
+++ b/Output/pjrcUSB/arm/usb_mouse.c	Tue May 17 01:18:14 2016 -0700
@@ -163,6 +163,12 @@
 		{
 			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();
--- a/Output/pjrcUSB/output_com.c	Mon May 16 23:25:08 2016 -0700
+++ b/Output/pjrcUSB/output_com.c	Tue May 17 01:18:14 2016 -0700
@@ -713,10 +713,12 @@
 	// 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() );
--- a/Output/usbMuxUart/output_com.c	Mon May 16 23:25:08 2016 -0700
+++ b/Output/usbMuxUart/output_com.c	Tue May 17 01:18:14 2016 -0700
@@ -734,10 +734,12 @@
 	// 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() );