From 425c27b5e3c4fa5c8797227f231399f76a37df21 Mon Sep 17 00:00:00 2001 From: proller Date: Wed, 29 Apr 2026 15:46:57 +0200 Subject: [PATCH 1/3] allow to define media keys --- hid-minikb-libusb.c | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/hid-minikb-libusb.c b/hid-minikb-libusb.c index bd2dc1a..c5d6ba5 100644 --- a/hid-minikb-libusb.c +++ b/hid-minikb-libusb.c @@ -13,6 +13,9 @@ #define KNOB_1_PRESS 0x0e #define KNOB_1_RIGHT 0x0f +#define MEDIA_PLAYPAUSE 0x00cd +#define MEDIA_MUTE 0x00e2 + #define CHECK(x, ...) if ((x)) errx(x, __VA_ARGS__) void send(struct libusb_device_handle* dh, unsigned char data[], int length) { @@ -42,6 +45,20 @@ 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); +} + int main(int argc, char* argv[]) { int err; @@ -63,10 +80,10 @@ int main(int argc, char* argv[]) { // 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_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; From 7f5f448dcac7fae9384f1184b8aad9d565ac93dd Mon Sep 17 00:00:00 2001 From: proller Date: Wed, 29 Apr 2026 16:33:26 +0200 Subject: [PATCH 2/3] Add led api --- hid-minikb-libusb.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/hid-minikb-libusb.c b/hid-minikb-libusb.c index c5d6ba5..84cce25 100644 --- a/hid-minikb-libusb.c +++ b/hid-minikb-libusb.c @@ -16,6 +16,15 @@ #define MEDIA_PLAYPAUSE 0x00cd #define MEDIA_MUTE 0x00e2 +#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) { @@ -59,6 +68,15 @@ void set_media_key(struct libusb_device_handle* dh, unsigned char button, unsign 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; @@ -78,6 +96,7 @@ int main(int argc, char* argv[]) { printf("connected\n"); // Modify these lines to your taste + // set_led(dh, LED_MODE_STEADY); set_key(dh, BUTTON_1, KEY_F13); set_key(dh, BUTTON_2, KEY_F14); set_media_key(dh, BUTTON_3, MEDIA_PLAYPAUSE); From 3f66c6edeb0aa77e80e0e9eb1c4ddd8ab270ee6e Mon Sep 17 00:00:00 2001 From: proller Date: Wed, 29 Apr 2026 16:38:47 +0200 Subject: [PATCH 3/3] more keys --- hid-minikb-libusb.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/hid-minikb-libusb.c b/hid-minikb-libusb.c index 84cce25..1a55ae5 100644 --- a/hid-minikb-libusb.c +++ b/hid-minikb-libusb.c @@ -13,8 +13,20 @@ #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 @@ -97,8 +109,8 @@ int main(int argc, char* argv[]) { // Modify these lines to your taste // set_led(dh, LED_MODE_STEADY); - set_key(dh, BUTTON_1, KEY_F13); - set_key(dh, BUTTON_2, KEY_F14); + 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);