Hi,

On Saturday 21 May 2011, Luca Bertoncello wrote:
> Konrad Rosenbaum <[email protected]> schrieb:
> > Ich suche eine Hardware, die möglichst frei, problemlos (also C, nicht
> > Assembler) zu programmieren, nicht zu teuer und via USB angebunden ist.
> > 
> > Im Augenblick schwanke ich zwischen Arduino Uno, Maple und der
> > eventuellen Möglichkeit dass es noch was anderes gibt...
> 
> Arduino ist fast 'ne Garantie! Ganz einfach zu nutzen, billig und
> trotzdem mächtig! Ob es reicht, für was du machen willst, ist die
> Preisfrage...

Genau diese Preisefrage stelle ich mir auch...

> > Ich will mir einen Tastatur- und Maus-emulator via USB basteln. Man
> > kann zwar in X11 Events einschmuggeln, aber auf der Textkonsole, im
> > Framebuffer oder Wayland ist das schon schwieriger - ein per USB
> > angeschlossener Emulator könnte beliebigen Programmen Input
> > unterjubeln.
> > 
> > Hat jemand Erfahrungen wie schwierig sowas ist?
> 
> 'sticazzi! (eine Übersetzung erfolgt auf Wunsch).

Hmm. Will ich das wissen?

> Man sagt mir, daß ich mir schwere Aufgabe für meine Freizeit mir suche,
> aber du hast auch sowas im Plan...

Ich arbeitet bereits seit ein paar Wochen an der Applikation, die ringsrum 
existieren soll. Ich mag Herausforderungen...

> Also, das ist eine SEHR schwere Sache... Erstmal musst du den USB-Stack
> als MASTER implementieren. Das kann schon recht aufwändig sein.

Master? Meinst Du Host? Nein, ich will nur ein Gerät bauen.

> Standardmäßig haben alle solche EmbeddedGeräte nur die USB-Schnittstelle
> als SLAVE (viel einfacher!).
> Danach musst du auch ein Ethernetstack, inklusive TCP/IP, einrichten.

Nö, da kann ich sparen... ;-)

> Und
> noch mit dem Lötkolben basteln, denn Arduino wenigstens, hat keinen
> Ethernetcontroller! Das bedeutet, eine extra Platine, im besten Fall mit
> einem ENC28J60, die übliche Kondensatoren, einen Quarz, die RJ45-Büchse
> und einen SPI-Anschluss bis zum ATMega (Arduino).

Ups. Da habe ich mich unklar ausgedrückt: ich will kein echtes Ethernet 
bauen. Es gibt eine Spezifikation wie Ethernet-Karten an USB zu 
funktionieren haben (CDC ECM). Ich will dem PC vorgaukeln, dass ich ein 
Ethernet wäre, aber darüber Kommandos entgegennehmen.

> Gewiss, es gibt schon freie Implementationen von TCP/IP-Stacks (siehe
> uIP), aber das ganze ist trotzdem gar nicht so einfach.

So sehr will ich nicht übertreiben. Ich werde ausschließlich IPv6 nehmen, 
das ist etwas einfacher als IPv4. Die Idee ist mit UDP-Paketen zu 
kommunizieren (spart sehr viel Status und Protokoll) - ich brauche nur zu 
filtern dass die Pakete an den richtigen Port gehen, die richtige Größe 
haben und interpretierbaren Inhalt haben. Wenn ich Daten senden will nehme 
ich einfach einen statischen Header, bastel die Daten hinten dran und 
berechne eine Standard-IP-CRC (ich muss nochmal nachlesen, eventuell kann 
ich mir das sogar sparen).

> > Die Idee ist das USB-Gerät drei virtuelle Schnittstellen haben zu
> > lassen: Ethernet (USB CDC ECM), Tastatur (HID Keyboard) und Maus (HID
> > Mouse). Wenn via Ethernet ein Kommando geschickt wird soll es dann via
> > Tastatur oder Maus als Event zurückgesendet werden. Wenn die Tastatur
> > das Kommando bekommt eine LED anzuschalten, kommt das Ereignis übers
> > Netzwerk zurück.
> 
> Sagen wir so: wenn du geschafft hast, USB-Master und Ethernet zu basteln,
> das ist das einfachste... :D

Wie gesagt: ich brauche nur USB-Device und das Ethernet ist virtuell.

> > Ich hatte noch überlegt statt Ethernet, HID plain data oder CDC ACM
> > (serial) zu nehmen. HID plain hat das Problem dass man eine
> > funktionierende USB- Bibliothek, wie libusb braucht, was nur begrenzt
> > portabel ist. CDC ACM ist an sich gleichwertig mit Ethernet, aber für
> > Netzwerk habe ich bereits fertige portable Klassen (Qt).
> 
> Naja, HID macht das ganze noch komplexer, denn du musst ZWEI USB-Stacks
> (und Ports!!) haben: eine als Master (für Tastatur und Mouse) und die
> andere als Slave (für HID).
> CDC ACM kenne ich nicht.

