# HG changeset patch # User Rowan Decker # Date 1425879355 25200 # Node ID 05a09eda53fb020e8dbbc43efedf3b23d08f8768 # Parent f158dfa0fa852d521b344755d31e54af4b2dba75 Inital Remote Wakeup Support Not working yet... diff -r f158dfa0fa85 -r 05a09eda53fb Output/pjrcUSB/arm/usb_dev.c --- a/Output/pjrcUSB/arm/usb_dev.c Sun Mar 08 17:33:29 2015 -0700 +++ b/Output/pjrcUSB/arm/usb_dev.c Sun Mar 08 22:35:55 2015 -0700 @@ -51,18 +51,18 @@ //#define UART_DEBUG_UNKNOWN 1 -#define TX_STATE_BOTH_FREE_EVEN_FIRST 0 -#define TX_STATE_BOTH_FREE_ODD_FIRST 1 -#define TX_STATE_EVEN_FREE 2 -#define TX_STATE_ODD_FREE 3 -#define TX_STATE_NONE_FREE_EVEN_FIRST 4 -#define TX_STATE_NONE_FREE_ODD_FIRST 5 +#define TX_STATE_BOTH_FREE_EVEN_FIRST 0 +#define TX_STATE_BOTH_FREE_ODD_FIRST 1 +#define TX_STATE_EVEN_FREE 2 +#define TX_STATE_ODD_FREE 3 +#define TX_STATE_NONE_FREE_EVEN_FIRST 4 +#define TX_STATE_NONE_FREE_ODD_FIRST 5 -#define BDT_OWN 0x80 -#define BDT_DATA1 0x40 -#define BDT_DATA0 0x00 -#define BDT_DTS 0x08 -#define BDT_STALL 0x04 +#define BDT_OWN 0x80 +#define BDT_DATA1 0x40 +#define BDT_DATA0 0x00 +#define BDT_DTS 0x08 +#define BDT_STALL 0x04 #define TX 1 #define RX 0 @@ -72,23 +72,23 @@ #define DATA1 1 -#define GET_STATUS 0 -#define CLEAR_FEATURE 1 -#define SET_FEATURE 3 -#define SET_ADDRESS 5 -#define GET_DESCRIPTOR 6 -#define SET_DESCRIPTOR 7 -#define GET_CONFIGURATION 8 -#define SET_CONFIGURATION 9 -#define GET_INTERFACE 10 -#define SET_INTERFACE 11 -#define SYNCH_FRAME 12 +#define GET_STATUS 0 +#define CLEAR_FEATURE 1 +#define SET_FEATURE 3 +#define SET_ADDRESS 5 +#define GET_DESCRIPTOR 6 +#define SET_DESCRIPTOR 7 +#define GET_CONFIGURATION 8 +#define SET_CONFIGURATION 9 +#define GET_INTERFACE 10 +#define SET_INTERFACE 11 +#define SYNCH_FRAME 12 -#define TX_STATE_BOTH_FREE_EVEN_FIRST 0 -#define TX_STATE_BOTH_FREE_ODD_FIRST 1 -#define TX_STATE_EVEN_FREE 2 -#define TX_STATE_ODD_FREE 3 -#define TX_STATE_NONE_FREE 4 +#define TX_STATE_BOTH_FREE_EVEN_FIRST 0 +#define TX_STATE_BOTH_FREE_ODD_FIRST 1 +#define TX_STATE_EVEN_FREE 2 +#define TX_STATE_ODD_FREE 3 +#define TX_STATE_NONE_FREE 4 @@ -96,9 +96,9 @@ // ----- Macros ----- -#define BDT_PID(n) (((n) >> 2) & 15) +#define BDT_PID(n) (((n) >> 2) & 15) -#define BDT_DESC(count, data) (BDT_OWN | BDT_DTS \ +#define BDT_DESC(count, data) (BDT_OWN | BDT_DTS \ | ((data) ? BDT_DATA1 : BDT_DATA0) \ | ((count) << 16)) @@ -167,6 +167,7 @@ static uint8_t reply_buffer[8]; +volatile uint8_t remote_wakeup_enabled = 0; // ----- Functions ----- @@ -294,7 +295,8 @@ data = reply_buffer; break; case 0x0080: // GET_STATUS (device) - reply_buffer[0] = 0; + //I think this is the corrent endianess + reply_buffer[0] = (remote_wakeup_enabled)<<1; reply_buffer[1] = 0; datalen = 2; data = reply_buffer; @@ -314,6 +316,11 @@ datalen = 2; break; case 0x0100: // CLEAR_FEATURE (device) + //Disable DEVICE_REMOTE_WAKEUP feature + if (setup.wValue == 0x01) { + remote_wakeup_enabled = 0; + } + break; case 0x0101: // CLEAR_FEATURE (interface) // TODO: Currently ignoring, perhaps useful? -HaaTa endpoint0_stall(); @@ -334,6 +341,11 @@ endpoint0_stall(); return; case 0x0300: // SET_FEATURE (device) + //Enable DEVICE_REMOTE_WAKEUP feature + if (setup.wValue == 0x01) { + remote_wakeup_enabled = 1; + } + break; case 0x0301: // SET_FEATURE (interface) // TODO: Currently ignoring, perhaps useful? -HaaTa endpoint0_stall(); @@ -936,7 +948,7 @@ serial_phex(b->desc >> 16); serial_print("\n"); #endif - endpoint--; // endpoint is index to zero-based arrays + endpoint--; // endpoint is index to zero-based arrays if ( stat & 0x08 ) { // transmit @@ -1108,6 +1120,11 @@ //serial_print("sleep\n"); USB0_ISTAT = USB_ISTAT_SLEEP; } + + if ( (status & USB_ISTAT_RESUME /* 20 */ ) ) { + //serial_print("resume\n"); + USB0_ISTAT = USB_ISTAT_RESUME; + } } @@ -1121,7 +1138,7 @@ // If no USB cable is attached, do not initialize usb // XXX Test -HaaTa //if ( USB0_OTGISTAT & USB_OTGSTAT_ID ) - // return 0; + // return 0; // Clear out endpoints table for ( int i = 0; i <= NUM_ENDPOINTS * 4; i++ ) diff -r f158dfa0fa85 -r 05a09eda53fb Output/pjrcUSB/arm/usb_dev.h --- a/Output/pjrcUSB/arm/usb_dev.h Sun Mar 08 17:33:29 2015 -0700 +++ b/Output/pjrcUSB/arm/usb_dev.h Sun Mar 08 22:35:55 2015 -0700 @@ -56,6 +56,8 @@ extern volatile uint8_t usb_cdc_line_rtsdtr; extern volatile uint8_t usb_cdc_transmit_flush_timer; +extern volatile uint8_t remote_wakeup_enabled; + // ----- Functions ----- @@ -75,10 +77,10 @@ static inline uint32_t usb_rx_byte_count(uint32_t endpoint) __attribute__((always_inline)); static inline uint32_t usb_rx_byte_count(uint32_t endpoint) { - endpoint--; - if ( endpoint >= NUM_ENDPOINTS ) + endpoint--; + if ( endpoint >= NUM_ENDPOINTS ) return 0; - return usb_rx_byte_count_data[ endpoint ]; + return usb_rx_byte_count_data[ endpoint ]; } void usb_device_reload(); diff -r f158dfa0fa85 -r 05a09eda53fb Output/pjrcUSB/arm/usb_keyboard.c --- a/Output/pjrcUSB/arm/usb_keyboard.c Sun Mar 08 17:33:29 2015 -0700 +++ b/Output/pjrcUSB/arm/usb_keyboard.c Sun Mar 08 22:35:55 2015 -0700 @@ -76,6 +76,13 @@ uint32_t wait_count = 0; usb_packet_t *tx_packet; + if (remote_wakeup_enabled) { + USB0_CTL |= USB_CTL_RESUME; + _delay_ms(5); //wait 1 to 15ms + USB0_CTL &= ~USB_CTL_RESUME; + _delay_ms(5); + } + // Wait till ready while ( 1 ) {