From ee5ea4ce2bc463206ed8fe01c71b31585c0cc280 Mon Sep 17 00:00:00 2001 From: Dean Camera Date: Tue, 11 May 2010 13:45:23 +0000 Subject: [PATCH] Fix nasty bug in USBInterrupt.c which would cause a lockup if the control endpoint was not selected at the point the USB endpoint interrupt fires when INTERRUPT_CONTROL_ENDPOINT is defined. --- .../BluetoothHost/Lib/ServiceDiscoveryProtocol.c | 5 ++--- LUFA/Drivers/USB/LowLevel/USBInterrupt.c | 8 ++++---- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/Demos/Host/Incomplete/BluetoothHost/Lib/ServiceDiscoveryProtocol.c b/Demos/Host/Incomplete/BluetoothHost/Lib/ServiceDiscoveryProtocol.c index f7935cad03..bd649419ac 100644 --- a/Demos/Host/Incomplete/BluetoothHost/Lib/ServiceDiscoveryProtocol.c +++ b/Demos/Host/Incomplete/BluetoothHost/Lib/ServiceDiscoveryProtocol.c @@ -183,8 +183,6 @@ static uint32_t ServiceDiscovery_GetDataElementSize(const void** DataElementHead uint8_t SizeIndex = (*((uint8_t*)*DataElementHeader) & 0x07); *DataElementHeader += sizeof(uint8_t); - *ElementHeaderSize = 1; - uint32_t ElementValue; switch (SizeIndex) @@ -205,7 +203,8 @@ static uint32_t ServiceDiscovery_GetDataElementSize(const void** DataElementHead *ElementHeaderSize = (1 + sizeof(uint32_t)); break; default: - ElementValue = (1UL << SizeIndex); + ElementValue = (1 << SizeIndex); + *ElementHeaderSize = 1; break; } diff --git a/LUFA/Drivers/USB/LowLevel/USBInterrupt.c b/LUFA/Drivers/USB/LowLevel/USBInterrupt.c index 7edd3ce6a6..43df5f61a1 100644 --- a/LUFA/Drivers/USB/LowLevel/USBInterrupt.c +++ b/LUFA/Drivers/USB/LowLevel/USBInterrupt.c @@ -233,15 +233,15 @@ ISR(USB_GEN_vect, ISR_BLOCK) #if defined(INTERRUPT_CONTROL_ENDPOINT) && defined(USB_CAN_BE_DEVICE) ISR(USB_COM_vect, ISR_BLOCK) { - uint8_t PrevSelectedEndpoint = Endpoint_GetCurrentEndpoint(); + uint8_t PrevSelectedEndpoint = Endpoint_GetCurrentEndpoint(); + Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP); USB_INT_Disable(USB_INT_RXSTPI); sei(); + USB_USBTask(); - USB_INT_Enable(USB_INT_RXSTPI); - USB_INT_Clear(USB_INT_RXSTPI); - + USB_INT_Enable(USB_INT_RXSTPI); Endpoint_SelectEndpoint(PrevSelectedEndpoint); } #endif