OSDN Git Service

HID: uclogic: Support faking Wacom pad device ID
authorNikolai Kondrashov <spbnick@gmail.com>
Sun, 10 Feb 2019 10:14:03 +0000 (12:14 +0200)
committerBenjamin Tissoires <benjamin.tissoires@redhat.com>
Thu, 21 Feb 2019 11:00:54 +0000 (12:00 +0100)
Add support for inserting a Wacom pad device ID into hid-uclogic
reports. This allows reporting dial inputs in a way compatible with the
Wacom driver. Needed for Ugee G5 support in particular.

Signed-off-by: Nikolai Kondrashov <spbnick@gmail.com>
Signed-off-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>
drivers/hid/hid-uclogic-core.c
drivers/hid/hid-uclogic-params.h

index e4324ad..f5fb612 100644 (file)
@@ -300,6 +300,16 @@ static int uclogic_raw_event(struct hid_device *hdev,
                }
        }
 
+       /* Tweak frame control reports, if necessary */
+       if ((report->type == HID_INPUT_REPORT) &&
+           (report->id == params->frame.id)) {
+               /* If need to, and can, set pad device ID for Wacom drivers */
+               if (params->frame.dev_id_byte > 0 &&
+                   params->frame.dev_id_byte < size) {
+                       data[params->frame.dev_id_byte] = 0xf;
+               }
+       }
+
        return 0;
 }
 
index 1060f70..4ba6ecc 100644 (file)
@@ -87,6 +87,13 @@ struct uclogic_params_frame {
         * Report ID, if reports should be tweaked, zero if not.
         */
        unsigned int id;
+       /*
+        * Offset of the Wacom-style device ID byte in the report, to be set
+        * to pad device ID (0xf), for compatibility with Wacom drivers. Zero
+        * if no changes to the report should be made. Only valid if "id" is
+        * not zero.
+        */
+       unsigned int dev_id_byte;
 };
 
 /*
@@ -161,6 +168,7 @@ extern int uclogic_params_init(struct uclogic_params *params,
                ".frame.desc_ptr = %p\n"            \
                ".frame.desc_size = %u\n"           \
                ".frame.id = %u\n"                  \
+               ".frame.dev_id_byte = %u\n"         \
                ".pen_frame_flag = 0x%02x\n"
 
 /* Tablet interface parameters *printf format arguments */
@@ -177,6 +185,7 @@ extern int uclogic_params_init(struct uclogic_params *params,
                (_params)->frame.desc_ptr,                                  \
                (_params)->frame.desc_size,                                 \
                (_params)->frame.id,                                        \
+               (_params)->frame.dev_id_byte,                               \
                (_params)->pen_frame_flag
 
 /* Get a replacement report descriptor for a tablet's interface. */