Serielle Maus mit µC emulieren

Gast #1220265
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.
Persönliche Seite #1220762
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...
#1220768
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.
Gast #1221055
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.
#1221067
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.
Gast #1221154
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
}
Gast #1221159
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?
#1221172
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.
Gast #1221293
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...
Persönliche Seite #1221481
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren