www.mikrocontroller.net

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


Autor: Schnapphase (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?titl...

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.

Autor: morph1 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Guido Körber (Gast)
Datum:

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

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Schnapphase (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Löter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Schnapphase (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
void main()
{
    while(1)
    {
      halUsbSendChar(0x4D);  // 'M'
        }
}

ButtonInterrupt(void)
{     
  buttonPressed=REG_BUTT;
  
  if (buttonPressed == BUTTON_S1)
  {
    
    halUsbSendChar(0x60); // Linksklick
    halUsbSendChar(0x00);     
    halUsbSendChar(0x00); 
  }
}

Autor: Schnapphase (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Schnapphase (Gast)
Datum:

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

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Schnapphase (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Schnapphase (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Schnapphase (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.