Alexander (HH): Hardware-Hack

Beitrag lesen

Moin Moin!

Gratuliere, Du hast Dein Gamepad zu einem Modem umfunktioniert. ;-)

Hehe, genau. Nur momentan ein ziemlich nutzloser, weil er nicht mit mir reden will. Oder nicht zuhört. Ich weiß noch nicht so genau.

Ich geh mal davon aus, dass Du die Standard-Prozeduren "Stecker raus Stecker rein" und "Reboot tut immer gut" schon erfolglos durchprobiert hast.

Offenbar gibt es 2 Interfaces, nämlich ACM (Abstract Control Model) und CDC Data. Wenn ich dmesg befrage, was sich mit dem Umschalten in diesen seltsamen Modus getan hat, kriege ich das hier als Antwort:

[ 8298.229790] usb 6-2: USB disconnect, address 23
[ 8298.860035] usb 6-2: new full speed USB device using ohci_hcd and address 24
[ 8299.033656] usb 6-2: configuration #1 chosen from 1 choice
[ 8299.034803] cdc_acm 6-2:1.0: This device cannot do calls on its own. It is not a modem.

^-- Die Meldung würde ich mal im Kernel-Source suchen. Mich würde echt interessieren, wie Linux auf diese Idee kommt.

Die letzte Zeile meinst Du? Findest Du in cdc-acm.c, wenn Dir das was sagt.

Das ist mir schon klar.

  
switch (buffer[2]) {  
// ...  
                case USB_CDC_CALL_MANAGEMENT_TYPE:  
                        call_management_function = buffer[3];  
                        call_interface_num = buffer[4];  
                        if ((quirks & NOT_A_MODEM) == 0 && (call_management_function & 3) != 3)  
                                dev_err(&intf->dev, "This device cannot do calls on its own. It is not a modem.\n");  
                        break;  

Was ich meine ist, warum rennt Linux in den Fehler rein? Warum ist das NOT_A_MODEM-Flag in quirks nicht gesetzt und warum sind in call_management_function die beiden niedrigsten Bits nicht gesetzt?

Etwas weiter unten wird in quirks via driver_info das Flag gesetzt, aber nur für ein Lego-USB-Device:

  
        /* Support Lego NXT using pbLua firmware */  
        { USB_DEVICE(0x0694, 0xff00),  
        .driver_info = NOT_A_MODEM,  
        },  

Ich habe das so interpretiert, daß es eben nicht als *echter* Modem gehandelt wird, weil das Gerät ja (wegen der grundlegenden Funktionsweise von USB) selber keine Kommunikation starten kann, sondern immer nur auf Polling vom Host reagiert. Das sollte aber prinzipiell kein Grund sein, nicht zu funktionieren, falls Du auf sowas hinaus wolltest.

Linux mag das Ding nicht, weil es sich wie ein Modem meldet, aber offenbar nicht die notwendigen Call-Management-Funktionen (was auch immer das sein soll) implementiert UND niemand Linux erzählt hat, das das normal ist (siehe Lego).

Ich hab so den Verdacht, dass das ein Interface zu einem Firmware-Updater ist. Oder vielleicht auch nur ein gut versteckters Debugger-Interface, was nur dem Entwickler der Software auf dem Microcontroller hilft.

Das ist auch meine Vermutung. Oder eher: meine Hoffnung. ;-) Umso schöner wäre es, tatsächlich mit diesem "Modem" kommunizieren zu können.

Hast Du irgendwelche Erfahrungen mit USB CDC/ACM?

Nö, leider nicht.

Ich bin ziemlich erschlagen von den Informationen, die ich zu diesem Schlagwort im Netz finde. Das allermeiste scheint davon auszugehen, daß dem Leser schon völlig klar ist, wie alles im Detail funktioniert und er nur gerne irgendwelche speziellen Probleme in Treibern o. ä. lösen möchte. Ansonsten bin ich immer noch dabei, den entsprechenden, hundertzwanzigseitigen Teil des USB-Standards durchzuackern, in der Hoffnung, daraus zumindest mal die grundlegende Funktionsweise rekonstruieren zu können.

USB ist ein riesiger Haufen Spezifikationen, und ich blicke da auch noch nicht so richtig durch.

Was mich z. B. irritiert, ist der Umstand, daß das Control Interface vom Gerät zum Host geht (ein USB Interrupt IN-Endpoint) und nicht in die andere Richtung ...

USB ist kein Bus. Das "Bus" ist Marketing-Speak, keine technische Angabe. USB ist ein Set von Punpt-zu-Punkt-Verbindungen, die eine Baumstruktur bilden. Gleichberechtigung gibt es auch nicht, alle Macht geht vom USB-Host aus. Der USB-Host entscheidet, wer wann was macht. Entsprechend sind auch Richtungsangaben nahezu immer vom Host ausgehend. Auch die Kommunikation läuft nur unter der Kontrolle des Hosts. Und wie auch z.B. bei HTTP (über TCP über IP über Ethernet über Kupferkabel) stapelt USB diverse Protkolle übereinander, teilweise in Hardware, teilweise in Software. Was USB noch schwieriger macht ist, dass immer mehr angeflanscht wurde.

Vielleicht solltest Du mal verraten, über welches Gerät wir hier reden.

Alexander

--
Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".