Преглед на файлове

Inital Remote Wakeup Support

Not working yet...
bringup
Rowan Decker преди 9 години
родител
ревизия
dc562cdcb3
променени са 3 файла, в които са добавени 62 реда и са изтрити 36 реда
  1. 50
    33
      Output/pjrcUSB/arm/usb_dev.c
  2. 5
    3
      Output/pjrcUSB/arm/usb_dev.h
  3. 7
    0
      Output/pjrcUSB/arm/usb_keyboard.c

+ 50
- 33
Output/pjrcUSB/arm/usb_dev.c Целия файл

//#define UART_DEBUG_UNKNOWN 1 //#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 BDT_OWN 0x80
#define BDT_DATA1 0x40
#define BDT_DATA0 0x00
#define BDT_DTS 0x08
#define BDT_STALL 0x04
#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 TX 1 #define TX 1
#define RX 0 #define RX 0
#define DATA1 1 #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








// ----- Macros ----- // ----- 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) \ | ((data) ? BDT_DATA1 : BDT_DATA0) \
| ((count) << 16)) | ((count) << 16))




static uint8_t reply_buffer[8]; static uint8_t reply_buffer[8];


volatile uint8_t remote_wakeup_enabled = 0;




// ----- Functions ----- // ----- Functions -----
data = reply_buffer; data = reply_buffer;
break; break;
case 0x0080: // GET_STATUS (device) 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; reply_buffer[1] = 0;
datalen = 2; datalen = 2;
data = reply_buffer; data = reply_buffer;
datalen = 2; datalen = 2;
break; break;
case 0x0100: // CLEAR_FEATURE (device) case 0x0100: // CLEAR_FEATURE (device)
//Disable DEVICE_REMOTE_WAKEUP feature
if (setup.wValue == 0x01) {
remote_wakeup_enabled = 0;
}
break;
case 0x0101: // CLEAR_FEATURE (interface) case 0x0101: // CLEAR_FEATURE (interface)
// TODO: Currently ignoring, perhaps useful? -HaaTa // TODO: Currently ignoring, perhaps useful? -HaaTa
endpoint0_stall(); endpoint0_stall();
endpoint0_stall(); endpoint0_stall();
return; return;
case 0x0300: // SET_FEATURE (device) case 0x0300: // SET_FEATURE (device)
//Enable DEVICE_REMOTE_WAKEUP feature
if (setup.wValue == 0x01) {
remote_wakeup_enabled = 1;
}
break;
case 0x0301: // SET_FEATURE (interface) case 0x0301: // SET_FEATURE (interface)
// TODO: Currently ignoring, perhaps useful? -HaaTa // TODO: Currently ignoring, perhaps useful? -HaaTa
endpoint0_stall(); endpoint0_stall();
serial_phex(b->desc >> 16); serial_phex(b->desc >> 16);
serial_print("\n"); serial_print("\n");
#endif #endif
endpoint--; // endpoint is index to zero-based arrays
endpoint--; // endpoint is index to zero-based arrays


if ( stat & 0x08 ) if ( stat & 0x08 )
{ // transmit { // transmit
//serial_print("sleep\n"); //serial_print("sleep\n");
USB0_ISTAT = USB_ISTAT_SLEEP; USB0_ISTAT = USB_ISTAT_SLEEP;
} }

if ( (status & USB_ISTAT_RESUME /* 20 */ ) ) {
//serial_print("resume\n");
USB0_ISTAT = USB_ISTAT_RESUME;
}
} }




// If no USB cable is attached, do not initialize usb // If no USB cable is attached, do not initialize usb
// XXX Test -HaaTa // XXX Test -HaaTa
//if ( USB0_OTGISTAT & USB_OTGSTAT_ID ) //if ( USB0_OTGISTAT & USB_OTGSTAT_ID )
// return 0;
// return 0;


// Clear out endpoints table // Clear out endpoints table
for ( int i = 0; i <= NUM_ENDPOINTS * 4; i++ ) for ( int i = 0; i <= NUM_ENDPOINTS * 4; i++ )

+ 5
- 3
Output/pjrcUSB/arm/usb_dev.h Целия файл

extern volatile uint8_t usb_cdc_line_rtsdtr; extern volatile uint8_t usb_cdc_line_rtsdtr;
extern volatile uint8_t usb_cdc_transmit_flush_timer; extern volatile uint8_t usb_cdc_transmit_flush_timer;


extern volatile uint8_t remote_wakeup_enabled;





// ----- Functions ----- // ----- Functions -----
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) __attribute__((always_inline));
static inline uint32_t usb_rx_byte_count(uint32_t endpoint) static inline uint32_t usb_rx_byte_count(uint32_t endpoint)
{ {
endpoint--;
if ( endpoint >= NUM_ENDPOINTS )
endpoint--;
if ( endpoint >= NUM_ENDPOINTS )
return 0; return 0;
return usb_rx_byte_count_data[ endpoint ];
return usb_rx_byte_count_data[ endpoint ];
} }


void usb_device_reload(); void usb_device_reload();

+ 7
- 0
Output/pjrcUSB/arm/usb_keyboard.c Целия файл

uint32_t wait_count = 0; uint32_t wait_count = 0;
usb_packet_t *tx_packet; 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 // Wait till ready
while ( 1 ) while ( 1 )
{ {