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
TNZS schrieb: > Wie geht man vor, um ein Gerät (via Systemtreiber) unter Linux > anzusteuern? Warum "Systemtreiber"? Es gibt libusb.
Weil der "Systemtreiber" nicht nur die niedrigere USB-Ebene, sondern auch Bluetooth erledigt.
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
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���
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 | }
|
Hatte das hier gesehen: https://www.kernel.org/doc/Documentation/input/input.txt "Aktuelle" Docs hier: https://www.kernel.org/doc/html/latest/input/input.html https://docs.kernel.org/input/joydev/index.html
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.