Forum: Mikrocontroller und Digitale Elektronik USB Verbindung als VCP und CDC?


von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


Lesenswert?

Hallo,

Ich möchte gerne den STM32F417 mit 2 USB Verbindungen nutzen. Es sollte 
einmal eine Datenverbindung per CDC laufen, die mit meiner Software 
betrieben wird, zum zweiten soll auch ein virtueller COM Port bereit 
gestellt werden, über den fremde Programme Zugriff auf mein Board haben.

Ich habe das noch nie gemacht, aber wenn ich die Doku von usb.org 
richtig verstehe sollte man im USB Descriptor mehrere Interfaces 
definieren können (Bei FTDI geht das auch, z.B. Olimex ARM-USB-OCD).

Ich suche immer wieder im Internet danach aber ich habe noch nichts 
passendes gefunden.

Für einen CDC habe ich mit LibUSB eine Kommunikation hin bekommen, und 
für den VCP über die Demo von ST.
Aber wie kann ich nun beides vereinen?

Am liebsten würde ich alles mit LibUSB (weil auch OpenSource) machen, 
aber ich habe nirgends gefunden wie ich dem LibUSB bei bringen kann dass 
er im Gerätemanager eine neue serielle Schnittstelle anlegt.

Weiß jemand Rat?
Oder gibt es einen anderen freien Gerätetreiber, den ich nutzen kann?

Grüße Markus

von Jim M. (turboj)


Lesenswert?

Such mal nach CDC und IAD (Interface Association Deskriptor). Den 
brauchst Du, weil dein Gerät jetzt 2 Interfaces braucht - einmal CDC für 
VCP und einmal für LibUSB.

von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


Lesenswert?


von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


Lesenswert?

Ich Analysiere nun die Descriptoren für USB, aber ich komme mit den 
Codes nicht ganz klar.
In der USB Spec V2 war der Descriptor Typ "IAD" nicht drin, aber ich 
habe den in der Spec V3 gefunden.

Erst mal den Code dann die Frage:
1
  /*IAD*/
2
  0x08,  // bLength: Interface Descriptor size
3
  0x0B,  // bDescriptorType: IAD
4
  0x00,  // bFirstInterface
5
  0x02,  // bInterfaceCount
6
  0x02,  // bFunctionClass: CDC
7
  0x02,  // bFunctionSubClass
8
  0x01,  // bFunctionProtocol
9
  0x02,  // iFunction
10
  /*Interface Descriptor*/
11
  0x09,   /* bLength: Interface Descriptor size */
12
  USB_INTERFACE_DESCRIPTOR_TYPE,  /* bDescriptorType: Interface */
13
  /* Interface descriptor type */
14
  0x00,   /* bInterfaceNumber: Number of Interface */
15
  0x00,   /* bAlternateSetting: Alternate setting */
16
  0x01,   /* bNumEndpoints: One endpoints used */
17
  0x02,   /* bInterfaceClass: Communication Interface Class */
18
  0x02,   /* bInterfaceSubClass: Abstract Control Model */
19
  0x01,   /* bInterfaceProtocol: Common AT commands */
20
  0x00,   /* iInterface: */
21
  /*Header Functional Descriptor*/
22
  0x05,   /* bLength: Endpoint Descriptor size */
23
  0x24,   /* bDescriptorType: CS_INTERFACE */
24
  0x00,   /* bDescriptorSubtype: Header Func Desc */
25
  0x10,   /* bcdCDC: spec release number */
26
  0x01,
27
  /*Call Managment Functional Descriptor*/
28
  0x05,   /* bFunctionLength */
29
  0x24,   /* bDescriptorType: CS_INTERFACE */
30
  0x01,   /* bDescriptorSubtype: Call Management Func Desc */
31
  0x00,   /* bmCapabilities: D0+D1 */
32
  0x01,   /* bDataInterface: 1 */
33
  /*ACM Functional Descriptor*/
34
  0x04,   /* bFunctionLength */
35
  0x24,   /* bDescriptorType: CS_INTERFACE */
36
  0x02,   /* bDescriptorSubtype: Abstract Control Management desc */
37
  0x02,   /* bmCapabilities */
38
  /*Union Functional Descriptor*/
39
  0x05,   /* bFunctionLength */
40
  0x24,   /* bDescriptorType: CS_INTERFACE */
41
  0x06,   /* bDescriptorSubtype: Union func desc */
42
  0x00,   /* bMasterInterface: Communication class interface */
43
  0x01,   /* bSlaveInterface0: Data Class Interface */

Beim Descriptor "0x0B,  // bDescriptorType: IAD":
Wo kann man nachlesen, was die Codes "bFunctionClass" und 
"bFunctionSubClass" usw. bedeuten?

Genauso auch beim Descriptor "0x24,   /* bDescriptorType: CS_INTERFACE 
*/"
Das hat ja nichts mit der USB Spec zu tun, sondern ist Applikations 
abhängig, in dem Fall wahrscheinlich wie das bei einem VCP eingestellt 
werden muss.

Weiß jemand wo ich da nachlesen könnte?

von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


Lesenswert?


von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


Lesenswert?

Nun habe ich den STM32 soweit programmiert und im Gerätemanager werden 
die zwei Devices gezeigt.

Aber ich habe mit der INF Datei noch ein Problem:
Ich wollte gerne die ganze Installation der Gerätetreiber in einer Datei 
drin haben.

Aber die ClassGuid vom VCP ist eine andere als wie von LibUSB:

ClassGuid={4D36E978-E325-11CE-BFC1-08002BE10318}
ClassGuid={EB781AAF-9C70-4523-A5DF-642A87ECA567}

Wie kann ich jetzt die ClassGuid abhängig vom Device in der INF Datei 
umschalten?

[Version]
Signature   = "$Windows NT$"
Class       = Ports
ClassGuid   = {4D36E978-E325-11CE-BFC1-08002BE10318}
Class       = "libusb devices"
ClassGuid   = {EB781AAF-9C70-4523-A5DF-642A87ECA567}

Gleiche Namen in der Sektion sind ja nicht erlaubt.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.