// SPDX-License-Identifier: GPL-2.0-or-later /* * HID driver for Ravcore Javelin & VKB Joysticks * Currently supported devices are: * * Ravcore Javelin: v11C0 p5607 * VKB Gladiator MKII: v231d p0121 * * Copyright (c) 2019 John Grs */ #include #include #include #include #define USB_VENDOR_ID_RAVCORE 0x11C0 #define USB_DEVICE_ID_RAVCORE_VKB5607 0x5607 #define USB_VENDOR_ID_VKB 0x231d #define USB_DEVICE_ID_GLADIATOR 0x0121 static const struct { __s32 x; __s32 y; } hid_hat_to_axis[] = {{ 0, 0}, { 0,-1}, { 1,-1}, { 1, 0}, { 1, 1}, { 0, 1}, {-1, 1}, {-1, 0}, {-1,-1}}; static __u8 *gladiator_report_fixup(struct hid_device *hdev, __u8 *rdesc, unsigned int *rsize) { hid_info(hdev, "Fix HAT for Gladiator MKII Joystick\n"); rdesc[177]=0x08; // Logigal Maximum = 8 return rdesc; } static int gladiator_event(struct hid_device *hdev, struct hid_field *field, struct hid_usage *usage, __s32 value) { struct input_dev *input = field->hidinput->input; if (usage->type == EV_ABS && usage->code == 16) { if (value > 239) { value=-1; } else { value /= 30; } value +=1; input_event(input, usage->type, usage->code, hid_hat_to_axis[value].x); input_event(input, usage->type, usage->code+1, hid_hat_to_axis[value].y); return 1; } return 0; } static const struct hid_device_id gladiator_devices[] = { { HID_USB_DEVICE(USB_VENDOR_ID_RAVCORE, USB_DEVICE_ID_RAVCORE_VKB5607) }, { HID_USB_DEVICE(USB_VENDOR_ID_VKB, USB_DEVICE_ID_GLADIATOR) }, { } }; MODULE_DEVICE_TABLE(hid, gladiator_devices); static struct hid_driver gladiator_driver = { .name = "VKB Gladiator MKII", .id_table = gladiator_devices, .report_fixup = gladiator_report_fixup, .event = gladiator_event, }; module_hid_driver(gladiator_driver); MODULE_AUTHOR("John Grs "); MODULE_DESCRIPTION("VKB Gladiator MKII driver"); MODULE_LICENSE("GPL");