X-Git-Url: http://git.linex4red.de/pub/USBasp.git/blobdiff_plain/bf041e8bbf67222e1c899b8df96f8220d5a0d9d2..fa8beef82d1340a69390d4b11ca785ee016789c5:/Demos/Device/Incomplete/Sideshow/Sideshow.c?ds=inline diff --git a/Demos/Device/Incomplete/Sideshow/Sideshow.c b/Demos/Device/Incomplete/Sideshow/Sideshow.c index c96335982..fdf4265e6 100644 --- a/Demos/Device/Incomplete/Sideshow/Sideshow.c +++ b/Demos/Device/Incomplete/Sideshow/Sideshow.c @@ -48,174 +48,110 @@ constraints, new content can be requested as needed. */ -/* - USB Mode: Device - USB Class: Sideshow Device (Microsoft Only) - USB Subclass: Bulk Only - Relevant Standards: Microsoft Sideshow Specification - Microsoft OS Descriptors Specification - XML Specification - Usable Speeds: Full Speed Mode -*/ - #include "Sideshow.h" -/* Project Tags, for reading out using the ButtLoad project */ -BUTTLOADTAG(ProjName, "LUFA Sideshow App"); -BUTTLOADTAG(BuildTime, __TIME__); -BUTTLOADTAG(BuildDate, __DATE__); -BUTTLOADTAG(LUFAVersion, "LUFA V" LUFA_VERSION_STRING); - -/* Scheduler Task List */ -TASK_LIST +/** Main program entry point. This routine contains the overall program flow, including initial + * setup of all components and the main program loop. + */ +int main(void) { - { Task: USB_USBTask , TaskStatus: TASK_STOP }, - { Task: USB_Sideshow , TaskStatus: TASK_STOP }, -}; + SetupHardware(); -int main(void) + LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY); + + for (;;) + { + SideShow_Task(); + USB_USBTask(); + } +} + +/** Configures the board hardware and chip peripherals for the demo's functionality. */ +void SetupHardware(void) { /* Disable watchdog if enabled by bootloader/fuses */ MCUSR &= ~(1 << WDRF); wdt_disable(); - /* Disable Clock Division */ - SetSystemClockPrescaler(0); - + /* Disable clock division */ + clock_prescale_set(clock_div_1); + /* Hardware Initialization */ - SerialStream_Init(9600, false); LEDs_Init(); - HWB_Init(); - - /* Indicate USB not ready */ - LEDs_SetAllLEDs(LEDS_LED1 | LEDS_LED3); - - /* Initialize Scheduler so that it can be used */ - Scheduler_Init(); - - /* Initialize USB Subsystem */ USB_Init(); - - /* Scheduling - routine never returns, so put this last in the main function */ - Scheduler_Start(); + SerialStream_Init(9600, false); } -EVENT_HANDLER(USB_Connect) +void EVENT_USB_Device_Connect(void) { - /* Start USB management task */ - Scheduler_SetTaskMode(USB_USBTask, TASK_RUN); - - /* Indicate USB enumerating */ - LEDs_SetAllLEDs(LEDS_LED1 | LEDS_LED4); + LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING); } -EVENT_HANDLER(USB_Disconnect) +void EVENT_USB_Device_Disconnect(void) { - /* Stop running mass storage and USB management tasks */ - Scheduler_SetTaskMode(USB_Sideshow, TASK_STOP); - Scheduler_SetTaskMode(USB_USBTask, TASK_STOP); - - /* Indicate USB not ready */ - LEDs_SetAllLEDs(LEDS_LED1 | LEDS_LED3); + LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY); } -EVENT_HANDLER(USB_ConfigurationChanged) +void EVENT_USB_Device_ConfigurationChanged(void) { - /* Setup Sideshow In and Out Endpoints */ - Endpoint_ConfigureEndpoint(SIDESHOW_IN_EPNUM, EP_TYPE_BULK, - ENDPOINT_DIR_IN, SIDESHOW_IO_EPSIZE, - ENDPOINT_BANK_SINGLE); + LEDs_SetAllLEDs(LEDMASK_USB_READY); - Endpoint_ConfigureEndpoint(SIDESHOW_OUT_EPNUM, EP_TYPE_BULK, - ENDPOINT_DIR_OUT, SIDESHOW_IO_EPSIZE, - ENDPOINT_BANK_SINGLE); + /* Setup Sideshow In and Out Endpoints */ + if (!(Endpoint_ConfigureEndpoint(SIDESHOW_IN_EPNUM, EP_TYPE_BULK, + ENDPOINT_DIR_IN, SIDESHOW_IO_EPSIZE, + ENDPOINT_BANK_SINGLE))) + { + LEDs_SetAllLEDs(LEDMASK_USB_ERROR); + } - /* Indicate USB connected and ready */ - LEDs_SetAllLEDs(LEDS_LED2 | LEDS_LED4); - - /* Start Sideshow task */ - Scheduler_SetTaskMode(USB_Sideshow, TASK_RUN); + if (!(Endpoint_ConfigureEndpoint(SIDESHOW_OUT_EPNUM, EP_TYPE_BULK, + ENDPOINT_DIR_OUT, SIDESHOW_IO_EPSIZE, + ENDPOINT_BANK_SINGLE))) + { + LEDs_SetAllLEDs(LEDMASK_USB_ERROR); + } } -EVENT_HANDLER(USB_UnhandledControlPacket) +void EVENT_USB_Device_UnhandledControlRequest(void) { /* Process UFI specific control requests */ - switch (bRequest) + switch (USB_ControlRequest.bRequest) { case REQ_GetOSFeatureDescriptor: - if (bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_VENDOR | REQREC_DEVICE)) + if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_VENDOR | REQREC_DEVICE)) { - uint16_t wValue = Endpoint_Read_Word_LE(); - uint16_t wIndex = Endpoint_Read_Word_LE(); - uint16_t wLength = Endpoint_Read_Word_LE(); - void* DescriptorPointer; uint16_t DescriptorSize; - bool SendZLP = true; - - if (!(USB_GetOSFeatureDescriptor(wValue, wIndex, &DescriptorPointer, &DescriptorSize))) - return; - - Endpoint_ClearSetupReceived(); - - if (wLength > DescriptorSize) - wLength = DescriptorSize; - - while (wLength && (!(Endpoint_IsSetupOUTReceived()))) + if (!(USB_GetOSFeatureDescriptor(USB_ControlRequest.wValue, USB_ControlRequest.wIndex, + &DescriptorPointer, &DescriptorSize))) { - while (!(Endpoint_IsSetupINReady())); - - while (wLength && (Endpoint_BytesInEndpoint() < USB_ControlEndpointSize)) - { - #if defined(USE_RAM_DESCRIPTORS) - Endpoint_Write_Byte(*((uint8_t*)DescriptorPointer++)); - #elif defined (USE_EEPROM_DESCRIPTORS) - Endpoint_Write_Byte(eeprom_read_byte(DescriptorPointer++)); - #else - Endpoint_Write_Byte(pgm_read_byte(DescriptorPointer++)); - #endif - - wLength--; - } - - SendZLP = (Endpoint_BytesInEndpoint() == USB_ControlEndpointSize); - Endpoint_ClearSetupIN(); - } - - if (Endpoint_IsSetupOUTReceived()) - { - Endpoint_ClearSetupOUT(); return; } - if (SendZLP) - { - while (!(Endpoint_IsSetupINReady())); - Endpoint_ClearSetupIN(); - } - - while (!(Endpoint_IsSetupOUTReceived())); - Endpoint_ClearSetupOUT(); + Endpoint_ClearSETUP(); + + Endpoint_Write_Control_PStream_LE(DescriptorPointer, DescriptorSize); + Endpoint_ClearOUT(); } break; } } -TASK(USB_Sideshow) +void SideShow_Task(void) { - /* Check if the USB System is connected to a Host */ - if (USB_IsConnected) + /* Device must be connected and configured for the task to run */ + if (USB_DeviceState != DEVICE_STATE_Configured) + return; + + /* Select the SideShow data out endpoint */ + Endpoint_SelectEndpoint(SIDESHOW_OUT_EPNUM); + + /* Check to see if a new SideShow message has been received */ + if (Endpoint_IsReadWriteAllowed()) { - /* Select the SideShow data out endpoint */ - Endpoint_SelectEndpoint(SIDESHOW_OUT_EPNUM); - - /* Check to see if a new SideShow message has been received */ - if (Endpoint_ReadWriteAllowed()) - { - /* Process the received SideShow message */ - Sideshow_ProcessCommandPacket(); - } + /* Process the received SideShow message */ + Sideshow_ProcessCommandPacket(); } }