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