Ports
May 19, 2013, 07:33:42 pm *
Welcome, Guest. Please login or register.

Login with username, password and session length
News: SMF - Just Installed!
 
   Home   Help Search Login Register  
Welcome to the PORTS Forum. Please post your questions, answers, and comments relating to USB and other hardware interfaces in the appropriate forums below. - Jan
Pages: [1]
  Print  
Author Topic: Is it possible to have a usb composite device made up of cdc and vendor spec?  (Read 1138 times)
phamtv
Member
*
Posts: 6


« on: January 27, 2012, 04:34:33 pm »

I am trying to develop a composite device made up of a cdc class and a vendor specific class.  Is this possible?  I am able to get them to work individually but am having a hard time merging the two together.  What ends up happening is that I get 3 other devices under the device manager.  I can assign my vendor specific interface to its driver.  However, I cannot assign the cdc class made up of the two interface to the cdc driver I used previously (when the cdc class was tested separately).  Any suggestion of feedback is greatly appreciated!

Logged
Jan Axelson
Administrator
Frequent Contributor
*****
Posts: 1625


WWW
« Reply #1 on: January 27, 2012, 04:59:48 pm »

See

Composite CDC devices

here

http://www.lvr.com/serport.htm#usb_virtual_com_ports

Jan
Logged
phamtv
Member
*
Posts: 6


« Reply #2 on: January 27, 2012, 05:15:45 pm »

Hi Jan,

The link under Composite CDC device is broken.  Can you elaborate on the fix?

- Tien
Logged
Jan Axelson
Administrator
Frequent Contributor
*****
Posts: 1625


WWW
« Reply #3 on: January 27, 2012, 06:39:07 pm »

Both links worked for me. Search on the article ID if you still have a problem.

Jan
Logged
phamtv
Member
*
Posts: 6


« Reply #4 on: January 31, 2012, 01:20:12 pm »

Hi Jan,

It looks like the hotfixes is used for Window XP, but I am running on Windows 7.  I am able to use the IAD descriptor and get my device to enumerate with 2 device but the CDC class is scanned in the system as an Imaging Device.  Can you take a look at my descriptor as follow and shed some light?  My goal is to get my usb device to support CDC + vendor specific class.  Thank you!

uint8_t device_descriptor[] = {
  0x12,                  /* bLength = 18                     */
  0x01,                  /* bDescriptorType = Device (1)     */
  0x10, 0x01,            /* bcdUSB(L/H) USB spec rev (BCD)   */
  0xEF,                  /* bDeviceClass = Generic Class    */
  0x02,                  /* bDeviceSubClass                  */
  0x01,                  /* bDeviceProtocol                  */
  0x40,                  /* bMaxPacketSize0 is 64 bytes      */
  0x6A, 0x0B,            /* idVendor(L/H)  -- 0x0B6A*/
  0x78, 0x56,            /* idProduct(L/H) -- 4401           */
  0x00, 0x01,            /* bcdDevice -- 01.00               */
  0x01,                  /* iManufacturer Descriptor ID      */
  0x02,                  /* iProduct Descriptor ID           */
  0x00,                  /* iSerialNumber = (0) No string    */
  0x01                   /* bNumConfigurations               */
};

