162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * HID driver for Keytouch devices not fully compliant with HID standard 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (c) 2011 Jiri Kosina 662306a36Sopenharmony_ci */ 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci/* 962306a36Sopenharmony_ci */ 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci#include <linux/device.h> 1262306a36Sopenharmony_ci#include <linux/hid.h> 1362306a36Sopenharmony_ci#include <linux/module.h> 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ci#include "hid-ids.h" 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_ci/* Replace the broken report descriptor of this device with rather 1862306a36Sopenharmony_ci * a default one */ 1962306a36Sopenharmony_cistatic __u8 keytouch_fixed_rdesc[] = { 2062306a36Sopenharmony_ci0x05, 0x01, 0x09, 0x06, 0xa1, 0x01, 0x05, 0x07, 0x19, 0xe0, 0x29, 0xe7, 0x15, 2162306a36Sopenharmony_ci0x00, 0x25, 0x01, 0x75, 0x01, 0x95, 0x08, 0x81, 0x02, 0x95, 0x01, 0x75, 0x08, 2262306a36Sopenharmony_ci0x81, 0x01, 0x95, 0x03, 0x75, 0x01, 0x05, 0x08, 0x19, 0x01, 0x29, 0x03, 0x91, 2362306a36Sopenharmony_ci0x02, 0x95, 0x05, 0x75, 0x01, 0x91, 0x01, 0x95, 0x06, 0x75, 0x08, 0x15, 0x00, 2462306a36Sopenharmony_ci0x26, 0xff, 0x00, 0x05, 0x07, 0x19, 0x00, 0x2a, 0xff, 0x00, 0x81, 0x00, 0xc0 2562306a36Sopenharmony_ci}; 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_cistatic __u8 *keytouch_report_fixup(struct hid_device *hdev, __u8 *rdesc, 2862306a36Sopenharmony_ci unsigned int *rsize) 2962306a36Sopenharmony_ci{ 3062306a36Sopenharmony_ci hid_info(hdev, "fixing up Keytouch IEC report descriptor\n"); 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_ci rdesc = keytouch_fixed_rdesc; 3362306a36Sopenharmony_ci *rsize = sizeof(keytouch_fixed_rdesc); 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_ci return rdesc; 3662306a36Sopenharmony_ci} 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_cistatic const struct hid_device_id keytouch_devices[] = { 3962306a36Sopenharmony_ci { HID_USB_DEVICE(USB_VENDOR_ID_KEYTOUCH, USB_DEVICE_ID_KEYTOUCH_IEC) }, 4062306a36Sopenharmony_ci { } 4162306a36Sopenharmony_ci}; 4262306a36Sopenharmony_ciMODULE_DEVICE_TABLE(hid, keytouch_devices); 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_cistatic struct hid_driver keytouch_driver = { 4562306a36Sopenharmony_ci .name = "keytouch", 4662306a36Sopenharmony_ci .id_table = keytouch_devices, 4762306a36Sopenharmony_ci .report_fixup = keytouch_report_fixup, 4862306a36Sopenharmony_ci}; 4962306a36Sopenharmony_cimodule_hid_driver(keytouch_driver); 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_ciMODULE_LICENSE("GPL"); 5262306a36Sopenharmony_ciMODULE_AUTHOR("Jiri Kosina"); 53