hid-kye.c revision a24f423bdf253ccee369adc6c5451b40a0716fbb
1794227415f8f5f395a9ed4269a4ee7a3c34f66a5Jiri Kosina/* 2794227415f8f5f395a9ed4269a4ee7a3c34f66a5Jiri Kosina * HID driver for Kye/Genius devices not fully compliant with HID standard 3794227415f8f5f395a9ed4269a4ee7a3c34f66a5Jiri Kosina * 4794227415f8f5f395a9ed4269a4ee7a3c34f66a5Jiri Kosina * Copyright (c) 2009 Jiri Kosina 5794227415f8f5f395a9ed4269a4ee7a3c34f66a5Jiri Kosina * Copyright (c) 2009 Tomas Hanak 6794227415f8f5f395a9ed4269a4ee7a3c34f66a5Jiri Kosina */ 7794227415f8f5f395a9ed4269a4ee7a3c34f66a5Jiri Kosina 8794227415f8f5f395a9ed4269a4ee7a3c34f66a5Jiri Kosina/* 9794227415f8f5f395a9ed4269a4ee7a3c34f66a5Jiri Kosina * This program is free software; you can redistribute it and/or modify it 10794227415f8f5f395a9ed4269a4ee7a3c34f66a5Jiri Kosina * under the terms of the GNU General Public License as published by the Free 11794227415f8f5f395a9ed4269a4ee7a3c34f66a5Jiri Kosina * Software Foundation; either version 2 of the License, or (at your option) 12794227415f8f5f395a9ed4269a4ee7a3c34f66a5Jiri Kosina * any later version. 13794227415f8f5f395a9ed4269a4ee7a3c34f66a5Jiri Kosina */ 14794227415f8f5f395a9ed4269a4ee7a3c34f66a5Jiri Kosina 15794227415f8f5f395a9ed4269a4ee7a3c34f66a5Jiri Kosina#include <linux/device.h> 16794227415f8f5f395a9ed4269a4ee7a3c34f66a5Jiri Kosina#include <linux/hid.h> 17794227415f8f5f395a9ed4269a4ee7a3c34f66a5Jiri Kosina#include <linux/module.h> 18794227415f8f5f395a9ed4269a4ee7a3c34f66a5Jiri Kosina 19794227415f8f5f395a9ed4269a4ee7a3c34f66a5Jiri Kosina#include "hid-ids.h" 20794227415f8f5f395a9ed4269a4ee7a3c34f66a5Jiri Kosina 21794227415f8f5f395a9ed4269a4ee7a3c34f66a5Jiri Kosina/* the fixups that need to be done: 22794227415f8f5f395a9ed4269a4ee7a3c34f66a5Jiri Kosina * - change led usage page to button for extra buttons 23794227415f8f5f395a9ed4269a4ee7a3c34f66a5Jiri Kosina * - report size 8 count 1 must be size 1 count 8 for button bitfield 24794227415f8f5f395a9ed4269a4ee7a3c34f66a5Jiri Kosina * - change the button usage range to 4-7 for the extra buttons 25794227415f8f5f395a9ed4269a4ee7a3c34f66a5Jiri Kosina */ 26794227415f8f5f395a9ed4269a4ee7a3c34f66a5Jiri Kosinastatic void kye_report_fixup(struct hid_device *hdev, __u8 *rdesc, 27794227415f8f5f395a9ed4269a4ee7a3c34f66a5Jiri Kosina unsigned int rsize) 28794227415f8f5f395a9ed4269a4ee7a3c34f66a5Jiri Kosina{ 29794227415f8f5f395a9ed4269a4ee7a3c34f66a5Jiri Kosina if (rsize >= 74 && 30794227415f8f5f395a9ed4269a4ee7a3c34f66a5Jiri Kosina rdesc[61] == 0x05 && rdesc[62] == 0x08 && 31794227415f8f5f395a9ed4269a4ee7a3c34f66a5Jiri Kosina rdesc[63] == 0x19 && rdesc[64] == 0x08 && 32794227415f8f5f395a9ed4269a4ee7a3c34f66a5Jiri Kosina rdesc[65] == 0x29 && rdesc[66] == 0x0f && 33794227415f8f5f395a9ed4269a4ee7a3c34f66a5Jiri Kosina rdesc[71] == 0x75 && rdesc[72] == 0x08 && 34794227415f8f5f395a9ed4269a4ee7a3c34f66a5Jiri Kosina rdesc[73] == 0x95 && rdesc[74] == 0x01) { 35794227415f8f5f395a9ed4269a4ee7a3c34f66a5Jiri Kosina dev_info(&hdev->dev, "fixing up Kye/Genius Ergo Mouse report " 36794227415f8f5f395a9ed4269a4ee7a3c34f66a5Jiri Kosina "descriptor\n"); 37794227415f8f5f395a9ed4269a4ee7a3c34f66a5Jiri Kosina rdesc[62] = 0x09; 38794227415f8f5f395a9ed4269a4ee7a3c34f66a5Jiri Kosina rdesc[64] = 0x04; 39794227415f8f5f395a9ed4269a4ee7a3c34f66a5Jiri Kosina rdesc[66] = 0x07; 40794227415f8f5f395a9ed4269a4ee7a3c34f66a5Jiri Kosina rdesc[72] = 0x01; 41794227415f8f5f395a9ed4269a4ee7a3c34f66a5Jiri Kosina rdesc[74] = 0x08; 42794227415f8f5f395a9ed4269a4ee7a3c34f66a5Jiri Kosina } 43794227415f8f5f395a9ed4269a4ee7a3c34f66a5Jiri Kosina} 44794227415f8f5f395a9ed4269a4ee7a3c34f66a5Jiri Kosina 45794227415f8f5f395a9ed4269a4ee7a3c34f66a5Jiri Kosinastatic const struct hid_device_id kye_devices[] = { 46794227415f8f5f395a9ed4269a4ee7a3c34f66a5Jiri Kosina { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_ERGO_525V) }, 47794227415f8f5f395a9ed4269a4ee7a3c34f66a5Jiri Kosina { } 48794227415f8f5f395a9ed4269a4ee7a3c34f66a5Jiri Kosina}; 49794227415f8f5f395a9ed4269a4ee7a3c34f66a5Jiri KosinaMODULE_DEVICE_TABLE(hid, kye_devices); 50794227415f8f5f395a9ed4269a4ee7a3c34f66a5Jiri Kosina 51794227415f8f5f395a9ed4269a4ee7a3c34f66a5Jiri Kosinastatic struct hid_driver kye_driver = { 52794227415f8f5f395a9ed4269a4ee7a3c34f66a5Jiri Kosina .name = "kye", 53794227415f8f5f395a9ed4269a4ee7a3c34f66a5Jiri Kosina .id_table = kye_devices, 54794227415f8f5f395a9ed4269a4ee7a3c34f66a5Jiri Kosina .report_fixup = kye_report_fixup, 55794227415f8f5f395a9ed4269a4ee7a3c34f66a5Jiri Kosina}; 56794227415f8f5f395a9ed4269a4ee7a3c34f66a5Jiri Kosina 57a24f423bdf253ccee369adc6c5451b40a0716fbbPeter Huewestatic int __init kye_init(void) 58794227415f8f5f395a9ed4269a4ee7a3c34f66a5Jiri Kosina{ 59794227415f8f5f395a9ed4269a4ee7a3c34f66a5Jiri Kosina return hid_register_driver(&kye_driver); 60794227415f8f5f395a9ed4269a4ee7a3c34f66a5Jiri Kosina} 61794227415f8f5f395a9ed4269a4ee7a3c34f66a5Jiri Kosina 62a24f423bdf253ccee369adc6c5451b40a0716fbbPeter Huewestatic void __exit kye_exit(void) 63794227415f8f5f395a9ed4269a4ee7a3c34f66a5Jiri Kosina{ 64794227415f8f5f395a9ed4269a4ee7a3c34f66a5Jiri Kosina hid_unregister_driver(&kye_driver); 65794227415f8f5f395a9ed4269a4ee7a3c34f66a5Jiri Kosina} 66794227415f8f5f395a9ed4269a4ee7a3c34f66a5Jiri Kosina 67794227415f8f5f395a9ed4269a4ee7a3c34f66a5Jiri Kosinamodule_init(kye_init); 68794227415f8f5f395a9ed4269a4ee7a3c34f66a5Jiri Kosinamodule_exit(kye_exit); 69794227415f8f5f395a9ed4269a4ee7a3c34f66a5Jiri KosinaMODULE_LICENSE("GPL"); 70