Updated from Linux LTS 3.10.21 to 3.10.22
This commit is contained in:
@@ -369,12 +369,14 @@ config LOGITECH_FF
|
||||
force feedback.
|
||||
|
||||
config LOGIRUMBLEPAD2_FF
|
||||
bool "Logitech RumblePad/Rumblepad 2 force feedback support"
|
||||
bool "Logitech force feedback support (variant 2)"
|
||||
depends on HID_LOGITECH
|
||||
select INPUT_FF_MEMLESS
|
||||
help
|
||||
Say Y here if you want to enable force feedback support for Logitech
|
||||
RumblePad and Rumblepad 2 devices.
|
||||
Say Y here if you want to enable force feedback support for:
|
||||
- Logitech RumblePad
|
||||
- Logitech Rumblepad 2
|
||||
- Logitech Formula Vibration Feedback Wheel
|
||||
|
||||
config LOGIG940_FF
|
||||
bool "Logitech Flight System G940 force feedback support"
|
||||
@@ -453,9 +455,11 @@ config HID_MULTITOUCH
|
||||
- Pixcir dual touch panels
|
||||
- Quanta panels
|
||||
- eGalax dual-touch panels, including the Joojoo and Wetab tablets
|
||||
- SiS multitouch panels
|
||||
- Stantum multitouch panels
|
||||
- Touch International Panels
|
||||
- Unitec Panels
|
||||
- Wistron optical touch panels
|
||||
- XAT optical touch panels
|
||||
- Xiroku optical touch panels
|
||||
- Zytronic touch panels
|
||||
|
||||
@@ -46,6 +46,12 @@ module_param(iso_layout, uint, 0644);
|
||||
MODULE_PARM_DESC(iso_layout, "Enable/Disable hardcoded ISO-layout of the keyboard. "
|
||||
"(0 = disabled, [1] = enabled)");
|
||||
|
||||
static unsigned int swap_opt_cmd = 0;
|
||||
module_param(swap_opt_cmd, uint, 0644);
|
||||
MODULE_PARM_DESC(swap_opt_cmd, "Swap the Option (\"Alt\") and Command (\"Flag\") keys. "
|
||||
"(For people who want to keep Windows PC keyboard muscle memory. "
|
||||
"[0] = as-is, Mac layout. 1 = swapped, Windows layout.)");
|
||||
|
||||
struct apple_sc {
|
||||
unsigned long quirks;
|
||||
unsigned int fn_on;
|
||||
@@ -150,6 +156,14 @@ static const struct apple_key_translation apple_iso_keyboard[] = {
|
||||
{ }
|
||||
};
|
||||
|
||||
static const struct apple_key_translation swapped_option_cmd_keys[] = {
|
||||
{ KEY_LEFTALT, KEY_LEFTMETA },
|
||||
{ KEY_LEFTMETA, KEY_LEFTALT },
|
||||
{ KEY_RIGHTALT, KEY_RIGHTMETA },
|
||||
{ KEY_RIGHTMETA,KEY_RIGHTALT },
|
||||
{ }
|
||||
};
|
||||
|
||||
static const struct apple_key_translation *apple_find_translation(
|
||||
const struct apple_key_translation *table, u16 from)
|
||||
{
|
||||
@@ -242,6 +256,14 @@ static int hidinput_apple_event(struct hid_device *hid, struct input_dev *input,
|
||||
}
|
||||
}
|
||||
|
||||
if (swap_opt_cmd) {
|
||||
trans = apple_find_translation(swapped_option_cmd_keys, usage->code);
|
||||
if (trans) {
|
||||
input_event(input, usage->type, trans->to, value);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -95,7 +95,7 @@ static int axff_init(struct hid_device *hid)
|
||||
}
|
||||
}
|
||||
|
||||
if (field_count < 4) {
|
||||
if (field_count < 4 && hid->product != 0xf705) {
|
||||
hid_err(hid, "not enough fields in the report: %d\n",
|
||||
field_count);
|
||||
return -ENODEV;
|
||||
@@ -180,6 +180,7 @@ static void ax_remove(struct hid_device *hdev)
|
||||
|
||||
static const struct hid_device_id ax_devices[] = {
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_ACRUX, 0x0802), },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_ACRUX, 0xf705), },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(hid, ax_devices);
|
||||
|
||||
@@ -1657,6 +1657,7 @@ static const struct hid_device_id hid_have_special_driver[] = {
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_A4TECH, USB_DEVICE_ID_A4TECH_X5_005D) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_A4TECH, USB_DEVICE_ID_A4TECH_RP_649) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_ACRUX, 0x0802) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_ACRUX, 0xf705) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MIGHTYMOUSE) },
|
||||
{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MAGICMOUSE) },
|
||||
{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MAGICTRACKPAD) },
|
||||
@@ -1799,6 +1800,7 @@ static const struct hid_device_id hid_have_special_driver[] = {
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_FLIGHT_SYSTEM_G940) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_MOMO_WHEEL) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_MOMO_WHEEL2) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_VIBRATION_WHEEL) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_DFP_WHEEL) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_DFGT_WHEEL) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_G25_WHEEL) },
|
||||
@@ -1854,12 +1856,14 @@ static const struct hid_device_id hid_have_special_driver[] = {
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_PLANTRONICS, HID_ANY_ID) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_PRIMAX, USB_DEVICE_ID_PRIMAX_KEYBOARD) },
|
||||
#if IS_ENABLED(CONFIG_HID_ROCCAT)
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_ROCCAT, USB_DEVICE_ID_ROCCAT_KONE) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_ROCCAT, USB_DEVICE_ID_ROCCAT_ARVO) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_ROCCAT, USB_DEVICE_ID_ROCCAT_ISKU) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_ROCCAT, USB_DEVICE_ID_ROCCAT_ISKUFX) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_ROCCAT, USB_DEVICE_ID_ROCCAT_KONE) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_ROCCAT, USB_DEVICE_ID_ROCCAT_KONEPLUS) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_ROCCAT, USB_DEVICE_ID_ROCCAT_KONEPURE) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_ROCCAT, USB_DEVICE_ID_ROCCAT_KONEPURE_OPTICAL) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_ROCCAT, USB_DEVICE_ID_ROCCAT_KONEXTD) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_ROCCAT, USB_DEVICE_ID_ROCCAT_KOVAPLUS) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_ROCCAT, USB_DEVICE_ID_ROCCAT_LUA) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_ROCCAT, USB_DEVICE_ID_ROCCAT_PYRA_WIRED) },
|
||||
@@ -1869,6 +1873,8 @@ static const struct hid_device_id hid_have_special_driver[] = {
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_SAITEK, USB_DEVICE_ID_SAITEK_PS1000) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_SAMSUNG, USB_DEVICE_ID_SAMSUNG_IR_REMOTE) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_SAMSUNG, USB_DEVICE_ID_SAMSUNG_WIRELESS_KBD_MOUSE) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_SIS2_TOUCH, USB_DEVICE_ID_SIS9200_TOUCH) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_SIS2_TOUCH, USB_DEVICE_ID_SIS817_TOUCH) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_SKYCABLE, USB_DEVICE_ID_SKYCABLE_WIRELESS_PRESENTER) },
|
||||
{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_BDREMOTE) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER) },
|
||||
@@ -2423,15 +2429,6 @@ bool hid_ignore(struct hid_device *hdev)
|
||||
hdev->type == HID_TYPE_USBNONE)
|
||||
return true;
|
||||
break;
|
||||
case USB_VENDOR_ID_DWAV:
|
||||
/* These are handled by usbtouchscreen. hdev->type is probably
|
||||
* HID_TYPE_USBNONE, but we say !HID_TYPE_USBMOUSE to match
|
||||
* usbtouchscreen. */
|
||||
if ((hdev->product == USB_DEVICE_ID_EGALAX_TOUCHCONTROLLER ||
|
||||
hdev->product == USB_DEVICE_ID_DWAV_TOUCHCONTROLLER) &&
|
||||
hdev->type != HID_TYPE_USBMOUSE)
|
||||
return true;
|
||||
break;
|
||||
case USB_VENDOR_ID_VELLEMAN:
|
||||
/* These are not HID devices. They are handled by comedi. */
|
||||
if ((hdev->product >= USB_DEVICE_ID_VELLEMAN_K8055_FIRST &&
|
||||
|
||||
@@ -330,6 +330,11 @@
|
||||
#define USB_VENDOR_ID_GENERAL_TOUCH 0x0dfc
|
||||
#define USB_DEVICE_ID_GENERAL_TOUCH_WIN7_TWOFINGERS 0x0003
|
||||
#define USB_DEVICE_ID_GENERAL_TOUCH_WIN8_PWT_TENFINGERS 0x0100
|
||||
#define USB_DEVICE_ID_GENERAL_TOUCH_WIN8_PIT_0101 0x0101
|
||||
#define USB_DEVICE_ID_GENERAL_TOUCH_WIN8_PIT_0102 0x0102
|
||||
#define USB_DEVICE_ID_GENERAL_TOUCH_WIN8_PIT_0106 0x0106
|
||||
#define USB_DEVICE_ID_GENERAL_TOUCH_WIN8_PIT_010A 0x010a
|
||||
#define USB_DEVICE_ID_GENERAL_TOUCH_WIN8_PIT_E100 0xe100
|
||||
|
||||
#define USB_VENDOR_ID_GLAB 0x06c2
|
||||
#define USB_DEVICE_ID_4_PHIDGETSERVO_30 0x0038
|
||||
@@ -569,6 +574,7 @@
|
||||
#define USB_DEVICE_ID_DINOVO_EDGE 0xc714
|
||||
#define USB_DEVICE_ID_DINOVO_MINI 0xc71f
|
||||
#define USB_DEVICE_ID_LOGITECH_MOMO_WHEEL2 0xca03
|
||||
#define USB_DEVICE_ID_LOGITECH_VIBRATION_WHEEL 0xca04
|
||||
#define USB_DEVICE_ID_WIRELESS_TOUCHPAD_T651 0xb00c
|
||||
#define USB_DEVICE_ID_BLUETOOTH_TOUCHMOUSE 0xb00d
|
||||
|
||||
@@ -747,6 +753,10 @@
|
||||
#define USB_VENDOR_ID_SIGMATEL 0x066F
|
||||
#define USB_DEVICE_ID_SIGMATEL_STMP3780 0x3780
|
||||
|
||||
#define USB_VENDOR_ID_SIS2_TOUCH 0x0457
|
||||
#define USB_DEVICE_ID_SIS9200_TOUCH 0x9200
|
||||
#define USB_DEVICE_ID_SIS817_TOUCH 0x0817
|
||||
|
||||
#define USB_VENDOR_ID_SKYCABLE 0x1223
|
||||
#define USB_DEVICE_ID_SKYCABLE_WIRELESS_PRESENTER 0x3F07
|
||||
|
||||
@@ -886,6 +896,9 @@
|
||||
#define USB_DEVICE_ID_SUPER_DUAL_BOX_PRO 0x8802
|
||||
#define USB_DEVICE_ID_SUPER_JOY_BOX_5_PRO 0x8804
|
||||
|
||||
#define USB_VENDOR_ID_WISTRON 0x0fb8
|
||||
#define USB_DEVICE_ID_WISTRON_OPTICAL_TOUCH 0x1109
|
||||
|
||||
#define USB_VENDOR_ID_X_TENSIONS 0x1ae7
|
||||
#define USB_DEVICE_ID_SPEEDLINK_VAD_CEZANNE 0x9001
|
||||
|
||||
|
||||
@@ -45,6 +45,7 @@
|
||||
/* Size of the original descriptors of the Driving Force (and Pro) wheels */
|
||||
#define DF_RDESC_ORIG_SIZE 130
|
||||
#define DFP_RDESC_ORIG_SIZE 97
|
||||
#define FV_RDESC_ORIG_SIZE 130
|
||||
#define MOMO_RDESC_ORIG_SIZE 87
|
||||
|
||||
/* Fixed report descriptors for Logitech Driving Force (and Pro)
|
||||
@@ -170,6 +171,73 @@ static __u8 dfp_rdesc_fixed[] = {
|
||||
0xC0 /* End Collection */
|
||||
};
|
||||
|
||||
static __u8 fv_rdesc_fixed[] = {
|
||||
0x05, 0x01, /* Usage Page (Desktop), */
|
||||
0x09, 0x04, /* Usage (Joystik), */
|
||||
0xA1, 0x01, /* Collection (Application), */
|
||||
0xA1, 0x02, /* Collection (Logical), */
|
||||
0x95, 0x01, /* Report Count (1), */
|
||||
0x75, 0x0A, /* Report Size (10), */
|
||||
0x15, 0x00, /* Logical Minimum (0), */
|
||||
0x26, 0xFF, 0x03, /* Logical Maximum (1023), */
|
||||
0x35, 0x00, /* Physical Minimum (0), */
|
||||
0x46, 0xFF, 0x03, /* Physical Maximum (1023), */
|
||||
0x09, 0x30, /* Usage (X), */
|
||||
0x81, 0x02, /* Input (Variable), */
|
||||
0x95, 0x0C, /* Report Count (12), */
|
||||
0x75, 0x01, /* Report Size (1), */
|
||||
0x25, 0x01, /* Logical Maximum (1), */
|
||||
0x45, 0x01, /* Physical Maximum (1), */
|
||||
0x05, 0x09, /* Usage Page (Button), */
|
||||
0x19, 0x01, /* Usage Minimum (01h), */
|
||||
0x29, 0x0C, /* Usage Maximum (0Ch), */
|
||||
0x81, 0x02, /* Input (Variable), */
|
||||
0x95, 0x02, /* Report Count (2), */
|
||||
0x06, 0x00, 0xFF, /* Usage Page (FF00h), */
|
||||
0x09, 0x01, /* Usage (01h), */
|
||||
0x81, 0x02, /* Input (Variable), */
|
||||
0x09, 0x02, /* Usage (02h), */
|
||||
0x26, 0xFF, 0x00, /* Logical Maximum (255), */
|
||||
0x46, 0xFF, 0x00, /* Physical Maximum (255), */
|
||||
0x95, 0x01, /* Report Count (1), */
|
||||
0x75, 0x08, /* Report Size (8), */
|
||||
0x81, 0x02, /* Input (Variable), */
|
||||
0x05, 0x01, /* Usage Page (Desktop), */
|
||||
0x25, 0x07, /* Logical Maximum (7), */
|
||||
0x46, 0x3B, 0x01, /* Physical Maximum (315), */
|
||||
0x75, 0x04, /* Report Size (4), */
|
||||
0x65, 0x14, /* Unit (Degrees), */
|
||||
0x09, 0x39, /* Usage (Hat Switch), */
|
||||
0x81, 0x42, /* Input (Variable, Null State), */
|
||||
0x75, 0x01, /* Report Size (1), */
|
||||
0x95, 0x04, /* Report Count (4), */
|
||||
0x65, 0x00, /* Unit, */
|
||||
0x06, 0x00, 0xFF, /* Usage Page (FF00h), */
|
||||
0x09, 0x01, /* Usage (01h), */
|
||||
0x25, 0x01, /* Logical Maximum (1), */
|
||||
0x45, 0x01, /* Physical Maximum (1), */
|
||||
0x81, 0x02, /* Input (Variable), */
|
||||
0x05, 0x01, /* Usage Page (Desktop), */
|
||||
0x95, 0x01, /* Report Count (1), */
|
||||
0x75, 0x08, /* Report Size (8), */
|
||||
0x26, 0xFF, 0x00, /* Logical Maximum (255), */
|
||||
0x46, 0xFF, 0x00, /* Physical Maximum (255), */
|
||||
0x09, 0x31, /* Usage (Y), */
|
||||
0x81, 0x02, /* Input (Variable), */
|
||||
0x09, 0x32, /* Usage (Z), */
|
||||
0x81, 0x02, /* Input (Variable), */
|
||||
0xC0, /* End Collection, */
|
||||
0xA1, 0x02, /* Collection (Logical), */
|
||||
0x26, 0xFF, 0x00, /* Logical Maximum (255), */
|
||||
0x46, 0xFF, 0x00, /* Physical Maximum (255), */
|
||||
0x95, 0x07, /* Report Count (7), */
|
||||
0x75, 0x08, /* Report Size (8), */
|
||||
0x09, 0x03, /* Usage (03h), */
|
||||
0x91, 0x02, /* Output (Variable), */
|
||||
0xC0, /* End Collection, */
|
||||
0xC0 /* End Collection */
|
||||
};
|
||||
|
||||
static __u8 momo_rdesc_fixed[] = {
|
||||
0x05, 0x01, /* Usage Page (Desktop), */
|
||||
0x09, 0x04, /* Usage (Joystik), */
|
||||
@@ -275,6 +343,15 @@ static __u8 *lg_report_fixup(struct hid_device *hdev, __u8 *rdesc,
|
||||
}
|
||||
break;
|
||||
|
||||
case USB_DEVICE_ID_LOGITECH_VIBRATION_WHEEL:
|
||||
if (*rsize == FV_RDESC_ORIG_SIZE) {
|
||||
hid_info(hdev,
|
||||
"fixing up Logitech Formula Vibration report descriptor\n");
|
||||
rdesc = fv_rdesc_fixed;
|
||||
*rsize = sizeof(fv_rdesc_fixed);
|
||||
}
|
||||
break;
|
||||
|
||||
case USB_DEVICE_ID_LOGITECH_DFP_WHEEL:
|
||||
if (*rsize == DFP_RDESC_ORIG_SIZE) {
|
||||
hid_info(hdev,
|
||||
@@ -492,6 +569,7 @@ static int lg_input_mapped(struct hid_device *hdev, struct hid_input *hi,
|
||||
case USB_DEVICE_ID_LOGITECH_G27_WHEEL:
|
||||
case USB_DEVICE_ID_LOGITECH_WII_WHEEL:
|
||||
case USB_DEVICE_ID_LOGITECH_MOMO_WHEEL2:
|
||||
case USB_DEVICE_ID_LOGITECH_VIBRATION_WHEEL:
|
||||
field->application = HID_GD_MULTIAXIS;
|
||||
break;
|
||||
default:
|
||||
@@ -639,6 +717,8 @@ static const struct hid_device_id lg_devices[] = {
|
||||
.driver_data = LG_NOGET | LG_FF4 },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_MOMO_WHEEL2),
|
||||
.driver_data = LG_FF4 },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_VIBRATION_WHEEL),
|
||||
.driver_data = LG_FF2 },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_G25_WHEEL),
|
||||
.driver_data = LG_FF4 },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_DFGT_WHEEL),
|
||||
|
||||
@@ -95,7 +95,7 @@ int lg2ff_init(struct hid_device *hid)
|
||||
|
||||
hid_hw_request(hid, report, HID_REQ_SET_REPORT);
|
||||
|
||||
hid_info(hid, "Force feedback for Logitech RumblePad/Rumblepad 2 by Anssi Hannula <anssi.hannula@gmail.com>\n");
|
||||
hid_info(hid, "Force feedback for Logitech variant 2 rumble devices by Anssi Hannula <anssi.hannula@gmail.com>\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -218,12 +218,46 @@ static void hid_lg4ff_set_autocenter_default(struct input_dev *dev, u16 magnitud
|
||||
struct list_head *report_list = &hid->report_enum[HID_OUTPUT_REPORT].report_list;
|
||||
struct hid_report *report = list_entry(report_list->next, struct hid_report, list);
|
||||
__s32 *value = report->field[0]->value;
|
||||
__u32 expand_a, expand_b;
|
||||
|
||||
/* De-activate Auto-Center */
|
||||
if (magnitude == 0) {
|
||||
value[0] = 0xf5;
|
||||
value[1] = 0x00;
|
||||
value[2] = 0x00;
|
||||
value[3] = 0x00;
|
||||
value[4] = 0x00;
|
||||
value[5] = 0x00;
|
||||
value[6] = 0x00;
|
||||
|
||||
hid_hw_request(hid, report, HID_REQ_SET_REPORT);
|
||||
return;
|
||||
}
|
||||
|
||||
if (magnitude <= 0xaaaa) {
|
||||
expand_a = 0x0c * magnitude;
|
||||
expand_b = 0x80 * magnitude;
|
||||
} else {
|
||||
expand_a = (0x0c * 0xaaaa) + 0x06 * (magnitude - 0xaaaa);
|
||||
expand_b = (0x80 * 0xaaaa) + 0xff * (magnitude - 0xaaaa);
|
||||
}
|
||||
|
||||
value[0] = 0xfe;
|
||||
value[1] = 0x0d;
|
||||
value[2] = magnitude >> 13;
|
||||
value[3] = magnitude >> 13;
|
||||
value[4] = magnitude >> 8;
|
||||
value[2] = expand_a / 0xaaaa;
|
||||
value[3] = expand_a / 0xaaaa;
|
||||
value[4] = expand_b / 0xaaaa;
|
||||
value[5] = 0x00;
|
||||
value[6] = 0x00;
|
||||
|
||||
hid_hw_request(hid, report, HID_REQ_SET_REPORT);
|
||||
|
||||
/* Activate Auto-Center */
|
||||
value[0] = 0x14;
|
||||
value[1] = 0x00;
|
||||
value[2] = 0x00;
|
||||
value[3] = 0x00;
|
||||
value[4] = 0x00;
|
||||
value[5] = 0x00;
|
||||
value[6] = 0x00;
|
||||
|
||||
@@ -540,17 +574,6 @@ int lg4ff_init(struct hid_device *hid)
|
||||
if (error)
|
||||
return error;
|
||||
|
||||
/* Check if autocentering is available and
|
||||
* set the centering force to zero by default */
|
||||
if (test_bit(FF_AUTOCENTER, dev->ffbit)) {
|
||||
if (rev_maj == FFEX_REV_MAJ && rev_min == FFEX_REV_MIN) /* Formula Force EX expects different autocentering command */
|
||||
dev->ff->set_autocenter = hid_lg4ff_set_autocenter_ffex;
|
||||
else
|
||||
dev->ff->set_autocenter = hid_lg4ff_set_autocenter_default;
|
||||
|
||||
dev->ff->set_autocenter(dev, 0);
|
||||
}
|
||||
|
||||
/* Get private driver data */
|
||||
drv_data = hid_get_drvdata(hid);
|
||||
if (!drv_data) {
|
||||
@@ -571,6 +594,17 @@ int lg4ff_init(struct hid_device *hid)
|
||||
entry->max_range = lg4ff_devices[i].max_range;
|
||||
entry->set_range = lg4ff_devices[i].set_range;
|
||||
|
||||
/* Check if autocentering is available and
|
||||
* set the centering force to zero by default */
|
||||
if (test_bit(FF_AUTOCENTER, dev->ffbit)) {
|
||||
if (rev_maj == FFEX_REV_MAJ && rev_min == FFEX_REV_MIN) /* Formula Force EX expects different autocentering command */
|
||||
dev->ff->set_autocenter = hid_lg4ff_set_autocenter_ffex;
|
||||
else
|
||||
dev->ff->set_autocenter = hid_lg4ff_set_autocenter_default;
|
||||
|
||||
dev->ff->set_autocenter(dev, 0);
|
||||
}
|
||||
|
||||
/* Create sysfs interface */
|
||||
error = device_create_file(&hid->dev, &dev_attr_range);
|
||||
if (error)
|
||||
|
||||
@@ -250,12 +250,12 @@ static struct mt_class mt_classes[] = {
|
||||
{ .name = MT_CLS_GENERALTOUCH_TWOFINGERS,
|
||||
.quirks = MT_QUIRK_NOT_SEEN_MEANS_UP |
|
||||
MT_QUIRK_VALID_IS_INRANGE |
|
||||
MT_QUIRK_SLOT_IS_CONTACTNUMBER,
|
||||
MT_QUIRK_SLOT_IS_CONTACTID,
|
||||
.maxcontacts = 2
|
||||
},
|
||||
{ .name = MT_CLS_GENERALTOUCH_PWT_TENFINGERS,
|
||||
.quirks = MT_QUIRK_NOT_SEEN_MEANS_UP |
|
||||
MT_QUIRK_SLOT_IS_CONTACTNUMBER
|
||||
MT_QUIRK_SLOT_IS_CONTACTID
|
||||
},
|
||||
|
||||
{ .name = MT_CLS_FLATFROG,
|
||||
@@ -1200,6 +1200,21 @@ static const struct hid_device_id mt_devices[] = {
|
||||
{ .driver_data = MT_CLS_GENERALTOUCH_PWT_TENFINGERS,
|
||||
MT_USB_DEVICE(USB_VENDOR_ID_GENERAL_TOUCH,
|
||||
USB_DEVICE_ID_GENERAL_TOUCH_WIN8_PWT_TENFINGERS) },
|
||||
{ .driver_data = MT_CLS_GENERALTOUCH_TWOFINGERS,
|
||||
MT_USB_DEVICE(USB_VENDOR_ID_GENERAL_TOUCH,
|
||||
USB_DEVICE_ID_GENERAL_TOUCH_WIN8_PIT_0101) },
|
||||
{ .driver_data = MT_CLS_GENERALTOUCH_PWT_TENFINGERS,
|
||||
MT_USB_DEVICE(USB_VENDOR_ID_GENERAL_TOUCH,
|
||||
USB_DEVICE_ID_GENERAL_TOUCH_WIN8_PIT_0102) },
|
||||
{ .driver_data = MT_CLS_GENERALTOUCH_PWT_TENFINGERS,
|
||||
MT_USB_DEVICE(USB_VENDOR_ID_GENERAL_TOUCH,
|
||||
USB_DEVICE_ID_GENERAL_TOUCH_WIN8_PIT_0106) },
|
||||
{ .driver_data = MT_CLS_GENERALTOUCH_PWT_TENFINGERS,
|
||||
MT_USB_DEVICE(USB_VENDOR_ID_GENERAL_TOUCH,
|
||||
USB_DEVICE_ID_GENERAL_TOUCH_WIN8_PIT_010A) },
|
||||
{ .driver_data = MT_CLS_GENERALTOUCH_PWT_TENFINGERS,
|
||||
MT_USB_DEVICE(USB_VENDOR_ID_GENERAL_TOUCH,
|
||||
USB_DEVICE_ID_GENERAL_TOUCH_WIN8_PIT_E100) },
|
||||
|
||||
/* Gametel game controller */
|
||||
{ .driver_data = MT_CLS_NSMU,
|
||||
@@ -1314,6 +1329,14 @@ static const struct hid_device_id mt_devices[] = {
|
||||
MT_USB_DEVICE(USB_VENDOR_ID_QUANTA,
|
||||
USB_DEVICE_ID_QUANTA_OPTICAL_TOUCH_3008) },
|
||||
|
||||
/* SiS panels */
|
||||
{ .driver_data = MT_CLS_DEFAULT,
|
||||
HID_USB_DEVICE(USB_VENDOR_ID_SIS2_TOUCH,
|
||||
USB_DEVICE_ID_SIS9200_TOUCH) },
|
||||
{ .driver_data = MT_CLS_DEFAULT,
|
||||
HID_USB_DEVICE(USB_VENDOR_ID_SIS2_TOUCH,
|
||||
USB_DEVICE_ID_SIS817_TOUCH) },
|
||||
|
||||
/* Stantum panels */
|
||||
{ .driver_data = MT_CLS_CONFIDENCE,
|
||||
MT_USB_DEVICE(USB_VENDOR_ID_STANTUM,
|
||||
@@ -1342,6 +1365,12 @@ static const struct hid_device_id mt_devices[] = {
|
||||
{ .driver_data = MT_CLS_NSMU,
|
||||
MT_USB_DEVICE(USB_VENDOR_ID_UNITEC,
|
||||
USB_DEVICE_ID_UNITEC_USB_TOUCH_0A19) },
|
||||
|
||||
/* Wistron panels */
|
||||
{ .driver_data = MT_CLS_NSMU,
|
||||
MT_USB_DEVICE(USB_VENDOR_ID_WISTRON,
|
||||
USB_DEVICE_ID_WISTRON_OPTICAL_TOUCH) },
|
||||
|
||||
/* XAT */
|
||||
{ .driver_data = MT_CLS_NSMU,
|
||||
MT_USB_DEVICE(USB_VENDOR_ID_XAT,
|
||||
|
||||
@@ -65,10 +65,11 @@ int roccat_common2_send(struct usb_device *usb_dev, uint report_id,
|
||||
EXPORT_SYMBOL_GPL(roccat_common2_send);
|
||||
|
||||
enum roccat_common2_control_states {
|
||||
ROCCAT_COMMON_CONTROL_STATUS_OVERLOAD = 0,
|
||||
ROCCAT_COMMON_CONTROL_STATUS_CRITICAL = 0,
|
||||
ROCCAT_COMMON_CONTROL_STATUS_OK = 1,
|
||||
ROCCAT_COMMON_CONTROL_STATUS_INVALID = 2,
|
||||
ROCCAT_COMMON_CONTROL_STATUS_WAIT = 3,
|
||||
ROCCAT_COMMON_CONTROL_STATUS_BUSY = 3,
|
||||
ROCCAT_COMMON_CONTROL_STATUS_CRITICAL_NEW = 4,
|
||||
};
|
||||
|
||||
static int roccat_common2_receive_control_status(struct usb_device *usb_dev)
|
||||
@@ -88,13 +89,12 @@ static int roccat_common2_receive_control_status(struct usb_device *usb_dev)
|
||||
switch (control.value) {
|
||||
case ROCCAT_COMMON_CONTROL_STATUS_OK:
|
||||
return 0;
|
||||
case ROCCAT_COMMON_CONTROL_STATUS_WAIT:
|
||||
case ROCCAT_COMMON_CONTROL_STATUS_BUSY:
|
||||
msleep(500);
|
||||
continue;
|
||||
case ROCCAT_COMMON_CONTROL_STATUS_INVALID:
|
||||
|
||||
case ROCCAT_COMMON_CONTROL_STATUS_OVERLOAD:
|
||||
/* seems to be critical - replug necessary */
|
||||
case ROCCAT_COMMON_CONTROL_STATUS_CRITICAL:
|
||||
case ROCCAT_COMMON_CONTROL_STATUS_CRITICAL_NEW:
|
||||
return -EINVAL;
|
||||
default:
|
||||
dev_err(&usb_dev->dev,
|
||||
|
||||
@@ -577,9 +577,13 @@ static void kovaplus_keep_values_up_to_date(struct kovaplus_device *kovaplus,
|
||||
break;
|
||||
case KOVAPLUS_MOUSE_REPORT_BUTTON_TYPE_CPI:
|
||||
kovaplus->actual_cpi = kovaplus_convert_event_cpi(button_report->data1);
|
||||
break;
|
||||
case KOVAPLUS_MOUSE_REPORT_BUTTON_TYPE_SENSITIVITY:
|
||||
kovaplus->actual_x_sensitivity = button_report->data1;
|
||||
kovaplus->actual_y_sensitivity = button_report->data2;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -327,7 +327,8 @@ int sensor_hub_input_get_attribute_info(struct hid_sensor_hub_device *hsdev,
|
||||
field->logical == attr_usage_id) {
|
||||
sensor_hub_fill_attr_info(info, i, report->id,
|
||||
field->unit, field->unit_exponent,
|
||||
field->report_size);
|
||||
field->report_size *
|
||||
field->report_count);
|
||||
ret = 0;
|
||||
} else {
|
||||
for (j = 0; j < field->maxusage; ++j) {
|
||||
@@ -339,7 +340,8 @@ int sensor_hub_input_get_attribute_info(struct hid_sensor_hub_device *hsdev,
|
||||
i, report->id,
|
||||
field->unit,
|
||||
field->unit_exponent,
|
||||
field->report_size);
|
||||
field->report_size *
|
||||
field->report_count);
|
||||
ret = 0;
|
||||
break;
|
||||
}
|
||||
@@ -426,9 +428,10 @@ static int sensor_hub_raw_event(struct hid_device *hdev,
|
||||
hid_dbg(hdev, "%d collection_index:%x hid:%x sz:%x\n",
|
||||
i, report->field[i]->usage->collection_index,
|
||||
report->field[i]->usage->hid,
|
||||
report->field[i]->report_size/8);
|
||||
|
||||
sz = report->field[i]->report_size/8;
|
||||
(report->field[i]->report_size *
|
||||
report->field[i]->report_count)/8);
|
||||
sz = (report->field[i]->report_size *
|
||||
report->field[i]->report_count)/8;
|
||||
if (pdata->pending.status && pdata->pending.attr_usage_id ==
|
||||
report->field[i]->usage->hid) {
|
||||
hid_dbg(hdev, "data was pending ...\n");
|
||||
|
||||
@@ -88,6 +88,8 @@ static const struct hid_blacklist {
|
||||
{ USB_VENDOR_ID_REALTEK, USB_DEVICE_ID_REALTEK_READER, HID_QUIRK_NO_INIT_REPORTS },
|
||||
{ USB_VENDOR_ID_SENNHEISER, USB_DEVICE_ID_SENNHEISER_BTD500USB, HID_QUIRK_NOGET },
|
||||
{ USB_VENDOR_ID_SIGMATEL, USB_DEVICE_ID_SIGMATEL_STMP3780, HID_QUIRK_NOGET },
|
||||
{ USB_VENDOR_ID_SIS2_TOUCH, USB_DEVICE_ID_SIS9200_TOUCH, HID_QUIRK_NOGET },
|
||||
{ USB_VENDOR_ID_SIS2_TOUCH, USB_DEVICE_ID_SIS817_TOUCH, HID_QUIRK_NOGET },
|
||||
{ USB_VENDOR_ID_SUN, USB_DEVICE_ID_RARITAN_KVM_DONGLE, HID_QUIRK_NOGET },
|
||||
{ USB_VENDOR_ID_SYMBOL, USB_DEVICE_ID_SYMBOL_SCANNER_1, HID_QUIRK_NOGET },
|
||||
{ USB_VENDOR_ID_SYMBOL, USB_DEVICE_ID_SYMBOL_SCANNER_2, HID_QUIRK_NOGET },
|
||||
|
||||
Reference in New Issue
Block a user