X-Git-Url: http://git.linex4red.de/pub/lufa.git/blobdiff_plain/6933f2e1a543b066ebe734bd126a7ff2f1c2777f..b3a4d8512bcaf0feba16a3cbeeaabfcfeb9cf051:/Demos/Device/MassStorage/MassStorage.c diff --git a/Demos/Device/MassStorage/MassStorage.c b/Demos/Device/MassStorage/MassStorage.c index 403264835..82e7e8aa2 100644 --- a/Demos/Device/MassStorage/MassStorage.c +++ b/Demos/Device/MassStorage/MassStorage.c @@ -37,16 +37,10 @@ #define INCLUDE_FROM_MASSSTORAGE_C #include "MassStorage.h" -/* Project Tags, for reading out using the ButtLoad project */ -BUTTLOADTAG(ProjName, "LUFA MassStore App"); -BUTTLOADTAG(BuildTime, __TIME__); -BUTTLOADTAG(BuildDate, __DATE__); -BUTTLOADTAG(LUFAVersion, "LUFA V" LUFA_VERSION_STRING); - /* Scheduler Task List */ TASK_LIST { - { Task: USB_MassStorage , TaskStatus: TASK_STOP }, + { .Task = USB_MassStorage , .TaskStatus = TASK_STOP }, }; /* Global Variables */ @@ -54,7 +48,7 @@ TASK_LIST CommandBlockWrapper_t CommandBlock; /** Structure to hold the latest Command Status Wrapper to return to the host, containing the status of the last issued command. */ -CommandStatusWrapper_t CommandStatus = { Signature: CSW_SIGNATURE }; +CommandStatusWrapper_t CommandStatus = { .Signature = CSW_SIGNATURE }; /** Flag to asynchronously abort any in-progress data transfers upon the reception of a mass storage reset command. */ volatile bool IsMassStoreReset = false; @@ -91,21 +85,8 @@ int main(void) Scheduler_Start(); } -/** Event handler for the USB_Reset event. This fires when the USB interface is reset by the USB host, before the - * enumeration process begins, and enables the control endpoint interrupt so that control requests can be handled - * asynchronously when they arrive rather than when the control endpoint is polled manually. - */ -EVENT_HANDLER(USB_Reset) -{ - /* Select the control endpoint */ - Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP); - - /* Enable the endpoint SETUP interrupt ISR for the control endpoint */ - USB_INT_Enable(ENDPOINT_INT_SETUP); -} - /** Event handler for the USB_Connect event. This indicates that the device is enumerating via the status LEDs. */ -EVENT_HANDLER(USB_Connect) +void EventHandler_USB_Connect(void) { /* Indicate USB enumerating */ UpdateStatus(Status_USBEnumerating); @@ -117,7 +98,7 @@ EVENT_HANDLER(USB_Connect) /** Event handler for the USB_Disconnect event. This indicates that the device is no longer connected to a host via * the status LEDs and stops the Mass Storage management task. */ -EVENT_HANDLER(USB_Disconnect) +void EventHandler_USB_Disconnect(void) { /* Stop running mass storage task */ Scheduler_SetTaskMode(USB_MassStorage, TASK_STOP); @@ -129,7 +110,7 @@ EVENT_HANDLER(USB_Disconnect) /** Event handler for the USB_ConfigurationChanged event. This is fired when the host set the current configuration * of the USB device after enumeration - the device endpoints are configured and the Mass Storage management task started. */ -EVENT_HANDLER(USB_ConfigurationChanged) +void EventHandler_USB_ConfigurationChanged(void) { /* Setup Mass Storage In and Out Endpoints */ Endpoint_ConfigureEndpoint(MASS_STORAGE_IN_EPNUM, EP_TYPE_BULK, @@ -151,38 +132,38 @@ EVENT_HANDLER(USB_ConfigurationChanged) * control requests that are not handled internally by the USB library (including the Mass Storage class-specific * requests) so that they can be handled appropriately for the application. */ -EVENT_HANDLER(USB_UnhandledControlPacket) +void EventHandler_USB_UnhandledControlPacket(void) { /* Process UFI specific control requests */ - switch (bRequest) + switch (USB_ControlRequest.bRequest) { case REQ_MassStorageReset: - if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) + if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) { - Endpoint_ClearSetupReceived(); + Endpoint_ClearSETUP(); /* Indicate that the current transfer should be aborted */ IsMassStoreReset = true; /* Acknowledge status stage */ - while (!(Endpoint_IsSetupINReady())); - Endpoint_ClearSetupIN(); + while (!(Endpoint_IsINReady())); + Endpoint_ClearIN(); } break; case REQ_GetMaxLUN: - if (bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE)) + if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE)) { - /* Indicate to the host the number of supported LUNs (virtual disks) on the device */ - Endpoint_ClearSetupReceived(); + Endpoint_ClearSETUP(); + /* Indicate to the host the number of supported LUNs (virtual disks) on the device */ Endpoint_Write_Byte(TOTAL_LUNS - 1); - Endpoint_ClearSetupIN(); + Endpoint_ClearIN(); /* Acknowledge status stage */ - while (!(Endpoint_IsSetupOUTReceived())); - Endpoint_ClearSetupOUT(); + while (!(Endpoint_IsOUTReceived())); + Endpoint_ClearOUT(); } break; @@ -234,7 +215,7 @@ TASK(USB_MassStorage) Endpoint_SelectEndpoint(MASS_STORAGE_OUT_EPNUM); /* Check to see if a command from the host has been issued */ - if (Endpoint_ReadWriteAllowed()) + if (Endpoint_IsReadWriteAllowed()) { /* Indicate busy */ UpdateStatus(Status_ProcessingCommandBlock); @@ -268,6 +249,11 @@ TASK(USB_MassStorage) /* Reset the data endpoint banks */ Endpoint_ResetFIFO(MASS_STORAGE_OUT_EPNUM); Endpoint_ResetFIFO(MASS_STORAGE_IN_EPNUM); + + Endpoint_SelectEndpoint(MASS_STORAGE_OUT_EPNUM); + Endpoint_ClearStall(); + Endpoint_SelectEndpoint(MASS_STORAGE_IN_EPNUM); + Endpoint_ClearStall(); /* Clear the abort transfer flag */ IsMassStoreReset = false; @@ -297,7 +283,7 @@ static bool ReadInCommandBlock(void) /* Read in command block header */ Endpoint_Read_Stream_LE(&CommandBlock, (sizeof(CommandBlock) - sizeof(CommandBlock.SCSICommandData)), - AbortOnMassStoreReset); + StreamCallback_AbortOnMassStoreReset); /* Check if the current command is being aborted by the host */ if (IsMassStoreReset) @@ -319,14 +305,14 @@ static bool ReadInCommandBlock(void) /* Read in command block command data */ Endpoint_Read_Stream_LE(&CommandBlock.SCSICommandData, CommandBlock.SCSICommandLength, - AbortOnMassStoreReset); + StreamCallback_AbortOnMassStoreReset); /* Check if the current command is being aborted by the host */ if (IsMassStoreReset) return false; /* Finalize the stream transfer to send the last packet */ - Endpoint_ClearCurrentBank(); + Endpoint_ClearOUT(); return true; } @@ -360,20 +346,20 @@ static void ReturnCommandStatus(void) /* Write the CSW to the endpoint */ Endpoint_Write_Stream_LE(&CommandStatus, sizeof(CommandStatus), - AbortOnMassStoreReset); + StreamCallback_AbortOnMassStoreReset); /* Check if the current command is being aborted by the host */ if (IsMassStoreReset) return; /* Finalize the stream transfer to send the last packet */ - Endpoint_ClearCurrentBank(); + Endpoint_ClearIN(); } /** Stream callback function for the Endpoint stream read and write functions. This callback will abort the current stream transfer * if a Mass Storage Reset request has been issued to the control endpoint. */ -STREAM_CALLBACK(AbortOnMassStoreReset) +uint8_t StreamCallback_AbortOnMassStoreReset(void) { /* Abort if a Mass Storage reset command was received */ if (IsMassStoreReset) @@ -382,24 +368,3 @@ STREAM_CALLBACK(AbortOnMassStoreReset) /* Continue with the current stream operation */ return STREAMCALLBACK_Continue; } - -/** ISR for the general Pipe/Endpoint interrupt vector. This ISR fires when a control request has been issued to the control endpoint, - * so that the request can be processed. As several elements of the Mass Storage implementation require asynchronous control requests - * (such as endpoint stall clearing and Mass Storage Reset requests during data transfers) this is done via interrupts rather than - * polling. - */ -ISR(ENDPOINT_PIPE_vect, ISR_BLOCK) -{ - /* Check if the control endpoint has received a request */ - if (Endpoint_HasEndpointInterrupted(ENDPOINT_CONTROLEP)) - { - /* Clear the endpoint interrupt */ - Endpoint_ClearEndpointInterrupt(ENDPOINT_CONTROLEP); - - /* Process the control request */ - USB_USBTask(); - - /* Handshake the endpoint setup interrupt - must be after the call to USB_USBTask() */ - USB_INT_Clear(ENDPOINT_INT_SETUP); - } -}