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
Das hier dürfte das sein was du suchst: http://www.epanorama.net/documents/pc/mouse.html Das ist sogar sehr viel einfacher als PS2.
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:
1 | void main() |
2 | {
|
3 | while(1) |
4 | {
|
5 | halUsbSendChar(0x4D); // 'M' |
6 | }
|
7 | }
|
8 | |
9 | ButtonInterrupt(void) |
10 | {
|
11 | buttonPressed=REG_BUTT; |
12 | |
13 | if (buttonPressed == BUTTON_S1) |
14 | {
|
15 | |
16 | halUsbSendChar(0x60); // Linksklick |
17 | halUsbSendChar(0x00); |
18 | halUsbSendChar(0x00); |
19 | }
|
20 | }
|
> 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.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.