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
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.
"IAD" - Das war der Tipp, Vielen Dank! Hier die Infos die ich dazu gefunden habe: http://webcache.googleusercontent.com/search?q=cache:IgUTdx7uRIQJ:https://my.st.com/public/STe2ecommunities/mcu/Lists/cortex_mx_stm32/AllItems.aspx%3FRootFolder%3D%252Fpublic%252FSTe2ecommunities%252Fmcu%252FLists%252Fcortex_mx_stm32%252FMultiple%2520USB%2520CDC%2520%28USB%2520IAD%29.%2520How+&cd=1&hl=de&ct=clnk&client=firefox-a http://akb77.com/g/stm32/stm32f103-cdc/ Jetzt habe ich erst mal zu tun...
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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.