Forum: Mikrocontroller und Digitale Elektronik USB-Gerät meldet sich als ACM-Device - wie ändern?


von Satz K. (satz_k)


Lesenswert?

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!

: Gesperrt durch Moderator
von Christian R. (supachris)


Lesenswert?

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.

von Kein Name (Gast)


Lesenswert?

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.

von Detlef K. (adenin)


Lesenswert?

Der Modem-Manager greift darauf zu und sendet AT-Kommandos.
Ich hab mir mal irgendwann folgendes notiert:
1
###########################################################################
2
Linux sendet AT+GACP an ttyACMx?
3
So schaltet man das ab:
4
in /etc/udev/rules.d/10-local.rules diese Zeile einfügen:
5
ATTRS{idVendor}=="1234", ATTRS{idProduct}=="5678", ENV{ID_MM_DEVICE_IGNORE}="1"
6
natürlich die korrekte Vendor und ProduktID benutzen ;)
7
###########################################################################
Damit wird aus ttyACMx nicht ttyUSBx, aber es wird nicht mehr 
fälschlicherweise vom Linux als Modem "missbraucht".

von Hans Ulli K. (Gast)


Lesenswert?

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!

von Satz K. (satz_k)


Lesenswert?

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...

von Detlef K. (adenin)


Lesenswert?

Hier steht eine kurze Erkärung zu ttyUSBx und ttyAMCx
https://www.rfc1149.net/blog/2013/03/05/what-is-the-difference-between-devttyusbx-and-devttyacmx/

USB_CLASS_CDC meldet sich (zumindest bei mir) als ttyACMx an.

von Satz K. (satz_k)


Lesenswert?

Detlef Kunz schrieb:
> ATTRS{idVendor}=="1234", ATTRS{idProduct}=="5678",
> ENV{ID_MM_DEVICE_IGNORE}="1"

Ich habe bei mir
1
ATTR{idVendor}=="1234", ATTR{idProduct}=="5678", ENV{ID_MM_DEVICE_IGNORE}="1"

eintragen müssen, aber damit geht es, es werden keine AT-Kommandos mehr 
dazwischengefunkt.

: Bearbeitet durch User
von Satz K. (satz_k)


Lesenswert?

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...

von Klaus (Gast)


Lesenswert?

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

von Detlef K. (adenin)


Lesenswert?

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.

von Klaus (Gast)


Lesenswert?

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

von Satz K. (satz_k)


Lesenswert?

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?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Zeig doch mal, was Du als Descriptor verwendest. Wo kommt das her?

von Detlef K. (adenin)


Lesenswert?

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).

: Bearbeitet durch User
von Klaus (Gast)


Lesenswert?

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

von W.S. (Gast)


Lesenswert?

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.

von Satz K. (satz_k)


Lesenswert?

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?

von Martin M. (capiman)


Lesenswert?


von René D. (Firma: www.dossmatik.de) (dose)


Lesenswert?

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.

von Stefan F. (Gast)


Lesenswert?

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.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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.

Dieser Beitrag ist gesperrt und kann nicht beantwortet werden.