Input: usbtouchscreen - add support for e2i touchscreen controller
Florian Echtler [Tue, 28 Jul 2009 00:35:39 +0000 (17:35 -0700)]
This patch adds support for the e2i touchscreen controller used in the
Mimo 740 (and probably in other e2i touchscreen products). Tested on
Mimo 740.

Signed-off-by: Florian Echtler <floe@butterbrot.org>
Signed-off-by: Dmitry Torokhov <dtor@mail.ru>

drivers/input/touchscreen/Kconfig
drivers/input/touchscreen/usbtouchscreen.c

index 07703bc..87a1ae6 100644 (file)
@@ -474,6 +474,11 @@ config TOUCHSCREEN_USB_JASTEC
        bool "JASTEC/DigiTech DTR-02U USB touch controller device support" if EMBEDDED
        depends on TOUCHSCREEN_USB_COMPOSITE
 
+config TOUCHSCREEN_USB_E2I
+       default y
+       bool "e2i Touchscreen controller (e.g. from Mimo 740)"
+       depends on TOUCHSCREEN_USB_COMPOSITE
+
 config TOUCHSCREEN_TOUCHIT213
        tristate "Sahara TouchIT-213 touchscreen"
        select SERIO
index c07be07..68ece58 100644 (file)
@@ -120,6 +120,7 @@ enum {
        DEVTYPE_GENERAL_TOUCH,
        DEVTYPE_GOTOP,
        DEVTYPE_JASTEC,
+       DEVTYPE_E2I,
 };
 
 #define USB_DEVICE_HID_CLASS(vend, prod) \
@@ -197,11 +198,47 @@ static struct usb_device_id usbtouch_devices[] = {
        {USB_DEVICE(0x0f92, 0x0001), .driver_info = DEVTYPE_JASTEC},
 #endif
 
+#ifdef CONFIG_TOUCHSCREEN_USB_E2I
+       {USB_DEVICE(0x1ac7, 0x0001), .driver_info = DEVTYPE_E2I},
+#endif
        {}
 };
 
 
 /*****************************************************************************
+ * e2i Part
+ */
+
+#ifdef CONFIG_TOUCHSCREEN_USB_E2I
+static int e2i_init(struct usbtouch_usb *usbtouch)
+{
+       int ret;
+
+       ret = usb_control_msg(usbtouch->udev, usb_rcvctrlpipe(usbtouch->udev, 0),
+                             0x01, 0x02, 0x0000, 0x0081,
+                             NULL, 0, USB_CTRL_SET_TIMEOUT);
+
+       dbg("%s - usb_control_msg - E2I_RESET - bytes|err: %d",
+           __func__, ret);
+       return ret;
+}
+
+static int e2i_read_data(struct usbtouch_usb *dev, unsigned char *pkt)
+{
+       int tmp = (pkt[0] << 8) | pkt[1];
+       dev->x  = (pkt[2] << 8) | pkt[3];
+       dev->y  = (pkt[4] << 8) | pkt[5];
+
+       tmp = tmp - 0xA000;
+       dev->touch = (tmp > 0);
+       dev->press = (tmp > 0 ? tmp : 0);
+
+       return 1;
+}
+#endif
+
+
+/*****************************************************************************
  * eGalax part
  */
 
@@ -734,6 +771,18 @@ static struct usbtouch_device_info usbtouch_dev_info[] = {
                .read_data      = jastec_read_data,
        },
 #endif
+
+#ifdef CONFIG_TOUCHSCREEN_USB_E2I
+       [DEVTYPE_E2I] = {
+               .min_xc         = 0x0,
+               .max_xc         = 0x7fff,
+               .min_yc         = 0x0,
+               .max_yc         = 0x7fff,
+               .rept_size      = 6,
+               .init           = e2i_init,
+               .read_data      = e2i_read_data,
+       },
+#endif
 };