Fix flip-ee DFU build target accidentally erasing the target FLASH memory space.
[pub/USBasp.git] / Projects / AVRISP-MKII / AVRISPDescriptors.c
index f3381e1..066dcf4 100644 (file)
@@ -38,6 +38,7 @@
 #include "AVRISPDescriptors.h"
 
 #if defined(RESET_TOGGLES_LIBUSB_COMPAT) || defined(__DOXYGEN__)
+       /** Indicates if an external reset has occurred and the compatibility mode needs to be altered */
        static bool AVRISP_NeedCompatibilitySwitch ATTR_NO_INIT;
 
        /** Current AVRISP data IN endpoint address. */
@@ -173,7 +174,7 @@ const USB_Descriptor_String_t PROGMEM AVRISP_ProductString =
 /** Serial number string. This is a Unicode string containing the device's unique serial number, expressed as a
  *  series of uppercase hexadecimal digits.
  */
-const USB_Descriptor_String_t PROGMEM AVRISP_SerialString =
+USB_Descriptor_String_t AVRISP_SerialString =
 {
        .Header                 = {.Size = USB_STRING_LEN(13), .Type = DTYPE_String},
        
@@ -207,7 +208,8 @@ uint16_t AVRISP_GetDescriptor(const uint16_t wValue,
                        break;
                case DTYPE_Configuration:
                        *DescriptorMemorySpace = MEMSPACE_RAM;
-                       #if defined(RESET_TOGGLES_LIBUSB_COMPAT)                        
+                       #if defined(RESET_TOGGLES_LIBUSB_COMPAT)
+                               /* Update the configuration descriptor with the current endpoint address */
                                AVRISP_ConfigurationDescriptor.AVRISP_DataInEndpoint.EndpointAddress = AVRISP_CurrDataINEndpointAddress;
                        #endif
 
@@ -231,7 +233,12 @@ uint16_t AVRISP_GetDescriptor(const uint16_t wValue,
                                        break;
                                case 0x03:
                                        Address = &AVRISP_SerialString;
-                                       Size    = pgm_read_byte(&AVRISP_SerialString.Header.Size);
+                                       Size    = AVRISP_SerialString.Header.Size;
+                                       
+                                       /* Update serial number to have a different serial based on the current endpoint address */
+                                       ((uint16_t*)&AVRISP_SerialString.UnicodeString)[6] = cpu_to_le16('0' + (AVRISP_DATA_IN_EPADDR & ENDPOINT_EPNUM_MASK));
+                                       
+                                       *DescriptorMemorySpace = MEMSPACE_RAM;
                                        break;
                        }
 
@@ -253,7 +260,7 @@ uint16_t AVRISP_GetDescriptor(const uint16_t wValue,
  */
 void CheckExternalReset(void)
 {      
-       /* If an external reset occured, we need to change compatibility mode */
+       /* If an external reset occurred, we need to change compatibility mode */
        AVRISP_NeedCompatibilitySwitch = (MCUSR == (1 << EXTRF));
 
        MCUSR = 0;
@@ -307,5 +314,7 @@ void UpdateCurrentCompatibilityMode(void)
                        }
                        break;
        }
+       
+       Delay_MS(500);
 }
 #endif