diff --git a/hid-minikb-libusb.c b/hid-minikb-libusb.c index bd2dc1a..1a55ae5 100644 --- a/hid-minikb-libusb.c +++ b/hid-minikb-libusb.c @@ -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) { @@ -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; @@ -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;