-
Notifications
You must be signed in to change notification settings - Fork 1
/
hid-minikb-libusb.c
73 lines (57 loc) · 4.6 KB
/
hid-minikb-libusb.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#include <stdio.h>
#include <libusb-1.0/libusb.h>
#include <err.h>
#include "usb_hid_keys.h"
#define VENDOR_ID 0x1189
#define PRODUCT_ID 0x8890
#define BUTTON_1 0x01
#define BUTTON_2 0x02
#define BUTTON_3 0x03
#define KNOB_1_LEFT 0x0d
#define KNOB_1_PRESS 0x0e
#define KNOB_1_RIGHT 0x0f
#define CHECK(x, ...) if ((x)) errx(x, __VA_ARGS__)
void send(struct libusb_device_handle* dh, unsigned char data[], int length) {
int transferred = -1;
int err = libusb_interrupt_transfer(dh, /* endpoint = */ 0x02, data, length, &transferred, /* timeout = */ 0);
CHECK(err, "Error: interrupt data transfer failed: %s", libusb_strerror(err));
printf("transferred %d bytes\n", transferred);
}
void set_key(struct libusb_device_handle* dh, unsigned char button, unsigned char keycode) {
// This is the sequence that the windows softare sends when setting a button to a single keycode
// "Start"?
send(dh, (unsigned char[]){0x03, 0xa1, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, 65);
if (keycode == KEY_NONE) {
// This doesn't seem to work, even though it matches the sniffed trace. Oh well.
send(dh, (unsigned char[]){0x03, button, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, 65);
} else {
send(dh, (unsigned char[]){0x03, button, 0x11, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, 65);
send(dh, (unsigned char[]){0x03, button, 0x11, 0x01, 0x01, 0x00, keycode, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, 65);
}
// "End/Commit"?
send(dh, (unsigned char[]){0x03, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, 65);
printf("set button %d to usb keycode %d\n", button, keycode);
}
int main(int argc, char* argv[]) {
int err;
err = libusb_init(NULL); // NULL is the default libusb_context
CHECK(err, "Error: cannot initialize libusb: %s", libusb_strerror(err));
struct libusb_device_handle *dh = NULL; // The device handle
dh = libusb_open_device_with_vid_pid(NULL, VENDOR_ID, PRODUCT_ID);
CHECK(dh == NULL, "Error: cannot open usb device %04x:%04x", VENDOR_ID, PRODUCT_ID);
// Transfer the setup packet to the USB device
err = libusb_control_transfer(dh, /* bmReqType = */ 0, /* bReq = */ 0, /* wVal = */ 0, /* wIndex = */ 0, /* data = */ "", /* wLen = */ 0, /* timeout = */ 0);
CHECK(err, "Error: control transfer failed: %s", libusb_strerror(err));
// The windows software sends this when opened.
send(dh, (unsigned char[]){0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, 65);
printf("connected\n");
// Modify these lines to your taste
set_key(dh, BUTTON_1, KEY_F13);
set_key(dh, BUTTON_2, KEY_F14);
set_key(dh, BUTTON_3, KEY_F15);
set_key(dh, KNOB_1_LEFT, KEY_F16);
set_key(dh, KNOB_1_PRESS, KEY_F17);
set_key(dh, KNOB_1_RIGHT, KEY_F18);
libusb_exit(NULL);
return 0;
}