mikrocontroller.net

Forum: PC-Programmierung USB: Alternative zu VCP über CDC?


Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

kennt jemand eine Alternative zur Virtual COM Port Implementation 
mittels Communication Device Class? Mein Ziel ist es, zwei 
COM-Schnittstellen mit meinem Wunschmicrocontroller zu realisieren, das 
Problem ist, dass dieser maximal 3x IN und 3x OUT USB-End-Points (neben 
Endpoint 0) unterstützt. CDC setzt aber 2x IN und 1 x OUT pro VCP 
voraus.

Das Ziel wäre also zusammengefasst eine VCP-Alternative zu der 
CDC-Implementation, welche keine OS-Treiberentwicklung fordert.

Vielleicht hat ja jemand ne Idee?

Ralf

Autor: Bernd Hallinger (bhallinger) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Abo

Autor: Εrnst B✶ (ernst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tja, Windows bringt nur den CDC Treiber mit, wenn du also keinen Eigenen 
Treiber schreiben willst, bleiben dir nur Treiber von anderen USB->RS232 
Lösungen.

Also: Mal Prolific, FTDI & co Chips ansehen, welcher davon mit den 
wenigsten Endpoints auskommt.

Danach einen "Simulator" für so einen Chip für deinen µC schreiben.

Testen ob der gewählte Treiber den Chip auch erkennt.

Simulator auf zweite Function mit dem zweiten Comport erweitern.

Wieder testen, ob der Treiber das noch schluckt.

Wenn nicht, Goto 1.

Wenn du alle verfügbaren Chips/Treiber durch hast, Pech gehabt. Einen 
USB-Hub Simulator wirst du wohl kaum noch zusätzlich auf deinen µC 
bekommen.

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Ernst,

hm, die Idee ist gar nicht schlecht. Mal sehen, ob ich irgendwie 
rausbekomme, wieviele Endpoints diese Treiber verwenden...

Danke.

Ralf

Autor: Εrnst B✶ (ernst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ralf wrote:
> hm, die Idee ist gar nicht schlecht. Mal sehen, ob ich irgendwie
> rausbekomme, wieviele Endpoints diese Treiber verwenden...

Das geht unter Linux mit lsusb, z.B.
# lsusb -v -d 0x04b4:0x5500

Bus 002 Device 067: ID 04b4:5500 Cypress Semiconductor Corp. HID->COM RS232 Adapter
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               1.00
  bDeviceClass            0 (Defined at Interface level)
  bDeviceSubClass         0
  bDeviceProtocol         0
  bMaxPacketSize0         8
  idVendor           0x04b4 Cypress Semiconductor Corp.
  idProduct          0x5500 HID->COM RS232 Adapter
  bcdDevice            0.00
  iManufacturer           1 ?
  iProduct                2 PS/2+USB Mouse
  iSerial                 0
  bNumConfigurations      1
  Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength           41
    bNumInterfaces          1
    bConfigurationValue     1
    iConfiguration          4 ?
    bmAttributes         0x80
      (Bus Powered)
    MaxPower              100mA
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        0
      bAlternateSetting       0
      bNumEndpoints           2
      bInterfaceClass         3 Human Interface Device
      bInterfaceSubClass      0 No Subclass
      bInterfaceProtocol      0 None
      iInterface              0
        HID Device Descriptor:
          bLength                 9
          bDescriptorType        33
          bcdHID               1.00
          bCountryCode            0 Not supported
          bNumDescriptors         1
          bDescriptorType        34 Report
          wDescriptorLength      37
         Report Descriptors:
           ** UNAVAILABLE **
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x81  EP 1 IN
        bmAttributes            3
          Transfer Type            Interrupt
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0008  1x 8 bytes
        bInterval               2
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x02  EP 2 OUT
        bmAttributes            3
          Transfer Type            Interrupt
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0008  1x 8 bytes
        bInterval              10
Device Status:     0x0000
  (Bus Powered)
=> Komisches Teil, meldet sich als HID, und hat einen IN und einen OUT 
Endpoint (zusätzlich zum Endpoint0, der ja immer gebraucht wird)

Ausserdem hat das verfluchte Teil einen Wackelkontakt, ausgerechnet in 
dem eingegossenen Steckergehäuse…

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Ernst,

> Das geht unter Linux mit lsusb, z.B.
Muss gestehen, dass ich verwöhnter Windows-User bin, mich mit Linux zu 
beschäftigen, steht zwar in Planung, aber da leg ich mir neue Hardware 
zu und papp es dann auf den alten Rechner :)

> => Komisches Teil, meldet sich als HID, und hat einen IN und einen OUT
> Endpoint (zusätzlich zum Endpoint0, der ja immer gebraucht wird)
Laut der Beschreibung, dass das gesamte Produkt eine Maus ist, würde ja 
HID (Human Interface Device) schon mal passen. Dass offenbar ein 
USB-UART-Wandler der Sache "übergeordnet" ist, wundert mich jetzt 
auch...

> Ausserdem hat das verfluchte Teil einen Wackelkontakt, ausgerechnet in
> dem eingegossenen Steckergehäuse…
Sorry, jetzt musste ich schmunzeln... Du meinst direkt im USB-Stecker? 
Das ist doof. Kannst du nicht aufmachen und das Kabel auswechseln?

Ralf

Autor: Mars (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mit USBView kannst du unter Windows die USB Deskriptoren anzeigen 
lassen.
Wird mit dem WDK mitgeliefert, findet man aber auch auf der FTDI HP.

Ansonsten könntest du von CDC auf HID umsatteln. Windows liefert hier 
ebenfalls einen Treiber mit.

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Mit USBView kannst du unter Windows die USB Deskriptoren anzeigen lassen.
> Wird mit dem WDK mitgeliefert, findet man aber auch auf der FTDI HP.
Okay, das guck ich mir mal an, danke...

> Ansonsten könntest du von CDC auf HID umsatteln. Windows liefert hier
> ebenfalls einen Treiber mit.
Aber ich brauch doch n VCP, und den kann man mit HID nicht realisieren 
(oder zumindest kenne ich keinen Treiber, der das über HID 
implementiert).

Ralf

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So, hab jetzt mal mit USBView einen FT232 ausgelesen:
Device Descriptor:
bcdUSB:             0x0110
bDeviceClass:         0x00
bDeviceSubClass:      0x00
bDeviceProtocol:      0x00
bMaxPacketSize0:      0x08 (8)
idVendor:           0x0403 (Future Technology Devices International Limited)
idProduct:          0x6001
bcdDevice:          0x0400
iManufacturer:        0x01
0x0409: "FTDI"
iProduct:             0x02
0x0409: "USB <-> Serial"
0x0409: "USB <-> Serial"
iSerialNumber:        0x00
bNumConfigurations:   0x01

ConnectionStatus: DeviceConnected
Current Config Value: 0x01
Device Bus Speed:     Full
Device Address:       0x01
Open Pipes:              2

Endpoint Descriptor:
bEndpointAddress:     0x81  IN
Transfer Type:        Bulk
wMaxPacketSize:     0x0040 (64)
bInterval:            0x00

Endpoint Descriptor:
bEndpointAddress:     0x02  OUT
Transfer Type:        Bulk
wMaxPacketSize:     0x0040 (64)
bInterval:            0x00

Configuration Descriptor:
wTotalLength:       0x0020
bNumInterfaces:       0x01
bConfigurationValue:  0x01
iConfiguration:       0x00
bmAttributes:         0x80 (Bus Powered )
MaxPower:             0x2D (90 Ma)

Interface Descriptor:
bInterfaceNumber:     0x00
bAlternateSetting:    0x00
bNumEndpoints:        0x02
bInterfaceClass:      0xFF
bInterfaceSubClass:   0xFF
bInterfaceProtocol:   0xFF
iInterface:           0x02
0x0409: "USB <-> Serial"
0x0409: "USB <-> Serial"

Endpoint Descriptor:
bEndpointAddress:     0x81  IN
Transfer Type:        Bulk
wMaxPacketSize:     0x0040 (64)
bInterval:            0x00

Endpoint Descriptor:
bEndpointAddress:     0x02  OUT
Transfer Type:        Bulk
wMaxPacketSize:     0x0040 (64)
bInterval:            0x00
Scheint tatsächlich so zu sein, dass nur zwei Endpunkte verwendet 
werden, obwohl ein CDC VCP m.W. zwei IN und einen OUT verwendet, der 
zweite IN ist soweit ich für die Signalisierung der Zustände bzw. 
Zustandsänderungen (RTS, usw.).
Interessant...

Ralf

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ralf wrote:
> So, hab jetzt mal mit USBView einen FT232 ausgelesen:

> Scheint tatsächlich so zu sein, dass nur zwei Endpunkte verwendet
> werden, obwohl ein CDC VCP m.W. zwei IN und einen OUT verwendet, der
> zweite IN ist soweit ich für die Signalisierung der Zustände bzw.
> Zustandsänderungen (RTS, usw.).
> Interessant...

Das mag daran liegen, dass FTDI kein CDC macht, sondern ein eigenes 
Protokoll.

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Das mag daran liegen, dass FTDI kein CDC macht, sondern ein eigenes
> Protokoll.
Ja, das hab ich mir auch gedacht, jetzt muss ich mal versuchen, 
rauszufinden, wie man auf einfachstem Wege auf die Art einen VCP 
realisiert.

Ich such mal nach "universellen" VCP-Treibern, welche quasi nur die 
Host-Seite implementieren und nur ein Interface für das Device 
bereitstellen, sodass man die Device-Steuerung selbst schreiben kann. 
Ich halt euch auf dem Laufenden...

Ralf

Autor: Εrnst B✶ (ernst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gibts da nicht dieses Com-To-Com oder com2com o.ä.?
Stellt zwei Virtuelle Com-Ports zur Verfügung, die sozusagen mit einem 
virtuellen Null-Modem-Kabel gekoppelt sind.

Ein Ende nimmst du für die Anwendung, das andere nimmt dein 
Userspace-Treiber zum Datenschaufeln?

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Ein Ende nimmst du für die Anwendung, das andere nimmt dein
> Userspace-Treiber zum Datenschaufeln?
Naja, das wär ne Notlösung :)

Im Prinzip bräuchte ich eine COM-to-MyDevice Implementierung grins
Bin noch am Suchen, aber wie gesagt, falls ich was brauchbares finde, 
stell ichs hier rein...

Ralf

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also, mal ein Update zu meiner bisherigen Suche:

Die einzige Möglichkeit, die mir am flexibelsten erscheint, ist einen 
VCP zu erzeugen, der aber erstmal nix mit USB am Hut hat, sondern über 
die Programmiersprache der Wahl erzeugt wird. Gekoppelt an den 
eigentlichen USB-fähigen Microcontroller wird eben über die 
programmierte Applikation. Die meisten µC-Hersteller geben neben 
VCP-Treibern ja meist auch DLLs für die Einbindung in eine 
Programmiersprache raus, um direkt mit den µC's kommunizieren zu können.

Nochmal zur Erinnerung, ich brauche ja eine spezielle Lösung, da ich bei 
meinem Wunsch-µC nicht genug USB-Endpunkte für einen USB-VCP habe. Mit 
der Lösung über einen "allgemeinen" VCP-Treiber kann ich mir also das 
System passend hinbasteln.

Es gibt viele Hersteller von solchen VCP-Treibern, ich denke, ich werde 
mal den von Eltima evaluieren:

http://www.eltima.com/products/vspax/

Über das Timing-Verhalten lässt sich natürlich jetzt noch nix aussagen, 
ich halte euch auf dem Laufenden. Aber vielleicht hilft dieser Beitrag 
dem einen oder anderen.

Ralf

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.