Hallo,
da wir in unserer Applikation mehrere "Eingabestreams" (also Joysticks, etc.)
über einen(!) JoyWarrior24 A8-16 laufen lassen, kommen wir um das
schreiben eines eigenen USB-HID-Treibers nicht drumherum.
Leider gibt das Datenblatt keine Auskünfte über das JW-Datenformat,
bzw. die Adressen der Speicherstellen (also z.B. an welchem OffSet welche Axen-Werte stehen, etc.).
Daher meine Frage :
Ist es möglich, an diese Informationen zu kommen ?
Neugierige Grüsse
DanDanger
Treiberentwicklung für JoyWarrior24 A8-16
Moderator: Guido Körber
Treiberentwicklung für JoyWarrior24 A8-16
--------------------
DanDanger
DanDanger
-
- Posts: 543
- Joined: Mon Dec 01, 2003 6:09 pm
Fuer den speziellen Fall unserer Joysticks laesst sich das leicht dokumentieren, aber es ist nicht wirklich notwendig.
Ich habe nochmal die DDK Dokumentation durchgelesen.
Alle HidP_-Funktionen des HID API sind auch im Kernel Mode aufrufbar.
Damit laesst sich der durch den Treiber laufende Report komplett analysieren, sprich man kann nach der Anzahl der vorhandenen Buttons und Achsen fragen und spezifisch herausbekommen welcher Button gedrueckt ist und welchen Wert eine Achse hat.
Die Probleme eines solchen Treibers liegen in der Konfigurierbarkeit. Windows ist da doch sehr stoerrisch.
Ich habe nochmal die DDK Dokumentation durchgelesen.
Alle HidP_-Funktionen des HID API sind auch im Kernel Mode aufrufbar.
Damit laesst sich der durch den Treiber laufende Report komplett analysieren, sprich man kann nach der Anzahl der vorhandenen Buttons und Achsen fragen und spezifisch herausbekommen welcher Button gedrueckt ist und welchen Wert eine Achse hat.
Die Probleme eines solchen Treibers liegen in der Konfigurierbarkeit. Windows ist da doch sehr stoerrisch.
-
- Site Admin
- Posts: 2856
- Joined: Tue Nov 25, 2003 10:25 pm
- Location: Germany/Berlin
- Contact:
Re: Treiberentwicklung für JoyWarrior24 A8-16
Also die erste Frage ist leicht zu beantworten: Steht im Report Descriptor des Chips, wie bei jedem HID Gerät.DanDanger wrote:Leider gibt das Datenblatt keine Auskünfte über das JW-Datenformat,
bzw. die Adressen der Speicherstellen (also z.B. an welchem OffSet welche Axen-Werte stehen, etc.).
Das ist ja gerade das schöne an HID: Die Geräte liefern die Beschreibung ihres Datenformates, so dass ein generischer Treiber praktisch alle möglichen Geräte bedienen kann.
Die zweite Frage ist falsch und kann nicht beantwortet werden. USB Geräte belegen keine Speicherstellen im Adressraum des Computers, genausowenig wie ein Fileserver im Adressraum der Client-Computer ist.
Jau,
danke für die Antworten
Ich komme halt aus der "Linux-Treiber-Ecke"
und Treiberentwicklung unter Windows ist (leider) komplett anders.
Ne' Frage hab' ich aber noch :
Nachdem das mit dem Auslesen der Werte geklärt ist, und auch die IOCTL's funktionieren, ist mein nächstes Problem, aus einem Device zwei zu machen.
Unser Treiber soll halt, wenn er geladen wird, zwei Devices (z.B. "Input_A" und "Input_B") anlegen.
In unserer "Driver_AddDevice"-Callback-Funktion
erstellen wir auch per "IoCreateDevice" 2 Instanzen, aber das lässt
Windows irgendwie kalt.....
Hat jemand ne' Idee, was hier falsch läuft ?
Neugierige Grüsse
DanDanger
danke für die Antworten
Ich komme halt aus der "Linux-Treiber-Ecke"
und Treiberentwicklung unter Windows ist (leider) komplett anders.
Ne' Frage hab' ich aber noch :
Nachdem das mit dem Auslesen der Werte geklärt ist, und auch die IOCTL's funktionieren, ist mein nächstes Problem, aus einem Device zwei zu machen.
Unser Treiber soll halt, wenn er geladen wird, zwei Devices (z.B. "Input_A" und "Input_B") anlegen.
In unserer "Driver_AddDevice"-Callback-Funktion
erstellen wir auch per "IoCreateDevice" 2 Instanzen, aber das lässt
Windows irgendwie kalt.....
Code: Select all
NTSTATUS EXTERNAL Driver_AddDevice (
IN PDRIVER_OBJECT DriverObject,
IN PDEVICE_OBJECT FunctionalDeviceObject
)
{
NTSTATUS ntStatus = STATUS_SUCCESS;
PDEVICE_OBJECT DeviceObject_A;
PDEVICE_OBJECT DeviceObject_B;
PDEVICE_OBJECT FDO_A ;
PDEVICE_OBJECT FDO_B ;
PDEVICE_EXTENSION DeviceExtension;
DeviceObject_A = DeviceObject_B = FunctionalDeviceObject;
DeviceExtension = GET_MINIDRIVER_DEVICE_EXTENSION (DeviceObject);
/* Part A */
ntStatus = IoCreateDevice(DriverObject_A,
sizeof(DeviceExtension), NULL, FILE_DEVICE_UNKNOWN,
FILE_DEVICE_SECURE_OPEN, FALSE, &FDO_A);
/* Part B */
ntStatus = IoCreateDevice(DriverObject_B,
sizeof(DeviceExtension), NULL, FILE_DEVICE_UNKNOWN,
FILE_DEVICE_SECURE_OPEN, FALSE, &FDO_B);
/* Attach */
IoAttachDeviceToDeviceStack(FDO_A, DeviceObject_A);
IoAttachDeviceToDeviceStack(FDO_B, DeviceObject_B);
(...)
Neugierige Grüsse
DanDanger
--------------------
DanDanger
DanDanger