From d5e874d3480e6806223cd2fc05d9c9bb85e9d95e Mon Sep 17 00:00:00 2001 From: Dean Camera Date: Mon, 25 Jul 2011 09:56:21 +0000 Subject: Add INTERRUPT_CONTROL_ENDPOINT compile time option support for the UC3 devices. --- LUFA/Drivers/USB/Core/UC3/USBInterrupt_UC3.c | 23 +++++++++++++++++++++++ LUFA/Drivers/USB/Core/UC3/USBInterrupt_UC3.h | 27 +++++++++++++++++++++------ 2 files changed, 44 insertions(+), 6 deletions(-) (limited to 'LUFA/Drivers/USB') diff --git a/LUFA/Drivers/USB/Core/UC3/USBInterrupt_UC3.c b/LUFA/Drivers/USB/Core/UC3/USBInterrupt_UC3.c index d92011ff6..fec007cdc 100644 --- a/LUFA/Drivers/USB/Core/UC3/USBInterrupt_UC3.c +++ b/LUFA/Drivers/USB/Core/UC3/USBInterrupt_UC3.c @@ -121,6 +121,10 @@ ISR(USB_GEN_vect) ENDPOINT_DIR_OUT, USB_Device_ControlEndpointSize, ENDPOINT_BANK_SINGLE); + #if defined(INTERRUPT_CONTROL_ENDPOINT) + USB_INT_Enable(USB_INT_RXSTPI); + #endif + EVENT_USB_Device_Reset(); } #endif @@ -200,3 +204,22 @@ ISR(USB_GEN_vect) } #endif } + +#if defined(INTERRUPT_CONTROL_ENDPOINT) && defined(USB_CAN_BE_DEVICE) +ISR(USB_COM_vect, ISR_BLOCK) +{ + uint8_t PrevSelectedEndpoint = Endpoint_GetCurrentEndpoint(); + + Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP); + USB_INT_Disable(USB_INT_RXSTPI); + + GlobalInterruptEnable(); + + USB_Device_ProcessControlRequest(); + + Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP); + USB_INT_Enable(USB_INT_RXSTPI); + Endpoint_SelectEndpoint(PrevSelectedEndpoint); +} +#endif + diff --git a/LUFA/Drivers/USB/Core/UC3/USBInterrupt_UC3.h b/LUFA/Drivers/USB/Core/UC3/USBInterrupt_UC3.h index 268eaa827..28dbabbfd 100644 --- a/LUFA/Drivers/USB/Core/UC3/USBInterrupt_UC3.h +++ b/LUFA/Drivers/USB/Core/UC3/USBInterrupt_UC3.h @@ -43,6 +43,7 @@ /* Includes: */ #include "../../../../Common/Common.h" + #include "../Endpoint.h" /* Enable C linkage for C++ Compilers: */ #if defined(__cplusplus) @@ -68,14 +69,15 @@ USB_INT_SUSPI = 3, USB_INT_EORSTI = 4, USB_INT_SOFI = 5, + USB_INT_RXSTPI = 6, #endif #if (defined(USB_CAN_BE_HOST) || defined(__DOXYGEN__)) - USB_INT_HSOFI = 6, - USB_INT_DCONNI = 7, - USB_INT_DDISCI = 8, - USB_INT_RSTI = 9, - USB_INT_BCERRI = 10, - USB_INT_VBERRI = 11, + USB_INT_HSOFI = 7, + USB_INT_DCONNI = 8, + USB_INT_DDISCI = 9, + USB_INT_RSTI = 10, + USB_INT_BCERRI = 11, + USB_INT_VBERRI = 12, #endif }; @@ -106,6 +108,9 @@ case USB_INT_SOFI: AVR32_USBB.UDINTESET.sofes = true; break; + case USB_INT_RXSTPI: + (&AVR32_USBB.UECON0SET)[USB_SelectedEndpoint].rxstpes = true; + break; #endif #if defined(USB_CAN_BE_HOST) case USB_INT_HSOFI: @@ -156,6 +161,9 @@ case USB_INT_SOFI: AVR32_USBB.UDINTECLR.sofec = true; break; + case USB_INT_RXSTPI: + (&AVR32_USBB.UECON0CLR)[USB_SelectedEndpoint].rxstpec = true; + break; #endif #if defined(USB_CAN_BE_HOST) case USB_INT_HSOFI: @@ -212,6 +220,9 @@ AVR32_USBB.UDINTCLR.sofc = true; (void)AVR32_USBB.UDINTCLR; break; + case USB_INT_RXSTPI: + (&AVR32_USBB.UESTA0CLR)[USB_SelectedEndpoint].rxstpic = true; + break; #endif #if defined(USB_CAN_BE_HOST) case USB_INT_HSOFI: @@ -262,6 +273,8 @@ return AVR32_USBB.UDINTE.eorste; case USB_INT_SOFI: return AVR32_USBB.UDINTE.sofe; + case USB_INT_RXSTPI: + return (&AVR32_USBB.UECON0)[USB_SelectedEndpoint].rxstpe; #endif #if defined(USB_CAN_BE_HOST) case USB_INT_HSOFI: @@ -302,6 +315,8 @@ return AVR32_USBB.UDINT.eorst; case USB_INT_SOFI: return AVR32_USBB.UDINT.sof; + case USB_INT_RXSTPI: + return (&AVR32_USBB.UESTA0)[USB_SelectedEndpoint].rxstpi; #endif #if defined(USB_CAN_BE_HOST) case USB_INT_HSOFI: -- cgit v1.2.3