void main(void) { init_boot(); init_usb(); while(1) { usb_sleep(); dispatch_usb_event(); if((application_data.invalid == 0) && (GET_ACTIVE_CONFIGURATION() > FLASH_CONFIGURATION)) { application_data.main(); INTCON = 0; // Forbid interrupts } } }
u8 ep0_usb_std_request(void) { // hack to avoid register allocation bug in sdcc static u8 unknown_request; unknown_request = FALSE; if (SetupBuffer.request_type != STANDARD) { return FALSE; } switch (SetupBuffer.bRequest) { case CLEAR_FEATURE: debug_usb("CLEAR_FEATURE\n"); // TODO not implemented break; case GET_CONFIGURATION: debug_usb("GET_CONFIGURATION\n"); sourceData = &GET_ACTIVE_CONFIGURATION(); num_bytes_to_be_send = 1; break; case GET_DESCRIPTOR: debug_usb("GET_DESCRIPTOR\n"); switch (SetupBuffer.bDescType) { case DEVICE_DESCRIPTOR: debug_usb("device\n"); sourceData = (u8 *) device_descriptor; num_bytes_to_be_send = device_descriptor->bLength; break; case CONFIGURATION_DESCRIPTOR: debug_usb("configuration\n"); sourceData = configuration_descriptor[SetupBuffer.bDescIndex]; num_bytes_to_be_send = ((USB_Configuration_Descriptor*) sourceData)->wTotalLength; break; case STRING_DESCRIPTOR: debug_usb("string\n"); sourceData = string_descriptor[SetupBuffer.bDescIndex]; num_bytes_to_be_send = sourceData[0]; break; default: debug_usb("unknown\n"); // This is required to stall the DEVICE_QUALIFIER request unknown_request = TRUE; break; } break; case GET_INTERFACE: debug_usb("GET_INTERFACE\n"); // TODO not implemented break; case GET_STATUS: debug_usb("GET_STATUS\n"); // TODO not implemented break; case SET_ADDRESS: debug_usb("SET_ADDRESS\n"); SET_DEVICE_STATE(ADDRESS_PENDING_STATE) ; break; case SET_CONFIGURATION: debug_usb("SET_CONFIGURATION\n"); // is this configuration valid ? if (device_descriptor->bNumConfigurations >= SetupBuffer.bConfigurationValue) { coming_cfg = SetupBuffer.bConfigurationValue; SET_DEVICE_STATE(CONFIGURATION_PENDING_STATE); } else // invalid configuration { debug_usb("invalid configuration\n"); // Reply with a request error (STALL) unknown_request = TRUE; } break; case SET_FEATURE: debug_usb("SET_FEATURE\n"); // TODO not implemented break; case SET_INTERFACE: debug_usb("SET_INTERFACE\n"); // TODO not implemented break; // case SYNCH_FRAME: // only for isochronous synchronization // break; default: unknown_request = TRUE; break; } return !unknown_request; }