X-Git-Url: http://git.linex4red.de/pub/USBasp.git/blobdiff_plain/99d8a3936384d1e9286dfecfb6f7896294cd6c11..d41cd9a41aca81eaa21e65e6c53672fe604fa3d5:/LUFA/Drivers/USB/HighLevel/DeviceStandardReq.c diff --git a/LUFA/Drivers/USB/HighLevel/DeviceStandardReq.c b/LUFA/Drivers/USB/HighLevel/DeviceStandardReq.c index 64af1406b..7d7e48d9b 100644 --- a/LUFA/Drivers/USB/HighLevel/DeviceStandardReq.c +++ b/LUFA/Drivers/USB/HighLevel/DeviceStandardReq.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 @@ -48,77 +48,66 @@ bool USB_RemoteWakeupEnabled; void USB_Device_ProcessControlRequest(void) { - bool RequestHandled = false; uint8_t* RequestHeader = (uint8_t*)&USB_ControlRequest; - + for (uint8_t RequestHeaderByte = 0; RequestHeaderByte < sizeof(USB_Request_Header_t); RequestHeaderByte++) *(RequestHeader++) = Endpoint_Read_Byte(); - - uint8_t bmRequestType = USB_ControlRequest.bmRequestType; - - switch (USB_ControlRequest.bRequest) + + EVENT_USB_Device_ControlRequest(); + + if (Endpoint_IsSETUPReceived()) { - case REQ_GetStatus: - if ((bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE)) || - (bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_ENDPOINT))) - { - USB_Device_GetStatus(); - RequestHandled = true; - } + uint8_t bmRequestType = USB_ControlRequest.bmRequestType; - break; - case REQ_ClearFeature: - case REQ_SetFeature: - if ((bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_DEVICE)) || - (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_ENDPOINT))) - { - USB_Device_ClearSetFeature(); - RequestHandled = true; - } + switch (USB_ControlRequest.bRequest) + { + case REQ_GetStatus: + if ((bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE)) || + (bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_ENDPOINT))) + { + USB_Device_GetStatus(); + } - break; - case REQ_SetAddress: - if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_DEVICE)) - { - USB_Device_SetAddress(); - RequestHandled = true; - } + break; + case REQ_ClearFeature: + case REQ_SetFeature: + if ((bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_DEVICE)) || + (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_ENDPOINT))) + { + USB_Device_ClearSetFeature(); + } - break; - case REQ_GetDescriptor: - if ((bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE)) || - (bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_INTERFACE))) - { - USB_Device_GetDescriptor(); - RequestHandled = true; - } - - break; - case REQ_GetConfiguration: - if (bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE)) - { - USB_Device_GetConfiguration(); - RequestHandled = true; - } + break; + case REQ_SetAddress: + if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_DEVICE)) + USB_Device_SetAddress(); - break; - case REQ_SetConfiguration: - if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_DEVICE)) - { - USB_Device_SetConfiguration(); - RequestHandled = true; - } + break; + case REQ_GetDescriptor: + if ((bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE)) || + (bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_INTERFACE))) + { + USB_Device_GetDescriptor(); + } - break; + break; + case REQ_GetConfiguration: + if (bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE)) + USB_Device_GetConfiguration(); + + break; + case REQ_SetConfiguration: + if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_DEVICE)) + USB_Device_SetConfiguration(); + + break; + } } - if (!(RequestHandled)) - EVENT_USB_Device_UnhandledControlRequest(); - if (Endpoint_IsSETUPReceived()) { Endpoint_StallTransaction(); - Endpoint_ClearSETUP(); + Endpoint_ClearSETUP(); } } @@ -126,29 +115,28 @@ static void USB_Device_SetAddress(void) { uint8_t DeviceAddress = (USB_ControlRequest.wValue & 0x7F); - Endpoint_ClearSETUP(); - - Endpoint_ClearStatusStage(); - - while (!(Endpoint_IsINReady())) + ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { - if (USB_DeviceState == DEVICE_STATE_Unattached) - return; - } + Endpoint_ClearSETUP(); + + Endpoint_ClearStatusStage(); - USB_DeviceState = (DeviceAddress) ? DEVICE_STATE_Addressed : DEVICE_STATE_Default; + while (!(Endpoint_IsINReady())); - USB_Device_SetDeviceAddress(DeviceAddress); + USB_DeviceState = (DeviceAddress) ? DEVICE_STATE_Addressed : DEVICE_STATE_Default; - return; + USB_Device_SetDeviceAddress(DeviceAddress); + } } static void USB_Device_SetConfiguration(void) { -#if defined(FIXED_NUM_CONFIGURATIONS) + #if defined(FIXED_NUM_CONFIGURATIONS) if ((uint8_t)USB_ControlRequest.wValue > FIXED_NUM_CONFIGURATIONS) return; -#else + #else + USB_Descriptor_Device_t* DevDescriptorPtr; + #if defined(USE_FLASH_DESCRIPTORS) #define MemoryAddressSpace MEMSPACE_FLASH #elif defined(USE_EEPROM_DESCRIPTORS) @@ -158,8 +146,6 @@ static void USB_Device_SetConfiguration(void) #else uint8_t MemoryAddressSpace; #endif - - USB_Descriptor_Device_t* DevDescriptorPtr; if (CALLBACK_USB_GetDescriptor((DTYPE_Device << 8), 0, (void*)&DevDescriptorPtr #if !defined(USE_FLASH_DESCRIPTORS) && !defined(USE_EEPROM_DESCRIPTORS) && !defined(USE_RAM_DESCRIPTORS) @@ -169,7 +155,7 @@ static void USB_Device_SetConfiguration(void) { return; } - + if (MemoryAddressSpace == MEMSPACE_FLASH) { if (((uint8_t)USB_ControlRequest.wValue > pgm_read_byte(&DevDescriptorPtr->NumberOfConfigurations))) @@ -185,20 +171,23 @@ static void USB_Device_SetConfiguration(void) if ((uint8_t)USB_ControlRequest.wValue > DevDescriptorPtr->NumberOfConfigurations) return; } -#endif - + #endif + Endpoint_ClearSETUP(); USB_ConfigurationNumber = (uint8_t)USB_ControlRequest.wValue; Endpoint_ClearStatusStage(); - USB_DeviceState = (USB_ConfigurationNumber) ? DEVICE_STATE_Configured : DEVICE_STATE_Addressed; + if (USB_ConfigurationNumber) + USB_DeviceState = DEVICE_STATE_Configured; + else + USB_DeviceState = (USB_Device_IsAddressSet()) ? DEVICE_STATE_Configured : DEVICE_STATE_Powered; EVENT_USB_Device_ConfigurationChanged(); } -void USB_Device_GetConfiguration(void) +static void USB_Device_GetConfiguration(void) { Endpoint_ClearSETUP(); @@ -211,8 +200,8 @@ void USB_Device_GetConfiguration(void) #if !defined(NO_INTERNAL_SERIAL) && (USE_INTERNAL_SERIAL != NO_DESCRIPTOR) static char USB_Device_NibbleToASCII(uint8_t Nibble) { - Nibble = ((Nibble & 0x0F) + '0'); - return (Nibble > '9') ? (Nibble + ('A' - '9' - 1)) : Nibble; + Nibble &= 0x0F; + return (Nibble >= 10) ? (('A' - 10) + Nibble) : ('0' + Nibble); } static void USB_Device_GetInternalSerialDescriptor(void) @@ -220,30 +209,30 @@ static void USB_Device_GetInternalSerialDescriptor(void) struct { USB_Descriptor_Header_t Header; - int16_t UnicodeString[20]; + wchar_t UnicodeString[20]; } SignatureDescriptor; SignatureDescriptor.Header.Type = DTYPE_String; SignatureDescriptor.Header.Size = sizeof(SignatureDescriptor); - - uint8_t SigReadAddress = 0x0E; ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { + uint8_t SigReadAddress = 0x0E; + for (uint8_t SerialCharNum = 0; SerialCharNum < 20; SerialCharNum++) { uint8_t SerialByte = boot_signature_byte_get(SigReadAddress); - + if (SerialCharNum & 0x01) { SerialByte >>= 4; SigReadAddress++; } - + SignatureDescriptor.UnicodeString[SerialCharNum] = USB_Device_NibbleToASCII(SerialByte); } } - + Endpoint_ClearSETUP(); Endpoint_Write_Control_Stream_LE(&SignatureDescriptor, sizeof(SignatureDescriptor)); @@ -254,13 +243,13 @@ static void USB_Device_GetInternalSerialDescriptor(void) static void USB_Device_GetDescriptor(void) { - void* DescriptorPointer; - uint16_t DescriptorSize; - + const void* DescriptorPointer; + uint16_t DescriptorSize; + #if !defined(USE_FLASH_DESCRIPTORS) && !defined(USE_EEPROM_DESCRIPTORS) && !defined(USE_RAM_DESCRIPTORS) - uint8_t DescriptorAddressSpace; + uint8_t DescriptorAddressSpace; #endif - + #if !defined(NO_INTERNAL_SERIAL) && (USE_INTERNAL_SERIAL != NO_DESCRIPTOR) if (USB_ControlRequest.wValue == ((DTYPE_String << 8) | USE_INTERNAL_SERIAL)) { @@ -268,7 +257,7 @@ static void USB_Device_GetDescriptor(void) return; } #endif - + if ((DescriptorSize = CALLBACK_USB_GetDescriptor(USB_ControlRequest.wValue, USB_ControlRequest.wIndex, &DescriptorPointer #if !defined(USE_FLASH_DESCRIPTORS) && !defined(USE_EEPROM_DESCRIPTORS) && !defined(USE_RAM_DESCRIPTORS) @@ -278,7 +267,7 @@ static void USB_Device_GetDescriptor(void) { return; } - + Endpoint_ClearSETUP(); #if defined(USE_RAM_DESCRIPTORS) @@ -286,14 +275,14 @@ static void USB_Device_GetDescriptor(void) #elif defined(USE_EEPROM_DESCRIPTORS) Endpoint_Write_Control_EStream_LE(DescriptorPointer, DescriptorSize); #elif defined(USE_FLASH_DESCRIPTORS) - Endpoint_Write_Control_PStream_LE(DescriptorPointer, DescriptorSize); + Endpoint_Write_Control_PStream_LE(DescriptorPointer, DescriptorSize); #else if (DescriptorAddressSpace == MEMSPACE_FLASH) - Endpoint_Write_Control_PStream_LE(DescriptorPointer, DescriptorSize); + Endpoint_Write_Control_PStream_LE(DescriptorPointer, DescriptorSize); else if (DescriptorAddressSpace == MEMSPACE_EEPROM) Endpoint_Write_Control_EStream_LE(DescriptorPointer, DescriptorSize); else - Endpoint_Write_Control_Stream_LE(DescriptorPointer, DescriptorSize); + Endpoint_Write_Control_Stream_LE(DescriptorPointer, DescriptorSize); #endif Endpoint_ClearOUT(); @@ -305,29 +294,29 @@ static void USB_Device_GetStatus(void) switch (USB_ControlRequest.bmRequestType) { -#if !defined(NO_DEVICE_SELF_POWER) || !defined(NO_DEVICE_REMOTE_WAKEUP) + #if !defined(NO_DEVICE_SELF_POWER) || !defined(NO_DEVICE_REMOTE_WAKEUP) case (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE): - #if !defined(NO_DEVICE_SELF_POWER) + #if !defined(NO_DEVICE_SELF_POWER) if (USB_CurrentlySelfPowered) CurrentStatus |= FEATURE_SELFPOWERED_ENABLED; - #endif + #endif - #if !defined(NO_DEVICE_REMOTE_WAKEUP) + #if !defined(NO_DEVICE_REMOTE_WAKEUP) if (USB_RemoteWakeupEnabled) CurrentStatus |= FEATURE_REMOTE_WAKEUP_ENABLED; - #endif + #endif break; -#endif -#if !defined(CONTROL_ONLY_DEVICE) + #endif + #if !defined(CONTROL_ONLY_DEVICE) case (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_ENDPOINT): Endpoint_SelectEndpoint((uint8_t)USB_ControlRequest.wIndex & ENDPOINT_EPNUM_MASK); CurrentStatus = Endpoint_IsStalled(); - Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP); + Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP); break; -#endif + #endif default: return; } @@ -336,7 +325,7 @@ static void USB_Device_GetStatus(void) Endpoint_Write_Word_LE(CurrentStatus); Endpoint_ClearIN(); - + Endpoint_ClearStatusStage(); } @@ -344,43 +333,43 @@ static void USB_Device_ClearSetFeature(void) { switch (USB_ControlRequest.bmRequestType & CONTROL_REQTYPE_RECIPIENT) { -#if !defined(NO_DEVICE_REMOTE_WAKEUP) + #if !defined(NO_DEVICE_REMOTE_WAKEUP) case REQREC_DEVICE: - if ((uint8_t)USB_ControlRequest.wValue == FEATURE_REMOTE_WAKEUP) + if ((uint8_t)USB_ControlRequest.wValue == FEATURE_SEL_DeviceRemoteWakeup) USB_RemoteWakeupEnabled = (USB_ControlRequest.bRequest == REQ_SetFeature); else return; - - break; -#endif -#if !defined(CONTROL_ONLY_DEVICE) + + break; + #endif + #if !defined(CONTROL_ONLY_DEVICE) case REQREC_ENDPOINT: - if ((uint8_t)USB_ControlRequest.wValue == FEATURE_ENDPOINT_HALT) + if ((uint8_t)USB_ControlRequest.wValue == FEATURE_SEL_EndpointHalt) { uint8_t EndpointIndex = ((uint8_t)USB_ControlRequest.wIndex & ENDPOINT_EPNUM_MASK); - + if (EndpointIndex == ENDPOINT_CONTROLEP) return; Endpoint_SelectEndpoint(EndpointIndex); - if (!(Endpoint_IsEnabled())) - return; - - if (USB_ControlRequest.bRequest == REQ_SetFeature) + if (Endpoint_IsEnabled()) { - Endpoint_StallTransaction(); - } - else - { - Endpoint_ClearStall(); - Endpoint_ResetFIFO(EndpointIndex); - Endpoint_ResetDataToggle(); + if (USB_ControlRequest.bRequest == REQ_SetFeature) + { + Endpoint_StallTransaction(); + } + else + { + Endpoint_ClearStall(); + Endpoint_ResetFIFO(EndpointIndex); + Endpoint_ResetDataToggle(); + } } } - + break; -#endif + #endif default: return; } @@ -393,3 +382,4 @@ static void USB_Device_ClearSetFeature(void) } #endif +