X-Git-Url: http://git.linex4red.de/pub/USBasp.git/blobdiff_plain/3ae9e6042fc1ebc876e32142dde606f7890518b2..7d83bd0dccfeed374f5e3954de4790cae58379b6:/LUFA/Drivers/USB/LowLevel/Endpoint.c diff --git a/LUFA/Drivers/USB/LowLevel/Endpoint.c b/LUFA/Drivers/USB/LowLevel/Endpoint.c index fc2bff154..56c73fc48 100644 --- a/LUFA/Drivers/USB/LowLevel/Endpoint.c +++ b/LUFA/Drivers/USB/LowLevel/Endpoint.c @@ -1,21 +1,21 @@ /* LUFA Library Copyright (C) Dean Camera, 2010. - + dean [at] fourwalledcubicle [dot] com - www.fourwalledcubicle.com + www.lufa-lib.org */ /* Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) - Permission to use, copy, modify, distribute, and sell this + Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted - without fee, provided that the above copyright notice appear in + without fee, provided that the above copyright notice appear in all copies and that both that the copyright notice and this - permission notice and warranty disclaimer appear in supporting - documentation, and that the name of the author not be used in - advertising or publicity pertaining to distribution of the + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the software without specific, written prior permission. The author disclaim all warranties with regard to this @@ -43,6 +43,7 @@ bool Endpoint_ConfigureEndpoint_Prv(const uint8_t Number, const uint8_t UECFG0XData, const uint8_t UECFG1XData) { +#if defined(CONTROL_ONLY_DEVICE) || defined(ORDERED_EP_CONFIG) Endpoint_SelectEndpoint(Number); Endpoint_EnableEndpoint(); @@ -51,6 +52,51 @@ bool Endpoint_ConfigureEndpoint_Prv(const uint8_t Number, UECFG1X = UECFG1XData; return Endpoint_IsConfigured(); +#else + uint8_t UECFG0XTemp[ENDPOINT_TOTAL_ENDPOINTS]; + uint8_t UECFG1XTemp[ENDPOINT_TOTAL_ENDPOINTS]; + uint8_t UEIENXTemp[ENDPOINT_TOTAL_ENDPOINTS]; + + for (uint8_t EPNum = 0; EPNum < ENDPOINT_TOTAL_ENDPOINTS; EPNum++) + { + Endpoint_SelectEndpoint(EPNum); + UECFG0XTemp[EPNum] = UECFG0X; + UECFG1XTemp[EPNum] = UECFG1X; + UEIENXTemp[EPNum] = UEIENX; + } + + UECFG0XTemp[Number] = UECFG0XData; + UECFG1XTemp[Number] = UECFG1XData; + UEIENXTemp[Number] = 0; + + for (uint8_t EPNum = 1; EPNum < ENDPOINT_TOTAL_ENDPOINTS; EPNum++) + { + Endpoint_SelectEndpoint(EPNum); + UEIENX = 0; + UEINTX = 0; + UECFG1X = 0; + Endpoint_DisableEndpoint(); + } + + for (uint8_t EPNum = 0; EPNum < ENDPOINT_TOTAL_ENDPOINTS; EPNum++) + { + if (!(UECFG1XTemp[EPNum] & (1 << ALLOC))) + continue; + + Endpoint_SelectEndpoint(EPNum); + Endpoint_EnableEndpoint(); + + UECFG0X = UECFG0XTemp[EPNum]; + UECFG1X = UECFG1XTemp[EPNum]; + UEIENX = UEIENXTemp[EPNum]; + + if (!(Endpoint_IsConfigured())) + return false; + } + + Endpoint_SelectEndpoint(Number); + return true; +#endif } void Endpoint_ClearEndpoints(void) @@ -59,7 +105,7 @@ void Endpoint_ClearEndpoints(void) for (uint8_t EPNum = 0; EPNum < ENDPOINT_TOTAL_ENDPOINTS; EPNum++) { - Endpoint_SelectEndpoint(EPNum); + Endpoint_SelectEndpoint(EPNum); UEIENX = 0; UEINTX = 0; UECFG1X = 0; @@ -86,7 +132,7 @@ void Endpoint_ClearStatusStage(void) if (USB_DeviceState == DEVICE_STATE_Unattached) return; } - + Endpoint_ClearIN(); } } @@ -95,7 +141,7 @@ void Endpoint_ClearStatusStage(void) uint8_t Endpoint_WaitUntilReady(void) { #if (USB_STREAM_TIMEOUT_MS < 0xFF) - uint8_t TimeoutMSRem = USB_STREAM_TIMEOUT_MS; + uint8_t TimeoutMSRem = USB_STREAM_TIMEOUT_MS; #else uint16_t TimeoutMSRem = USB_STREAM_TIMEOUT_MS; #endif @@ -114,13 +160,13 @@ uint8_t Endpoint_WaitUntilReady(void) if (Endpoint_IsOUTReceived()) return ENDPOINT_READYWAIT_NoError; } - + uint8_t USB_DeviceState_LCL = USB_DeviceState; if (USB_DeviceState_LCL == DEVICE_STATE_Unattached) return ENDPOINT_READYWAIT_DeviceDisconnected; else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) - return ENDPOINT_READYWAIT_BusSuspended; + return ENDPOINT_READYWAIT_BusSuspended; else if (Endpoint_IsStalled()) return ENDPOINT_READYWAIT_EndpointStalled; @@ -138,3 +184,4 @@ uint8_t Endpoint_WaitUntilReady(void) #endif #endif +