Forum: Mikrocontroller und Digitale Elektronik Serielle Maus mit µC emulieren


von Schnapphase (Gast)


Lesenswert?

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.

von morph1 (Gast)


Lesenswert?

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

von Benedikt K. (benedikt)


Lesenswert?

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.

von Guido Körber (Gast)


Lesenswert?

XP hat standardmäßig keine Treiber mehr für serielle Mäuse.

von Benedikt K. (benedikt)


Lesenswert?

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.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

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...

von Benedikt K. (benedikt)


Lesenswert?

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.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

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.

von Schnapphase (Gast)


Lesenswert?

> 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.

von Benedikt K. (benedikt)


Lesenswert?

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.

von Löter (Gast)


Lesenswert?

>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.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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.

von Schnapphase (Gast)


Lesenswert?

> 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
}

von Schnapphase (Gast)


Lesenswert?

> 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?

von Schnapphase (Gast)


Lesenswert?

Achso, der USB-Chip ums den's hier geht, ist ein TUSB3410.

von Benedikt K. (benedikt)


Lesenswert?

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.

von Schnapphase (Gast)


Lesenswert?

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?

von Benedikt K. (benedikt)


Lesenswert?

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.

von Schnapphase (Gast)


Lesenswert?

> 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...

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

> 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.

von Schnapphase (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.