Use an early-abort in the USB_DeviceTask() function rather than wrapping the entire...
[pub/USBasp.git] / Bootloaders / CDC / Descriptors.c
index 8973c4e..b99df6f 100644 (file)
@@ -1,13 +1,13 @@
 /*
              LUFA Library
 /*
              LUFA Library
-     Copyright (C) Dean Camera, 2011.
+     Copyright (C) Dean Camera, 2012.
 
   dean [at] fourwalledcubicle [dot] com
            www.lufa-lib.org
 */
 
 /*
 
   dean [at] fourwalledcubicle [dot] com
            www.lufa-lib.org
 */
 
 /*
-  Copyright 2011  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+  Copyright 2012  Dean Camera (dean [at] fourwalledcubicle [dot] com)
 
   Permission to use, copy, modify, distribute, and sell this
   software and its documentation for any purpose is hereby granted
 
   Permission to use, copy, modify, distribute, and sell this
   software and its documentation for any purpose is hereby granted
@@ -55,10 +55,10 @@ const USB_Descriptor_Device_t DeviceDescriptor =
 
        .VendorID               = 0x03EB,
        .ProductID              = 0x204A,
 
        .VendorID               = 0x03EB,
        .ProductID              = 0x204A,
-       .ReleaseNumber          = VERSION_BCD(00.01),
+       .ReleaseNumber          = VERSION_BCD(01.00),
 
 
-       .ManufacturerStrIndex   = NO_DESCRIPTOR,
-       .ProductStrIndex        = 0x01,
+       .ManufacturerStrIndex   = 0x01,
+       .ProductStrIndex        = 0x02,
        .SerialNumStrIndex      = NO_DESCRIPTOR,
 
        .NumberOfConfigurations = FIXED_NUM_CONFIGURATIONS
        .SerialNumStrIndex      = NO_DESCRIPTOR,
 
        .NumberOfConfigurations = FIXED_NUM_CONFIGURATIONS
@@ -81,7 +81,7 @@ const USB_Descriptor_Configuration_t ConfigurationDescriptor =
                        .ConfigurationNumber    = 1,
                        .ConfigurationStrIndex  = NO_DESCRIPTOR,
 
                        .ConfigurationNumber    = 1,
                        .ConfigurationStrIndex  = NO_DESCRIPTOR,
 
-                       .ConfigAttributes       = USB_CONFIG_ATTR_BUSPOWERED,
+                       .ConfigAttributes       = USB_CONFIG_ATTR_RESERVED,
 
                        .MaxPowerConsumption    = USB_CONFIG_POWER_MA(100)
                },
 
                        .MaxPowerConsumption    = USB_CONFIG_POWER_MA(100)
                },
@@ -104,7 +104,7 @@ const USB_Descriptor_Configuration_t ConfigurationDescriptor =
 
        .CDC_Functional_Header =
                {
 
        .CDC_Functional_Header =
                {
-                       .Header                 = {.Size = sizeof(USB_Descriptor_CDC_FunctionalHeader_t), .Type = DTYPE_CSInterface},
+                       .Header                 = {.Size = sizeof(USB_CDC_Descriptor_FunctionalHeader_t), .Type = DTYPE_CSInterface},
                        .Subtype                = 0x00,
 
                        .CDCSpecification       = VERSION_BCD(01.10),
                        .Subtype                = 0x00,
 
                        .CDCSpecification       = VERSION_BCD(01.10),
@@ -112,15 +112,15 @@ const USB_Descriptor_Configuration_t ConfigurationDescriptor =
 
        .CDC_Functional_ACM =
                {
 
        .CDC_Functional_ACM =
                {
-                       .Header                 = {.Size = sizeof(USB_Descriptor_CDC_FunctionalACM_t), .Type = DTYPE_CSInterface},
+                       .Header                 = {.Size = sizeof(USB_CDC_Descriptor_FunctionalACM_t), .Type = DTYPE_CSInterface},
                        .Subtype                = 0x02,
 
                        .Subtype                = 0x02,
 
-                       .Capabilities           = 0x04,
+                       .Capabilities           = 0x00,
                },
 
        .CDC_Functional_Union =
                {
                },
 
        .CDC_Functional_Union =
                {
-                       .Header                 = {.Size = sizeof(USB_Descriptor_CDC_FunctionalUnion_t), .Type = DTYPE_CSInterface},
+                       .Header                 = {.Size = sizeof(USB_CDC_Descriptor_FunctionalUnion_t), .Type = DTYPE_CSInterface},
                        .Subtype                = 0x06,
 
                        .MasterInterfaceNumber  = 0,
                        .Subtype                = 0x06,
 
                        .MasterInterfaceNumber  = 0,
@@ -131,7 +131,7 @@ const USB_Descriptor_Configuration_t ConfigurationDescriptor =
                {
                        .Header                 = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
 
                {
                        .Header                 = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
 
-                       .EndpointAddress        = (ENDPOINT_DESCRIPTOR_DIR_IN | CDC_NOTIFICATION_EPNUM),
+                       .EndpointAddress        = CDC_NOTIFICATION_EPADDR,
                        .Attributes             = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
                        .EndpointSize           = CDC_NOTIFICATION_EPSIZE,
                        .PollingIntervalMS      = 0xFF
                        .Attributes             = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
                        .EndpointSize           = CDC_NOTIFICATION_EPSIZE,
                        .PollingIntervalMS      = 0xFF
@@ -157,20 +157,20 @@ const USB_Descriptor_Configuration_t ConfigurationDescriptor =
                {
                        .Header                 = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
 
                {
                        .Header                 = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
 
-                       .EndpointAddress        = (ENDPOINT_DESCRIPTOR_DIR_OUT | CDC_RX_EPNUM),
+                       .EndpointAddress        = CDC_RX_EPADDR,
                        .Attributes             = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
                        .EndpointSize           = CDC_TXRX_EPSIZE,
                        .Attributes             = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
                        .EndpointSize           = CDC_TXRX_EPSIZE,
-                       .PollingIntervalMS      = 0x01
+                       .PollingIntervalMS      = 0x05
                },
 
        .CDC_DataInEndpoint =
                {
                        .Header                 = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
 
                },
 
        .CDC_DataInEndpoint =
                {
                        .Header                 = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
 
-                       .EndpointAddress        = (ENDPOINT_DESCRIPTOR_DIR_IN | CDC_TX_EPNUM),
+                       .EndpointAddress        = CDC_TX_EPADDR,
                        .Attributes             = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
                        .EndpointSize           = CDC_TXRX_EPSIZE,
                        .Attributes             = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
                        .EndpointSize           = CDC_TXRX_EPSIZE,
-                       .PollingIntervalMS      = 0x01
+                       .PollingIntervalMS      = 0x05
                }
 };
 
                }
 };
 
@@ -185,15 +185,26 @@ const USB_Descriptor_String_t LanguageString =
        .UnicodeString          = {LANGUAGE_ID_ENG}
 };
 
        .UnicodeString          = {LANGUAGE_ID_ENG}
 };
 
+/** Manufacturer descriptor string. This is a Unicode string containing the manufacturer's details in human readable
+ *  form, and is read out upon request by the host when the appropriate string ID is requested, listed in the Device
+ *  Descriptor.
+ */
+const USB_Descriptor_String_t PROGMEM ManufacturerString =
+{
+       .Header                 = {.Size = USB_STRING_LEN(11), .Type = DTYPE_String},
+
+       .UnicodeString          = L"Dean Camera"
+};
+
 /** Product descriptor string. This is a Unicode string containing the product's details in human readable form,
  *  and is read out upon request by the host when the appropriate string ID is requested, listed in the Device
  *  Descriptor.
  */
 const USB_Descriptor_String_t ProductString =
 {
 /** Product descriptor string. This is a Unicode string containing the product's details in human readable form,
  *  and is read out upon request by the host when the appropriate string ID is requested, listed in the Device
  *  Descriptor.
  */
 const USB_Descriptor_String_t ProductString =
 {
-       .Header                 = {.Size = USB_STRING_LEN(18), .Type = DTYPE_String},
+       .Header                 = {.Size = USB_STRING_LEN(19), .Type = DTYPE_String},
 
 
-       .UnicodeString          = L"AVR CDC Bootloader"
+       .UnicodeString          = L"LUFA CDC Bootloader"
 };
 
 /** This function is called by the library when in device mode, and must be overridden (see LUFA library "USB Descriptors"
 };
 
 /** This function is called by the library when in device mode, and must be overridden (see LUFA library "USB Descriptors"
@@ -206,29 +217,43 @@ uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue,
                                     const uint8_t wIndex,
                                     const void** const DescriptorAddress)
 {
                                     const uint8_t wIndex,
                                     const void** const DescriptorAddress)
 {
-       const uint8_t DescriptorType   = (wValue >> 8);
-       const uint8_t DescriptorNumber = (wValue & 0xFF);
+       const uint8_t  DescriptorType   = (wValue >> 8);
+       const uint8_t  DescriptorNumber = (wValue & 0xFF);
 
        const void* Address = NULL;
 
        const void* Address = NULL;
+       uint16_t    Size    = NO_DESCRIPTOR;
 
        switch (DescriptorType)
        {
                case DTYPE_Device:
                        Address = &DeviceDescriptor;
 
        switch (DescriptorType)
        {
                case DTYPE_Device:
                        Address = &DeviceDescriptor;
+                       Size    = sizeof(USB_Descriptor_Device_t);
                        break;
                case DTYPE_Configuration:
                        Address = &ConfigurationDescriptor;
                        break;
                case DTYPE_Configuration:
                        Address = &ConfigurationDescriptor;
+                       Size    = sizeof(USB_Descriptor_Configuration_t);
                        break;
                case DTYPE_String:
                        if (!(DescriptorNumber))
                        break;
                case DTYPE_String:
                        if (!(DescriptorNumber))
-                         Address = &LanguageString;
-                       else
-                         Address = &ProductString;
+                       {
+                               Address = &LanguageString;
+                               Size    = LanguageString.Header.Size;
+                       }
+                       else if (DescriptorNumber == 0x01)
+                       {
+                               Address = &ManufacturerString;
+                               Size    = ManufacturerString.Header.Size;
+                       }
+                       else if (DescriptorNumber == 0x02)
+                       {
+                               Address = &ProductString;
+                               Size    = ProductString.Header.Size;
+                       }
 
                        break;
        }
 
        *DescriptorAddress = Address;
 
                        break;
        }
 
        *DescriptorAddress = Address;
-       return (Address != NULL) ? ((USB_Descriptor_Header_t*)Address)->Size : NO_DESCRIPTOR;
+       return Size;
 }
 
 }