diff Output/pjrcUSB/arm/usb_dev.c @ 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 56237ba5da6f
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;
 }