#include #include #include #include #include #include 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; };