finally works!

This commit is contained in:
2026-07-29 20:13:13 +02:00
parent 1ce65ddd1e
commit 3ce1866b36
4 changed files with 38 additions and 15 deletions
+3
View File
@@ -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
+6 -5
View File
@@ -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
View File
@@ -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
View File
@@ -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);