91 lines
2.5 KiB
C
91 lines
2.5 KiB
C
#include <usb/usb.h>
|
|
#include <hwo/utils.h>
|
|
#include <hwo/events.h>
|
|
|
|
#include <sys/trace.h>
|
|
|
|
#include <avr/io.h>
|
|
#include <avr/eeprom.h>
|
|
|
|
uint16_t zero16;
|
|
uint32_t temp32;
|
|
|
|
int usb_ll_setup_standard_request(int endpoint,usb_device_request_t *request);
|
|
|
|
|
|
int usb_ll_setup_request(int endpoint,usb_device_request_t *request){
|
|
device_configuration_t *config = usb_device.current_configuration >= 0 ? usb_device.descriptor->configurations[usb_device.current_configuration] : NULL;
|
|
|
|
#ifdef USB_DEBUG_SETUP
|
|
|
|
usb_debug_setup[ *usb_debug_index ].request = *request;
|
|
usb_debug_setup[ *usb_debug_index ].cfg0x = UECFG0X;
|
|
usb_debug_setup[ *usb_debug_index ].cfg1x = UECFG1X;
|
|
usb_debug_setup[ *usb_debug_index ].sta0x = UESTA0X;
|
|
usb_debug_setup[ *usb_debug_index ].sta1x = UESTA1X;
|
|
usb_debug_setup[ *usb_debug_index ].intx = UEINTX;
|
|
usb_debug_setup[ *usb_debug_index ].ienx = UEIENX;
|
|
|
|
(*usb_debug_index)++;
|
|
if (*usb_debug_index >= *usb_debug_size){
|
|
*usb_debug_index = 0;
|
|
};
|
|
|
|
#endif
|
|
|
|
switch ((request->bmRequestType >> 5) & 0x03){
|
|
case 0x01:
|
|
if (config && config->setup_handler[endpoint]){
|
|
return config->setup_handler[endpoint]( endpoint, request );
|
|
};
|
|
default:
|
|
return usb_ll_setup_standard_request( endpoint, request );
|
|
};
|
|
};
|
|
|
|
|
|
|
|
int usb_ll_setup_standard_request(int endpoint,usb_device_request_t *request){
|
|
void *ptr;
|
|
uint16_t size;
|
|
|
|
switch (request->bRequest){
|
|
case USB_REQ_GET_STATUS:
|
|
usb_endpoint_set_buffer( endpoint, &zero16, 2 );
|
|
return 0;
|
|
|
|
case USB_REQ_SET_ADDRESS:
|
|
usb_device._addr_setup = (request->wValue & 0x7F);
|
|
UDADDR = (request->wValue & 0x7F);
|
|
usb_endpoint_set_buffer( endpoint, &zero16, 0 );
|
|
return 0;
|
|
|
|
case USB_REQ_GET_DESCRIPTOR:
|
|
ptr = usb_get_descriptor( (request->wValue >> 8), request->wValue & 0xff, &size);
|
|
if (ptr) {
|
|
int len = size > request->wLength ? request->wLength : size;
|
|
usb_endpoint_set_buffer( endpoint, ptr, len );
|
|
return 0;
|
|
};
|
|
break;
|
|
case USB_REQ_GET_CONFIGURATION:
|
|
temp32 = usb_device.current_configuration + 1;
|
|
usb_endpoint_set_buffer( endpoint, &temp32, 1 );
|
|
return 0;
|
|
case USB_REQ_SET_CONFIGURATION:
|
|
usb_ll_setup_configuration( (request->wValue & 0xff) - 1 );
|
|
usb_endpoint_set_buffer( endpoint, &zero16, 0 );
|
|
return 0;
|
|
|
|
case USB_REQ_GET_INTERFACE:
|
|
case USB_REQ_SET_INTERFACE:
|
|
case USB_REQ_SYNCH_FRAME:
|
|
break;
|
|
default:
|
|
break;
|
|
};
|
|
return -1;
|
|
};
|
|
|
|
|