drivers/hid/bpf/progs/XPPen__DecoMini4.bpf.c

Source file repositories/reference/linux-study-clean/drivers/hid/bpf/progs/XPPen__DecoMini4.bpf.c

File Facts

System
Linux kernel
Corpus path
drivers/hid/bpf/progs/XPPen__DecoMini4.bpf.c
Extension
.c
Size
9687 bytes
Lines
232
Domain
Driver Families
Bucket
drivers/hid
Inferred role
Driver Families: implementation source
Status
source implementation candidate

Why This File Exists

Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.

Dependency Surface

Detected Declarations

Annotated Snippet

// SPDX-License-Identifier: GPL-2.0-only
/* Copyright (c) 2024 José Expósito
 */

#include "vmlinux.h"
#include "hid_bpf.h"
#include "hid_bpf_helpers.h"
#include <bpf/bpf_tracing.h>

#define VID_UGEE	0x28BD
#define PID_DECO_MINI_4	0x0929
#define RDESC_SIZE_PAD	177
#define RDESC_SIZE_PEN	109
#define PAD_REPORT_ID	0x06

/*
 * XP-Pen devices return a descriptor with the values the driver should use when
 * one of its interfaces is queried. For this device the descriptor is:
 *
 * 0E 03 60 4F 88 3B 06 00 FF 1F D8 13
 *       ----- -----       ----- -----
 *         |     |           |     |
 *         |     |           |     `- Resolution: 5080 (13d8)
 *         |     |           `- Maximum pressure: 8191 (1FFF)
 *         |     `- Logical maximum Y: 15240 (3B88)
 *         `- Logical maximum X: 20320 (4F60)
 *
 * The physical maximum is calculated as (logical_max * 1000) / resolution.
 */
#define LOGICAL_MAX_X	0x60, 0x4F
#define LOGICAL_MAX_Y	0x88, 0x3B
#define PHYSICAL_MAX_X	0xA0, 0x0F
#define PHYSICAL_MAX_Y	0xB8, 0x0B
#define PRESSURE_MAX	0xFF, 0x1F

HID_BPF_CONFIG(
	HID_DEVICE(BUS_USB, HID_GROUP_GENERIC, VID_UGEE, PID_DECO_MINI_4)
);

/*
 * The tablet send these values when the pad buttons are pressed individually:
 *
 *   Buttons released: 06 00 00 00 00 00 00 00
 *   Button 1:         06 00 05 00 00 00 00 00 -> b
 *   Button 2:         06 00 08 00 00 00 00 00 -> e
 *   Button 3:         06 04 00 00 00 00 00 00 -> LAlt
 *   Button 4:         06 00 2c 00 00 00 00 00 -> Space
 *   Button 5:         06 01 16 00 00 00 00 00 -> LControl + s
 *   Button 6:         06 01 1d 00 00 00 00 00 -> LControl + z
 *
 * When multiple buttons are pressed at the same time, the values used to
 * identify the buttons are identical, but they appear in different bytes of the
 * record. For example, when button 2 (0x08) and button 1 (0x05) are pressed,
 * this is the report:
 *
 *   Buttons 2 and 1:  06 00 08 05 00 00 00 00 -> e + b
 *
 * Buttons 1, 2, 4, 5 and 6 can be matched by finding their values in the
 * report.
 *
 * Button 3 is pressed when the 3rd bit is 1. For example, pressing buttons 3
 * and 5 generates this report:
 *
 *   Buttons 3 and 5:  06 05 16 00 00 00 00 00 -> LControl + LAlt + s
 *                        -- --
 *                         |  |
 *                         |  `- Button 5 (0x16)
 *                         `- 0x05 = 0101. Button 3 is pressed
 *                                    ^
 *
 * pad_buttons contains a list of buttons that can be matched in
 * HID_BPF_DEVICE_EVENT. Button 3 as it has a dedicated bit.
 */
static const __u8 pad_buttons[] = { 0x05, 0x08, 0x00, 0x2C, 0x16, 0x1D };

static const __u8 fixed_pad_rdesc[] = {
	0x05, 0x01,           /*  Usage Page (Desktop),                   */
	0x09, 0x07,           /*  Usage (Keypad),                         */
	0xA1, 0x01,           /*  Collection (Application),               */
	0x85, 0x06,           /*      Report ID (6),                      */
	0x05, 0x0D,           /*      Usage Page (Digitizer),             */
	0x09, 0x39,           /*      Usage (Tablet Function Keys),       */
	0xA0,                 /*      Collection (Physical),              */
	0x05, 0x09,           /*          Usage Page (Button),            */
	0x75, 0x01,           /*          Report Size (1),                */
	0x95, 0x06,           /*          Report Count (6),               */
	0x19, 0x01,           /*          Usage Minimum (01h),            */
	0x29, 0x06,           /*          Usage Maximum (06h),            */
	0x14,                 /*          Logical Minimum (0),            */
	0x25, 0x01,           /*          Logical Maximum (1),            */

Annotation

Implementation Notes