Ich hab hier ein Experimentier-Board mit einem Microcontroller. Das Teil
beherrscht die Emulierung eines COM-Ports über die USB Schnittstelle.
Ich kann zB über HyperTerminal Daten an das Board verschicken und auch
Daten vom Board senden.
Ich möchte gern eine serielle Maus mit den Tastern auf dem Board
emulieren. Das Protkoll in C nachzubauen ist nicht so das Problem, denke
ich:
http://www.computer-engineering.org/index.php?title=PS/2_Mouse_Interface
Ich habe die Init-Sequenz nachgebaut, dh das Board sollte korrekt auf
gesendete Bytes vom PC antworten. Allerdings erkennt Windows XP beim
Booten das Board nicht als Maus - was muss ich dazu noch einbauen? Beim
Booten wird das Board überhaupt nicht angesprochen (ich lasse mir alle
vom PC gesendeten Bytes auf einem Display ausgeben). Ich denke, das
liegt daran, dass die COM-Port Emulation erst dann funktioniert, wenn
der USB-Treiber geladen wurde...
Wie stelle ich es nun an, dass mein Board, welches am USB Port hängt und
einen COM emuliert, als serielle Maus erkannt wird?
Ich hab hier übrigens eine uralte serielle Microsoft Maus ausgegraben,
welche am gleichen PC wunderbar funktioniert (am COM1 angeschlossen) -
also mein PC/ mein Windows kann im Prinzip schon mit seriellen Mäusen
umgehen.
Zitat:
Older pointing device interfaces include the Apple Desktop Bus (ADB),
RS-232 serial port, and the bus mouse interface. These are obsolete and
are not covered in this article.
also folglich kommst du damit wohl nicht sehr weit
Guido Körber wrote:
> XP hat standardmäßig keine Treiber mehr für serielle Mäuse.
Das würde ich von meiner Erfahrung her mal als falsch bezeichnen.
Zumindest hat XP bei mir schon mehrfach serielle Mäuse gefunden.
Von Vista meine ich aber derartiges gehört zu haben.
Das Problem wird sein das der PC die USB Maus vor dem Booten als
"Serielle" ansprechen müßte damit Windows das mitbekommt. Hast du mal
versucht per Hardware Asistenten eine Serielle Maus zwangsweise zu
installieren? Ansonsten was spricht dagegen den uC ordinär an die
(offensichtlich vorhande) Serielle Schnittstelle ranzuhängen?
Andere möglichkeit wäre die Firmaware umzustricken das das USB Gerät als
HID Device erscheint, er wird sich aber wohl eher als CDC anmelden...
Läubi .. wrote:
> Das Problem wird sein das der PC die USB Maus vor dem Booten als> "Serielle" ansprechen müßte damit Windows das mitbekommt.
Glaube ich nicht. Windows prüft beim Anstecken eines Geräts ob es eine
Maus ist. Das geht selbst während dem Betrieb (das sieht man daran, dass
ein USB-RS232 Konverter etwa die ersten 5-10s nach dem Anstecker
blockiert ist).
Zumindest habe ich es schon mehrmals geschafft, dass ein AVR + FT232 als
Maus erkannt wurden, wenn der AVR sofort lossendet. Als Abhilfe habe ich
dann erst USB angesteckt, und den AVR dann 10s später eingeschaltet.
Hm.. okay, ich vertrau dir da mal ich hab weder XP noch nen FT232...
Wäre halt interessant was für ein UC Board er hat und wie dort die USB
Kommunikation geregelt wird.
> Das Problem wird sein das der PC die USB Maus vor dem Booten als> "Serielle" ansprechen müßte damit Windows das mitbekommt.
Also - genau so sehe ich das auch. Denn wenn Windows einmal gebootet
hat, dann wird eine serielle Maus eigentlich nicht mehr erkannt. Ich hab
ja schon ne serielle Maus, welche auch nur beim Booten erkannt wird.
Vielleicht hab ich auch was am Protokoll falsch gemacht...
Eine serielle Maus "zwangsweise" kann ich nicht installieren, da das
entsprechende Gerät nicht im Geräte Manager auftaucht und ich es auch
nicht in der HW-Datenbank finde...
Den µC kann ich nicht anders anschließen. Ich verwende keinen
USB-seriell Adapter, sondern der Controller hat einen USB Chip onBoard,
welcher nur serielle Kommunikation als COM-Emulation untersützt. Dh das
ist die einzige Möglichkeit.
Schnapphase wrote:
> Ich hab> ja schon ne serielle Maus, welche auch nur beim Booten erkannt wird.
Das ist klar, denn Windows fragt jeden Port nur ab, wenn er
initialisiert wird.
Häng mal die Maus an einen USB-RS232 Adapter und steck den ein, dann
wird die Maus auch während des Betriebs erkannt.
> Vielleicht hab ich auch was am Protokoll falsch gemacht...
Zeig doch mal deine Software, bzw. einen Mitschnitt aus den Daten die du
sendest.
> Den µC kann ich nicht anders anschließen. Ich verwende keinen> USB-seriell Adapter, sondern der Controller hat einen USB Chip onBoard,> welcher nur serielle Kommunikation als COM-Emulation untersützt. Dh das> ist die einzige Möglichkeit.
Sendest du direkt nach dem Aufbau der USB Verbindung los? Das ist der
wichtigste Punkt, damit das ganze funktioniert.
PS: Ich habs mal ausprobiert: Es funktioniert so wie ich es geschrieben
habe: Serielle Maus an einem FT232, angesteckt: Maus funktioniert.
Eine Maus sendet direkt nach dem Anlegen der Spannung ein 'M'.
Vielleicht ist das auch notwendig, damit Windows diese erkennt.
>Wie stelle ich es nun an, dass mein Board, welches am USB Port hängt und>einen COM emuliert, als serielle Maus erkannt wird?
vielleicht werden beim booten erst die COMs abgefragt und später die USB
Treiber geladen.
Mögliche Fehlerquellen:
- Maus sendet kein "M" nach dem Anlegen der Spannung
- USB-Gerät ist ein CDC und keine normale USB-Seriell-Bridge wie
es ein FTDI-Chip und Konsorten ist. Das erkennt man daran, daß
kein spezieller Devicetreiber installiert werden muss, sondern
nur eine *.inf-Datei.
> Ich habs mal ausprobiert: Es funktioniert so wie ich es geschrieben> habe: Serielle Maus an einem FT232, angesteckt: Maus funktioniert.> Eine Maus sendet direkt nach dem Anlegen der Spannung ein 'M'.> Vielleicht ist das auch notwendig, damit Windows diese erkennt.
Hast du auch auf die Baudrateneinstellung achten müssen? Also ich habe
jetzt 1200 Baud, 7 Bit Daten, 1 Stopbit.
Das PRogramm sieht jetzt so aus, dass ich einfach in einer
while-Schleife ständig 'M' Bytes sende, damit ich sicher bin, dass der
Iinit klappt.
Per Interrupt (Druck auf einen Button) soll ein Linksklich ausgelöst
werden.
Code:
> USB-Gerät ist ein CDC und keine normale USB-Seriell-Bridge wie> es ein FTDI-Chip und Konsorten ist. Das erkennt man daran, daß> kein spezieller Devicetreiber installiert werden muss, sondern> nur eine *.inf-Datei.
Also mein Treiber für WinXP ist wirklich nur eine inf-Datei. Das heißt,
das was ich vorhabe, geht garnicht?
Schnapphase wrote:
> Hast du auch auf die Baudrateneinstellung achten müssen? Also ich habe> jetzt 1200 Baud, 7 Bit Daten, 1 Stopbit.
Keine Ahnung ob das wirklich notwendig ist. Windows stellt die Parameter
schon passend ein.
> Das PRogramm sieht jetzt so aus, dass ich einfach in einer> while-Schleife ständig 'M' Bytes sende, damit ich sicher bin, dass der> Iinit klappt.
Sende nur 1x das M, das sollte reichen. Keine Ahnung wie Windows
reagiert wenn es dauerhaft nur Ms empfängt.
Kannst du den Status von RTS abfragen? Dieser wird auf 12V, also auf
logisch 0 gesetzt um die Maus zu versorgen.
Dies könnte man als Startbedingung für das Senden vom M hernehmen.
Aber ansonsten würdest du sagen, dass meine kurze Implementierung
erstmal stimmt? Also zB die 3 Bytes in der Interrupt Routine - die
sollten doch schon einen Linkskllick erzeugen?
Ja, es sollte funktionieren.
Teste das ganze mal mit hterm oder einem anderen Programm: Da müsste
nach dem Verbinden ein M kommen und danach die Tastendrücke.
> Teste das ganze mal mit hterm oder einem anderen Programm:
Jo, das mach ich ja schon die ganze Zeit ;) Also das funktioniert alles
bestens. Ich hab jetzt noch ein bissel gegoogelt und es scheint so, als
würde der USB Controller keine seriellen Mäuse untersützen:
"Notes for the TUSB3410UART: The provided driver will not support a
legacy serial mouse." Quelle:
http://focus.ti.com/lit/an/slla118/slla118.pdf
Hat das was mit diesem CDC zu tun? Ich hab mal den entsprechenden
Wikipedia Artikel gelesen, aber so recht verstehe ich das noch nicht -
kann da jmd vll noch was dazu sagen? ;)
Ähm und... Wie siehtn das aus mit HID? Das wäre natürlich auch klasse,
wenn ich das mit dem 3410 hinkriege! Bei TI gibts da sogar irgendwo ein
Code Sample, aber da komm ich nich ran...
> Hat das was mit diesem CDC zu tun? Ich hab mal den entsprechenden> Wikipedia Artikel gelesen, aber so recht verstehe ich das noch nicht -> kann da jmd vll noch was dazu sagen? ;)
CDC ist eine USB-Geräteklasse für "communication devices", gemeint sind
damit z.B. Modems. Diese werden von Windows im Prinzip mit einem zu
Windows gehörenden Treiber unterstützt, so wie das auch bei anderen
USB-Geräteklassen (HID, MSD etc.) der Fall ist.
Allerdings wende Windows den eigenen CDC-Treiber nur dann an, wenn bei
der Installation eines CDC-Gerätes eine passende *.inf-Datei zur
Verfügung gestellt ist. Was und womit die Windows-Entwicklicher sich
dabei gedacht haben, entzieht sich nicht nur meiner Kenntnis.
So ein CDC verhält sich nach der Installation so wie eine serielle
Schnittstelle; es gibt aber auch USB-Seriell-Bridges, die nicht auf die
Windows-eigenen Devicetreiber zurückgreifen, und auch nicht das
CDC-Protokoll implementieren.
Diese stellen dann eine "vollständige" serielle Schnittstelle zur
Verfügung (mit den USB-typischen Eigenheiten), an der auch die
Windows-eigenen Plug&Play-Erkennung von seriellen Geräten wie Mäusen
funktioniert.
Vielen Dank an alle bis hierhin.
Ich hatte jetzt noch eine Idee: Ich versuche, den Windows Treiber, der
für den USB Chip mitgeliefert wurde, so zu modifizieren, dass er den
Standardtreiber für serielle Mäuse liefert. Denn eigentlich verhält sich
mein µC ja wie eine serielle Maus. Mal schauen, was da rauskommt.