Hmm. Noch mehr Misverständnisse. Ich will keine Tastatur an das Device 
anstöpseln, sondern selbst Tastatur spielen.

Meine Box soll ausschließlich via USB angeschlossen werden und dem PC die 
drei virtuellen Interfaces vorgaukeln, die ich dann mit etwas simpler 
Software benutze, um dem PC Tastatur- und Maus-Events unterzujubeln.


Kleines USB-Glossar:

USB Host: ein PC oder Mac oder so, sagt einem Device wann es reden darf. An 
einer Host Buchse können (via Hub) mehrere Devices stecken. Auf 
Protokollebene: Master.

USB Device: eine Tastatur, Maus, Modem, Arduino, sonstwas. Ein Gerät kann an 
exakt einen Hub oder einen PC-Port gestöpselt werden. Auf Protokollebene: 
Slave. Ein Device kann mehrere Interfaces haben.

Interface: ein virtuelles Gerät am selben physischen Stecker. Die meisten 
Geräte haben nur ein Interface. Mehrere Interface am selben physischen Gerät 
dürfen durchaus sehr unterschiedliche Funktionen haben (das typische UMTS-
Modem hat ein Mass-Storage, ein Modem und eventuell noch ein paar).

Weitere Ebenen, wie End-Point, Configuration, Descriptor, Report, etc. lasse 
ich mal weg, weil zu kompliziert.

HID: Human Interface Device. Unter dieser Spec läuft alles was normalerweise 
benutzt wird, um Eingaben vom Nutzer entgegen zu nehmen. Es gibt mehrere 
Sub-Specs:

HID Keyboard: Tastatur, kann Tastendrücke senden und den LED-Status 
empfangen.

HID Mouse: die Maus, ganz ohne Sendung. Sendet in nur einem Report die 
Bewegung der Maus, gedrückte Tasten, Mausrad, etc. Kann keine Kommandos 
entgegennehmen.

HID ...: es gibt noch sub-Specs für Joystick, Force Feedback, etc.pp.

HID plain data: Ausnahmespec. Eigentlich keine Spec, aber sehr verbreitet. 
Das Device sendet und empfängt Daten in kleinen Blöcken (bis zu 8 Byte), die 
vom Betriebssystem nicht interpretiert werden können. Wird gerne für 
einfache IO-Bausteine benutzt.

CDC: Communication Device Class. Netzwerkkarten, Modems, ISDN, UMTS, etc.

CDC ACM: Abstract Control Model. Simuliert eine serielle Schnittstelle mit 
beliebiger Geschwindigkeit. Wurde entwickelt um Modems dahinter zu 
verstecken. Typisch für UMTS Modems und Geräte, die einfach nur eine 
serielle Konsole bieten wollen ohne ein echtes serielles Gerät dahinter zu 
haben.

CDC ATM: Asynchronous Transfer Mode. Nein, keine Telekomglasfasern. Einige 
ältere DSL- oder Kabel-Modems. Nicht sehr verbreitet.

CDC ISDN: ISDN. Als ob ISDN und USB alleine nicht schon schlimm genug 
wären...

CDC ECM: Ethernet Control Model. Das Protokoll mit dem man Ethernet-Frames 
über USB jagen kann. Üblicherweise hat das Kabel an einem Ende einen USB-
Stecker am anderen Ende eine RJ-45-Buchse. Das Protokoll erlaubt es 
Ethernet-Frames zu senden und zu empfangen, verschiedene Eigenschaften der 
Ethernet-Karte zu setzen und Statusänderungen (z.B. Kabel wurde eingesteckt) 
zu senden. Soweit ich recherchieren konnte sollten das alle Systeme auch 
können.

CDC EEM: Ethernet Emulation Model. Vereinfachte Variante. Die Idee ist dass 
man zwei USB-Stecker (mit einem Chip dazwischen!!) nimmt, sie an zwei PCs 
ansteckt und dann kommuniziert als wäre es ein Netzwerk. Man spart sich eine 
Menge Ethernet-Overhead (Settings, Filter, Checksumme, ...). Dummerweise 
weigert sich Microsoft es zu implementieren - sie bevorzugen etwas namens 
RNDIS, was wesentlich komplexer und schwerer zu implementieren ist.

Neben HID und CDC gibt es noch ungefähr ein halbes dutzend weitere 
standardisierte USB-Geräte-Klassen


        Konrad

Attachment: signature.asc
Description: This is a digitally signed message part.

_______________________________________________
Lug-dd maillist  -  [email protected]
https://ssl.schlittermann.de/mailman/listinfo/lug-dd

Antwort per Email an