uint8_t config_descriptor[] = {
  0x09,                  /*  bLength = 9                     */
  0x02,                  /*  bDescriptorType = Config (2)    */
  0x54, 0x00,            /*  wTotalLength(L/H)               */
  0x03,                  /*  bNumInterfaces                  */
  0x01,                  /*  bConfigValue                    */
  0x00,                  /*  iConfiguration                  */
  0xc0,                  /*  bmAttributes (self-powered, no remote wakeup) */
  0x01,                  /*  MaxPower is 2ma (units are 2ma/bit) */
 
  /* IAD - Interface Association Descriptor */
 
  0x08,                  /*  bLength                         */
  0x0B,                  /*  bDescriptorType                 */
  0x00,                  /*  bFirstInterface                 */
  0x02,                  /*  bInterfaceCount                 */
  0x02,                  /*  bFunctionClass - Com Class                 */
  0x00,                  /*  bFunctionSubClass               */
  0x00,                  /*  bFunctionProtocol               */
  0x00,                  /*  iFunction                       */

  /*  First Interface Descriptor For Comm Class Interface */
 
  0x09,                  /*  bLength = 9                     */
  0x04,                  /*  bDescriptorType = Interface (4) */
  0x00,                  /*  bInterfaceNumber                */
  0x00,                  /*  bAlternateSetting               */
  0x01,                  /*  bNumEndpoints (one for OUT)     */
  0x02,                  /*  bInterfaceClass = Communications Interface Class (2) */
  0x02,                  /*  bInterfaceSubClass = Abstract Control Model (2) */
  0x01,                  /*  bInterfaceProtocol = Common "AT" commands (1), */
                         /*   no class specific protocol (0)                */
  0x00,                  /*  iInterface                      */
 
  /*  Header Functional Descriptor */
 
  0x05,                  /*  bFunctionalLength = 5           */
  0x24,                  /*  bDescriptorType                 */
  0x00,                  /*  bDescriptorSubtype              */
  0x10, 0x01,            /*  bcdCDC                          */
 
  /*  Call Management Descriptor */
 
  0x05,                  /*  bFunctionalLength = 5           */
  0x24,                  /*  bDescriptorType                 */
  0x01,                  /*  bDescriptorSubtype              */
  0x03,                  /*  bmCapabilities = Device handles call management itself (0x01), */
                         /*    management over data class (0x02)                            */
  0x01,                  /*  bmDataInterface                 */
 
  /*  Abstract Control Management Functional Descriptor */
 
  0x04,                  /*  bFunctionalLength = 4           */
  0x24,                  /*  bDescriptorType                 */
  0x02,                  /*  bDescriptorSubtype              */
  0x02,                  /*  bmCapabilities                  */
 
  /*  Union Functional Descriptor */
 
  0x05,                  /*  bFunctionalLength = 5           */
  0x24,                  /*  bDescriptorType                 */
  0x06,                  /*  bDescriptorSubtype              */
  0x00,                  /*  bmMasterInterface               */
  0x01,                  /*  bmSlaveInterface0               */
 
  /*  IN Endpoint 3 (Descriptor #1) */
 
  0x07,                 /*  bLength                          */
  0x05,                 /*  bDescriptorType (Endpoint)       */
  0x83,                 /*  bEndpointAddress (EP3-IN)        */
  0x03,                 /*  bmAttributes (interrupt)         */
  0x40, 0x00,           /*  wMaxPacketSize(L/H) (64)         */
  0xff,                 /*  bInterval (255 milliseconds)     */
   
  /*  Second Interface Descriptor For Data Interface */
 
  0x09,                 /*  bLength                          */
  0x04,                 /*  bDescriptorType (Interface)      */
  0x01,                 /*  bInterfaceNumber                 */
  0x00,                 /*  bAlternateSetting                */
  0x02,                 /*  bNumEndpoints                    */
  0x0a,                 /*  bInterfaceClass = Data Interface (10) */
  0x00,                 /*  bInterfaceSubClass = none (0)    */
  0x00,                 /*  bInterfaceProtocol = No class specific protocol (0) */
  0x00,                 /*  biInterface = No Text String (0) */
 
  /*  OUT Endpoint 1 (Descriptor #2) */
 
  0x07,                 /*  bLength                          */
  0x05,                 /*  bDescriptorType (Endpoint)       */
  0x01,                 /*  bEndpointAddress (EP1-OUT)       */
  0x02,                 /*  bmAttributes (bulk)              */
  0x40, 0x00,           /*  wMaxPacketSize(L/H) (64)         */
  0x00,                 /*  bInterval (N/A)                  */
 
  /*  IN Endpoint 2 (Descriptor #3) */
 
  0x07,                 /*  bLength                          */
  0x05,                 /*  bDescriptorType (Endpoint)       */
  0x82,                 /*  bEndpointAddress (EP2-IN)        */
  0x02,                 /*  bmAttributes (bulk)              */
  0x40, 0x00,           /*  wMaxPacketSize(L/H) (64)         */
  0x00,                 /*  bInterval (N/A)                  */
 
    /*  Third interface - Vendor Specific -
  (Serial communication via endpoint 0) */
 
  0x09,                  /*  bLength = 9                     */
  0x04,                  /*  bDescriptorType = Interface (4) */
  0x02,                  /*  bInterfaceNumber                */
  0x00,                  /*  bAlternateSetting               */
  0x00,                  /*  bNumEndpoints (one for OUT)     */
  0xFF,                  /*  bInterfaceClass = Vendor Specific */
  0xFF,                  /*  bInterfaceSubClass = Abstract Control Model (2) */
  0xFF,                  /*  bInterfaceProtocol = Common "AT" commands (1), */
                         /*   no class specific protocol (0)                */
  0x00                   /*  iInterface                      */
Logged
Jan Axelson
Administrator
Frequent Contributor
*****
Posts: 1625


WWW
« Reply #5 on: January 31, 2012, 02:30:48 pm »

Use these values in the IAD as well as the interface descriptor:

0x02,                  /*  bInterfaceClass = Communications Interface Class (2) */
0x02,                  /*  bInterfaceSubClass = Abstract Control Model (2) */
0x01,                  /*  bInterfaceProtocol = Common "AT" commands (1), */

Jan
Logged
phamtv
Member
*
Posts: 6


« Reply #6 on: February 02, 2012, 03:18:38 pm »

thank you Jan.  I was able to get it to work!  Your support is greatly appreciated!!!
Logged
Pages: [1]
  Print  
 
Jump to:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.11 | SMF © 2006-2009, Simple Machines LLC Valid XHTML 1.0! Valid CSS!