Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
60 changes: 54 additions & 6 deletions hid-minikb-libusb.c
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,30 @@
#define KNOB_1_PRESS 0x0e
#define KNOB_1_RIGHT 0x0f

#define MEDIA_NEXT 0x00b5
#define MEDIA_PREVIOUS 0x00b6
#define MEDIA_STOP 0x00b7
#define MEDIA_PLAYPAUSE 0x00cd
#define MEDIA_MUTE 0x00e2
#define MEDIA_VOLUMEUP 0x00e9
#define MEDIA_VOLUMEDOWN 0x00ea
#define MEDIA_FAVORITES 0x0182
#define MEDIA_CALCULATOR 0x0192
#define MEDIA_SCREENLOCK 0x019e

#define MEDIA_NEXTSONG MEDIA_NEXT
#define MEDIA_PREVIOUSSONG MEDIA_PREVIOUS
#define MEDIA_PLAY MEDIA_PLAYPAUSE

#define LED_MODE_0 0x00
#define LED_MODE_1 0x01
#define LED_MODE_255 0xff

#define LED_MODE_OFF LED_MODE_0
#define LED_MODE_STEADY LED_MODE_1
#define LED_MODE_MIN LED_MODE_0
#define LED_MODE_MAX LED_MODE_255

#define CHECK(x, ...) if ((x)) errx(x, __VA_ARGS__)

void send(struct libusb_device_handle* dh, unsigned char data[], int length) {
Expand Down Expand Up @@ -42,6 +66,29 @@ void set_key(struct libusb_device_handle* dh, unsigned char button, unsigned cha
printf("set button %d to usb keycode %d\n", button, keycode);
}

void set_media_key(struct libusb_device_handle* dh, unsigned char button, unsigned short media_code) {
// Consumer/media usages use a different macro type than keyboard scan codes.

// "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);

send(dh, (unsigned char[]){0x03, button, 0x12, media_code & 0xff, media_code >> 8, 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);

// "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 media usage %d\n", button, media_code);
}

void set_led(struct libusb_device_handle* dh, unsigned char mode) {
// LED modes are firmware-specific. Mode 1 is known to be steady/on for this model family.
send(dh, (unsigned char[65]){0x03, 0xa1, 0x01}, 65);
send(dh, (unsigned char[65]){0x03, 0xb0, 0x18, mode}, 65);
send(dh, (unsigned char[65]){0x03, 0xaa, 0xa1}, 65);

printf("set led mode %d\n", mode);
}

int main(int argc, char* argv[]) {
int err;

Expand All @@ -61,12 +108,13 @@ int main(int argc, char* argv[]) {
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);
// set_led(dh, LED_MODE_STEADY);
set_media_key(dh, BUTTON_1, MEDIA_SCREENLOCK);
set_media_key(dh, BUTTON_2, MEDIA_NEXTSONG);
set_media_key(dh, BUTTON_3, MEDIA_PLAYPAUSE);
set_key(dh, KNOB_1_LEFT, KEY_VOLUMEDOWN);
set_media_key(dh, KNOB_1_PRESS, MEDIA_MUTE);
set_key(dh, KNOB_1_RIGHT, KEY_VOLUMEUP);

libusb_exit(NULL);
return 0;
Expand Down