finally works!
This commit is contained in:
@@ -1,3 +1,6 @@
|
|||||||
|
> [!NOTE]
|
||||||
|
> work in progress, but works!
|
||||||
|
|
||||||
## K1NG-Driver
|
## K1NG-Driver
|
||||||
|
|
||||||
a driver for K1NG PRO (4K) mouse from redragon
|
a driver for K1NG PRO (4K) mouse from redragon
|
||||||
|
|||||||
@@ -2,22 +2,23 @@
|
|||||||
#include "src/driver.h"
|
#include "src/driver.h"
|
||||||
|
|
||||||
int main(int argc, char *argv[]) {
|
int main(int argc, char *argv[]) {
|
||||||
int level;
|
int sens;
|
||||||
|
|
||||||
printf("K1NG PRO (4k) driver | Cli\n");
|
printf("K1NG PRO (4k) driver | Cli\n");
|
||||||
printf("set any sens from 50-26000\n\n");
|
printf("set any sens from 50-26000\n\n");
|
||||||
|
printf("rememeber to set an value like in original software so for example `50 + 50 = 100` or `100 + 50 = 150` u get the point it goes up by 50\n\n");
|
||||||
|
|
||||||
if (argc < 2) {
|
if (argc < 2) {
|
||||||
printf("set sensitivity to: ");
|
printf("set sensitivity to: ");
|
||||||
if (scanf("%d", &level) != 1) {
|
if (scanf("%d", &sens) != 1) {
|
||||||
printf("u forgot to input a number?\n");
|
printf("u forgot to input a number?\n");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
level = atoi(argv[1]);
|
sens = atoi(argv[1]);
|
||||||
printf("set sensitivity to: %d\n", level);
|
printf("set sensitivity to: %d\n", sens);
|
||||||
}
|
}
|
||||||
|
|
||||||
run_driver(level);
|
run_driver(sens);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
+26
-7
@@ -1,15 +1,12 @@
|
|||||||
#ifndef DATA_H
|
#include "data.h"
|
||||||
#define DATA_H
|
#include <string.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
struct dpi_payload {
|
struct dpi_payload {
|
||||||
int level;
|
int level;
|
||||||
unsigned char buf[17];
|
unsigned char buf[17];
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
|
||||||
all possible sens values
|
|
||||||
reverse engineered from "goldgoldgold.pcapng"
|
|
||||||
*/
|
|
||||||
static const struct dpi_payload payload_table[] = {
|
static const struct dpi_payload payload_table[] = {
|
||||||
{50 , {0x08, 0x07, 0x00, 0x00, 0x0c, 0x04, 0x00, 0x00, 0x00, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe1}},
|
{50 , {0x08, 0x07, 0x00, 0x00, 0x0c, 0x04, 0x00, 0x00, 0x00, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe1}},
|
||||||
{100 , {0x08, 0x07, 0x00, 0x00, 0x0c, 0x04, 0x01, 0x01, 0x00, 0x53, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe1}},
|
{100 , {0x08, 0x07, 0x00, 0x00, 0x0c, 0x04, 0x01, 0x01, 0x00, 0x53, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe1}},
|
||||||
@@ -533,4 +530,26 @@ static const struct dpi_payload payload_table[] = {
|
|||||||
{26000, {0x08, 0x07, 0x00, 0x00, 0x0c, 0x04, 0x07, 0x07, 0x88, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe1}},
|
{26000, {0x08, 0x07, 0x00, 0x00, 0x0c, 0x04, 0x07, 0x07, 0x88, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe1}},
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
static const size_t payload_table_len = sizeof(payload_table) / sizeof(payload_table[0]);
|
||||||
|
|
||||||
|
void get_payload(int level, unsigned char *buf) {
|
||||||
|
if (level < payload_table[0].level) {
|
||||||
|
level = payload_table[0].level;
|
||||||
|
} else if (level > payload_table[payload_table_len - 1].level) {
|
||||||
|
level = payload_table[payload_table_len - 1].level;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t best = 0;
|
||||||
|
int best_diff = abs(level - payload_table[0].level);
|
||||||
|
|
||||||
|
for (size_t i = 1; i < payload_table_len; i++) {
|
||||||
|
int diff = level - payload_table[i].level;
|
||||||
|
if (diff < 0) diff = -diff;
|
||||||
|
if (diff < best_diff) {
|
||||||
|
best_diff = diff;
|
||||||
|
best = i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
memcpy(buf, payload_table[best].buf, sizeof(payload_table[best].buf));
|
||||||
|
}
|
||||||
|
|||||||
+3
-3
@@ -2,7 +2,7 @@
|
|||||||
#include "driver.h"
|
#include "driver.h"
|
||||||
#include "data.h"
|
#include "data.h"
|
||||||
|
|
||||||
void run_driver(int target_level) {
|
void run_driver(int sens) {
|
||||||
libusb_device_handle *handle = NULL;
|
libusb_device_handle *handle = NULL;
|
||||||
int r = libusb_init(NULL);
|
int r = libusb_init(NULL);
|
||||||
if (r < 0) {
|
if (r < 0) {
|
||||||
@@ -25,7 +25,7 @@ void run_driver(int target_level) {
|
|||||||
libusb_claim_interface(handle, 1);
|
libusb_claim_interface(handle, 1);
|
||||||
|
|
||||||
unsigned char payload[17];
|
unsigned char payload[17];
|
||||||
get_payload(target_level, payload);
|
get_payload(sens, payload);
|
||||||
|
|
||||||
int transferred = libusb_control_transfer(
|
int transferred = libusb_control_transfer(
|
||||||
handle,
|
handle,
|
||||||
@@ -41,7 +41,7 @@ void run_driver(int target_level) {
|
|||||||
if (transferred < 0) {
|
if (transferred < 0) {
|
||||||
fprintf(stderr, "byte transfer failed: %s\n", libusb_error_name(transferred));
|
fprintf(stderr, "byte transfer failed: %s\n", libusb_error_name(transferred));
|
||||||
} else {
|
} else {
|
||||||
printf("write succeed %d (%d bytes written)\n", target_level, transferred);
|
printf("write succeed %d (%d bytes written)\n", sens, transferred);
|
||||||
}
|
}
|
||||||
|
|
||||||
libusb_release_interface(handle, 1);
|
libusb_release_interface(handle, 1);
|
||||||
|
|||||||
Reference in New Issue
Block a user