Fixed PDI/TPI programming speed of ~250KHz in the AVRISP-MKII Clone project, instead...
[pub/USBasp.git] / LUFA / Drivers / USB / HighLevel / DeviceStandardReq.c
index 64af140..7d7e48d 100644 (file)
@@ -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
+