Logitech G400 Maus DPI setzen unter Linux

Seit einiger Zeit gibt es einiges was man unter Linux spielen kann. Möchte man hier eine hohe Präzision beim Spielen erreichen ist es notwendig, das die Maus immer mit der selben DPI Zahl eingestellt ist. Da es unter Linux aber keinen Treiber für die Logitech Mäuse gibt muss man von Hand, über die beim Mausrad platzierten Taster, dafür sorgen das diese eingestellt wird.

Dadurch wird leider verhindert das man diese Tasten mit eigenen Funktionen belegt, zudem kann man es auch einfach manchmal vergessen, und merkt es erst beim Spielen. Um nun sicherzustellen das diese aber immer gleich ist, ohne das man diese von Hand einstellt, muss ein kleines Tool kompiliert und beim starten ausgeführt werden.

Source

Den Quellcode habe ich auf der Suche nach einer Lösung auf Pastebin gefunden und angepasst(siehe Quellen). Das Tool ermöglicht die Maus auf die der Logitech G400 Mouse möglichen DPI Werte einzustellen (400 800 1800 3600). Ob das Tool mit der Angeschlossen Maus funktionieren kann, wird ermittelt, indem man 'lsusb' aufruft.

thomas@quad:~/devel/mouse_g400$ lsusb 
Bus 002 Device 002: ID 8087:8001 Intel Corp. 
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 002: ID 8087:8009 Intel Corp. 
Bus 003 Device 003: ID 046d:c245 Logitech, Inc. G400 Optical Mouse
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

Die Vendor:Product ID "046d:c245" ist die im Tool eingestellte kombination, über welche das USB-Gerät (in diesem Fall die Maus) angesprochen wird.

// Simple hack to change dpi on Logitech G400
// G400 only support: 400, 800, 1800 and 3600 dpi,
// all other are interpolate by software
// compile with: gcc -o g400_hack h400_hack.c -lusb-1.0 
//
// Based on http://pastebin.com/zK8jH2A1
// Based on g400_hack from Przemek Aksamit 
// https://bitbucket.org/extaliones/g400_hack/src

#include <stdio.h>
#include <stdlib.h>
#include <libusb-1.0/libusb.h>

#define G400_VENDOR_ID  0x046d
#define G400_PRODUCT_ID 0xc245

libusb_context *ctx = NULL;
libusb_device_handle *handle = NULL;

int detached = 0;
int claimed  = 0;

void clean_exit(char* error);

int main(int argc, char **argv)
{
    if (argc != 2 || argv[1][0] != '-') {
        printf("Avaliable options: -400 -800 -1800 -3600\n");
        return 1;
    }

    char x = argv[1][1];

    // 0 => 400dpi, 1 => 800dpi, 2 => 1800dpi, 3 => 3600dpi
    int dpi_idx = x == '4' ? 0 : x == '8' ? 1 : x == '1' ? 2 : 3;

    libusb_device_handle *handle = NULL;
    libusb_context *ctx = NULL;

    libusb_init(&ctx);

    handle = libusb_open_device_with_vid_pid(ctx, G400_VENDOR_ID, G400_PRODUCT_ID);
    if (!handle) {
        clean_exit("Logitech G400 not found! (you have usb rights? try with sudo?)\n");
    }

    if (libusb_kernel_driver_active(handle, 1) == 1) {
        if (libusb_detach_kernel_driver(handle, 1) != 0) {
            clean_exit("Can't detach kernel driver.\n"); 
        }
        detached = 1;
    }

    if (libusb_claim_interface(handle, 1) != 0) {
        clean_exit("Failed to claim interface.");
    }

    claimed = 1;
    char data[] = {0x8e, 0x03 + dpi_idx}; 
    
    int r;
    r = libusb_control_transfer (handle, 0x21, 9, 0x038e, 1, &data[0], 2, 1000);
   
    //0x21 => USB_ENDPOINT_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE
    if (r < 0) {
        clean_exit("Error writing to USB device");
    }
    printf ("Bytes send %i\n", r);
    clean_exit("Finished");
}

void clean_exit(char* msg)
{
    printf("%s\n", msg);
    if (claimed) {
        libusb_release_interface(handle, 1);
    }

    if (detached) {
        libusb_attach_kernel_driver(handle, 1);
    }

    libusb_close(handle);
    libusb_exit(ctx);

    exit(0);
}

Tool kompilieren

Den Quellcode des Tools herunterladen und mittels 'gcc -o g400_hack h400_hack.c -lusb-1.0' kompilieren. Dazu muss man das 'libusb-1.0-0-dev' Paket installiert haben.

sudo apt-get install libusb-1.0-0-dev
mkdir g400
cd g400
wget "http://notdefine.de/g400_hack.c"
gcc -o g400_hack h400_hack.c -lusb-1.0

DPI beim starten setzen

Um zum Beispiel die Maus auf 800 DPI zu setzen wird das Tool wie folgt aufgerufen:

sudo ./g400_hack -800

Diese wollen wir nun direkt beim Bootvorgang erledigen, dazu tragen wir das Tool in die '/etc/rc.local' ein. Somit wird der Befehl beim starten als Root aufgerufen. Hier ein Beispiel wie diese Datei bei mir aussieht, der Pfad zum Tool ist anzupassen

#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#                                                                                                                                                                                                                                            
# By default this script does nothing.                                                                                                                                                                                                       
                                                                                                                                                                                                                                             
# maus auf 800dpi                                                                                                                                                                                                                            
/home/thomas/devel/mouse_g400/g400_hack -800                                                                                                                                                                                                 
                                                                                                                                                                                                                                             
exit 0         

Quellen

Last Change: 01-Sep-2017 03:26

Kontakt und Infos zur Person: Thomas Eimers