diff --git a/Bootloaders/CDC/BootloaderCDC.c b/Bootloaders/CDC/BootloaderCDC.c index 60fe4a4bc9e5e99096698f89541b61f8c8db56e0..0add977ce499d9b029c92b62a3f13743000fa802 100644 --- a/Bootloaders/CDC/BootloaderCDC.c +++ b/Bootloaders/CDC/BootloaderCDC.c @@ -167,6 +167,7 @@ EVENT_HANDLER(USB_UnhandledControlPacket) Endpoint_ClearSetupIN(); + /* Acknowledge status stage */ while (!(Endpoint_IsSetupOUTReceived())); Endpoint_ClearSetupOUT(); } @@ -184,6 +185,7 @@ EVENT_HANDLER(USB_UnhandledControlPacket) Endpoint_ClearSetupOUT(); + /* Acknowledge status stage */ while (!(Endpoint_IsSetupINReady())); Endpoint_ClearSetupIN(); } @@ -194,6 +196,7 @@ EVENT_HANDLER(USB_UnhandledControlPacket) { Endpoint_ClearSetupReceived(); + /* Acknowledge status stage */ while (!(Endpoint_IsSetupINReady())); Endpoint_ClearSetupIN(); } diff --git a/Bootloaders/DFU/BootloaderDFU.c b/Bootloaders/DFU/BootloaderDFU.c index 8cc5fd4099ab4a7405916046e832d8aaaabc0f49..9fff20c12d206ff688559d2576b3b4231371eb50 100644 --- a/Bootloaders/DFU/BootloaderDFU.c +++ b/Bootloaders/DFU/BootloaderDFU.c @@ -57,7 +57,7 @@ bool RunBootloader = true; /** Flag to indicate if the bootloader is waiting to exit. When the host requests the bootloader to exit and * jump to the application address it specifies, it sends two sequential commands which must be properly - * acknowedged. Upon reception of the first the RunBootloader flag is cleared and the WaitForExit flag is set, + * acknowledged. Upon reception of the first the RunBootloader flag is cleared and the WaitForExit flag is set, * causing the bootloader to wait for the final exit command before shutting down. */ bool WaitForExit = false; @@ -305,7 +305,8 @@ EVENT_HANDLER(USB_UnhandledControlPacket) Endpoint_ClearSetupOUT(); - /* Send ZLP to the host to acknowedge the request */ + /* Acknowledge status stage */ + while (!(Endpoint_IsSetupINReady())); Endpoint_ClearSetupIN(); break; @@ -392,7 +393,7 @@ EVENT_HANDLER(USB_UnhandledControlPacket) Endpoint_ClearSetupIN(); - /* Send ZLP to the host to acknowedge the request */ + /* Acknowledge status stage */ while (!(Endpoint_IsSetupOUTReceived())); Endpoint_ClearSetupOUT(); @@ -415,6 +416,7 @@ EVENT_HANDLER(USB_UnhandledControlPacket) Endpoint_ClearSetupIN(); + /* Acknowledge status stage */ while (!(Endpoint_IsSetupOUTReceived())); Endpoint_ClearSetupOUT(); @@ -424,9 +426,11 @@ EVENT_HANDLER(USB_UnhandledControlPacket) /* Reset the status value variable to the default OK status */ DFU_Status = OK; - - Endpoint_ClearSetupIN(); + /* Acknowledge status stage */ + while (!(Endpoint_IsSetupINReady())); + Endpoint_ClearSetupIN(); + break; case DFU_GETSTATE: Endpoint_ClearSetupReceived(); @@ -436,6 +440,7 @@ EVENT_HANDLER(USB_UnhandledControlPacket) Endpoint_ClearSetupIN(); + /* Acknowledge status stage */ while (!(Endpoint_IsSetupOUTReceived())); Endpoint_ClearSetupOUT(); @@ -446,6 +451,8 @@ EVENT_HANDLER(USB_UnhandledControlPacket) /* Reset the current state variable to the default idle state */ DFU_State = dfuIDLE; + /* Acknowledge status stage */ + while (!(Endpoint_IsSetupINReady())); Endpoint_ClearSetupIN(); break; diff --git a/Bootloaders/TeensyHID/TeensyHID.c b/Bootloaders/TeensyHID/TeensyHID.c index fe20702cddfdd58109dc83f47b27afe80f0d4a78..93f062195b324f02e6e09b22651b0bd61ec9e223 100644 --- a/Bootloaders/TeensyHID/TeensyHID.c +++ b/Bootloaders/TeensyHID/TeensyHID.c @@ -144,10 +144,8 @@ EVENT_HANDLER(USB_UnhandledControlPacket) Endpoint_ClearSetupOUT(); - /* Wait until the host is ready to receive the request confirmation */ + /* Acknowledge status stage */ while (!(Endpoint_IsSetupINReady())); - - /* Handshake the request by sending an empty IN packet */ Endpoint_ClearSetupIN(); } diff --git a/Demos/AudioInput/AudioInput.c b/Demos/AudioInput/AudioInput.c index 0db41c3c11e667bb99eea5706083db206c41a857..6ead7a0153c7752feb587e6d21196a1204ecfee6 100644 --- a/Demos/AudioInput/AudioInput.c +++ b/Demos/AudioInput/AudioInput.c @@ -163,7 +163,8 @@ EVENT_HANDLER(USB_UnhandledControlPacket) Scheduler_SetTaskMode(USB_Audio_Task, TASK_STOP); } - /* Handshake the request */ + /* Acknowledge status stage */ + while (!(Endpoint_IsSetupINReady())); Endpoint_ClearSetupIN(); } diff --git a/Demos/AudioOutput/AudioOutput.c b/Demos/AudioOutput/AudioOutput.c index 3d2e3249ed7df14352950b5bc4bc861550f7fbcf..87afd360628809c8ef1467b261a01fb0cd7c71e3 100644 --- a/Demos/AudioOutput/AudioOutput.c +++ b/Demos/AudioOutput/AudioOutput.c @@ -193,7 +193,8 @@ EVENT_HANDLER(USB_UnhandledControlPacket) Scheduler_SetTaskMode(USB_Audio_Task, TASK_STOP); } - /* Handshake the request */ + /* Acknowledge status stage */ + while (!(Endpoint_IsSetupINReady())); Endpoint_ClearSetupIN(); } @@ -249,7 +250,7 @@ TASK(USB_Audio_Task) /* Check to see if the bank is now empty */ if (!(Endpoint_ReadWriteAllowed())) { - /* Acknowedge the packet, clear the bank ready for the next packet */ + /* Acknowledge the packet, clear the bank ready for the next packet */ Endpoint_ClearCurrentBank(); } diff --git a/Demos/CDC/CDC.c b/Demos/CDC/CDC.c index eeae625cfece4acecea1f5bf1b3f167f55e81d10..6e933d5813ddbb0fb99cf2787636bb6a925f0972 100644 --- a/Demos/CDC/CDC.c +++ b/Demos/CDC/CDC.c @@ -171,7 +171,7 @@ EVENT_HANDLER(USB_UnhandledControlPacket) case REQ_GetLineEncoding: if (bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE)) { - /* Acknowedge the SETUP packet, ready for data transfer */ + /* Acknowledge the SETUP packet, ready for data transfer */ Endpoint_ClearSetupReceived(); /* Write the line coding data to the control endpoint */ @@ -185,7 +185,7 @@ EVENT_HANDLER(USB_UnhandledControlPacket) case REQ_SetLineEncoding: if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) { - /* Acknowedge the SETUP packet, ready for data transfer */ + /* Acknowledge the SETUP packet, ready for data transfer */ Endpoint_ClearSetupReceived(); /* Read the line coding data in from the host into the global struct */ @@ -210,10 +210,11 @@ EVENT_HANDLER(USB_UnhandledControlPacket) // Do something with the given line states in wIndex #endif - /* Acknowedge the SETUP packet, ready for data transfer */ + /* Acknowledge the SETUP packet, ready for data transfer */ Endpoint_ClearSetupReceived(); - /* Send an empty packet to acknowedge the command */ + /* Acknowledge status stage */ + while (!(Endpoint_IsSetupINReady())); Endpoint_ClearSetupIN(); } diff --git a/Demos/DualCDC/DualCDC.c b/Demos/DualCDC/DualCDC.c index 8e6e3890716e9c901a5ce9a70fadeda610e0fc4a..3c598da42400961bd58291e6a82ff11d1800b5f1 100644 --- a/Demos/DualCDC/DualCDC.c +++ b/Demos/DualCDC/DualCDC.c @@ -209,7 +209,7 @@ EVENT_HANDLER(USB_UnhandledControlPacket) case REQ_GetLineEncoding: if (bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE)) { - /* Acknowedge the SETUP packet, ready for data transfer */ + /* Acknowledge the SETUP packet, ready for data transfer */ Endpoint_ClearSetupReceived(); /* Write the line coding data to the control endpoint */ @@ -223,7 +223,7 @@ EVENT_HANDLER(USB_UnhandledControlPacket) case REQ_SetLineEncoding: if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) { - /* Acknowedge the SETUP packet, ready for data transfer */ + /* Acknowledge the SETUP packet, ready for data transfer */ Endpoint_ClearSetupReceived(); /* Read the line coding data in from the host into the global struct */ @@ -237,10 +237,11 @@ EVENT_HANDLER(USB_UnhandledControlPacket) case REQ_SetControlLineState: if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) { - /* Acknowedge the SETUP packet, ready for data transfer */ + /* Acknowledge the SETUP packet, ready for data transfer */ Endpoint_ClearSetupReceived(); - /* Send an empty packet to acknowedge the command (currently unused) */ + /* Acknowledge status stage */ + while (!(Endpoint_IsSetupINReady())); Endpoint_ClearSetupIN(); } diff --git a/Demos/Keyboard/Keyboard.c b/Demos/Keyboard/Keyboard.c index 22d406dbe9e66d3d291345fe5b0aa11138cefcd4..931f080980c9f782eb59453ef1253d56642179a6 100644 --- a/Demos/Keyboard/Keyboard.c +++ b/Demos/Keyboard/Keyboard.c @@ -210,10 +210,8 @@ EVENT_HANDLER(USB_UnhandledControlPacket) /* Clear the endpoint data */ Endpoint_ClearSetupOUT(); - /* Wait until the host is ready to receive the request confirmation */ + /* Acknowledge status stage */ while (!(Endpoint_IsSetupINReady())); - - /* Handshake the request by sending an empty IN packet */ Endpoint_ClearSetupIN(); } @@ -228,6 +226,10 @@ EVENT_HANDLER(USB_UnhandledControlPacket) /* Send the flag to the host */ Endpoint_ClearSetupIN(); + + /* Acknowledge status stage */ + while (!(Endpoint_IsSetupOUTReceived())); + Endpoint_ClearSetupOUT(); } break; @@ -242,7 +244,8 @@ EVENT_HANDLER(USB_UnhandledControlPacket) /* Set or clear the flag depending on what the host indicates that the current Protocol should be */ UsingReportProtocol = (wValue != 0x0000); - /* Send an empty packet to acknowedge the command */ + /* Acknowledge status stage */ + while (!(Endpoint_IsSetupINReady())); Endpoint_ClearSetupIN(); } @@ -258,7 +261,8 @@ EVENT_HANDLER(USB_UnhandledControlPacket) /* Get idle period in MSB */ IdleCount = (wValue >> 8); - /* Send an empty packet to acknowedge the command */ + /* Acknowledge status stage */ + while (!(Endpoint_IsSetupINReady())); Endpoint_ClearSetupIN(); } @@ -273,6 +277,10 @@ EVENT_HANDLER(USB_UnhandledControlPacket) /* Send the flag to the host */ Endpoint_ClearSetupIN(); + + /* Acknowledge status stage */ + while (!(Endpoint_IsSetupOUTReceived())); + Endpoint_ClearSetupOUT(); } break; diff --git a/Demos/KeyboardFullInt/KeyboardFullInt.c b/Demos/KeyboardFullInt/KeyboardFullInt.c index ed081376d32c483730b74cdd5b9b0a2f104ac1c6..6a15a9233238e0cb3ee9938e2c62377d5b4a3e8f 100644 --- a/Demos/KeyboardFullInt/KeyboardFullInt.c +++ b/Demos/KeyboardFullInt/KeyboardFullInt.c @@ -212,10 +212,8 @@ EVENT_HANDLER(USB_UnhandledControlPacket) /* Clear the endpoint data */ Endpoint_ClearSetupOUT(); - /* Wait until the host is ready to receive the request confirmation */ + /* Acknowledge status stage */ while (!(Endpoint_IsSetupINReady())); - - /* Handshake the request by sending an empty IN packet */ Endpoint_ClearSetupIN(); } @@ -230,6 +228,10 @@ EVENT_HANDLER(USB_UnhandledControlPacket) /* Send the flag to the host */ Endpoint_ClearSetupIN(); + + /* Acknowledge status stage */ + while (!(Endpoint_IsSetupOUTReceived())); + Endpoint_ClearSetupOUT(); } break; @@ -244,7 +246,8 @@ EVENT_HANDLER(USB_UnhandledControlPacket) /* Set or clear the flag depending on what the host indicates that the current Protocol should be */ UsingReportProtocol = (wValue != 0x0000); - /* Send an empty packet to acknowedge the command */ + /* Acknowledge status stage */ + while (!(Endpoint_IsSetupINReady())); Endpoint_ClearSetupIN(); } @@ -260,7 +263,8 @@ EVENT_HANDLER(USB_UnhandledControlPacket) /* Get idle period in MSB */ IdleCount = (wValue >> 8); - /* Send an empty packet to acknowedge the command */ + /* Acknowledge status stage */ + while (!(Endpoint_IsSetupINReady())); Endpoint_ClearSetupIN(); } @@ -275,6 +279,10 @@ EVENT_HANDLER(USB_UnhandledControlPacket) /* Send the flag to the host */ Endpoint_ClearSetupIN(); + + /* Acknowledge status stage */ + while (!(Endpoint_IsSetupOUTReceived())); + Endpoint_ClearSetupOUT(); } break; diff --git a/Demos/KeyboardMouse/KeyboardMouse.c b/Demos/KeyboardMouse/KeyboardMouse.c index 8108a30327e5119ebc3aa7d4de110a6aea8528b9..3ee101b8db3c58a2f4ef5bef78ad411958cebb16 100644 --- a/Demos/KeyboardMouse/KeyboardMouse.c +++ b/Demos/KeyboardMouse/KeyboardMouse.c @@ -213,10 +213,8 @@ EVENT_HANDLER(USB_UnhandledControlPacket) /* Clear the endpoint data */ Endpoint_ClearSetupOUT(); - /* Wait until the host is ready to receive the request confirmation */ + /* Acknowledge status stage */ while (!(Endpoint_IsSetupINReady())); - - /* Handshake the request by sending an empty IN packet */ Endpoint_ClearSetupIN(); } diff --git a/Demos/KeyboardViaInt/KeyboardViaInt.c b/Demos/KeyboardViaInt/KeyboardViaInt.c index b66506df5a123739e871ced2ce04f6978c6517a3..1e724e6faeb0dff93a7d2bdcf54e4d9f2ba55252 100644 --- a/Demos/KeyboardViaInt/KeyboardViaInt.c +++ b/Demos/KeyboardViaInt/KeyboardViaInt.c @@ -211,10 +211,8 @@ EVENT_HANDLER(USB_UnhandledControlPacket) /* Clear the endpoint data */ Endpoint_ClearSetupOUT(); - /* Wait until the host is ready to receive the request confirmation */ + /* Acknowledge status stage */ while (!(Endpoint_IsSetupINReady())); - - /* Handshake the request by sending an empty IN packet */ Endpoint_ClearSetupIN(); } @@ -229,6 +227,10 @@ EVENT_HANDLER(USB_UnhandledControlPacket) /* Send the flag to the host */ Endpoint_ClearSetupIN(); + + /* Acknowledge status stage */ + while (!(Endpoint_IsSetupOUTReceived())); + Endpoint_ClearSetupOUT(); } break; @@ -243,7 +245,8 @@ EVENT_HANDLER(USB_UnhandledControlPacket) /* Set or clear the flag depending on what the host indicates that the current Protocol should be */ UsingReportProtocol = (wValue != 0x0000); - /* Send an empty packet to acknowedge the command */ + /* Acknowledge status stage */ + while (!(Endpoint_IsSetupINReady())); Endpoint_ClearSetupIN(); } @@ -259,7 +262,8 @@ EVENT_HANDLER(USB_UnhandledControlPacket) /* Get idle period in MSB */ IdleCount = (wValue >> 8); - /* Send an empty packet to acknowedge the command */ + /* Acknowledge status stage */ + while (!(Endpoint_IsSetupINReady())); Endpoint_ClearSetupIN(); } @@ -274,6 +278,10 @@ EVENT_HANDLER(USB_UnhandledControlPacket) /* Send the flag to the host */ Endpoint_ClearSetupIN(); + + /* Acknowledge status stage */ + while (!(Endpoint_IsSetupOUTReceived())); + Endpoint_ClearSetupOUT(); } break; diff --git a/Demos/MassStorage/MassStorage.c b/Demos/MassStorage/MassStorage.c index 34fcee4884fc6247299aa5e77fc9dcbfe8e44dee..92e33073c50b626d35c73acd78b146b5e0060e0f 100644 --- a/Demos/MassStorage/MassStorage.c +++ b/Demos/MassStorage/MassStorage.c @@ -159,10 +159,13 @@ EVENT_HANDLER(USB_UnhandledControlPacket) case REQ_MassStorageReset: if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) { - /* Indicate that the current transfer should be aborted */ - IsMassStoreReset = true; - Endpoint_ClearSetupReceived(); + + /* Indicate that the current transfer should be aborted */ + IsMassStoreReset = true; + + /* Acknowledge status stage */ + while (!(Endpoint_IsSetupINReady())); Endpoint_ClearSetupIN(); } @@ -171,9 +174,15 @@ EVENT_HANDLER(USB_UnhandledControlPacket) if (bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE)) { /* Indicate to the host the number of supported LUNs (virtual disks) on the device */ - Endpoint_ClearSetupReceived(); + Endpoint_ClearSetupReceived(); + Endpoint_Write_Byte(TOTAL_LUNS - 1); + Endpoint_ClearSetupIN(); + + /* Acknowledge status stage */ + while (!(Endpoint_IsSetupOUTReceived())); + Endpoint_ClearSetupOUT(); } break; diff --git a/Demos/Mouse/Mouse.c b/Demos/Mouse/Mouse.c index 3e59706c98e5bcefec1c0873abc28ef2105e5e67..da8a4a809c8cf768bcc48c988b63faf6b91419c5 100644 --- a/Demos/Mouse/Mouse.c +++ b/Demos/Mouse/Mouse.c @@ -201,6 +201,10 @@ EVENT_HANDLER(USB_UnhandledControlPacket) /* Send the flag to the host */ Endpoint_ClearSetupIN(); + + /* Acknowledge status stage */ + while (!(Endpoint_IsSetupOUTReceived())); + Endpoint_ClearSetupOUT(); } break; @@ -215,7 +219,8 @@ EVENT_HANDLER(USB_UnhandledControlPacket) /* Set or clear the flag depending on what the host indicates that the current Protocol should be */ UsingReportProtocol = (wValue != 0x0000); - /* Send an empty packet to acknowedge the command */ + /* Acknowledge status stage */ + while (!(Endpoint_IsSetupINReady())); Endpoint_ClearSetupIN(); } @@ -231,7 +236,8 @@ EVENT_HANDLER(USB_UnhandledControlPacket) /* Get idle period in MSB */ IdleCount = (wValue >> 8); - /* Send an empty packet to acknowedge the command */ + /* Acknowledge status stage */ + while (!(Endpoint_IsSetupINReady())); Endpoint_ClearSetupIN(); } @@ -246,6 +252,10 @@ EVENT_HANDLER(USB_UnhandledControlPacket) /* Send the flag to the host */ Endpoint_ClearSetupIN(); + + /* Acknowledge status stage */ + while (!(Endpoint_IsSetupOUTReceived())); + Endpoint_ClearSetupOUT(); } break; diff --git a/Demos/MouseFullInt/MouseFullInt.c b/Demos/MouseFullInt/MouseFullInt.c index 98782b6cf9193b4f57282d5246f85d335a08873c..7e69d81e7b2ad6b969dbee8f0f3e0b26c4ab0d6e 100644 --- a/Demos/MouseFullInt/MouseFullInt.c +++ b/Demos/MouseFullInt/MouseFullInt.c @@ -200,6 +200,10 @@ EVENT_HANDLER(USB_UnhandledControlPacket) /* Send the flag to the host */ Endpoint_ClearSetupIN(); + + /* Acknowledge status stage */ + while (!(Endpoint_IsSetupOUTReceived())); + Endpoint_ClearSetupOUT(); } break; @@ -214,7 +218,8 @@ EVENT_HANDLER(USB_UnhandledControlPacket) /* Set or clear the flag depending on what the host indicates that the current Protocol should be */ UsingReportProtocol = (wValue != 0x0000); - /* Send an empty packet to acknowedge the command */ + /* Acknowledge status stage */ + while (!(Endpoint_IsSetupINReady())); Endpoint_ClearSetupIN(); } @@ -230,7 +235,8 @@ EVENT_HANDLER(USB_UnhandledControlPacket) /* Get idle period in MSB */ IdleCount = (wValue >> 8); - /* Send an empty packet to acknowedge the command */ + /* Acknowledge status stage */ + while (!(Endpoint_IsSetupINReady())); Endpoint_ClearSetupIN(); } @@ -245,6 +251,10 @@ EVENT_HANDLER(USB_UnhandledControlPacket) /* Send the flag to the host */ Endpoint_ClearSetupIN(); + + /* Acknowledge status stage */ + while (!(Endpoint_IsSetupOUTReceived())); + Endpoint_ClearSetupOUT(); } break; diff --git a/Demos/MouseViaInt/MouseViaInt.c b/Demos/MouseViaInt/MouseViaInt.c index 445fb499407fdf49678e8145d790b692c1ca4f1a..465459a36f4bd600dfd86c923a27fb29a095b884 100644 --- a/Demos/MouseViaInt/MouseViaInt.c +++ b/Demos/MouseViaInt/MouseViaInt.c @@ -198,6 +198,10 @@ EVENT_HANDLER(USB_UnhandledControlPacket) /* Send the flag to the host */ Endpoint_ClearSetupIN(); + + /* Acknowledge status stage */ + while (!(Endpoint_IsSetupOUTReceived())); + Endpoint_ClearSetupOUT(); } break; @@ -212,7 +216,8 @@ EVENT_HANDLER(USB_UnhandledControlPacket) /* Set or clear the flag depending on what the host indicates that the current Protocol should be */ UsingReportProtocol = (wValue != 0x0000); - /* Send an empty packet to acknowedge the command */ + /* Acknowledge status stage */ + while (!(Endpoint_IsSetupINReady())); Endpoint_ClearSetupIN(); } @@ -228,7 +233,8 @@ EVENT_HANDLER(USB_UnhandledControlPacket) /* Get idle period in MSB */ IdleCount = (wValue >> 8); - /* Send an empty packet to acknowedge the command */ + /* Acknowledge status stage */ + while (!(Endpoint_IsSetupINReady())); Endpoint_ClearSetupIN(); } @@ -243,6 +249,10 @@ EVENT_HANDLER(USB_UnhandledControlPacket) /* Send the flag to the host */ Endpoint_ClearSetupIN(); + + /* Acknowledge status stage */ + while (!(Endpoint_IsSetupOUTReceived())); + Endpoint_ClearSetupOUT(); } break; diff --git a/Demos/USBtoSerial/USBtoSerial.c b/Demos/USBtoSerial/USBtoSerial.c index 0495826b9d48ff8605d8f00b28a5e7d9b8766273..c7c9e4b04d8d5f818e1c2a425b515c9d513335f2 100644 --- a/Demos/USBtoSerial/USBtoSerial.c +++ b/Demos/USBtoSerial/USBtoSerial.c @@ -164,7 +164,7 @@ EVENT_HANDLER(USB_UnhandledControlPacket) case REQ_GetLineEncoding: if (bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE)) { - /* Acknowedge the SETUP packet, ready for data transfer */ + /* Acknowledge the SETUP packet, ready for data transfer */ Endpoint_ClearSetupReceived(); /* Write the line coding data to the control endpoint */ @@ -178,7 +178,7 @@ EVENT_HANDLER(USB_UnhandledControlPacket) case REQ_SetLineEncoding: if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) { - /* Acknowedge the SETUP packet, ready for data transfer */ + /* Acknowledge the SETUP packet, ready for data transfer */ Endpoint_ClearSetupReceived(); /* Read the line coding data in from the host into the global struct */ @@ -206,10 +206,11 @@ EVENT_HANDLER(USB_UnhandledControlPacket) // Do something with the given line states in wIndex #endif - /* Acknowedge the SETUP packet, ready for data transfer */ + /* Acknowledge the SETUP packet, ready for data transfer */ Endpoint_ClearSetupReceived(); - /* Send an empty packet to acknowedge the command */ + /* Acknowledge status stage */ + while (!(Endpoint_IsSetupINReady())); Endpoint_ClearSetupIN(); } diff --git a/LUFA/ChangeLog.txt b/LUFA/ChangeLog.txt index 1a2b9f8a1813d9bc3893051163e4a280935fcd0f..d283d7f95de2c8f205467cb44d74a5fb041f5330 100644 --- a/LUFA/ChangeLog.txt +++ b/LUFA/ChangeLog.txt @@ -29,13 +29,15 @@ * - Function attribute ATTR_ALWAYSINLINE renamed to ATTR_ALWAYS_INLINE to match other function attribute macro naming conventions * - Added ATTR_ALWAYS_INLINE attribute to several key inlined library components, to ensure they are inlined in all circumstances * - Removed SetSystemClockPrescaler() macro, the clock_prescale_set() avr-libc macro has been corrected in recent avr-libc versions + * - Fixed incorrect/missing control status stage transfers on demos, bootloaders and applications (thanks to Nate Lawson) * * \section Sec_ChangeLog090209 Version 090209 * * - PWM timer mode in AudioOut demo changed to Fast PWM for speed * - Updated Magstripe project to work with the latest hardware revision * - Fixed library not responding to the BCERRI flag correctly in host mode, leading to device lockups - * - Fixed library handling Get Descriptor requests when not addressed as standard requests to the device or interface + * - Fixed library handling Get Descriptor requests when not addressed as standard requests to the device or interface (thanks to + * Nate Lawson) * - Fixed serious data corruption issue in MassStorage demo dataflash write routine * - Added new NO_CLEARSET_FEATURE_REQUEST compile time token * - USB task now restores previous global interrupt state after execution, rather than forcing global interrupts to be enabled @@ -326,7 +328,7 @@ * - Added Endpoint_Read_Stream, Endpoint_Write_Stream, Pipe_Read_Stream and Pipe_Write_Stream functions * (including Big and Little Endian variants) * - Made Dataflash functions inline for speed, removed now empty Dataflash.c driver file - * - Added new SetSystemClockPrescaler() macro - thanks to Joerg Wunsch + * - Added new SetSystemClockPrescaler() macro (thanks to Joerg Wunsch) * - Fixed Endpoint_ClearStall() to function correctly on full USB controller AVRs (AT90USBXXX6/7) * - Endpoint_Setup_In_Clear() and Endpoint_Setup_Out_Clear() no longer set FIFOCON, in line with the * directives in the datasheet diff --git a/LUFA/Drivers/USB/LowLevel/Endpoint.h b/LUFA/Drivers/USB/LowLevel/Endpoint.h index d1ad1315ad6a3e309e7be8cc8fbd8b782d30fb0e..16266868cf7d57668ba83239e24c20aea45fcbc3 100644 --- a/LUFA/Drivers/USB/LowLevel/Endpoint.h +++ b/LUFA/Drivers/USB/LowLevel/Endpoint.h @@ -256,7 +256,7 @@ /** Sends an IN packet to the host on the currently selected CONTROL type endpoint. */ #define Endpoint_ClearSetupIN() MACROS{ UEINTX &= ~(1 << TXINI); }MACROE - /** Acknowedges an OUT packet to the host on the currently selected CONTROL type endpoint, freeing + /** Acknowledges an OUT packet to the host on the currently selected CONTROL type endpoint, freeing * up the endpoint for the next packet. */ #define Endpoint_ClearSetupOUT() MACROS{ UEINTX &= ~(1 << RXOUTI); }MACROE @@ -667,7 +667,7 @@ ) ATTR_NON_NULL_PTR_ARG(1); /** Writes the given number of bytes to the CONTROL type endpoint from the given buffer in little endian, - * sending full packets to the host as needed. The host OUT acknowedgement is not automatically cleared + * sending full packets to the host as needed. The host OUT acknowledgement is not automatically cleared * in both failure and success states; the user is responsible for manually clearing the setup OUT to * finalize the transfer via the Endpoint_ClearSetupOUT() macro. * @@ -684,7 +684,7 @@ uint8_t Endpoint_Write_Control_Stream_LE(const void* Buffer, uint16_t Length) ATTR_NON_NULL_PTR_ARG(1); /** Writes the given number of bytes to the CONTROL type endpoint from the given buffer in big endian, - * sending full packets to the host as needed. The host OUT acknowedgement is not automatically cleared + * sending full packets to the host as needed. The host OUT acknowledgement is not automatically cleared * in both failure and success states; the user is responsible for manually clearing the setup OUT to * finalize the transfer via the Endpoint_ClearSetupOUT() macro. * @@ -701,7 +701,7 @@ uint8_t Endpoint_Write_Control_Stream_BE(const void* Buffer, uint16_t Length) ATTR_NON_NULL_PTR_ARG(1); /** Reads the given number of bytes from the CONTROL endpoint from the given buffer in little endian, - * discarding fully read packets from the host as needed. The device IN acknowedgement is not + * discarding fully read packets from the host as needed. The device IN acknowledgement is not * automatically sent after success or failure states; the user is responsible for manually sending the * setup IN to finalize the transfer via the Endpoint_ClearSetupIN() macro. * @@ -718,7 +718,7 @@ uint8_t Endpoint_Read_Control_Stream_LE(void* Buffer, uint16_t Length) ATTR_NON_NULL_PTR_ARG(1); /** Reads the given number of bytes from the CONTROL endpoint from the given buffer in big endian, - * discarding fully read packets from the host as needed. The device IN acknowedgement is not + * discarding fully read packets from the host as needed. The device IN acknowledgement is not * automatically sent after success or failure states; the user is responsible for manually sending the * setup IN to finalize the transfer via the Endpoint_ClearSetupIN() macro. * diff --git a/LUFA/Drivers/USB/LowLevel/LowLevel.h b/LUFA/Drivers/USB/LowLevel/LowLevel.h index 9721baca011942dfe339a58411376d4ee0a46efd..98deaaca1e41a07f00deec853ffd567f3993e779 100644 --- a/LUFA/Drivers/USB/LowLevel/LowLevel.h +++ b/LUFA/Drivers/USB/LowLevel/LowLevel.h @@ -205,7 +205,7 @@ #if !defined(USB_STREAM_TIMEOUT_MS) || defined(__DOXYGEN__) /** Constant for the maximum software timeout period of the USB data stream transfer functions * (both control and standard) when in either device or host mode. If the next packet of a stream - * is not received or acknowedged within this time period, the stream function will fail. + * is not received or acknowledged within this time period, the stream function will fail. * * This value may be overridden in the user project makefile as the value of the * USB_STREAM_TIMEOUT_MS token, and passed to the compiler using the -D switch. diff --git a/LUFA/Drivers/USB/LowLevel/Pipe.h b/LUFA/Drivers/USB/LowLevel/Pipe.h index f7d10bc1db96f7898efbcbc676c8bfac615fb366..5d4793eb2a173d0ac7309d04b9f2bf5a73fa59bf 100644 --- a/LUFA/Drivers/USB/LowLevel/Pipe.h +++ b/LUFA/Drivers/USB/LowLevel/Pipe.h @@ -347,7 +347,7 @@ */ #define Pipe_IsSetupOUTReady() ((UPINTX & (1 << TXOUTI)) ? true : false) - /** Acknowedges the reception of a setup IN request from the attached device on the currently selected + /** Acknowledges the reception of a setup IN request from the attached device on the currently selected * CONTROL type endpoint, allowing for the transmission of a setup OUT packet, or the reception of * another setup IN packet. */ @@ -356,7 +356,7 @@ /** Sends the currently selected CONTROL type pipe's contents to the device as a setup OUT packet. */ #define Pipe_ClearSetupOUT() MACROS{ UPINTX &= ~(1 << TXOUTI); UPINTX &= ~(1 << FIFOCON); }MACROE - /** Returns true if the device sent a NAK (Negative Acknowedge) in response to the last sent packet on + /** Returns true if the device sent a NAK (Negative Acknowledge) in response to the last sent packet on * the currently selected pipe. This ocurrs when the host sends a packet to the device, but the device * is not currently ready to handle the packet (i.e. its endpoint banks are full). Once a NAK has been * received, it must be cleard using Pipe_ClearNAKReceived() before the previous (or any other) packet diff --git a/LUFA/MigrationInformation.txt b/LUFA/MigrationInformation.txt index 364f09c3e0f603d0eb4bcd9e7a411409a1330f0f..75b5d1912e6f53a1cf0251df66d31c047ae93734 100644 --- a/LUFA/MigrationInformation.txt +++ b/LUFA/MigrationInformation.txt @@ -22,6 +22,9 @@ * * <b>Library Demos</b> * - The USBtoSerial demo now discards all data when not connected to a host, rather than buffering it for later transmission. + * - Most demos, bootloaders and applications have had their control request handling code corrected, to properly send the status + * stage in all handled requests. If you are using code based off one of the library demos, bootloaders or applications, you should + * update to the latest revisions. * * <b>Non-USB Library Components</b> * - The ATTR_ALWAYSINLINE function attribute macro has been renamed to ATTR_ALWAYS_INLINE. diff --git a/Projects/AVRISP_Programmer/AVRISP_Programmer.c b/Projects/AVRISP_Programmer/AVRISP_Programmer.c index 4bc4f9cc31876d2e1f6fb99bf761f7b83b2ee922..58593670e060c07c1d4b07e6a4c549ce197d873c 100644 --- a/Projects/AVRISP_Programmer/AVRISP_Programmer.c +++ b/Projects/AVRISP_Programmer/AVRISP_Programmer.c @@ -267,7 +267,7 @@ EVENT_HANDLER(USB_UnhandledControlPacket) case REQ_GetLineEncoding: if (bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE)) { - /* Acknowedge the SETUP packet, ready for data transfer */ + /* Acknowledge the SETUP packet, ready for data transfer */ Endpoint_ClearSetupReceived(); /* Write the line coding data to the control endpoint */ @@ -281,7 +281,7 @@ EVENT_HANDLER(USB_UnhandledControlPacket) case REQ_SetLineEncoding: if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) { - /* Acknowedge the SETUP packet, ready for data transfer */ + /* Acknowledge the SETUP packet, ready for data transfer */ Endpoint_ClearSetupReceived(); /* Read the line coding data in from the host into the global struct */ @@ -298,10 +298,11 @@ EVENT_HANDLER(USB_UnhandledControlPacket) case REQ_SetControlLineState: if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) { - /* Acknowedge the SETUP packet, ready for data transfer */ + /* Acknowledge the SETUP packet, ready for data transfer */ Endpoint_ClearSetupReceived(); - /* Send an empty packet to acknowedge the command */ + /* Acknowledge status stage */ + while (!(Endpoint_IsSetupINReady())); Endpoint_ClearSetupIN(); } diff --git a/Projects/Magstripe/Magstripe.c b/Projects/Magstripe/Magstripe.c index 2826c140e0530d73ab4f4788612e58f5c2efd0d3..0e10053da44104dc7bc491e0d62f75937e977357 100644 --- a/Projects/Magstripe/Magstripe.c +++ b/Projects/Magstripe/Magstripe.c @@ -204,6 +204,10 @@ EVENT_HANDLER(USB_UnhandledControlPacket) /* Send the flag to the host */ Endpoint_ClearSetupIN(); + + /* Acknowledge status stage */ + while (!(Endpoint_IsSetupOUTReceived())); + Endpoint_ClearSetupOUT(); } break; @@ -218,7 +222,8 @@ EVENT_HANDLER(USB_UnhandledControlPacket) /* Set or clear the flag depending on what the host indicates that the current Protocol should be */ UsingReportProtocol = (wValue != 0x0000); - /* Send an empty packet to acknowedge the command */ + /* Acknowledge status stage */ + while (!(Endpoint_IsSetupINReady())); Endpoint_ClearSetupIN(); } @@ -234,7 +239,8 @@ EVENT_HANDLER(USB_UnhandledControlPacket) /* Get idle period in MSB */ IdleCount = (wValue >> 8); - /* Send an empty packet to acknowedge the command */ + /* Acknowledge status stage */ + while (!(Endpoint_IsSetupINReady())); Endpoint_ClearSetupIN(); } @@ -249,6 +255,10 @@ EVENT_HANDLER(USB_UnhandledControlPacket) /* Send the flag to the host */ Endpoint_ClearSetupIN(); + + /* Acknowledge status stage */ + while (!(Endpoint_IsSetupOUTReceived())); + Endpoint_ClearSetupOUT(); } break;