diff options
| author | gdisirio <gdisirio@35acf78f-673a-0410-8e92-d51de3d6d3f4> | 2011-02-15 18:44:29 +0000 | 
|---|---|---|
| committer | gdisirio <gdisirio@35acf78f-673a-0410-8e92-d51de3d6d3f4> | 2011-02-15 18:44:29 +0000 | 
| commit | 60d8f68906f28d369f35b624e129deee5092c86d (patch) | |
| tree | 5c45e6bea6107dca69f8e3095a6ddda4e7c219a6 /testhal/STM32/USB_CDC/main.c | |
| parent | 35ff7323526f5225d1a00c7812291e9fcdbfafac (diff) | |
| download | ChibiOS-60d8f68906f28d369f35b624e129deee5092c86d.tar.gz ChibiOS-60d8f68906f28d369f35b624e129deee5092c86d.tar.bz2 ChibiOS-60d8f68906f28d369f35b624e129deee5092c86d.zip  | |
More improvements to the generic USB driver, implemented suspend and wakeup handling in the STM32 USB driver.
git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@2742 35acf78f-673a-0410-8e92-d51de3d6d3f4
Diffstat (limited to 'testhal/STM32/USB_CDC/main.c')
| -rw-r--r-- | testhal/STM32/USB_CDC/main.c | 213 | 
1 files changed, 101 insertions, 112 deletions
diff --git a/testhal/STM32/USB_CDC/main.c b/testhal/STM32/USB_CDC/main.c index 423a47413..9868b00ab 100644 --- a/testhal/STM32/USB_CDC/main.c +++ b/testhal/STM32/USB_CDC/main.c @@ -30,129 +30,118 @@  #define DATA_AVAILABLE_EP       3
  /*
 - * USB driver structure.
 + * USB Driver structure.
   */
  static SerialUSBDriver SDU1;
  /*
   * USB Device Descriptor.
   */
 -static const uint8_t vcom_device_descriptor_data[] = {
 -  18,                               /* bLength.                             */
 -  USB_DESCRIPTOR_DEVICE,            /* bDescriptorType.                     */
 -  0x10, 0x01,                       /* bcdUSB (1.1).                        */
 -  0x02,                             /* bDeviceClass (CDC).                  */
 -  0x00,                             /* bDeviceSubClass.                     */
 -  0x00,                             /* bDeviceProtocol.                     */
 -  0x40,                             /* bMaxPacketSize.                      */
 -  0x83, 0x04,                       /* idVendor (0x0483).                   */
 -  0x40, 0x57,                       /* idProduct (0x7540).                  */
 -  0x00, 0x02,                       /* bcdDevice (2.00).                    */
 -  1,                                /* iManufacturer.                       */
 -  2,                                /* iProduct.                            */
 -  3,                                /* IiSerialNumber.                      */
 -  1                                 /* bNumConfigurations.                  */
 +static const uint8_t vcom_device_descriptor_data[18] = {
 +  USB_DESC_DEVICE       (0x0110,        /* bcdUSB (1.1).                    */
 +                         0x02,          /* bDeviceClass (CDC).              */
 +                         0x00,          /* bDeviceSubClass.                 */
 +                         0x00,          /* bDeviceProtocol.                 */
 +                         0x40,          /* bMaxPacketSize.                  */
 +                         0x0483,        /* idVendor (ST).                   */
 +                         0x5740,        /* idProduct.                       */
 +                         0x0200,        /* bcdDevice.                       */
 +                         1,             /* iManufacturer.                   */
 +                         2,             /* iProduct.                        */
 +                         3,             /* iSerialNumber.                   */
 +                         1)             /* bNumConfigurations.              */
  };
  /*
 - * Device descriptor wrapper.
 + * Device Descriptor wrapper.
   */
  static const USBDescriptor vcom_device_descriptor = {
 -  sizeof (vcom_device_descriptor_data),
 +  sizeof vcom_device_descriptor_data,
    vcom_device_descriptor_data
  };
 -/* Configuration Descriptor tree for a VCOM.*/
 -static const uint8_t vcom_configuration_descriptor_data[] = {
 -  /* Configuration descriptor.*/
 -  9,                                /* bLength.                             */
 -  USB_DESCRIPTOR_CONFIGURATION,     /* bDescriptorType.                     */
 -  67,  0,                           /* wTotalLength.                        */
 -  0x02,                             /* bNumInterfaces.                      */
 -  0x01,                             /* bConfigurationValue.                 */
 -  0,                                /* iConfiguration.                      */
 -  0xC0,                             /* bmAttributes (self powered).         */
 -  50,                               /* MaxPower (100mA).                    */
 +/* Configuration Descriptor tree for a CDC.*/
 +static const uint8_t vcom_configuration_descriptor_data[67] = {
 +  /* Configuration Descriptor.*/
 +  USB_DESC_CONFIGURATION(67,            /* wTotalLength.                    */
 +                         0x02,          /* bNumInterfaces.                  */
 +                         0x01,          /* bConfigurationValue.             */
 +                         0,             /* iConfiguration.                  */
 +                         0xC0,          /* bmAttributes (self powered).     */
 +                         50),           /* bMaxPower (100mA).               */
    /* Interface Descriptor.*/
 -  9,                                /* bLength.                             */
 -  USB_DESCRIPTOR_INTERFACE,         /* bDescriptorType.                     */
 -  0x00,                             /* bInterfaceNumber.                    */
 -  0x00,                             /* bAlternateSetting.                   */
 -  0x01,                             /* bNumEndpoints.                       */
 -  0x02,                             /* bInterfaceClass (Communications
 -                                       Interface Class, CDC section 4.2).   */
 -  0x02,                             /* bInterfaceSubClass (Abstract Control
 -                                       Model, CDC section 4.3).             */
 -  0x01,                             /* bInterfaceProtocol (AT commands, CDC
 -                                       section 4.4).                        */
 -  0,                                /* iInterface.                          */
 +  USB_DESC_INTERFACE    (0x00,          /* bInterfaceNumber.                */
 +                         0x00,          /* bAlternateSetting.               */
 +                         0x01,          /* bNumEndpoints.                   */
 +                         0x02,          /* bInterfaceClass (Communications
 +                                           Interface Class, CDC section
 +                                           4.2).                            */
 +                         0x02,          /* bInterfaceSubClass (Abstract
 +                                         Control Model, CDC section 4.3).   */
 +                         0x01,          /* bInterfaceProtocol (AT commands,
 +                                           CDC section 4.4).                */
 +                         0),            /* iInterface.                      */
    /* Header Functional Descriptor (CDC section 5.2.3).*/
 -  5,                                /* bLength.                             */
 -  0x24,                             /* bDescriptorType (CS_INTERFACE).      */
 -  0x00,                             /* bDescriptorSubtype (Header Functional
 -                                       Descriptor.                          */
 -  0x10, 0x01,                       /* bcdCDC (1.10).                       */
 -  /* Call Managment Functional Descriptor. */
 -  5,                                /* bFunctionLength.                     */
 -  0x24,                             /* bDescriptorType (CS_INTERFACE).      */
 -  0x01,                             /* bDescriptorSubtype (Call Management
 -                                       Functional Descriptor).              */
 -  0x00,                             /* bmCapabilities (D0+D1).              */
 -  0x01,                             /* bDataInterface.                      */
 +  USB_DESC_BYTE         (5),            /* bLength.                         */
 +  USB_DESC_BYTE         (0x24),         /* bDescriptorType (CS_INTERFACE).  */
 +  USB_DESC_BYTE         (0x00),         /* bDescriptorSubtype (Header
 +                                           Functional Descriptor.           */
 +  USB_DESC_BCD          (0x0110),       /* bcdCDC.                          */
 +  /* Call Management Functional Descriptor. */
 +  USB_DESC_BYTE         (5),            /* bFunctionLength.                 */
 +  USB_DESC_BYTE         (0x24),         /* bDescriptorType (CS_INTERFACE).  */
 +  USB_DESC_BYTE         (0x01),         /* bDescriptorSubtype (Call Management
 +                                           Functional Descriptor).          */
 +  USB_DESC_BYTE         (0x00),         /* bmCapabilities (D0+D1).          */
 +  USB_DESC_BYTE         (0x01),         /* bDataInterface.                  */
    /* ACM Functional Descriptor.*/
 -  4,                                /* bFunctionLength.                     */
 -  0x24,                             /* bDescriptorType (CS_INTERFACE).      */
 -  0x02,                             /* bDescriptorSubtype (Abstract Control
 -                                       Management Descriptor).              */
 -  0x02,                             /* bmCapabilities.                      */
 +  USB_DESC_BYTE         (4),            /* bFunctionLength.                 */
 +  USB_DESC_BYTE         (0x24),         /* bDescriptorType (CS_INTERFACE).  */
 +  USB_DESC_BYTE         (0x02),         /* bDescriptorSubtype (Abstract
 +                                           Control Management Descriptor).  */
 +  USB_DESC_BYTE         (0x02),         /* bmCapabilities.                  */
    /* Union Functional Descriptor.*/
 -  5,                                /* bFunctionLength.                     */
 -  0x24,                             /* bDescriptorType (CS_INTERFACE).      */
 -  0x06,                             /* bDescriptorSubtype (Union Functional
 -                                       Descriptor).                         */
 -  0x00,                             /* bMasterInterface (Communication Class
 -                                       Interface).                          */
 -  0x01,                             /* bSlaveInterface0 (Data Class
 -                                       Interface).                          */
 +  USB_DESC_BYTE         (5),            /* bFunctionLength.                 */
 +  USB_DESC_BYTE         (0x24),         /* bDescriptorType (CS_INTERFACE).  */
 +  USB_DESC_BYTE         (0x06),         /* bDescriptorSubtype (Union
 +                                           Functional Descriptor).          */
 +  USB_DESC_BYTE         (0x00),         /* bMasterInterface (Communication
 +                                           Class Interface).                */
 +  USB_DESC_BYTE         (0x01),         /* bSlaveInterface0 (Data Class
 +                                           Interface).                      */
    /* Endpoint 2 Descriptor.*/
 -  7,                                /* bLength.                             */
 -  USB_DESCRIPTOR_ENDPOINT,          /* bDescriptorType.                     */
 -  INTERRUPT_REQUEST_EP | 0x80,      /* bEndpointAddress (IN).               */
 -  0x03,                             /* bmAttributes (Interrupt).            */
 -  0x08, 0x00,                       /* wMaxPacketSize.                      */
 -  0xFF,                             /* bInterval.                           */
 +  USB_DESC_ENDPOINT     (INTERRUPT_REQUEST_EP|0x80, /* bEndpointAddress.    */
 +                         0x03,          /* bmAttributes (Interrupt).        */
 +                         0x0008,        /* wMaxPacketSize.                  */
 +                         0xFF),         /* bInterval.                       */
    /* Interface Descriptor.*/
 -  9,                                /* bLength.                             */
 -  USB_DESCRIPTOR_INTERFACE,         /* bDescriptorType.                     */
 -  0x01,                             /* bInterfaceNumber.                    */
 -  0x00,                             /* bAlternateSetting.                   */
 -  0x02,                             /* bNumEndpoints.                       */
 -  0x0A,                             /* bInterfaceClass (Data Class
 -                                       Interface, CDC section 4.5).         */
 -  0x00,                             /* bInterfaceSubClass (CDC section 4.6).*/
 -  0x00,                             /* bInterfaceProtocol (CDC section 4.7).*/
 -  0x00,                             /* iInterface.                          */
 +  USB_DESC_INTERFACE    (0x01,          /* bInterfaceNumber.                */
 +                         0x00,          /* bAlternateSetting.               */
 +                         0x02,          /* bNumEndpoints.                   */
 +                         0x0A,          /* bInterfaceClass (Data Class
 +                                           Interface, CDC section 4.5).     */
 +                         0x00,          /* bInterfaceSubClass (CDC section
 +                                           4.6).                            */
 +                         0x00,          /* bInterfaceProtocol (CDC section
 +                                           4.7).                            */
 +                         0x00),         /* iInterface.                      */
    /* Endpoint 3 Descriptor.*/
 -  7,                                /* bLength.                             */
 -  USB_DESCRIPTOR_ENDPOINT,          /* bDescriptorType.                     */
 -  DATA_AVAILABLE_EP,                /* bEndpointAddress (OUT).              */
 -  0x02,                             /* bmAttributes (Bulk).                 */
 -  0x40, 0x00,                       /* wMaxPacketSize.                      */
 -  0x00,                             /* bInterval (ignored for bulk.         */
 +  USB_DESC_ENDPOINT     (DATA_AVAILABLE_EP,         /* bEndpointAddress.    */
 +                         0x02,          /* bmAttributes (Bulk).             */
 +                         0x0040,        /* wMaxPacketSize.                  */
 +                         0x00),         /* bInterval.                       */
    /* Endpoint 1 Descriptor.*/
 -  7,                                /* bLength.                             */
 -  USB_DESCRIPTOR_ENDPOINT,          /* bDescriptorType.                     */
 -  DATA_REQUEST_EP | 0x80,           /* bEndpointAddress (IN).               */
 -  0x02,                             /* bmAttributes (Bulk).                 */
 -  0x40, 0x00,                       /* wMaxPacketSize.                      */
 -  0x00                              /* bInterval (ignored for bulk.         */
 +  USB_DESC_ENDPOINT     (DATA_REQUEST_EP|0x80,      /* bEndpointAddress.    */
 +                         0x02,          /* bmAttributes (Bulk).             */
 +                         0x0040,        /* wMaxPacketSize.                  */
 +                         0x00)          /* bInterval.                       */
  };
  /*
 - * Configuration descriptor wrapper.
 + * Configuration Descriptor wrapper.
   */
  static const USBDescriptor vcom_configuration_descriptor = {
 -  sizeof (vcom_configuration_descriptor_data),
 +  sizeof vcom_configuration_descriptor_data,
    vcom_configuration_descriptor_data
  };
 @@ -160,28 +149,28 @@ static const USBDescriptor vcom_configuration_descriptor = {   * U.S. English language identifier.
   */
  static const uint8_t vcom_string0[] = {
 -  4,                                /* bLength.                             */
 -  USB_DESCRIPTOR_STRING,            /* bDescriptorType.                     */
 -  0x09, 0x04                        /* wLANGID (0x0409, U.S. English).      */
 +  USB_DESC_BYTE(4),                     /* bLength.                         */
 +  USB_DESC_BYTE(USB_DESCRIPTOR_STRING), /* bDescriptorType.                 */
 +  USB_DESC_WORD(0x0409)                 /* wLANGID (U.S. English).          */
  };
  /*
   * Vendor string.
   */
  static const uint8_t vcom_string1[] = {
 -  38,                               /* bLength.                             */
 -  USB_DESCRIPTOR_STRING,            /* bDescriptorType.                     */
 +  USB_DESC_BYTE(38),                    /* bLength.                         */
 +  USB_DESC_BYTE(USB_DESCRIPTOR_STRING), /* bDescriptorType.                 */
    'S', 0, 'T', 0, 'M', 0, 'i', 0, 'c', 0, 'r', 0, 'o', 0, 'e', 0,
    'l', 0, 'e', 0, 'c', 0, 't', 0, 'r', 0, 'o', 0, 'n', 0, 'i', 0,
    'c', 0, 's', 0
  };
  /*
 - * Device description string.
 + * Device Description string.
   */
  static const uint8_t vcom_string2[] = {
 -  56,                               /* bLength.                             */
 -  USB_DESCRIPTOR_STRING,            /* bDescriptorType.                     */
 +  USB_DESC_BYTE(56),                    /* bLength.                         */
 +  USB_DESC_BYTE(USB_DESCRIPTOR_STRING), /* bDescriptorType.                 */
    'C', 0, 'h', 0, 'i', 0, 'b', 0, 'i', 0, 'O', 0, 'S', 0, '/', 0,
    'R', 0, 'T', 0, ' ', 0, 'V', 0, 'i', 0, 'r', 0, 't', 0, 'u', 0,
    'a', 0, 'l', 0, ' ', 0, 'C', 0, 'O', 0, 'M', 0, ' ', 0, 'P', 0,
 @@ -189,11 +178,11 @@ static const uint8_t vcom_string2[] = {  };
  /*
 - * Serial number string.
 + * Serial Number string.
   */
  static const uint8_t vcom_string3[] = {
 -  8,                                /* bLength.                             */
 -  USB_DESCRIPTOR_STRING,            /* bDescriptorType.                     */
 +  USB_DESC_BYTE(8),                     /* bLength.                         */
 +  USB_DESC_BYTE(USB_DESCRIPTOR_STRING), /* bDescriptorType.                 */
    '0' + CH_KERNEL_MAJOR, 0,
    '0' + CH_KERNEL_MINOR, 0,
    '0' + CH_KERNEL_PATCH, 0
 @@ -203,10 +192,10 @@ static const uint8_t vcom_string3[] = {   * Strings wrappers array.
   */
  static const USBDescriptor vcom_strings[] = {
 -  {sizeof(vcom_string0), vcom_string0},
 -  {sizeof(vcom_string1), vcom_string1},
 -  {sizeof(vcom_string2), vcom_string2},
 -  {sizeof(vcom_string3), vcom_string3}
 +  {sizeof vcom_string0, vcom_string0},
 +  {sizeof vcom_string1, vcom_string1},
 +  {sizeof vcom_string2, vcom_string2},
 +  {sizeof vcom_string3, vcom_string3}
  };
  /*
 @@ -291,7 +280,7 @@ static void usb_event(USBDriver *usbp, usbevent_t event) {      return;
    case USB_EVENT_SUSPEND:
      return;
 -  case USB_EVENT_RESUME:
 +  case USB_EVENT_WAKEUP:
      return;
    case USB_EVENT_STALLED:
      return;
  | 
