SubCompatibleID: "UNIV1"}\r
};\r
\r
-uint16_t USB_GetDescriptor(const uint16_t wValue, const uint8_t wIndex, void** const DescriptorAddress)\r
+uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, const uint8_t wIndex, void** const DescriptorAddress)\r
{\r
const uint8_t DescriptorType = (wValue >> 8);\r
const uint8_t DescriptorNumber = (wValue & 0xFF);\r
switch (DescriptorType)\r
{\r
case DTYPE_Device:\r
- Address = DESCRIPTOR_ADDRESS(DeviceDescriptor);\r
+ Address = (void*)&DeviceDescriptor;\r
Size = sizeof(USB_Descriptor_Device_t);\r
break;\r
case DTYPE_Configuration:\r
- Address = DESCRIPTOR_ADDRESS(ConfigurationDescriptor);\r
+ Address = (void*)&ConfigurationDescriptor;\r
Size = sizeof(USB_Descriptor_Configuration_t);\r
break;\r
case DTYPE_String:\r
switch (DescriptorNumber)\r
{\r
case 0x00:\r
- Address = DESCRIPTOR_ADDRESS(LanguageString);\r
+ Address = (void*)&LanguageString;\r
Size = pgm_read_byte(&LanguageString.Header.Size);\r
break;\r
case 0x01:\r
- Address = DESCRIPTOR_ADDRESS(ManufacturerString);\r
+ Address = (void*)&ManufacturerString;\r
Size = pgm_read_byte(&ManufacturerString.Header.Size);\r
break;\r
case 0x02:\r
- Address = DESCRIPTOR_ADDRESS(ProductString);\r
+ Address = (void*)&ProductString;\r
Size = pgm_read_byte(&ProductString.Header.Size);\r
break;\r
case 0x03:\r
- Address = DESCRIPTOR_ADDRESS(SerialNumberString);\r
+ Address = (void*)&SerialNumberString;\r
Size = pgm_read_byte(&SerialNumberString.Header.Size);\r
break;\r
case 0xEE:\r
our device is Sideshow compatible. Most people would be happy using the normal\r
0xFF 0x?? 0x?? Class/Subclass/Protocol values like the USBIF intended. */\r
\r
- Address = DESCRIPTOR_ADDRESS(OSDescriptorString);\r
+ Address = (void*)&OSDescriptorString;\r
Size = pgm_read_byte(&OSDescriptorString.Header.Size);\r
break;\r
}\r
/* Only the Extended Device Compatibility descriptor is supported */\r
if (wIndex == EXTENDED_COMPAT_ID_DESCRIPTOR)\r
{\r
- Address = DESCRIPTOR_ADDRESS(DevCompatIDs);\r
+ Address = (void*)&DevCompatIDs;\r
Size = sizeof(USB_OSCompatibleIDDescriptor_t);\r
}\r
}\r
} USB_OSCompatibleIDDescriptor_t;\r
\r
/* Function Prototypes: */\r
- uint16_t USB_GetDescriptor(const uint16_t wValue, const uint8_t wIndex, void** const DescriptorAddress)\r
- ATTR_WARN_UNUSED_RESULT ATTR_WEAK ATTR_NON_NULL_PTR_ARG(3);\r
+ uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, const uint8_t wIndex, void** const DescriptorAddress)\r
+ ATTR_WARN_UNUSED_RESULT ATTR_WEAK ATTR_NON_NULL_PTR_ARG(3);\r
\r
bool USB_GetOSFeatureDescriptor(const uint16_t wValue, const uint8_t wIndex,\r
void** const DescriptorAddress, uint16_t* const DescriptorSize)\r
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_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_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_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_UnhandledControlPacket(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
- {\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
+ if (!(USB_GetOSFeatureDescriptor(USB_ControlRequest.wValue, USB_ControlRequest.wIndex,\r
+ &DescriptorPointer, &DescriptorSize)))\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_Stream_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
Endpoint_SelectEndpoint(SIDESHOW_OUT_EPNUM);\r
\r
/* Check to see if a new SideShow message has been received */\r
- if (Endpoint_ReadWriteAllowed())\r
+ if (Endpoint_IsReadWriteAllowed())\r
{\r
/* Process the received SideShow message */\r
Sideshow_ProcessCommandPacket();\r
/* Includes: */\r
#include <avr/io.h>\r
#include <avr/wdt.h>\r
+ #include <avr/power.h>\r
\r
#include "Descriptors.h"\r
#include "SideshowCommands.h"\r
\r
- #include <LUFA/Version.h> // Library Version Information\r
- #include <LUFA/Common/ButtLoadTag.h> // PROGMEM tags readable by the ButtLoad project\r
- #include <LUFA/Drivers/USB/USB.h> // USB Functionality\r
- #include <LUFA/Drivers/Board/HWB.h> // HWB button driver\r
- #include <LUFA/Drivers/Board/LEDs.h> // LEDs driver\r
- #include <LUFA/Drivers/Board/Dataflash.h> // Dataflash chip driver\r
- #include <LUFA/Scheduler/Scheduler.h> // Simple scheduler for task management\r
- #include <LUFA/Drivers/AT90USBXXX/Serial_Stream.h> // Serial stream driver\r
+ #include <LUFA/Version.h>
+ #include <LUFA/Drivers/USB/USB.h>\r
+ #include <LUFA/Drivers/Board/LEDs.h>\r
+ #include <LUFA/Drivers/Peripheral/SerialStream.h>\r
\r
/* Macros: */\r
#define REQ_GetOSFeatureDescriptor 0x01\r
\r
#define EXTENDED_COMPAT_ID_DESCRIPTOR 0x0004\r
\r
- /* Task Definitions: */\r
- TASK(USB_Sideshow);\r
+ /** LED mask for the library LED driver, to indicate that the USB interface is not ready. */\r
+ #define LEDMASK_USB_NOTREADY LEDS_LED1\r
+\r
+ /** LED mask for the library LED driver, to indicate that the USB interface is enumerating. */\r
+ #define LEDMASK_USB_ENUMERATING (LEDS_LED2 | LEDS_LED3)\r
+\r
+ /** LED mask for the library LED driver, to indicate that the USB interface is ready. */\r
+ #define LEDMASK_USB_READY (LEDS_LED2 | LEDS_LED4)\r
+\r
+ /** LED mask for the library LED driver, to indicate that an error has occurred in the USB interface. */\r
+ #define LEDMASK_USB_ERROR (LEDS_LED1 | LEDS_LED3)\r
\r
- /* Event Handlers: */\r
- HANDLES_EVENT(USB_Connect);\r
- HANDLES_EVENT(USB_Disconnect);\r
- HANDLES_EVENT(USB_ConfigurationChanged);\r
- HANDLES_EVENT(USB_UnhandledControlPacket);\r
+ /* Function Prototypes: */\r
+ void SetupHardware(void);\r
+ void SideShow_Task(void);\r
+\r
+ void EVENT_USB_Connect(void);\r
+ void EVENT_USB_Disconnect(void);\r
+ void EVENT_USB_ConfigurationChanged(void);\r
+ void EVENT_USB_UnhandledControlPacket(void);\r
\r
#endif\r
PacketHeader.Length -= sizeof(SideShow_PacketHeader_t);\r
\r
Endpoint_Discard_Stream(PacketHeader.Length);\r
- Endpoint_ClearCurrentBank();\r
+ Endpoint_ClearOUT();\r
\r
PacketHeader.Length = sizeof(SideShow_PacketHeader_t);\r
PacketHeader.Type.NAK = true;\r
\r
Endpoint_SelectEndpoint(SIDESHOW_IN_EPNUM); \r
Endpoint_Write_Stream_LE(&PacketHeader, sizeof(SideShow_PacketHeader_t)); \r
- Endpoint_ClearCurrentBank();\r
+ Endpoint_ClearIN();\r
\r
printf(" UNK");\r
}\r
\r
static void SideShow_Ping(SideShow_PacketHeader_t* PacketHeader)\r
{\r
- Endpoint_ClearCurrentBank();\r
+ Endpoint_ClearOUT();\r
\r
Endpoint_SelectEndpoint(SIDESHOW_IN_EPNUM); \r
Endpoint_Write_Stream_LE(PacketHeader, sizeof(SideShow_PacketHeader_t)); \r
- Endpoint_ClearCurrentBank();\r
+ Endpoint_ClearIN();\r
}\r
\r
static void SideShow_Sync(SideShow_PacketHeader_t* PacketHeader)\r
GUID_t ProtocolGUID;\r
\r
Endpoint_Read_Stream_LE(&ProtocolGUID, sizeof(GUID_t));\r
- Endpoint_ClearCurrentBank();\r
+ Endpoint_ClearOUT();\r
\r
if (memcmp(&ProtocolGUID, (uint32_t[])STANDARD_PROTOCOL_GUID, sizeof(GUID_t)) != 0)\r
PacketHeader->Type.NAK = true;\r
Endpoint_SelectEndpoint(SIDESHOW_IN_EPNUM);\r
Endpoint_Write_Stream_LE(PacketHeader, sizeof(SideShow_PacketHeader_t)); \r
Endpoint_Write_Stream_LE(&ProtocolGUID, sizeof(GUID_t));\r
- Endpoint_ClearCurrentBank();\r
+ Endpoint_ClearIN();\r
}\r
\r
static void SideShow_GetCurrentUser(SideShow_PacketHeader_t* PacketHeader)\r
{\r
- Endpoint_ClearCurrentBank();\r
+ Endpoint_ClearOUT();\r
\r
PacketHeader->Length = sizeof(SideShow_PacketHeader_t) + sizeof(uint32_t) + UserSID.LengthInBytes;\r
\r
Endpoint_SelectEndpoint(SIDESHOW_IN_EPNUM);\r
Endpoint_Write_Stream_LE(PacketHeader, sizeof(SideShow_PacketHeader_t));\r
SideShow_Write_Unicode_String(&UserSID);\r
- Endpoint_ClearCurrentBank();\r
+ Endpoint_ClearIN();\r
}\r
\r
static void SideShow_SetCurrentUser(SideShow_PacketHeader_t* PacketHeader)\r
{\r
SideShow_Read_Unicode_String(&UserSID, sizeof(UserSID.UnicodeString));\r
- Endpoint_ClearCurrentBank();\r
+ Endpoint_ClearOUT();\r
\r
PacketHeader->Length = sizeof(SideShow_PacketHeader_t);\r
\r
Endpoint_SelectEndpoint(SIDESHOW_IN_EPNUM);\r
Endpoint_Write_Stream_LE(PacketHeader, sizeof(SideShow_PacketHeader_t));\r
- Endpoint_ClearCurrentBank();\r
+ Endpoint_ClearIN();\r
}\r
\r
static void SideShow_GetCapabilities(SideShow_PacketHeader_t* PacketHeader)\r
SideShow_PropertyData_t PropertyData;\r
\r
Endpoint_Read_Stream_LE(&Property, sizeof(SideShow_PropertyKey_t));\r
- Endpoint_ClearCurrentBank();\r
+ Endpoint_ClearOUT();\r
\r
printf(" ID: %lu", Property.PropertyID);\r
\r
}\r
}\r
\r
- Endpoint_ClearCurrentBank();\r
+ Endpoint_ClearIN();\r
return;\r
}\r
\r
static void SideShow_GetString(SideShow_PacketHeader_t* PacketHeader, void* UnicodeStruct)\r
{\r
- Endpoint_ClearCurrentBank();\r
+ Endpoint_ClearOUT();\r
\r
PacketHeader->Length = sizeof(SideShow_PacketHeader_t) +\r
sizeof(uint32_t) + ((Unicode_String_t*)UnicodeStruct)->LengthInBytes;\r
Endpoint_SelectEndpoint(SIDESHOW_IN_EPNUM);\r
Endpoint_Write_Stream_LE(PacketHeader, sizeof(SideShow_PacketHeader_t));\r
SideShow_Write_Unicode_String(UnicodeStruct);\r
- Endpoint_ClearCurrentBank();\r
+ Endpoint_ClearIN();\r
}\r
\r
static void SideShow_GetApplicationOrder(SideShow_PacketHeader_t* PacketHeader)\r
uint8_t TotalInstalledApplications = SideShow_GetTotalApplications();\r
uint16_t GadgetGUIDBytes = (TotalInstalledApplications * sizeof(GUID_t));\r
\r
- Endpoint_ClearCurrentBank();\r
+ Endpoint_ClearOUT();\r
\r
PacketHeader->Length = sizeof(SideShow_PacketHeader_t) +\r
sizeof(uint32_t) + GadgetGUIDBytes;\r
Endpoint_Write_Stream_LE(&InstalledApplications[App].ApplicationID, sizeof(GUID_t));\r
}\r
\r
- Endpoint_ClearCurrentBank(); \r
+ Endpoint_ClearIN();\r
}\r
\r
static void SideShow_GetSupportedEndpoints(SideShow_PacketHeader_t* PacketHeader)\r
{\r
GUID_t SupportedEndpointGUID = (GUID_t){Chunks: SIMPLE_CONTENT_FORMAT_GUID};\r
\r
- Endpoint_ClearCurrentBank();\r
+ Endpoint_ClearOUT();\r
\r
PacketHeader->Length = sizeof(SideShow_PacketHeader_t) + sizeof(uint32_t) + sizeof(GUID_t);\r
\r
Endpoint_Write_Stream_LE(PacketHeader, sizeof(SideShow_PacketHeader_t));\r
Endpoint_Write_DWord_LE(1);\r
Endpoint_Write_Stream_LE(&SupportedEndpointGUID, sizeof(GUID_t));\r
- Endpoint_ClearCurrentBank();\r
+ Endpoint_ClearIN();\r
}\r
\r
static void SideShow_AddApplication(SideShow_PacketHeader_t* PacketHeader)\r
PacketHeader->Length -= sizeof(SideShow_PacketHeader_t) + sizeof(GUID_t);\r
\r
Endpoint_Discard_Stream(PacketHeader->Length);\r
- Endpoint_ClearCurrentBank();\r
+ Endpoint_ClearOUT();\r
\r
PacketHeader->Type.NAK = true;\r
}\r
SideShow_Discard_Byte_Stream();\r
SideShow_Discard_Byte_Stream();\r
SideShow_Discard_Byte_Stream();\r
- Endpoint_ClearCurrentBank();\r
+ Endpoint_ClearOUT();\r
\r
CurrApp->InUse = true;\r
CurrApp->HaveContent = false;\r
\r
Endpoint_SelectEndpoint(SIDESHOW_IN_EPNUM);\r
Endpoint_Write_Stream_LE(PacketHeader, sizeof(SideShow_PacketHeader_t));\r
- Endpoint_ClearCurrentBank();\r
+ Endpoint_ClearIN();\r
}\r
\r
static void SideShow_DeleteApplication(SideShow_PacketHeader_t* PacketHeader)\r
GUID_t ApplicationGUID;\r
\r
Endpoint_Read_Stream_LE(&ApplicationGUID, sizeof(GUID_t)); \r
- Endpoint_ClearCurrentBank();\r
+ Endpoint_ClearOUT();\r
\r
SideShow_Application_t* AppToDelete = SideShow_GetApplicationFromGUID(&ApplicationGUID);\r
\r
\r
Endpoint_SelectEndpoint(SIDESHOW_IN_EPNUM);\r
Endpoint_Write_Stream_LE(PacketHeader, sizeof(SideShow_PacketHeader_t));\r
- Endpoint_ClearCurrentBank();\r
+ Endpoint_ClearIN();\r
}\r
\r
static void SideShow_DeleteAllApplications(SideShow_PacketHeader_t* PacketHeader)\r
{\r
- Endpoint_ClearCurrentBank();\r
+ Endpoint_ClearOUT();\r
\r
for (uint8_t App = 0; App < MAX_APPLICATIONS; App++)\r
InstalledApplications[App].InUse = false;\r
\r
Endpoint_SelectEndpoint(SIDESHOW_IN_EPNUM);\r
Endpoint_Write_Stream_LE(PacketHeader, sizeof(SideShow_PacketHeader_t));\r
- Endpoint_ClearCurrentBank();\r
+ Endpoint_ClearIN();\r
}\r
\r
static void SideShow_AddContent(SideShow_PacketHeader_t* PacketHeader)\r
PacketHeader->Type.NAK = true;\r
}\r
\r
- Endpoint_ClearCurrentBank();\r
+ Endpoint_ClearOUT();\r
\r
PacketHeader->Length = sizeof(SideShow_PacketHeader_t);\r
\r
Endpoint_SelectEndpoint(SIDESHOW_IN_EPNUM);\r
Endpoint_Write_Stream_LE(PacketHeader, sizeof(SideShow_PacketHeader_t));\r
- Endpoint_ClearCurrentBank();\r
+ Endpoint_ClearIN();\r
}\r
\r
static void SideShow_DeleteContent(SideShow_PacketHeader_t* PacketHeader)\r
Endpoint_Read_Stream_LE(&ApplicationID, sizeof(GUID_t));\r
Endpoint_Read_Stream_LE(&EndpointID, sizeof(GUID_t));\r
Endpoint_Read_Stream_LE(&ContentID, sizeof(uint32_t));\r
- Endpoint_ClearCurrentBank();\r
+ Endpoint_ClearOUT();\r
\r
SideShow_Application_t* Application = SideShow_GetApplicationFromGUID(&ApplicationID);\r
\r
\r
Endpoint_SelectEndpoint(SIDESHOW_IN_EPNUM);\r
Endpoint_Write_Stream_LE(PacketHeader, sizeof(SideShow_PacketHeader_t));\r
- Endpoint_ClearCurrentBank(); \r
+ Endpoint_ClearIN();\r
}\r
\r
static void SideShow_DeleteAllContent(SideShow_PacketHeader_t* PacketHeader)\r
\r
Endpoint_Read_Stream_LE(&ApplicationID, sizeof(GUID_t));\r
Endpoint_Read_Stream_LE(&EndpointID, sizeof(GUID_t));\r
- Endpoint_ClearCurrentBank();\r
+ Endpoint_ClearOUT();\r
\r
SideShow_Application_t* Application = SideShow_GetApplicationFromGUID(&ApplicationID);\r
\r
\r
Endpoint_SelectEndpoint(SIDESHOW_IN_EPNUM);\r
Endpoint_Write_Stream_LE(PacketHeader, sizeof(SideShow_PacketHeader_t));\r
- Endpoint_ClearCurrentBank(); \r
+ Endpoint_ClearIN(); \r
}\r
# Hey Emacs, this is a -*- makefile -*-\r
#----------------------------------------------------------------------------\r
# WinAVR Makefile Template written by Eric B. Weddington, Jörg Wunsch, et al.\r
+# >> Modified for use with the LUFA project. <<\r
#\r
# Released to the Public Domain\r
#\r
# Sander Pool\r
# Frederik Rouleau\r
# Carlos Lamas\r
+# Dean Camera\r
+# Opendous Inc.\r
+# Denver Gingerich\r
#\r
#----------------------------------------------------------------------------\r
# On command line:\r
# make program = Download the hex file to the device, using avrdude.\r
# Please customize the avrdude settings below first!\r
#\r
+# make dfu = Download the hex file to the device, using dfu-programmer (must\r
+# have dfu-programmer installed).\r
+#\r
+# make flip = Download the hex file to the device, using Atmel FLIP (must\r
+# have Atmel FLIP installed).\r
+#\r
+# make dfu-ee = Download the eeprom file to the device, using dfu-programmer\r
+# (must have dfu-programmer installed).\r
+#\r
+# make flip-ee = Download the eeprom file to the device, using Atmel FLIP\r
+# (must have Atmel FLIP installed).\r
+#\r
+# make doxygen = Generate DoxyGen documentation for the project (must have\r
+# DoxyGen installed)\r
+#\r
# make debug = Start either simulavr or avarice as specified for debugging, \r
# with avr-gdb or avr-insight as the front end for debugging.\r
#\r
MCU = at90usb1287\r
\r
\r
-# Target board (see library BoardTypes.h documentation, USER or blank for projects not requiring\r
+# Target board (see library "Board Types" documentation, USER or blank for projects not requiring\r
# LUFA board drivers). If USER is selected, put custom board drivers in a directory called \r
# "Board" inside the application directory.\r
BOARD = USBKEY\r
F_CPU = 8000000\r
\r
\r
+# Input clock frequency.\r
+# This will define a symbol, F_CLOCK, in all source code files equal to the \r
+# input clock frequency (before any prescaling is performed). This value may\r
+# differ from F_CPU if prescaling is used on the latter, and is required as the\r
+# raw input clock is fed directly to the PLL sections of the AVR for high speed\r
+# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'\r
+# at the end, this will be done automatically to create a 32-bit value in your\r
+# source code.\r
+#\r
+# If no clock division is performed on the input clock inside the AVR (via the\r
+# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.\r
+F_CLOCK = 8000000\r
+\r
+\r
# Output format. (can be srec, ihex, binary)\r
FORMAT = ihex\r
\r
\r
# Target file name (without extension).\r
-TARGET = Sideshow\r
+TARGET = SideShow\r
\r
\r
# Object files directory\r
OBJDIR = .\r
\r
\r
+# Path to the LUFA library\r
+LUFA_PATH = ../../../..\r
+\r
+\r
# List C source files here. (C dependencies are automatically generated.)\r
-SRC = $(TARGET).c \\r
- Descriptors.c \\r
- SideshowCommon.c \\r
- SideshowCommands.c \\r
- SideshowApplications.c \\r
- SideshowContent.c \\r
- ../../LUFA/Scheduler/Scheduler.c \\r
- ../../LUFA/Drivers/USB/LowLevel/LowLevel.c \\r
- ../../LUFA/Drivers/USB/LowLevel/Endpoint.c \\r
- ../../LUFA/Drivers/USB/LowLevel/DevChapter9.c \\r
- ../../LUFA/Drivers/USB/HighLevel/USBTask.c \\r
- ../../LUFA/Drivers/USB/HighLevel/USBInterrupt.c \\r
- ../../LUFA/Drivers/USB/HighLevel/Events.c \\r
- ../../LUFA/Drivers/USB/HighLevel/StdDescriptors.c \\r
- ../../LUFA/Drivers/AT90USBXXX/Serial_Stream.c \\r
- ../../LUFA/Drivers/AT90USBXXX/Serial.c \\r
- \r
- \r
+SRC = $(TARGET).c \\r
+ Descriptors.c \\r
+ SideshowCommon.c \\r
+ SideshowCommands.c \\r
+ SideshowApplications.c \\r
+ SideshowContent.c \\r
+ $(LUFA_PATH)/LUFA/Drivers/USB/LowLevel/DevChapter9.c \\r
+ $(LUFA_PATH)/LUFA/Drivers/USB/LowLevel/Endpoint.c \\r
+ $(LUFA_PATH)/LUFA/Drivers/USB/LowLevel/Host.c \\r
+ $(LUFA_PATH)/LUFA/Drivers/USB/LowLevel/HostChapter9.c \\r
+ $(LUFA_PATH)/LUFA/Drivers/USB/LowLevel/LowLevel.c \\r
+ $(LUFA_PATH)/LUFA/Drivers/USB/LowLevel/Pipe.c \\r
+ $(LUFA_PATH)/LUFA/Drivers/USB/HighLevel/Events.c \\r
+ $(LUFA_PATH)/LUFA/Drivers/USB/HighLevel/USBInterrupt.c \\r
+ $(LUFA_PATH)/LUFA/Drivers/USB/HighLevel/USBTask.c \\r
+ $(LUFA_PATH)/LUFA/Drivers/USB/HighLevel/ConfigDescriptor.c \\r
+ $(LUFA_PATH)/LUFA/Drivers/Peripheral/SerialStream.c \\r
+ $(LUFA_PATH)/LUFA/Drivers/Peripheral/Serial.c \\r
+\r
+\r
# List C++ source files here. (C dependencies are automatically generated.)\r
CPPSRC = \r
\r
# Each directory must be seperated by a space.\r
# Use forward slashes for directory separators.\r
# For a directory that has spaces, enclose it in quotes.\r
-EXTRAINCDIRS = ../../\r
+EXTRAINCDIRS = $(LUFA_PATH)/\r
\r
\r
# Compiler flag to set the C Standard level.\r
\r
\r
# Place -D or -U options here for C sources\r
-CDEFS = -DF_CPU=$(F_CPU)UL -DBOARD=BOARD_$(BOARD) -DUSE_NONSTANDARD_DESCRIPTOR_NAMES\r
-CDEFS += -DUSB_DEVICE_ONLY -DUSE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"\r
-CDEFS += -DNO_STREAM_CALLBACKS\r
+CDEFS = -DF_CPU=$(F_CPU)UL -DF_CLOCK=$(F_CLOCK)UL -DBOARD=BOARD_$(BOARD)\r
+CDEFS += -DUSE_NONSTANDARD_DESCRIPTOR_NAMES -DNO_STREAM_CALLBACKS -DUSB_DEVICE_ONLY\r
+CDEFS += -DFIXED_CONTROL_ENDPOINT_SIZE=8 -DUSE_SINGLE_DEVICE_CONFIGURATION\r
+CDEFS += -DUSE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"\r
\r
\r
# Place -D or -U options here for ASM sources\r
# -Map: create map file\r
# --cref: add cross reference to map file\r
LDFLAGS = -Wl,-Map=$(TARGET).map,--cref\r
-LDFLAGS += -Wl,--relax\r
+LDFLAGS += -Wl,--relax \r
LDFLAGS += -Wl,--gc-sections\r
LDFLAGS += $(EXTMEMOPTS)\r
LDFLAGS += $(patsubst %,-L%,$(EXTRALIBDIRS))\r
\r
\r
# Default target.\r
-all: begin gccversion sizebefore build checkhooks checklibmode sizeafter end\r
+all: begin gccversion sizebefore build checkhooks checklibmode checkboard sizeafter end\r
\r
# Change the build target to build a HEX file or a library.\r
build: elf hex eep lss sym\r
checkhooks: build\r
@echo\r
@echo ------- Unhooked LUFA Events -------\r
- @$(shell) (grep -s '^Event.*LUFA/.*\\.o' $(TARGET).map | \\r
+ @$(shell) (grep -s '^EVENT_.*LUFA/.*\\.o' $(TARGET).map | \\r
cut -d' ' -f1 | cut -d'_' -f2- | grep ".*") || \\r
echo "(None)"\r
- @echo ----- End Unhooked LUFA Events -----\r
- \r
+ @echo ------------------------------------\r
+\r
checklibmode:\r
@echo\r
@echo ----------- Library Mode -----------\r
|| echo "No specific mode (both device and host mode allowable)."\r
@echo ------------------------------------\r
\r
+checkboard:\r
+ @echo\r
+ @echo ---------- Selected Board ----------\r
+ @echo Selected board model is $(BOARD).\r
+ @echo ------------------------------------\r
+ \r
# Display compiler version information.\r
gccversion : \r
@$(CC) --version\r
program: $(TARGET).hex $(TARGET).eep\r
$(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM)\r
\r
+flip: $(TARGET).hex\r
+ batchisp -hardware usb -device $(MCU) -operation erase f\r
+ batchisp -hardware usb -device $(MCU) -operation loadbuffer $(TARGET).hex program\r
+ batchisp -hardware usb -device $(MCU) -operation start reset 0\r
+\r
+dfu: $(TARGET).hex\r
+ dfu-programmer $(MCU) erase\r
+ dfu-programmer $(MCU) flash --debug 1 $(TARGET).hex\r
+ dfu-programmer $(MCU) reset\r
+\r
+flip-ee: $(TARGET).hex $(TARGET).eep\r
+ copy $(TARGET).eep $(TARGET)eep.hex\r
+ batchisp -hardware usb -device $(MCU) -operation memory EEPROM erase\r
+ batchisp -hardware usb -device $(MCU) -operation memory EEPROM loadbuffer $(TARGET)eep.hex program\r
+ batchisp -hardware usb -device $(MCU) -operation start reset 0\r
+\r
+dfu-ee: $(TARGET).hex $(TARGET).eep\r
+ dfu-programmer $(MCU) flash-eeprom --debug 1 --suppress-bootloader-mem $(TARGET).eep\r
+ dfu-programmer $(MCU) reset\r
+\r
\r
# Generate avr-gdb config/init file which does the following:\r
# define the reset signal, load the target file, connect to target, and set \r
\r
clean_binary:\r
$(REMOVE) $(TARGET).hex\r
-\r
+ \r
clean_list:\r
@echo $(MSG_CLEANING)\r
$(REMOVE) $(TARGET).eep\r
+ $(REMOVE) $(TARGET)eep.hex\r
$(REMOVE) $(TARGET).cof\r
$(REMOVE) $(TARGET).elf\r
$(REMOVE) $(TARGET).map\r
@doxygen Doxygen.conf\r
@echo Documentation Generation Complete.\r
\r
+clean_doxygen:\r
+ rm -rf Documentation\r
+\r
# Create object files directory\r
$(shell mkdir $(OBJDIR) 2>/dev/null)\r
\r
\r
\r
# Listing of phony targets.\r
-.PHONY : all checkhooks checklibmode begin \\r
-finish end sizebefore sizeafter gccversion \\r
-build elf hex eep lss sym coff extcoff \\r
-clean clean_list clean_binary program debug \\r
-gdb-config doxygen\r
+.PHONY : all checkhooks checklibmode checkboard \\r
+begin finish end sizebefore sizeafter gccversion \\r
+build elf hex eep lss sym coff extcoff clean \\r
+clean_list clean_binary program debug gdb-config \\r
+doxygen dfu flip flip-ee dfu-ee
\ No newline at end of file
*/\r
\r
========== TODO: ===========\r
- - Document new class drivers (in progress)\r
- - Add standardized descriptor names to class driver structures, controlled by USE_NONSTANDARD_DESCRIPTOR_NAMES\r
+ - Document new device class drivers (in progress)\r
+ - Made new host class drivers\r
+ - Document new host class drivers\r
- Convert Host mode demos to class drivers\r
+ - Add in old Host mode demos, convert to schedulerless\r
+ - Add in incomplete host mode demos\r
+ - Add standardized descriptor names to class driver structures, controlled by USE_NONSTANDARD_DESCRIPTOR_NAMES\r
- Remake AVRStudio projects to reflect file structure changes\r
============================\r
\r