Hi,
ich experimentiere hier gerade mit einem BeagleBone Black sowie ein
wenig Bare-Metal Programmierung herum. Unter anderem habe ich das
usb_dev_serial-Beispiel aus der Starterware am Wickel (damit soll
serielle Kommunikation per USB möglich sein).
Der Code funktioniert problemlos, leider taucht das Gerät aber als
/dev/ttyACM0 statt als /dev/ttyUSB0 auf. Das führt dazu, dass immer mal
ein paar AT-Sequenzen gesendet werden (das scheint das Kernelmodul zu
machen).
Da das Gerät aber als reine serielle (USB-)Schnittstelle verwendet
werden soll: wie identifiziert der Linux-Kernel mein BBB denn als
ACM-Gerät? Vendor- und Product-ID habe ich bereits zu was unbekanntem
geändert, der Control Interface String heißt auch nicht mehr "ACM
Control Interface" (ich hatte vermutet, dass vielleicht das "ACM" in
diesem String geparst wird).
Woher könnte das sonst noch kommen - warum erkennt der Kernel das Teil
nicht als reine serielle Schnittstelle sondern popelt immer das ACM
rein?
Danke!
Du musst die USB Device Class auf CDC ändern und auf die ensprechenden
Kommandos reagieren. VID/PID und String Descriptoren haben damit rein
gar nichts zu tun.
Seit einem Ubuntu-Update vor einigen Monaten ist bei mir das ttyACM0
verschwunden. Hatte mich damals aber nicht weiter gestört, Ubuntu hatte
keine AT Kommandos gesendet.
Vielleicht finden sich unter /var/log Hinweise, welches Programm die
Kommandos sendet.
Satz K. schrieb:> Der Code funktioniert problemlos, leider taucht das Gerät aber als> /dev/ttyACM0 statt als /dev/ttyUSB0 auf. Das führt dazu, dass immer mal> ein paar AT-Sequenzen gesendet werden (das scheint das Kernelmodul zu> machen).
Mit den AT Commands : Der Kernel macht da nichts garantiert> Da das Gerät aber als reine serielle (USB-)Schnittstelle verwendet> werden soll: wie identifiziert der Linux-Kernel mein BBB denn als> ACM-Gerät? Vendor- und Product-ID habe ich bereits zu was unbekanntem> geändert, der Control Interface String heißt auch nicht mehr "ACM> Control Interface" (ich hatte vermutet, dass vielleicht das "ACM" in> diesem String geparst wird).>> Woher könnte das sonst noch kommen - warum erkennt der Kernel das Teil> nicht als reine serielle Schnittstelle sondern popelt immer das ACM> rein?>
Das kommt meist vom Modemmanager, der in Verbundung mit udev das Chaos
macht.
Google mal PL2303 blacklisten
> Danke!
Christian R. schrieb:> Du musst die USB Device Class auf CDC ändern und auf die ensprechenden> Kommandos reagieren. VID/PID und String Descriptoren haben damit rein> gar nichts zu tun.
Die ist schon auf USB_CLASS_CDC...
Detlef Kunz schrieb:> USB_CLASS_CDC meldet sich (zumindest bei mir) als ttyACMx an.
Bei mir auch. Ganz eigenwillig: wenn ich den control interface
description string (der im Original "ACM Control Interface" heißt) ganz
weglasse, dann taucht das Gerät weder als /dev/ttyACM0 noch als irgend
was anderes auf...
Satz K. schrieb:> Da das Gerät aber als reine serielle (USB-)Schnittstelle verwendet> werden soll: wie identifiziert der Linux-Kernel mein BBB denn als> ACM-Gerät?
Ob das was mit dem Kernel zu tun hat?
Ich lehne mich mal aus dem Fenster: Wenn sich Deine Firmware an die
USB-Spezifikation hält, dann geht das auch mit Linux?
Klaus
Klaus schrieb:> Satz K. schrieb:>> Da das Gerät aber als reine serielle (USB-)Schnittstelle verwendet>> werden soll: wie identifiziert der Linux-Kernel mein BBB denn als>> ACM-Gerät?>> Ob das was mit dem Kernel zu tun hat?> Ich lehne mich mal aus dem Fenster: Wenn sich Deine Firmware an die> USB-Spezifikation hält, dann geht das auch mit Linux?>> Klaus
Das Gerät selbst meldet, das es ein ACM-Device ist.
Das steht nicht in den Desciptor Strings, sondern als Zahlenwert in den
Descriptoren.
Detlef Kunz schrieb:> Das Gerät selbst meldet, das es ein ACM-Device ist.> Das steht nicht in den Desciptor Strings, sondern als Zahlenwert in den> Descriptoren.
Aber genau diese Deskriptoren legen die Funktion Deines Gerätes fest.
Wenn bei Dir also in den Deskriptoren ein ACM Gerät definiert wird, und
sich dann Dein Gerät als ACM Gerät anmeldet, dann würde ich sagen: Alles
Ok.
Klaus
Klaus schrieb:> Wenn bei Dir also in den Deskriptoren ein ACM Gerät definiert wird, und> sich dann Dein Gerät als ACM Gerät anmeldet, dann würde ich sagen: Alles> Ok.
Dann wiederhole ich doch gleich mal meine ursprüngliche Frage: WELCHE
Deskriptoren legen dieses Verhalten fest?
Satz K. schrieb:> Klaus schrieb:>> Wenn bei Dir also in den Deskriptoren ein ACM Gerät definiert wird, und>> sich dann Dein Gerät als ACM Gerät anmeldet, dann würde ich sagen: Alles>> Ok.>> Dann wiederhole ich doch gleich mal meine ursprüngliche Frage: WELCHE> Deskriptoren legen dieses Verhalten fest?
Das ganze ist ziehmlich komplex.
Die Descriptoren bauen aufeinander auf.
Änderst Du den Typ des Devices, dann must Du meist auch eine Menge
andere Dinge ändern, einschießlich der Software, die die Steuerung des
Datenverkehrs regelt.
Also fangen wir mal beim Device Desriptor an:
Wenn Du ein einfaches Interface hast, steht da im Feld bDeviceClass
sicher 0x02 drin, was bedeutet, Du hast ein CDC-Device (CDC -->
communications device class) sollte da 0xEF drin sein, dann wird es
richtig schwierig, weil dann mehrere Interface enthalten sein können.
Also wenn Du ein CDC-Device hast, dann bleibt als brauchbare Subclass
nur Abstract Control Model (also ACM).
Aber man brauchte schon deine Descriptoren um das zu klären.
Ändern wird man dann auch nichts könne, weil wenn Du da was änderst,
dann werden andere Treiber geladen (es sei denn man trickst), das
erfordert wieder ander Kommunikatinssoftware in µC (wenn Du dir die
Sourcen zu deinem USB-Interface anschaust, wirst Du sicher feststellen
das da irgendwas von CDC drin steht, da ist das Zeug für die
Kommunikation als CDC/ACM-Device drin).
Satz K. schrieb:> Dann wiederhole ich doch gleich mal meine ursprüngliche Frage: WELCHE> Deskriptoren legen dieses Verhalten fest?
Leider hat Deine Frage einen größeren Umfang wie z.B.: Welches Bit muss
ich setzen, damit die LED angeht? Bei USB musst Du Dich selber etwas
damit auseinander setzen, oder Du hängst einen FTDI an den UART:
http://www.lvr.com/usb_virtual_com_port.htm
Satz K. schrieb:> Dann wiederhole ich doch gleich mal meine ursprüngliche Frage: WELCHE> Deskriptoren legen dieses Verhalten fest?
Dann gibt's ne passende Antwort: Lies die USB-Doku. Ohne die wenigstens
EINMAL durchgekäut zu haben, wirst du ewig bloß im Nebel stochern, ohne
was zu kapieren.
Und: Soweit ich mich erinnere, heißt der entscheidende Descriptor Device
Descriptor. Dort werden Geräteart und Unterart festgelegt.
W.S.
W.S. schrieb:> Dann gibt's ne passende Antwort: Lies die USB-Doku. Ohne die wenigstens> EINMAL durchgekäut zu haben, wirst du ewig bloß im Nebel stochern, ohne> was zu kapieren.
Das wirft die nächste Frage auf: wo gibt's die? Die Codekommentare in
meinem Deskriptor verweisen für den Subtyp auf eine USB-IF, so wie es
aussieht, bekommt man die Doku aber nur als (zahlendes) Mitglied des
USB-Forums?
Ich habe gerade das Problem mit den Arduino mit Opensuse.
Sie lassen sich nicht programmieren.
Sie melden sich als /dev/ttyACM0 an.
Den Modemmanager habe ich schon deinstalliert klappt immer noch nicht.
Auch mit root rechten klappt es nicht.
Das Programmieren startet, die LED zuckt entsprechen. Kann leider das
Programmieren nicht vollständig durchführen.
Ich kann das Board auch auslesen welcher Typ und Seriennummer.
Aber eben das Programmieren geht in die Hose.
René D. schrieb:> Das Programmieren startet, die LED zuckt entsprechen. Kann leider das> Programmieren nicht vollständig durchführen.
Mit welchem Programm? Welcher Konfiguration? Und wie lautet die
Fehlermeldung?
Schau dir mal an, wie man avrdude im Kommandofenster verwendet und mit
dem Parameter -v detaillierte Meldungen aktiviert. Diese helfen dabei,
diese Frage zu klären.
Jetzt google nach avrdude Anleitungen.
Für's nächste mal: Hänge dich nicht an einen uralten Thread, wo es auch
noch um ein anderes Problem geht. Aufgrund des Titel lockt er nämlich
die falschen Leute an.
Stefan ⛄ F. schrieb:> Für's nächste mal: Hänge dich nicht an einen uralten Thread, wo es auch> noch um ein anderes Problem geht.
Ich mach daher mal dicht hier. Bitte als neuen Thread mit passendem
Titel posten.