Hi,
On Saturday 21 May 2011, Luca Bertoncello wrote:
Konrad Rosenbaum konrad@silmor.de 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