lkml.org 
[lkml]   [2019]   [Dec]   [11]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 5.4 082/134] HID: Improve Windows Precision Touchpad detection.
    Date
    From: Blaž Hrastnik <blaz@mxxn.io>

    [ Upstream commit 2dbc6f113acd74c66b04bf49fb027efd830b1c5a ]

    Per Microsoft spec, usage 0xC5 (page 0xFF) returns a blob containing
    data used to verify the touchpad as a Windows Precision Touchpad.

    0x85, REPORTID_PTPHQA, // REPORT_ID (PTPHQA)
    0x09, 0xC5, // USAGE (Vendor Usage 0xC5)
    0x15, 0x00, // LOGICAL_MINIMUM (0)
    0x26, 0xff, 0x00, // LOGICAL_MAXIMUM (0xff)
    0x75, 0x08, // REPORT_SIZE (8)
    0x96, 0x00, 0x01, // REPORT_COUNT (0x100 (256))
    0xb1, 0x02, // FEATURE (Data,Var,Abs)

    However, some devices, namely Microsoft's Surface line of products
    instead implement a "segmented device certification report" (usage 0xC6)
    which returns the same report, but in smaller chunks.

    0x06, 0x00, 0xff, // USAGE_PAGE (Vendor Defined)
    0x85, REPORTID_PTPHQA, // REPORT_ID (PTPHQA)
    0x09, 0xC6, // USAGE (Vendor usage for segment #)
    0x25, 0x08, // LOGICAL_MAXIMUM (8)
    0x75, 0x08, // REPORT_SIZE (8)
    0x95, 0x01, // REPORT_COUNT (1)
    0xb1, 0x02, // FEATURE (Data,Var,Abs)
    0x09, 0xC7, // USAGE (Vendor Usage)
    0x26, 0xff, 0x00, // LOGICAL_MAXIMUM (0xff)
    0x95, 0x20, // REPORT_COUNT (32)
    0xb1, 0x02, // FEATURE (Data,Var,Abs)

    By expanding Win8 touchpad detection to also look for the segmented
    report, all Surface touchpads are now properly recognized by
    hid-multitouch.

    Signed-off-by: Blaž Hrastnik <blaz@mxxn.io>
    Signed-off-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/hid/hid-core.c | 4 ++++
    1 file changed, 4 insertions(+)

    diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c
    index 2fa3587d974f4..e0b241bd3070c 100644
    --- a/drivers/hid/hid-core.c
    +++ b/drivers/hid/hid-core.c
    @@ -781,6 +781,10 @@ static void hid_scan_feature_usage(struct hid_parser *parser, u32 usage)
    if (usage == 0xff0000c5 && parser->global.report_count == 256 &&
    parser->global.report_size == 8)
    parser->scan_flags |= HID_SCAN_FLAG_MT_WIN_8;
    +
    + if (usage == 0xff0000c6 && parser->global.report_count == 1 &&
    + parser->global.report_size == 8)
    + parser->scan_flags |= HID_SCAN_FLAG_MT_WIN_8;
    }

    static void hid_scan_collection(struct hid_parser *parser, unsigned type)
    --
    2.20.1
    \
     
     \ /
      Last update: 2019-12-11 16:14    [W:4.149 / U:0.004 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site