Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a062cc5a authored by Stephane Chatty's avatar Stephane Chatty Committed by Jiri Kosina
Browse files

HID: hid-multitouch: add support for the IDEACOM 6650 chip



The IDEACOM 6650 multitouch chip, present in various all-in-one computers,
uses the serial version of the HID multitouch protocol. No existing class
supports this.

In principle, the new MT_CLS_SERIAL should work for other
serial panels as well, perhaps including some eGalax panels.

Signed-off-by: default avatarStephane Chatty <chatty@enac.fr>
Signed-off-by: default avatarJiri Kosina <jkosina@suse.cz>
parent c50bb1a4
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -1388,6 +1388,7 @@ static const struct hid_device_id hid_have_special_driver[] = {
	{ HID_USB_DEVICE(USB_VENDOR_ID_GYRATION, USB_DEVICE_ID_GYRATION_REMOTE_2) },
	{ HID_USB_DEVICE(USB_VENDOR_ID_GYRATION, USB_DEVICE_ID_GYRATION_REMOTE_2) },
	{ HID_USB_DEVICE(USB_VENDOR_ID_GYRATION, USB_DEVICE_ID_GYRATION_REMOTE_3) },
	{ HID_USB_DEVICE(USB_VENDOR_ID_GYRATION, USB_DEVICE_ID_GYRATION_REMOTE_3) },
	{ HID_USB_DEVICE(USB_VENDOR_ID_HANVON, USB_DEVICE_ID_HANVON_MULTITOUCH) },
	{ HID_USB_DEVICE(USB_VENDOR_ID_HANVON, USB_DEVICE_ID_HANVON_MULTITOUCH) },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_IDEACOM, USB_DEVICE_ID_IDEACOM_IDC6650) },
	{ HID_USB_DEVICE(USB_VENDOR_ID_HOLTEK, USB_DEVICE_ID_HOLTEK_ON_LINE_GRIP) },
	{ HID_USB_DEVICE(USB_VENDOR_ID_HOLTEK, USB_DEVICE_ID_HOLTEK_ON_LINE_GRIP) },
	{ HID_USB_DEVICE(USB_VENDOR_ID_ILITEK, USB_DEVICE_ID_ILITEK_MULTITOUCH) },
	{ HID_USB_DEVICE(USB_VENDOR_ID_ILITEK, USB_DEVICE_ID_ILITEK_MULTITOUCH) },
	{ HID_USB_DEVICE(USB_VENDOR_ID_IRTOUCHSYSTEMS, USB_DEVICE_ID_IRTOUCH_INFRARED_USB) },
	{ HID_USB_DEVICE(USB_VENDOR_ID_IRTOUCHSYSTEMS, USB_DEVICE_ID_IRTOUCH_INFRARED_USB) },
+3 −0
Original line number Original line Diff line number Diff line
@@ -347,6 +347,9 @@
#define USB_DEVICE_ID_UGCI_FLYING	0x0020
#define USB_DEVICE_ID_UGCI_FLYING	0x0020
#define USB_DEVICE_ID_UGCI_FIGHTING	0x0030
#define USB_DEVICE_ID_UGCI_FIGHTING	0x0030


#define USB_VENDOR_ID_IDEACOM		0x1cb6
#define USB_DEVICE_ID_IDEACOM_IDC6650	0x6650

#define USB_VENDOR_ID_ILITEK		0x222a
#define USB_VENDOR_ID_ILITEK		0x222a
#define USB_DEVICE_ID_ILITEK_MULTITOUCH	0x0001
#define USB_DEVICE_ID_ILITEK_MULTITOUCH	0x0001


+21 −10
Original line number Original line Diff line number Diff line
@@ -47,10 +47,11 @@ MODULE_LICENSE("GPL");
#define MT_QUIRK_SLOT_IS_CONTACTID	(1 << 1)
#define MT_QUIRK_SLOT_IS_CONTACTID	(1 << 1)
#define MT_QUIRK_CYPRESS		(1 << 2)
#define MT_QUIRK_CYPRESS		(1 << 2)
#define MT_QUIRK_SLOT_IS_CONTACTNUMBER	(1 << 3)
#define MT_QUIRK_SLOT_IS_CONTACTNUMBER	(1 << 3)
#define MT_QUIRK_VALID_IS_INRANGE	(1 << 4)
#define MT_QUIRK_ALWAYS_VALID		(1 << 4)
#define MT_QUIRK_VALID_IS_CONFIDENCE	(1 << 5)
#define MT_QUIRK_VALID_IS_INRANGE	(1 << 5)
#define MT_QUIRK_EGALAX_XYZ_FIXUP	(1 << 6)
#define MT_QUIRK_VALID_IS_CONFIDENCE	(1 << 6)
#define MT_QUIRK_SLOT_IS_CONTACTID_MINUS_ONE	(1 << 7)
#define MT_QUIRK_EGALAX_XYZ_FIXUP	(1 << 7)
#define MT_QUIRK_SLOT_IS_CONTACTID_MINUS_ONE	(1 << 8)


