Treiberentwicklung für JoyWarrior24 A8-16

Dies ist das deutsche Forum für alle Themen um den JoyWarrior. Beiträge bitte nur in Deutsch.

Moderator: Guido Körber

Post Reply
DanDanger
Posts: 2
Joined: Sun Sep 18, 2005 1:00 am

Treiberentwicklung für JoyWarrior24 A8-16

Post by DanDanger »

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
--------------------
DanDanger
Robert Marquardt
Posts: 543
Joined: Mon Dec 01, 2003 6:09 pm

Post by Robert Marquardt »

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.
Guido Körber
Site Admin
Posts: 2856
Joined: Tue Nov 25, 2003 10:25 pm
Location: Germany/Berlin
Contact:

Re: Treiberentwicklung für JoyWarrior24 A8-16

Post by Guido Körber »

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.).
Also die erste Frage ist leicht zu beantworten: Steht im Report Descriptor des Chips, wie bei jedem HID Gerät.

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.
DanDanger
Posts: 2
Joined: Sun Sep 18, 2005 1:00 am

Post by DanDanger »

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

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);

  (...)
Hat jemand ne' Idee, was hier falsch läuft ?

Neugierige Grüsse
DanDanger
--------------------
DanDanger
Post Reply