Forum: PC-Programmierung (HID) Gerät unter Linux ansteuern


von TNZS (Gast)


Lesenswert?

Wie geht man vor, um ein Gerät (via Systemtreiber) unter Linux 
anzusteuern?
Konkret geht es um ein Playstation 5 Gamepad namens "DualSense".
Das hat Bluetooth und USB. Beides funktioniert unter Linux.
Es hat Gimmicks wie LEDs, Touchpad (steuert Maus), 
Beschleunigungssensor, Vibration, Mikrofon und Lautsprecher (USB, aber 
scheint einen Vibrator/VCM anzusprechen, denn für Audio reicht es nicht) 
und wohl noch nicht unterstütztes Einstellen der Trigger-Kräfte 
(Force-Feedback).

Erstes Ziel wäre, es über das System auszulesen (Tasten, Achsen, Sensor, 
Touch) und anzusteuern (LED, Vibration).

Welche Möglichkeiten/Ebenen gibt es dazu heutzutage (habe vor 20 Jahren 
mal was mit 'nem USB-Gerät gemacht)?

Treiber
https://github.com/torvalds/linux/blob/master/drivers/hid/hid-playstation.c

Zwei Projekte habe ich gefunden:

C via Treiber (älter)
https://github.com/nowrep/dualsensectl/blob/main/main.c

Python / GUI via Gerätedateien
https://github.com/cow-killer/dualsense-led-configurator

von Émile (Gast)


Lesenswert?

TNZS schrieb:
> Wie geht man vor, um ein Gerät (via Systemtreiber) unter Linux
> anzusteuern?

Warum "Systemtreiber"? Es gibt libusb.

von TNZS (Gast)


Lesenswert?

Weil der "Systemtreiber" nicht nur die niedrigere USB-Ebene, sondern 
auch Bluetooth erledigt.

von Frank K. (fchk)


Lesenswert?

TNZS schrieb:
> Weil der "Systemtreiber" nicht nur die niedrigere USB-Ebene, sondern
> auch Bluetooth erledigt.

/dev/input/js* gibt Dir die Standardinfos (Buttons, Joysticks, ...) 
zurück.

fchk

von TNZS (Gast)


Lesenswert?

Frank K. schrieb:
> /dev/input/js* gibt Dir die Standardinfos (Buttons, Joysticks, ...)
> zurück.

Da tut sich was. Aber was ist das Format?

    cat /dev/input/js0
    T���T���T���T���T���T���T���T���T��T���  T���

von Rolf M. (rmagnus)


Lesenswert?


von TNZS (Gast)


Lesenswert?

Das hier hilft nicht wesentlich weiter:

#include <stdlib.h>
#include <stdio.h>

struct input_event {
  struct timeval time;
  unsigned short type;
  unsigned short code;
  unsigned int value;
};
1
int main(void) {
2
3
  FILE *fp;
4
5
  fp = fopen("/dev/input/js0", "rb");
6
  if(!fp) {
7
        perror("File opening failed");
8
        return EXIT_FAILURE;
9
    }
10
11
    while(1){
12
        struct input_event ie;
13
        size_t ret_code = fread(&ie, sizeof ie, 1, fp);
14
15
        printf("time:  %ld \ntype:  %u\ncode:  %u\nvalue: %u\n\n", ie.time, ie.type, ie.code, ie.value);
16
    }
17
18
  fclose(fp);
19
  
20
  return EXIT_SUCCESS;
21
}

von TNZS (Gast)


Lesenswert?


von Rolf M. (rmagnus)


Lesenswert?

TNZS schrieb:
> struct input_event {
>   struct timeval time;
>   unsigned short type;
>   unsigned short code;
>   unsigned int value;
> };

Das ist die Struktur für das evdev, nicht für das Joystick-Interface.
Ich würde außerdem nicht fopen() und fread() nehmen, sondern die 
POSIX-Funktionen.

von Εrnst B. (ernst)


Lesenswert?

Code wie du die Farben am Controller (über HID, bluetooth und USB) 
verstellst findest du z.B. hier:

https://gitlab.com/CalcProgrammer1/OpenRGB/-/blob/master/Controllers/SonyGamepadController/SonyDualSenseController.cpp

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.