struct mt_slot {
struct mt_slot {
	__s32 x, y, p, w, h;
	__s32 x, y, p, w, h;
@@ -86,11 +87,12 @@ struct mt_class {
/* classes of device behavior */
/* classes of device behavior */
#define MT_CLS_DEFAULT				0x0001
#define MT_CLS_DEFAULT				0x0001


#define MT_CLS_CONFIDENCE			0x0002
#define MT_CLS_SERIAL				0x0002
#define MT_CLS_CONFIDENCE_MINUS_ONE		0x0003
#define MT_CLS_CONFIDENCE			0x0003
#define MT_CLS_DUAL_INRANGE_CONTACTID		0x0004
#define MT_CLS_CONFIDENCE_MINUS_ONE		0x0004
#define MT_CLS_DUAL_INRANGE_CONTACTNUMBER	0x0005
#define MT_CLS_DUAL_INRANGE_CONTACTID		0x0005
#define MT_CLS_DUAL_NSMU_CONTACTID		0x0006
#define MT_CLS_DUAL_INRANGE_CONTACTNUMBER	0x0006
#define MT_CLS_DUAL_NSMU_CONTACTID		0x0007


/* vendor specific classes */
/* vendor specific classes */
#define MT_CLS_3M				0x0101
#define MT_CLS_3M				0x0101
@@ -134,6 +136,8 @@ static int find_slot_from_contactid(struct mt_device *td)
struct mt_class mt_classes[] = {
struct mt_class mt_classes[] = {
	{ .name = MT_CLS_DEFAULT,
	{ .name = MT_CLS_DEFAULT,
		.quirks = MT_QUIRK_NOT_SEEN_MEANS_UP },
		.quirks = MT_QUIRK_NOT_SEEN_MEANS_UP },
	{ .name = MT_CLS_SERIAL,
		.quirks = MT_QUIRK_ALWAYS_VALID},
	{ .name = MT_CLS_CONFIDENCE,
	{ .name = MT_CLS_CONFIDENCE,
		.quirks = MT_QUIRK_VALID_IS_CONFIDENCE },
		.quirks = MT_QUIRK_VALID_IS_CONFIDENCE },
	{ .name = MT_CLS_CONFIDENCE_MINUS_ONE,
	{ .name = MT_CLS_CONFIDENCE_MINUS_ONE,
@@ -445,7 +449,9 @@ static int mt_event(struct hid_device *hid, struct hid_field *field,
	if (hid->claimed & HID_CLAIMED_INPUT && td->slots) {
	if (hid->claimed & HID_CLAIMED_INPUT && td->slots) {
		switch (usage->hid) {
		switch (usage->hid) {
		case HID_DG_INRANGE:
		case HID_DG_INRANGE:
			if (quirks & MT_QUIRK_VALID_IS_INRANGE)
			if (quirks & MT_QUIRK_ALWAYS_VALID)
				td->curvalid = true;
			else if (quirks & MT_QUIRK_VALID_IS_INRANGE)
				td->curvalid = value;
				td->curvalid = value;
			break;
			break;
		case HID_DG_TIPSWITCH:
		case HID_DG_TIPSWITCH:
@@ -672,6 +678,11 @@ static const struct hid_device_id mt_devices[] = {
		HID_USB_DEVICE(USB_VENDOR_ID_GOODTOUCH,
		HID_USB_DEVICE(USB_VENDOR_ID_GOODTOUCH,
			USB_DEVICE_ID_GOODTOUCH_000f) },
			USB_DEVICE_ID_GOODTOUCH_000f) },


	/* Ideacom panel */
	{ .driver_data = MT_CLS_SERIAL,
		HID_USB_DEVICE(USB_VENDOR_ID_IDEACOM,
			USB_DEVICE_ID_IDEACOM_IDC6650) },

	/* Ilitek dual touch panel */
	/* Ilitek dual touch panel */
	{  .driver_data = MT_CLS_DEFAULT,
	{  .driver_data = MT_CLS_DEFAULT,
		HID_USB_DEVICE(USB_VENDOR_ID_ILITEK,
		HID_USB_DEVICE(USB_VENDOR_ID_ILITEK,