mirror of
https://github.com/torvalds/linux.git
synced 2026-01-12 00:42:35 +08:00
Merge tag 'hid-for-linus-2026010801' of git://git.kernel.org/pub/scm/linux/kernel/git/hid/hid
Pull HID fixes from Jiri Kosina: - build fix for HID-BPF (Benjamin Tissoires) - fix for potential buffer overflow in i2c-hid (Kwok Kin Ming) - a couple of selftests/hid fixes (Peter Hutterer) - fix for handling pressure pads in hid-multitouch (Peter Hutterer) - fix for potential NULL pointer dereference in intel-thc-hid (Even Xu) - fix for interrupt delay control in intel-thc-hid (Even Xu) - fix finger release detection on some VTL-class touchpads (DaytonCL) - fix for correct enumeration on intel-ish-hid systems with no sensors (Zhang Lixu) - assorted device ID additions and device-specific quirks * tag 'hid-for-linus-2026010801' of git://git.kernel.org/pub/scm/linux/kernel/git/hid/hid: (21 commits) HID: logitech: add HID++ support for Logitech MX Anywhere 3S HID: Elecom: Add support for ELECOM M-XT3DRBK (018C) HID: quirks: work around VID/PID conflict for appledisplay HID: Apply quirk HID_QUIRK_ALWAYS_POLL to Edifier QR30 (2d99:a101) HID: i2c-hid: fix potential buffer overflow in i2c_hid_get_report() selftests/hid: add a test for the Digitizer/Button Type pressurepad selftests/hid: use a enum class for the different button types selftests/hid: require hidtools 0.12 HID: multitouch: set INPUT_PROP_PRESSUREPAD based on Digitizer/Button Type HID: quirks: Add another Chicony HP 5MP Cameras to hid_ignore_list HID: Intel-thc-hid: Intel-thc: Add safety check for reading DMA buffer hid: intel-thc-hid: Select SGL_ALLOC selftests/hid: fix bpf compilations due to -fms-extensions HID: bpf: fix bpf compilation with -fms-extensions HID: Intel-thc-hid: Intel-thc: Fix wrong register reading HID: multitouch: add MT_QUIRK_STICKY_FINGERS to MT_CLS_VTL HID: intel-ish-hid: Reset enum_devices_done before enumeration HID: intel-ish-hid: Update ishtp bus match to support device ID table HID: Intel-thc-hid: Intel-thc: fix dma_unmap_sg() nents value HID: playstation: Center initial joystick axes to prevent spurious events ...
This commit is contained in:
@@ -56,8 +56,10 @@ clean:
|
||||
|
||||
%.bpf.o: %.bpf.c vmlinux.h $(BPFOBJ) | $(OUTPUT)
|
||||
$(call msg,BPF,$@)
|
||||
$(Q)$(CLANG) -g -O2 --target=bpf -Wall -Werror $(INCLUDES) \
|
||||
-c $(filter %.c,$^) -o $@ && \
|
||||
$(Q)$(CLANG) -g -O2 --target=bpf -Wall -Werror $(INCLUDES) \
|
||||
-Wno-microsoft-anon-tag \
|
||||
-fms-extensions \
|
||||
-c $(filter %.c,$^) -o $@ && \
|
||||
$(LLVM_STRIP) -g $@
|
||||
|
||||
vmlinux.h: $(VMLINUX_BTF) $(BPFTOOL) | $(INCLUDE_DIR)
|
||||
|
||||
@@ -77,7 +77,7 @@ static const __u8 *elecom_report_fixup(struct hid_device *hdev, __u8 *rdesc,
|
||||
break;
|
||||
case USB_DEVICE_ID_ELECOM_M_XT3URBK_00FB:
|
||||
case USB_DEVICE_ID_ELECOM_M_XT3URBK_018F:
|
||||
case USB_DEVICE_ID_ELECOM_M_XT3DRBK:
|
||||
case USB_DEVICE_ID_ELECOM_M_XT3DRBK_00FC:
|
||||
case USB_DEVICE_ID_ELECOM_M_XT4DRBK:
|
||||
/*
|
||||
* Report descriptor format:
|
||||
@@ -102,6 +102,16 @@ static const __u8 *elecom_report_fixup(struct hid_device *hdev, __u8 *rdesc,
|
||||
*/
|
||||
mouse_button_fixup(hdev, rdesc, *rsize, 12, 30, 14, 20, 8);
|
||||
break;
|
||||
case USB_DEVICE_ID_ELECOM_M_XT3DRBK_018C:
|
||||
/*
|
||||
* Report descriptor format:
|
||||
* 22: button bit count
|
||||
* 30: padding bit count
|
||||
* 24: button report size
|
||||
* 16: button usage maximum
|
||||
*/
|
||||
mouse_button_fixup(hdev, rdesc, *rsize, 22, 30, 24, 16, 6);
|
||||
break;
|
||||
case USB_DEVICE_ID_ELECOM_M_DT2DRBK:
|
||||
case USB_DEVICE_ID_ELECOM_M_HT1DRBK_011C:
|
||||
/*
|
||||
@@ -122,7 +132,8 @@ static const struct hid_device_id elecom_devices[] = {
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_M_XGL20DLBK) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_M_XT3URBK_00FB) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_M_XT3URBK_018F) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_M_XT3DRBK) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_M_XT3DRBK_00FC) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_M_XT3DRBK_018C) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_M_XT4DRBK) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_M_DT1URBK) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_M_DT1DRBK) },
|
||||
|
||||
@@ -317,6 +317,7 @@
|
||||
#define USB_DEVICE_ID_CHICONY_ACER_SWITCH12 0x1421
|
||||
#define USB_DEVICE_ID_CHICONY_HP_5MP_CAMERA 0xb824
|
||||
#define USB_DEVICE_ID_CHICONY_HP_5MP_CAMERA2 0xb82c
|
||||
#define USB_DEVICE_ID_CHICONY_HP_5MP_CAMERA3 0xb882
|
||||
|
||||
#define USB_VENDOR_ID_CHUNGHWAT 0x2247
|
||||
#define USB_DEVICE_ID_CHUNGHWAT_MULTITOUCH 0x0001
|
||||
@@ -438,6 +439,9 @@
|
||||
#define USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_A001 0xa001
|
||||
#define USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_C002 0xc002
|
||||
|
||||
#define USB_VENDOR_ID_EDIFIER 0x2d99
|
||||
#define USB_DEVICE_ID_EDIFIER_QR30 0xa101 /* EDIFIER Hal0 2.0 SE */
|
||||
|
||||
#define USB_VENDOR_ID_ELAN 0x04f3
|
||||
#define USB_DEVICE_ID_TOSHIBA_CLICK_L9W 0x0401
|
||||
#define USB_DEVICE_ID_HP_X2 0x074d
|
||||
@@ -451,7 +455,8 @@
|
||||
#define USB_DEVICE_ID_ELECOM_M_XGL20DLBK 0x00e6
|
||||
#define USB_DEVICE_ID_ELECOM_M_XT3URBK_00FB 0x00fb
|
||||
#define USB_DEVICE_ID_ELECOM_M_XT3URBK_018F 0x018f
|
||||
#define USB_DEVICE_ID_ELECOM_M_XT3DRBK 0x00fc
|
||||
#define USB_DEVICE_ID_ELECOM_M_XT3DRBK_00FC 0x00fc
|
||||
#define USB_DEVICE_ID_ELECOM_M_XT3DRBK_018C 0x018c
|
||||
#define USB_DEVICE_ID_ELECOM_M_XT4DRBK 0x00fd
|
||||
#define USB_DEVICE_ID_ELECOM_M_DT1URBK 0x00fe
|
||||
#define USB_DEVICE_ID_ELECOM_M_DT1DRBK 0x00ff
|
||||
|
||||
@@ -4662,6 +4662,8 @@ static const struct hid_device_id hidpp_devices[] = {
|
||||
HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, 0xb025) },
|
||||
{ /* MX Master 3S mouse over Bluetooth */
|
||||
HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, 0xb034) },
|
||||
{ /* MX Anywhere 3S mouse over Bluetooth */
|
||||
HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, 0xb037) },
|
||||
{ /* MX Anywhere 3SB mouse over Bluetooth */
|
||||
HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, 0xb038) },
|
||||
{}
|
||||
|
||||
@@ -81,6 +81,7 @@ MODULE_LICENSE("GPL");
|
||||
#define MT_INPUTMODE_TOUCHPAD 0x03
|
||||
|
||||
#define MT_BUTTONTYPE_CLICKPAD 0
|
||||
#define MT_BUTTONTYPE_PRESSUREPAD 1
|
||||
|
||||
enum latency_mode {
|
||||
HID_LATENCY_NORMAL = 0,
|
||||
@@ -179,6 +180,7 @@ struct mt_device {
|
||||
__u8 inputmode_value; /* InputMode HID feature value */
|
||||
__u8 maxcontacts;
|
||||
bool is_buttonpad; /* is this device a button pad? */
|
||||
bool is_pressurepad; /* is this device a pressurepad? */
|
||||
bool is_haptic_touchpad; /* is this device a haptic touchpad? */
|
||||
bool serial_maybe; /* need to check for serial protocol */
|
||||
|
||||
@@ -393,6 +395,7 @@ static const struct mt_class mt_classes[] = {
|
||||
{ .name = MT_CLS_VTL,
|
||||
.quirks = MT_QUIRK_ALWAYS_VALID |
|
||||
MT_QUIRK_CONTACT_CNT_ACCURATE |
|
||||
MT_QUIRK_STICKY_FINGERS |
|
||||
MT_QUIRK_FORCE_GET_FEATURE,
|
||||
},
|
||||
{ .name = MT_CLS_GOOGLE,
|
||||
@@ -530,8 +533,14 @@ static void mt_feature_mapping(struct hid_device *hdev,
|
||||
}
|
||||
|
||||
mt_get_feature(hdev, field->report);
|
||||
if (field->value[usage->usage_index] == MT_BUTTONTYPE_CLICKPAD)
|
||||
switch (field->value[usage->usage_index]) {
|
||||
case MT_BUTTONTYPE_CLICKPAD:
|
||||
td->is_buttonpad = true;
|
||||
break;
|
||||
case MT_BUTTONTYPE_PRESSUREPAD:
|
||||
td->is_pressurepad = true;
|
||||
break;
|
||||
}
|
||||
|
||||
break;
|
||||
case 0xff0000c5:
|
||||
@@ -1393,6 +1402,8 @@ static int mt_touch_input_configured(struct hid_device *hdev,
|
||||
|
||||
if (td->is_buttonpad)
|
||||
__set_bit(INPUT_PROP_BUTTONPAD, input->propbit);
|
||||
if (td->is_pressurepad)
|
||||
__set_bit(INPUT_PROP_PRESSUREPAD, input->propbit);
|
||||
|
||||
app->pending_palm_slots = devm_kcalloc(&hi->input->dev,
|
||||
BITS_TO_LONGS(td->maxcontacts),
|
||||
|
||||
@@ -753,11 +753,16 @@ ps_gamepad_create(struct hid_device *hdev,
|
||||
if (IS_ERR(gamepad))
|
||||
return ERR_CAST(gamepad);
|
||||
|
||||
/* Set initial resting state for joysticks to 128 (center) */
|
||||
input_set_abs_params(gamepad, ABS_X, 0, 255, 0, 0);
|
||||
gamepad->absinfo[ABS_X].value = 128;
|
||||
input_set_abs_params(gamepad, ABS_Y, 0, 255, 0, 0);
|
||||
gamepad->absinfo[ABS_Y].value = 128;
|
||||
input_set_abs_params(gamepad, ABS_Z, 0, 255, 0, 0);
|
||||
input_set_abs_params(gamepad, ABS_RX, 0, 255, 0, 0);
|
||||
gamepad->absinfo[ABS_RX].value = 128;
|
||||
input_set_abs_params(gamepad, ABS_RY, 0, 255, 0, 0);
|
||||
gamepad->absinfo[ABS_RY].value = 128;
|
||||
input_set_abs_params(gamepad, ABS_RZ, 0, 255, 0, 0);
|
||||
|
||||
input_set_abs_params(gamepad, ABS_HAT0X, -1, 1, 0, 0);
|
||||
|
||||
@@ -81,6 +81,7 @@ static const struct hid_device_id hid_quirks[] = {
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_DRAGONRISE, USB_DEVICE_ID_DRAGONRISE_PS3), HID_QUIRK_MULTI_INPUT },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_DRAGONRISE, USB_DEVICE_ID_DRAGONRISE_WIIU), HID_QUIRK_MULTI_INPUT },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_DWAV, USB_DEVICE_ID_EGALAX_TOUCHCONTROLLER), HID_QUIRK_MULTI_INPUT | HID_QUIRK_NOGET },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_EDIFIER, USB_DEVICE_ID_EDIFIER_QR30), HID_QUIRK_ALWAYS_POLL },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_ELAN, HID_ANY_ID), HID_QUIRK_ALWAYS_POLL },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_ELO, USB_DEVICE_ID_ELO_TS2700), HID_QUIRK_NOGET },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_EMS, USB_DEVICE_ID_EMS_TRIO_LINKER_PLUS_II), HID_QUIRK_MULTI_INPUT },
|
||||
@@ -232,6 +233,15 @@ static const struct hid_device_id hid_quirks[] = {
|
||||
* used as a driver. See hid_scan_report().
|
||||
*/
|
||||
static const struct hid_device_id hid_have_special_driver[] = {
|
||||
#if IS_ENABLED(CONFIG_APPLEDISPLAY)
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, 0x9218) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, 0x9219) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, 0x921c) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, 0x921d) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, 0x9222) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, 0x9226) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, 0x9236) },
|
||||
#endif
|
||||
#if IS_ENABLED(CONFIG_HID_A4TECH)
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_A4TECH, USB_DEVICE_ID_A4TECH_WCP32PU) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_A4TECH, USB_DEVICE_ID_A4TECH_X5_005D) },
|
||||
@@ -412,7 +422,8 @@ static const struct hid_device_id hid_have_special_driver[] = {
|
||||
{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_M_XGL20DLBK) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_M_XT3URBK_00FB) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_M_XT3URBK_018F) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_M_XT3DRBK) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_M_XT3DRBK_00FC) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_M_XT3DRBK_018C) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_M_XT4DRBK) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_M_DT1URBK) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_M_DT1DRBK) },
|
||||
@@ -769,6 +780,7 @@ static const struct hid_device_id hid_ignore_list[] = {
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_BERKSHIRE, USB_DEVICE_ID_BERKSHIRE_PCWD) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_HP_5MP_CAMERA) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_HP_5MP_CAMERA2) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_HP_5MP_CAMERA3) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_CIDC, 0x0103) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_CYGNAL, USB_DEVICE_ID_CYGNAL_RADIO_SI470X) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_CYGNAL, USB_DEVICE_ID_CYGNAL_RADIO_SI4713) },
|
||||
|
||||
@@ -286,6 +286,7 @@ static int i2c_hid_get_report(struct i2c_hid *ihid,
|
||||
* In addition to report data device will supply data length
|
||||
* in the first 2 bytes of the response, so adjust .
|
||||
*/
|
||||
recv_len = min(recv_len, ihid->bufsize - sizeof(__le16));
|
||||
error = i2c_hid_xfer(ihid, ihid->cmdbuf, length,
|
||||
ihid->rawbuf, recv_len + sizeof(__le16));
|
||||
if (error) {
|
||||
|
||||
@@ -495,6 +495,7 @@ static int ishtp_enum_enum_devices(struct ishtp_cl *hid_ishtp_cl)
|
||||
int rv;
|
||||
|
||||
/* Send HOSTIF_DM_ENUM_DEVICES */
|
||||
client_data->enum_devices_done = false;
|
||||
memset(&msg, 0, sizeof(struct hostif_msg));
|
||||
msg.hdr.command = HOSTIF_DM_ENUM_DEVICES;
|
||||
rv = ishtp_cl_send(hid_ishtp_cl, (unsigned char *)&msg,
|
||||
|
||||
@@ -240,9 +240,17 @@ static int ishtp_cl_bus_match(struct device *dev, const struct device_driver *dr
|
||||
{
|
||||
struct ishtp_cl_device *device = to_ishtp_cl_device(dev);
|
||||
struct ishtp_cl_driver *driver = to_ishtp_cl_driver(drv);
|
||||
struct ishtp_fw_client *client = device->fw_client;
|
||||
const struct ishtp_device_id *id;
|
||||
|
||||
return(device->fw_client ? guid_equal(&driver->id[0].guid,
|
||||
&device->fw_client->props.protocol_name) : 0);
|
||||
if (client) {
|
||||
for (id = driver->id; !guid_is_null(&id->guid); id++) {
|
||||
if (guid_equal(&id->guid, &client->props.protocol_name))
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -7,6 +7,7 @@ menu "Intel THC HID Support"
|
||||
config INTEL_THC_HID
|
||||
tristate "Intel Touch Host Controller"
|
||||
depends on ACPI
|
||||
select SGL_ALLOC
|
||||
help
|
||||
THC (Touch Host Controller) is the name of the IP block in PCH that
|
||||
interfaces with Touch Devices (ex: touchscreen, touchpad etc.). It
|
||||
|
||||
@@ -1593,7 +1593,7 @@ int thc_i2c_set_rx_max_size(struct thc_device *dev, u32 max_rx_size)
|
||||
if (!max_rx_size)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
ret = regmap_read(dev->thc_regmap, THC_M_PRT_SW_SEQ_STS_OFFSET, &val);
|
||||
ret = regmap_read(dev->thc_regmap, THC_M_PRT_SPI_ICRRD_OPCODE_OFFSET, &val);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
@@ -1662,7 +1662,7 @@ int thc_i2c_set_rx_int_delay(struct thc_device *dev, u32 delay_us)
|
||||
if (!delay_us)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
ret = regmap_read(dev->thc_regmap, THC_M_PRT_SW_SEQ_STS_OFFSET, &val);
|
||||
ret = regmap_read(dev->thc_regmap, THC_M_PRT_SPI_ICRRD_OPCODE_OFFSET, &val);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
|
||||
@@ -232,6 +232,7 @@ static int setup_dma_buffers(struct thc_device *dev,
|
||||
return 0;
|
||||
|
||||
memset(config->sgls, 0, sizeof(config->sgls));
|
||||
memset(config->sgls_nent_pages, 0, sizeof(config->sgls_nent_pages));
|
||||
memset(config->sgls_nent, 0, sizeof(config->sgls_nent));
|
||||
|
||||
cpu_addr = dma_alloc_coherent(dev->dev, prd_tbls_size,
|
||||
@@ -254,6 +255,7 @@ static int setup_dma_buffers(struct thc_device *dev,
|
||||
}
|
||||
count = dma_map_sg(dev->dev, config->sgls[i], nent, dir);
|
||||
|
||||
config->sgls_nent_pages[i] = nent;
|
||||
config->sgls_nent[i] = count;
|
||||
}
|
||||
|
||||
@@ -299,7 +301,7 @@ static void release_dma_buffers(struct thc_device *dev,
|
||||
continue;
|
||||
|
||||
dma_unmap_sg(dev->dev, config->sgls[i],
|
||||
config->sgls_nent[i],
|
||||
config->sgls_nent_pages[i],
|
||||
config->dir);
|
||||
|
||||
sgl_free(config->sgls[i]);
|
||||
@@ -573,6 +575,11 @@ static int read_dma_buffer(struct thc_device *dev,
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (!read_config->prd_tbls || !read_config->sgls[prd_table_index]) {
|
||||
dev_err_once(dev->dev, "PRD tables are not ready yet\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
prd_tbl = &read_config->prd_tbls[prd_table_index];
|
||||
mes_len = calc_message_len(prd_tbl, &nent);
|
||||
if (mes_len > read_config->max_packet_size) {
|
||||
|
||||
@@ -91,6 +91,7 @@ struct thc_prd_table {
|
||||
* @dir: Direction of DMA for this config
|
||||
* @prd_tbls: PRD tables for current DMA
|
||||
* @sgls: Array of pointers to scatter-gather lists
|
||||
* @sgls_nent_pages: Number of pages per scatter-gather list
|
||||
* @sgls_nent: Actual number of entries per scatter-gather list
|
||||
* @prd_tbl_num: Actual number of PRD tables
|
||||
* @max_packet_size: Size of the buffer needed for 1 DMA message (1 PRD table)
|
||||
@@ -107,6 +108,7 @@ struct thc_dma_configuration {
|
||||
|
||||
struct thc_prd_table *prd_tbls;
|
||||
struct scatterlist *sgls[PRD_TABLES_NUM];
|
||||
u8 sgls_nent_pages[PRD_TABLES_NUM];
|
||||
u8 sgls_nent[PRD_TABLES_NUM];
|
||||
u8 prd_tbl_num;
|
||||
|
||||
|
||||
@@ -985,6 +985,7 @@ static int usbhid_parse(struct hid_device *hid)
|
||||
struct usb_device *dev = interface_to_usbdev (intf);
|
||||
struct hid_descriptor *hdesc;
|
||||
struct hid_class_descriptor *hcdesc;
|
||||
__u8 fixed_opt_descriptors_size;
|
||||
u32 quirks = 0;
|
||||
unsigned int rsize = 0;
|
||||
char *rdesc;
|
||||
@@ -1015,7 +1016,21 @@ static int usbhid_parse(struct hid_device *hid)
|
||||
(hdesc->bNumDescriptors - 1) * sizeof(*hcdesc)) {
|
||||
dbg_hid("hid descriptor invalid, bLen=%hhu bNum=%hhu\n",
|
||||
hdesc->bLength, hdesc->bNumDescriptors);
|
||||
return -EINVAL;
|
||||
|
||||
/*
|
||||
* Some devices may expose a wrong number of descriptors compared
|
||||
* to the provided length.
|
||||
* However, we ignore the optional hid class descriptors entirely
|
||||
* so we can safely recompute the proper field.
|
||||
*/
|
||||
if (hdesc->bLength >= sizeof(*hdesc)) {
|
||||
fixed_opt_descriptors_size = hdesc->bLength - sizeof(*hdesc);
|
||||
|
||||
hid_warn(intf, "fixing wrong optional hid class descriptors count\n");
|
||||
hdesc->bNumDescriptors = fixed_opt_descriptors_size / sizeof(*hcdesc) + 1;
|
||||
} else {
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
|
||||
hid->version = le16_to_cpu(hdesc->bcdHID);
|
||||
|
||||
@@ -184,6 +184,8 @@ MENDIAN=$(if $(IS_LITTLE_ENDIAN),-mlittle-endian,-mbig-endian)
|
||||
|
||||
CLANG_SYS_INCLUDES = $(call get_sys_includes,$(CLANG))
|
||||
BPF_CFLAGS = -g -Werror -D__TARGET_ARCH_$(SRCARCH) $(MENDIAN) \
|
||||
-Wno-microsoft-anon-tag \
|
||||
-fms-extensions \
|
||||
-I$(INCLUDE_DIR)
|
||||
|
||||
CLANG_CFLAGS = $(CLANG_SYS_INCLUDES) \
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
# Copyright (c) 2017 Benjamin Tissoires <benjamin.tissoires@gmail.com>
|
||||
# Copyright (c) 2017 Red Hat, Inc.
|
||||
|
||||
from packaging.version import Version
|
||||
import platform
|
||||
import pytest
|
||||
import re
|
||||
@@ -14,6 +15,19 @@ from .base import HIDTestUdevRule
|
||||
from pathlib import Path
|
||||
|
||||
|
||||
@pytest.fixture(autouse=True)
|
||||
def hidtools_version_check():
|
||||
HIDTOOLS_VERSION = "0.12"
|
||||
try:
|
||||
import hidtools
|
||||
|
||||
version = hidtools.__version__ # type: ignore
|
||||
if Version(version) < Version(HIDTOOLS_VERSION):
|
||||
pytest.skip(reason=f"have hidtools {version}, require >={HIDTOOLS_VERSION}")
|
||||
except Exception:
|
||||
pytest.skip(reason=f"hidtools >={HIDTOOLS_VERSION} required")
|
||||
|
||||
|
||||
# See the comment in HIDTestUdevRule, this doesn't set up but it will clean
|
||||
# up once the last test exited.
|
||||
@pytest.fixture(autouse=True, scope="session")
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
from . import base
|
||||
from hidtools.hut import HUT
|
||||
from hidtools.util import BusType
|
||||
import enum
|
||||
import libevdev
|
||||
import logging
|
||||
import pytest
|
||||
@@ -232,11 +233,17 @@ class Digitizer(base.UHIDTestDevice):
|
||||
return 0
|
||||
|
||||
|
||||
class HIDButtonType(enum.IntEnum):
|
||||
CLICKPAD = 0
|
||||
PRESSUREPAD = 1
|
||||
DISCRETE_BUTTONS = 2
|
||||
|
||||
|
||||
class PTP(Digitizer):
|
||||
def __init__(
|
||||
self,
|
||||
name,
|
||||
type="Click Pad",
|
||||
buttontype=HIDButtonType.CLICKPAD,
|
||||
rdesc_str=None,
|
||||
rdesc=None,
|
||||
application="Touch Pad",
|
||||
@@ -244,11 +251,8 @@ class PTP(Digitizer):
|
||||
max_contacts=None,
|
||||
input_info=None,
|
||||
):
|
||||
self.type = type.lower().replace(" ", "")
|
||||
if self.type == "clickpad":
|
||||
self.buttontype = 0
|
||||
else: # pressurepad
|
||||
self.buttontype = 1
|
||||
self.buttontype = buttontype
|
||||
|
||||
self.clickpad_state = False
|
||||
self.left_state = False
|
||||
self.right_state = False
|
||||
@@ -975,15 +979,36 @@ class BaseTest:
|
||||
assert libevdev.InputEvent(libevdev.EV_ABS.ABS_MT_ORIENTATION, 90) in events
|
||||
|
||||
class TestPTP(TestWin8Multitouch):
|
||||
def test_buttontype(self):
|
||||
"""Check for the right ButtonType."""
|
||||
uhdev = self.uhdev
|
||||
assert uhdev is not None
|
||||
evdev = uhdev.get_evdev()
|
||||
|
||||
# If libevdev.so is not yet compiled with INPUT_PROP_PRESSUREPAD
|
||||
# python-libevdev won't have it either, let's fake it
|
||||
if not getattr(libevdev, "INPUT_PROP_PRESSUREPAD", None):
|
||||
prop = libevdev.InputProperty(name="INPUT_PROP_PRESSUREPAD", value=0x7)
|
||||
libevdev.INPUT_PROP_PRESSUREPAD = prop
|
||||
libevdev.props.append(prop)
|
||||
|
||||
if uhdev.buttontype == HIDButtonType.CLICKPAD:
|
||||
assert libevdev.INPUT_PROP_BUTTONPAD in evdev.properties
|
||||
elif uhdev.buttontype == HIDButtonType.PRESSUREPAD:
|
||||
assert libevdev.INPUT_PROP_PRESSUREPAD in evdev.properties
|
||||
else:
|
||||
assert libevdev.INPUT_PROP_PRESSUREPAD not in evdev.properties
|
||||
assert libevdev.INPUT_PROP_BUTTONPAD not in evdev.properties
|
||||
|
||||
def test_ptp_buttons(self):
|
||||
"""check for button reliability.
|
||||
There are 2 types of touchpads: the click pads and the pressure pads.
|
||||
Each should reliably report the BTN_LEFT events.
|
||||
There are 3 types of touchpads: click pads + pressure pads and
|
||||
those with discrete buttons. Each should reliably report the BTN_LEFT events.
|
||||
"""
|
||||
uhdev = self.uhdev
|
||||
evdev = uhdev.get_evdev()
|
||||
|
||||
if uhdev.type == "clickpad":
|
||||
if uhdev.buttontype in [HIDButtonType.CLICKPAD, HIDButtonType.PRESSUREPAD]:
|
||||
r = uhdev.event(click=True)
|
||||
events = uhdev.next_sync_events()
|
||||
self.debug_reports(r, uhdev, events)
|
||||
@@ -995,7 +1020,7 @@ class BaseTest:
|
||||
self.debug_reports(r, uhdev, events)
|
||||
assert libevdev.InputEvent(libevdev.EV_KEY.BTN_LEFT, 0) in events
|
||||
assert evdev.value[libevdev.EV_KEY.BTN_LEFT] == 0
|
||||
else:
|
||||
elif uhdev.buttontype == HIDButtonType.DISCRETE_BUTTONS:
|
||||
r = uhdev.event(left=True)
|
||||
events = uhdev.next_sync_events()
|
||||
self.debug_reports(r, uhdev, events)
|
||||
@@ -1918,7 +1943,7 @@ class Testdell_044e_1220(BaseTest.TestPTP):
|
||||
def create_device(self):
|
||||
return PTP(
|
||||
"uhid test dell_044e_1220",
|
||||
type="pressurepad",
|
||||
buttontype=HIDButtonType.DISCRETE_BUTTONS,
|
||||
rdesc="05 01 09 02 a1 01 85 01 09 01 a1 00 05 09 19 01 29 03 15 00 25 01 75 01 95 03 81 02 95 05 81 01 05 01 09 30 09 31 15 81 25 7f 75 08 95 02 81 06 09 38 95 01 81 06 05 0c 0a 38 02 81 06 c0 c0 05 0d 09 05 a1 01 85 08 09 22 a1 02 15 00 25 01 09 47 09 42 95 02 75 01 81 02 95 01 75 03 25 05 09 51 81 02 75 01 95 03 81 03 05 01 15 00 26 af 04 75 10 55 0e 65 11 09 30 35 00 46 e8 03 95 01 81 02 26 7b 02 46 12 02 09 31 81 02 c0 55 0c 66 01 10 47 ff ff 00 00 27 ff ff 00 00 75 10 95 01 05 0d 09 56 81 02 09 54 25 05 95 01 75 08 81 02 05 09 19 01 29 03 25 01 75 01 95 03 81 02 95 05 81 03 05 0d 85 09 09 55 75 08 95 01 25 05 b1 02 06 00 ff 85 0a 09 c5 15 00 26 ff 00 75 08 96 00 01 b1 02 c0 06 01 ff 09 01 a1 01 85 03 09 01 15 00 26 ff 00 95 1b 81 02 85 04 09 02 95 50 81 02 85 05 09 03 95 07 b1 02 85 06 09 04 81 02 c0 06 02 ff 09 01 a1 01 85 07 09 02 95 86 75 08 b1 02 c0 05 0d 09 0e a1 01 85 0b 09 22 a1 02 09 52 15 00 25 0a 75 08 95 01 b1 02 c0 09 22 a1 00 85 0c 09 57 09 58 75 01 95 02 25 01 b1 02 95 06 b1 03 c0 c0",
|
||||
)
|
||||
|
||||
@@ -2018,7 +2043,7 @@ class Testelan_04f3_313a(BaseTest.TestPTP):
|
||||
def create_device(self):
|
||||
return PTP(
|
||||
"uhid test elan_04f3_313a",
|
||||
type="touchpad",
|
||||
buttontype=HIDButtonType.DISCRETE_BUTTONS,
|
||||
input_info=(BusType.I2C, 0x04F3, 0x313A),
|
||||
rdesc="05 01 09 02 a1 01 85 01 09 01 a1 00 05 09 19 01 29 03 15 00 25 01 75 01 95 03 81 02 95 05 81 03 05 01 09 30 09 31 15 81 25 7f 75 08 95 02 81 06 75 08 95 05 81 03 c0 06 00 ff 09 01 85 0e 09 c5 15 00 26 ff 00 75 08 95 04 b1 02 85 0a 09 c6 15 00 26 ff 00 75 08 95 04 b1 02 c0 06 00 ff 09 01 a1 01 85 5c 09 01 95 0b 75 08 81 06 85 0d 09 c5 15 00 26 ff 00 75 08 95 04 b1 02 85 0c 09 c6 96 80 03 75 08 b1 02 85 0b 09 c7 95 82 75 08 b1 02 c0 05 0d 09 05 a1 01 85 04 09 22 a1 02 15 00 25 01 09 47 09 42 95 02 75 01 81 02 05 09 09 02 09 03 15 00 25 01 75 01 95 02 81 02 05 0d 95 01 75 04 25 0f 09 51 81 02 05 01 15 00 26 d7 0e 75 10 55 0d 65 11 09 30 35 00 46 44 2f 95 01 81 02 46 12 16 26 eb 06 26 eb 06 09 31 81 02 05 0d 15 00 25 64 95 03 c0 55 0c 66 01 10 47 ff ff 00 00 27 ff ff 00 00 75 10 95 01 09 56 81 02 09 54 25 7f 95 01 75 08 81 02 25 01 75 01 95 08 81 03 09 c5 75 08 95 02 81 03 05 0d 85 02 09 55 09 59 75 04 95 02 25 0f b1 02 85 07 09 60 75 01 95 01 15 00 25 01 b1 02 95 0f b1 03 06 00 ff 06 00 ff 85 06 09 c5 15 00 26 ff 00 75 08 96 00 01 b1 02 c0 05 0d 09 0e a1 01 85 03 09 22 a1 00 09 52 15 00 25 0a 75 10 95 01 b1 02 c0 09 22 a1 00 85 05 09 57 09 58 75 01 95 02 25 01 b1 02 95 0e b1 03 c0 c0 05 01 09 02 a1 01 85 2a 09 01 a1 00 05 09 19 01 29 03 15 00 25 01 75 01 95 03 81 02 95 05 81 03 05 01 09 30 09 31 15 81 25 7f 35 81 45 7f 55 00 65 13 75 08 95 02 81 06 75 08 95 05 81 03 c0 c0",
|
||||
)
|
||||
@@ -2058,6 +2083,16 @@ class Testite_06cb_2968(BaseTest.TestPTP):
|
||||
)
|
||||
|
||||
|
||||
class Testven_0488_108c(BaseTest.TestPTP):
|
||||
def create_device(self):
|
||||
return PTP(
|
||||
"uhid test ven_0488_108c",
|
||||
rdesc="05 01 09 02 a1 01 85 06 09 01 a1 00 05 09 19 01 29 03 15 00 25 01 95 03 75 01 81 02 95 01 75 05 81 03 05 01 09 30 09 31 09 38 15 81 25 7f 75 08 95 03 81 06 c0 c0 05 0d 09 05 a1 01 85 01 05 0d 09 22 a1 02 15 00 25 01 09 47 09 42 95 02 75 01 81 02 95 01 75 03 25 05 09 51 81 02 81 03 05 01 15 00 26 ba 0d 75 10 55 0e 65 11 09 30 35 00 46 d0 05 95 01 81 02 26 d0 06 46 bb 02 09 31 81 02 05 0d 95 01 75 10 26 ff 7f 46 ff 7f 09 30 81 02 c0 05 0d 09 22 a1 02 15 00 25 01 09 47 09 42 95 02 75 01 81 02 95 01 75 03 25 05 09 51 81 02 81 03 05 01 15 00 26 ba 0d 75 10 55 0e 65 11 09 30 35 00 46 d0 05 95 01 81 02 26 d0 06 46 bb 02 09 31 81 02 05 0d 95 01 75 10 26 ff 7f 46 ff 7f 09 30 81 02 c0 05 0d 09 22 a1 02 15 00 25 01 09 47 09 42 95 02 75 01 81 02 95 01 75 03 25 05 09 51 81 02 81 03 05 01 15 00 26 ba 0d 75 10 55 0e 65 11 09 30 35 00 46 d0 05 95 01 81 02 26 d0 06 46 bb 02 09 31 81 02 05 0d 95 01 75 10 26 ff 7f 46 ff 7f 09 30 81 02 c0 55 0c 66 01 10 47 ff ff 00 00 27 ff ff 00 00 75 10 95 01 05 0d 09 56 81 02 09 54 25 05 95 01 75 08 81 02 05 09 09 01 25 01 75 01 95 01 81 02 95 07 81 03 05 0d 85 02 09 55 75 08 95 01 25 05 b1 02 09 59 b1 02 06 00 ff 85 03 09 c5 15 00 26 ff 00 75 08 96 00 01 b1 02 05 0e 09 01 a1 02 85 13 09 23 15 00 25 64 75 08 95 01 b1 02 c0 c0 05 0d 09 0e a1 01 85 04 09 22 a1 02 09 52 15 00 25 0a 75 08 95 01 b1 02 c0 09 22 a1 00 85 05 09 57 09 58 75 01 95 02 25 01 b1 02 95 06 b1 03 c0 c0 06 01 ff 09 02 a1 01 09 00 85 07 15 00 26 ff 00 75 08 96 12 02 b1 02 c0 06 00 ff 09 01 a1 01 85 0d 15 00 26 ff 00 75 08 95 11 09 01 81 02 09 01 91 02 c0 05 0e 09 01 a1 01 85 11 09 35 15 00 26 ff 00 75 08 95 17 b1 02 c0 06 81 ff 09 01 a1 01 09 20 85 17 15 00 26 ff 00 75 08 95 3f 09 01 81 02 09 01 91 02 c0",
|
||||
input_info=(0x18, 0x0488, 0x108C),
|
||||
buttontype=HIDButtonType.PRESSUREPAD,
|
||||
)
|
||||
|
||||
|
||||
class Testn_trig_1b96_0c01(BaseTest.TestWin8Multitouch):
|
||||
def create_device(self):
|
||||
return Digitizer(
|
||||
@@ -2110,7 +2145,7 @@ class Testsipodev_0603_0002(BaseTest.TestPTP):
|
||||
def create_device(self):
|
||||
return PTP(
|
||||
"uhid test sipodev_0603_0002",
|
||||
type="clickpad",
|
||||
buttontype=HIDButtonType.CLICKPAD,
|
||||
rdesc="05 01 09 02 a1 01 85 03 09 01 a1 00 05 09 19 01 29 02 25 01 75 01 95 02 81 02 95 06 81 03 05 01 09 30 09 31 15 80 25 7f 75 08 95 02 81 06 c0 c0 05 0d 09 05 a1 01 85 04 09 22 a1 02 15 00 25 01 09 47 09 42 95 02 75 01 81 02 75 01 95 02 81 03 95 01 75 04 25 05 09 51 81 02 05 01 15 00 26 44 0a 75 0c 55 0e 65 11 09 30 35 00 46 ac 03 95 01 81 02 46 fe 01 26 34 05 75 0c 09 31 81 02 05 0d c0 55 0c 66 01 10 47 ff ff 00 00 27 ff ff 00 00 75 10 95 01 09 56 81 02 09 54 25 0a 95 01 75 04 81 02 75 01 95 03 81 03 05 09 09 01 25 01 75 01 95 01 81 02 05 0d 85 0a 09 55 09 59 75 04 95 02 25 0f b1 02 85 0b 09 60 75 01 95 01 15 00 25 01 b1 02 95 07 b1 03 85 09 06 00 ff 09 c5 15 00 26 ff 00 75 08 96 00 01 b1 02 c0 05 0d 09 0e a1 01 85 06 09 22 a1 02 09 52 15 00 25 0a 75 08 95 01 b1 02 c0 09 22 a1 00 85 07 09 57 09 58 75 01 95 02 25 01 b1 02 95 06 b1 03 c0 c0 05 01 09 0c a1 01 85 08 15 00 25 01 09 c6 75 01 95 01 81 06 75 07 81 03 c0 05 01 09 80 a1 01 85 01 15 00 25 01 75 01 0a 81 00 0a 82 00 0a 83 00 95 03 81 06 95 05 81 01 c0 06 0c 00 09 01 a1 01 85 02 25 01 15 00 75 01 0a b5 00 0a b6 00 0a b7 00 0a cd 00 0a e2 00 0a a2 00 0a e9 00 0a ea 00 95 08 81 02 0a 83 01 0a 6f 00 0a 70 00 0a 88 01 0a 8a 01 0a 92 01 0a a8 02 0a 24 02 95 08 81 02 0a 21 02 0a 23 02 0a 96 01 0a 25 02 0a 26 02 0a 27 02 0a 23 02 0a b1 02 95 08 81 02 c0 06 00 ff 09 01 a1 01 85 05 15 00 26 ff 00 19 01 29 02 75 08 95 05 b1 02 c0",
|
||||
)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user