Commit 531a1cc6 authored by Benjamin Tissoires's avatar Benjamin Tissoires
Browse files

HID: bpf: Added updated Kamvas Pro 19 descriptor

This adds an updated HID descriptor for the Huion Kamvas Pro 19 that is
present on newer firmware revisions, while also trying to keep
compat with the older versions.

Link: https://gitlab.freedesktop.org/libevdev/udev-hid-bpf/-/merge_requests/164


Signed-off-by: default avatarAki Van Ness <aki@lethalbit.net>
Acked-by: default avatarJiri Kosina <jkosina@suse.com>
Link: https://patch.msgid.link/20250207-bpf-import-2025-02-07-v1-3-6048fdd5a206@kernel.org


Signed-off-by: default avatarBenjamin Tissoires <bentiss@kernel.org>
parent 43db1911
Loading
Loading
Loading
Loading
+71 −4
Original line number Diff line number Diff line
@@ -41,7 +41,7 @@ static const __u8 fixed_rdesc[] = {
	0x15, 0x00,                    //   Logical Minimum (0)               22
	0x25, 0x01,                    //   Logical Maximum (1)               24
	0x75, 0x01,                    //   Report Size (1)                   26
	0x95, 0x05,                    //   Report Count (5)                  28 /* changed (was 5) */
	0x95, 0x05,                    //   Report Count (5)                  28 /* changed (was 6) */
	0x81, 0x02,                    //   Input (Data,Var,Abs)              30
	0x05, 0x09,                    //   Usage Page (Button)                  /* inserted */
	0x09, 0x4a,                    //   Usage (0x4a)                         /* inserted to be translated as input usage 0x149: BTN_STYLUS3 */
@@ -189,8 +189,68 @@ static const __u8 fixed_rdesc[] = {
	0x96, 0x00, 0x01,              //  Report Count (256)                 322
	0xb1, 0x02,                    //  Feature (Data,Var,Abs)             325
	0xc0,                          // End Collection                      327
	/* New in Firmware Version: HUION_M220_240524 */
	0x05, 0x01,                    // Usage Page (Generic Desktop)            328
	0x09, 0x01,                    // Usage (Pointer)                         330
	0xa1, 0x01,                    // Collection (Application)                332
	0x09, 0x01,                    //   Usage (Pointer)                       334
	0xa1, 0x00,                    //   Collection (Physical)                 336
	0x05, 0x09,                    //     Usage Page (Button)                 338
	0x19, 0x01,                    //     UsageMinimum (1)                    340
	0x29, 0x03,                    //     UsageMaximum (3)                    342
	0x15, 0x00,                    //     Logical Minimum (0)                 344
	0x25, 0x01,                    //     Logical Maximum (1)                 346
	0x85, 0x02,                    //     Report ID (2)                       348
	0x95, 0x03,                    //     Report Count (3)                    350
	0x75, 0x01,                    //     Report Size (1)                     352
	0x81, 0x02,                    //     Input (Data,Var,Abs)                354
	0x95, 0x01,                    //     Report Count (1)                    356
	0x75, 0x05,                    //     Report Size (5)                     358
	0x81, 0x01,                    //     Input (Cnst,Arr,Abs)                360
	0x05, 0x01,                    //     Usage Page (Generic Desktop)        362
	0x09, 0x30,                    //     Usage (X)                           364
	0x09, 0x31,                    //     Usage (Y)                           366
	0x15, 0x81,                    //     Logical Minimum (-127)              368
	0x25, 0x7f,                    //     Logical Maximum (127)               370
	0x75, 0x08,                    //     Report Size (8)                     372
	0x95, 0x02,                    //     Report Count (2)                    374
	0x81, 0x06,                    //     Input (Data,Var,Rel)                376
	0x95, 0x04,                    //     Report Count (4)                    378
	0x75, 0x08,                    //     Report Size (8)                     380
	0x81, 0x01,                    //     Input (Cnst,Arr,Abs)                382
	0xc0,                          //   End Collection                        384
	0xc0,                          // End Collection                          385
	0x05, 0x0d,                    // Usage Page (Digitizers)                 386
	0x09, 0x05,                    // Usage (Touch Pad)                       388
	0xa1, 0x01,                    // Collection (Application)                390
	0x06, 0x00, 0xff,              //   Usage Page (Vendor Defined Page FF00) 392
	0x09, 0x0c,                    //   Usage (Vendor Usage 0x0c)             395
	0x15, 0x00,                    //   Logical Minimum (0)                   397
	0x26, 0xff, 0x00,              //   Logical Maximum (255)                 399
	0x75, 0x08,                    //   Report Size (8)                       402
	0x95, 0x10,                    //   Report Count (16)                     404
	0x85, 0x3f,                    //   Report ID (63)                        406
	0x81, 0x22,                    //   Input (Data,Var,Abs,NoPref)           408
	0xc0,                          // End Collection                          410
	0x06, 0x00, 0xff,              // Usage Page (Vendor Defined Page FF00)   411
	0x09, 0x0c,                    // Usage (Vendor Usage 0x0c)               414
	0xa1, 0x01,                    // Collection (Application)                416
	0x06, 0x00, 0xff,              //   Usage Page (Vendor Defined Page FF00) 418
	0x09, 0x0c,                    //   Usage (Vendor Usage 0x0c)             421
	0x15, 0x00,                    //   Logical Minimum (0)                   423
	0x26, 0xff, 0x00,              //   Logical Maximum (255)                 425
	0x85, 0x44,                    //   Report ID (68)                        428
	0x75, 0x08,                    //   Report Size (8)                       430
	0x96, 0x6b, 0x05,              //   Report Count (1387)                   432
	0x81, 0x00,                    //   Input (Data,Arr,Abs)                  435
	0xc0,                          // End Collection                          437
};

#define PRE_240524_RDESC_SIZE 328
#define PRE_240524_RDESC_FIXED_SIZE 338 /* The original bits of the descriptor */
#define FW_240524_RDESC_SIZE 438
#define FW_240524_RDESC_FIXED_SIZE sizeof(fixed_rdesc)

SEC(HID_BPF_RDESC_FIXUP)
int BPF_PROG(hid_fix_rdesc_huion_kamvas_pro_19, struct hid_bpf_ctx *hctx)
{
@@ -199,11 +259,16 @@ int BPF_PROG(hid_fix_rdesc_huion_kamvas_pro_19, struct hid_bpf_ctx *hctx)
	if (!data)
		return 0; /* EPERM check */

	__builtin_memcpy(data, fixed_rdesc, sizeof(fixed_rdesc));

	if (hctx->size == FW_240524_RDESC_SIZE) {
		__builtin_memcpy(data, fixed_rdesc, FW_240524_RDESC_FIXED_SIZE);
		return sizeof(fixed_rdesc);
	}

	__builtin_memcpy(data, fixed_rdesc, PRE_240524_RDESC_FIXED_SIZE);

	return PRE_240524_RDESC_FIXED_SIZE;
}

/*
 * This tablet reports the 3rd button through invert, but this conflict
 * with the normal eraser mode.
@@ -263,7 +328,9 @@ HID_BPF_OPS(huion_Kamvas_pro_19) = {
SEC("syscall")
int probe(struct hid_bpf_probe_args *ctx)
{
	ctx->retval = ctx->rdesc_size != 328;

	ctx->retval = !((ctx->rdesc_size == PRE_240524_RDESC_SIZE) ||
			(ctx->rdesc_size == FW_240524_RDESC_SIZE));
	if (ctx->retval)
		ctx->retval = -EINVAL;