avr-fw-modules/usb/src/usb_ll_setup.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;
};