This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

USB CDC ACM with AUDIO class on Windows

I have successfully been using USB CDC ACM class alongside USB Audio with only a MIC feature available on Mac OS. However, on Windows, only USB CDC ACM enumerates in Device Manager. The Audio class enumerates with a failure "Device USB\VID****** had a problem starting". Any ideas what could be causing this discrepancy?

  • Just to add on to the above, in test.h, in the static declaration of the descriptors, some values are marked as "pending". It was too easy to make a mistake changing the descriptor and forgot to update other parts. So, in my code, these are not hard coded but are automatically filled in based on the actual type and number of USB devices to be created. In case you want to test quickly, look for "pending" and enter the values based on the descriptor bytes below.

    DEVICE: 12 01 00 02 00 00 00 40 15 19 0E 52 00 01 01 02 03 01
    CONFIGURATION: 09 02 B9 00 04 01 04 C0 32
    USBD_DSC_TYPE_IF_ASSOC: 08 0B 02 02 01 01 00 00
    INTERFACE: 09 04 02 00 00 01 01 00 00
    AUDIO INTERFACE: 09 24 01 00 01 2B 00 01 03
    AUDIO INTERFACE: 0C 24 02 01 01 01 00 02 03 00 00 00
    AUDIO INTERFACE: 0D 24 06 02 01 02 01 00 01 00 01 00 00
    AUDIO INTERFACE: 09 24 03 03 02 03 00 02 00
    INTERFACE: 09 04 03 00 00 01 02 00 00
    INTERFACE: 09 04 03 01 01 01 02 00 00
    AUDIO INTERFACE: 07 24 01 01 00 01 00
    AUDIO INTERFACE: 0B 24 02 03 02 02 10 01 80 BB 00
    AUDIO ENDPOINT: 07 25 01 00 00 00 00
    ENDPOINT: 07 05 08 01 C0 00 01
    USBD_DSC_TYPE_IF_ASSOC: 08 0B 06 02 02 02 01 00
    INTERFACE: 09 04 06 00 01 02 02 01 00
    AUDIO INTERFACE: 05 24 00 10 01
    AUDIO INTERFACE: 05 24 01 03 07
    AUDIO INTERFACE: 04 24 02 02
    AUDIO INTERFACE: 05 24 06 06 07
    ENDPOINT: 07 05 83 03 40 00 10
    INTERFACE: 09 04 07 00 02 0A 00 00 00
    ENDPOINT: 07 05 84 02 40 00 00
    ENDPOINT: 07 05 04 02 40 00 00
    STRING: 04 03 09 04
    STRING: 0A 03 4D 00 41 00 4E 00 55 00
    STRING: 0A 03 50 00 52 00 4F 00 44 00
    STRING: 0A 03 53 00 54 00 52 00 33 00  

  • Brilliant, that worked for me! Thank you so much.

  • I have the same problem. But I will not be able to solve it in the described way. Maybe I'm doing something wrong, could you please demonstrate the part of the code "app_usbd_audio.c" in which the /* INSERT CODE HERE FOR THE IAD * / is inserted, in which the problem is solved?

  • my code with the addition of IAD in the file "app_usbd_audio.c" not work (no usb audio device in windows):

    #define USBD_AUDIO_CLASS				0x01
    #define USBD_AUDIO_SUBCLASS_CONTROL			0x01
    #define USBD_AUDIO_PROTOCOL_UNDEFINED			0x00
    #define USBD_DSC_TYPE_INTERFACE_ASSOCIATION		0x0B
    
    static bool audio_feed_descriptors(app_usbd_class_descriptor_ctx_t * p_ctx,
                                       app_usbd_class_inst_t const     * p_inst,
                                       uint8_t                         * p_buff,
                                       size_t                            max_size)
    {
        static uint8_t ifaces   = 0;
        ifaces = app_usbd_class_iface_count_get(p_inst);
        ASSERT(ifaces == 2);
        app_usbd_audio_t const * p_audio = audio_get(p_inst);
    //**
        static app_usbd_class_iface_conf_t const * p_cur_iface = NULL;
        p_cur_iface = app_usbd_class_iface_get(p_inst, 0);
    //**
    
        APP_USBD_CLASS_DESCRIPTOR_BEGIN(p_ctx, p_buff, max_size);
    
        //********** IA insert ******************
    
        APP_USBD_CLASS_DESCRIPTOR_WRITE(0x08); // bLength
        APP_USBD_CLASS_DESCRIPTOR_WRITE(USBD_DSC_TYPE_INTERFACE_ASSOCIATION);
        APP_USBD_CLASS_DESCRIPTOR_WRITE(app_usbd_class_iface_number_get(p_cur_iface));
        APP_USBD_CLASS_DESCRIPTOR_WRITE(2);
        APP_USBD_CLASS_DESCRIPTOR_WRITE(USBD_AUDIO_CLASS);
        APP_USBD_CLASS_DESCRIPTOR_WRITE(USBD_AUDIO_SUBCLASS_CONTROL);
        APP_USBD_CLASS_DESCRIPTOR_WRITE(USBD_AUDIO_PROTOCOL_UNDEFINED);
        APP_USBD_CLASS_DESCRIPTOR_WRITE(0x00);
    
        //*****************************************
    
        /* CONTROL INTERFACE DESCRIPTOR */
        APP_USBD_CLASS_DESCRIPTOR_WRITE(0x09); // bLength
        APP_USBD_CLASS_DESCRIPTOR_WRITE(APP_USBD_DESCRIPTOR_INTERFACE); // bDescriptorType = Interface
    
    //    static app_usbd_class_iface_conf_t const * p_cur_iface = NULL;
    //    p_cur_iface = app_usbd_class_iface_get(p_inst, 0);
    
        APP_USBD_CLASS_DESCRIPTOR_WRITE(app_usbd_class_iface_number_get(p_cur_iface)); // bInterfaceNumber
        APP_USBD_CLASS_DESCRIPTOR_WRITE(0x00); // bAlternateSetting
        APP_USBD_CLASS_DESCRIPTOR_WRITE(app_usbd_class_iface_ep_count_get(p_cur_iface)); // bNumEndpoints
        APP_USBD_CLASS_DESCRIPTOR_WRITE(APP_USBD_AUDIO_CLASS); // bInterfaceClass = Audio
        APP_USBD_CLASS_DESCRIPTOR_WRITE(APP_USBD_AUDIO_SUBCLASS_AUDIOCONTROL); // bInterfaceSubclass (Audio Control)
        APP_USBD_CLASS_DESCRIPTOR_WRITE(APP_USBD_AUDIO_CLASS_PROTOCOL_UNDEFINED); // bInterfaceProtocol
        APP_USBD_CLASS_DESCRIPTOR_WRITE(0x00); // iInterface
    
        /* HEADER INTERFACE */

  • It works, I give the working code for nrf82540 and SDK v17b maybe it will help someone (to create a composite USB device USB AUDIO + CDC ACM, you need to add a descriptor  an "INTERFACE_ASSOCIATION DESCRIPTOR" (IAD) just before the "INTERFACE DESCRIPTOR" in the file "app_usbd_audio.c", in the function audio_feed_descriptors() at line 675,  for the AudioClass Control Interface):

    #define USBD_AUDIO_CLASS				0x01
    #define USBD_AUDIO_SUBCLASS_CONTROL			0x01
    #define USBD_AUDIO_PROTOCOL_UNDEFINED			0x00
    #define USBD_DSC_TYPE_INTERFACE_ASSOCIATION		0x0B
    
    static bool audio_feed_descriptors(app_usbd_class_descriptor_ctx_t * p_ctx,
                                       app_usbd_class_inst_t const     * p_inst,
                                       uint8_t                         * p_buff,
                                       size_t                            max_size)
    {
        static uint8_t ifaces   = 0;
        ifaces = app_usbd_class_iface_count_get(p_inst);
        ASSERT(ifaces == 2);
        app_usbd_audio_t const * p_audio = audio_get(p_inst);
    
        APP_USBD_CLASS_DESCRIPTOR_BEGIN(p_ctx, p_buff, max_size);
    
        static app_usbd_class_iface_conf_t const * p_cur_iface = NULL;
        p_cur_iface = app_usbd_class_iface_get(p_inst, 0);
    
        //********** IA insert ******************
    
        APP_USBD_CLASS_DESCRIPTOR_WRITE(0x08); // bLength
        APP_USBD_CLASS_DESCRIPTOR_WRITE(USBD_DSC_TYPE_INTERFACE_ASSOCIATION);
        APP_USBD_CLASS_DESCRIPTOR_WRITE(app_usbd_class_iface_number_get(p_cur_iface));
        APP_USBD_CLASS_DESCRIPTOR_WRITE(ifaces);
        APP_USBD_CLASS_DESCRIPTOR_WRITE(USBD_AUDIO_CLASS);
        APP_USBD_CLASS_DESCRIPTOR_WRITE(USBD_AUDIO_SUBCLASS_CONTROL);
        APP_USBD_CLASS_DESCRIPTOR_WRITE(USBD_AUDIO_PROTOCOL_UNDEFINED);
        APP_USBD_CLASS_DESCRIPTOR_WRITE(0x00);
    
        //*****************************************
    
        /* CONTROL INTERFACE DESCRIPTOR */
        APP_USBD_CLASS_DESCRIPTOR_WRITE(0x09); // bLength
        APP_USBD_CLASS_DESCRIPTOR_WRITE(APP_USBD_DESCRIPTOR_INTERFACE); // bDescriptorType = Interface
    
      //  static app_usbd_class_iface_conf_t const * p_cur_iface = NULL;
     //   p_cur_iface = app_usbd_class_iface_get(p_inst, 0);
    
        APP_USBD_CLASS_DESCRIPTOR_WRITE(app_usbd_class_iface_number_get(p_cur_iface)); // bInterfaceNumber
        APP_USBD_CLASS_DESCRIPTOR_WRITE(0x00); // bAlternateSetting
        APP_USBD_CLASS_DESCRIPTOR_WRITE(app_usbd_class_iface_ep_count_get(p_cur_iface)); // bNumEndpoints
        APP_USBD_CLASS_DESCRIPTOR_WRITE(APP_USBD_AUDIO_CLASS); // bInterfaceClass = Audio
        APP_USBD_CLASS_DESCRIPTOR_WRITE(APP_USBD_AUDIO_SUBCLASS_AUDIOCONTROL); // bInterfaceSubclass (Audio Control)
        APP_USBD_CLASS_DESCRIPTOR_WRITE(APP_USBD_AUDIO_CLASS_PROTOCOL_UNDEFINED); // bInterfaceProtocol
        APP_USBD_CLASS_DESCRIPTOR_WRITE(0x00); // iInterface
    
        /* HEADER INTERFACE */
    

Related