Re: usbtouchscreen: Add support for Zytronic capacitive touchscreen

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, 2009-01-15 at 15:12 +0000, Ben Dooks wrote:
> > > > As I understand it; yes. (Some bits of hardware really are hideous
> > > > things) Indeed if the driver fails to load quickly enough, the device
> > > > might disconnect/reconnect before the driver can get hold of it.
> > > Geez... you sure it wasn't just broken device/batch?
> > Nope, the datasheet proudly proclaims this watchdog functionality.
> Would be useful to add a comment about that being the primary function
> for the irq_always flag

I've done this.

Here is a patch with the fake pressure support removed, as Dmitry tells
me there is now support in TSLib for that. It also updates the comment
as suggested by Ben Dooks.

Regards,

Daniel.

usbtouchscreen: Add support for Zytronic capacitive touchscreen

Zytronic USB-attached capacitive touchscreen support
within the generic USB touchscreen driver.

Signed-off-by: Simtec Linux Team <linux@xxxxxxxxxxxx>
Signed-off-by: Daniel Silverstone <dsilvers@xxxxxxxxxxxx>
Signed-off-by: Vincent Sanders <vince@xxxxxxxxxxxx>

Index: linux-2.6.29-rc2/drivers/input/touchscreen/usbtouchscreen.c
===================================================================
--- linux-2.6.29-rc2.orig/drivers/input/touchscreen/usbtouchscreen.c
2009-01-29 09:50:40.677710539 +0000
+++ linux-2.6.29-rc2/drivers/input/touchscreen/usbtouchscreen.c
2009-01-29 10:51:24.897709879 +0000
@@ -13,6 +13,7 @@
  *  - IdealTEK URTC1000
  *  - General Touch
  *  - GoTop Super_Q2/GogoPen/PenPower tablets
+ *  - Zytronic capacitive touchscreen
  *
  * Copyright (C) 2004-2007 by Daniel Ritz <daniel.ritz@xxxxxx>
  * Copyright (C) by Todd E. Johnson (mtouchusb.c)
@@ -68,6 +69,14 @@
 	int min_press, max_press;
 	int rept_size;
 
+	/* Always service the USB devices irq not just when the input device
is
+	 * open. This is useful when devices have a watchdog which prevents us
+         * from periodically polling the device. Leave this unset
unless your
+         * touchscreen device requires it, as it does consume more of
the USB
+         * bandwidth.
+	 */
+	int irq_always;
+
 	void (*process_pkt) (struct usbtouch_usb *usbtouch, unsigned char
*pkt, int len);
 
 	/*
@@ -114,6 +123,7 @@
 	DEVTYPE_IDEALTEK,
 	DEVTYPE_GENERAL_TOUCH,
 	DEVTYPE_GOTOP,
+	DEVTYPE_ZYTRONIC,
 };
 
 #define USB_DEVICE_HID_CLASS(vend, prod) \
@@ -186,6 +196,10 @@
 	{USB_DEVICE(0x08f2, 0x00f4), .driver_info = DEVTYPE_GOTOP},
 #endif
 
+#ifdef CONFIG_TOUCHSCREEN_USB_ZYTRONIC
+	{USB_DEVICE(0x14c8, 0x0003), .driver_info = DEVTYPE_ZYTRONIC},
+#endif
+
 	{}
 };
 
@@ -547,6 +561,39 @@
 }
 #endif
 
+/*****************************************************************************
+ * Zytronic Part
+ */
+#ifdef CONFIG_TOUCHSCREEN_USB_ZYTRONIC
+static int zytronic_read_data(struct usbtouch_usb *dev, unsigned char
*pkt)
+{
+	switch (pkt[0]) {
+	case 0x3A: /* command response */
+		dbg("%s: Command response %d", __func__, pkt[1]);
+		break;
+
+	case 0xC0: /* down */
+		dev->x = (pkt[1] & 0x7f) | ((pkt[2] & 0x07) << 7);
+		dev->y = (pkt[3] & 0x7f) | ((pkt[4] & 0x07) << 7);
+		dev->touch = 1;
+		dbg("%s: down %d,%d", __func__, dev->x, dev->y);
+		return 1;
+
+	case 0x80: /* up */
+		dev->x = (pkt[1] & 0x7f) | ((pkt[2] & 0x07) << 7);
+		dev->y = (pkt[3] & 0x7f) | ((pkt[4] & 0x07) << 7);
+		dev->touch = 0;
+		dbg("%s: up %d,%d", __func__, dev->x, dev->y);
+		return 1;
+
+	default:
+		dbg("%s: Unknown return %d", __func__, pkt[0]);
+		break;
+	}
+
+	return 0;
+}
+#endif
 
 /*****************************************************************************
  * the different device descriptors
@@ -686,8 +733,19 @@
 		.read_data	= gotop_read_data,
 	},
 #endif
-};
 
+#ifdef CONFIG_TOUCHSCREEN_USB_ZYTRONIC
+	[DEVTYPE_ZYTRONIC] = {
+		.min_xc		= 0x0,
+		.max_xc		= 0x03ff,
+		.min_yc		= 0x0,
+		.max_yc		= 0x03ff,
+		.rept_size	= 5,
+		.read_data	= zytronic_read_data,
+		.irq_always     = 1,
+	},
+#endif
+};
 
 /*****************************************************************************
  * Generic Part
@@ -836,8 +894,10 @@
 
 	usbtouch->irq->dev = usbtouch->udev;
 
-	if (usb_submit_urb(usbtouch->irq, GFP_KERNEL))
-		return -EIO;
+	if (!usbtouch->type->irq_always) {
+		if (usb_submit_urb(usbtouch->irq, GFP_KERNEL))
+			return -EIO;
+	}
 
 	return 0;
 }
@@ -846,7 +906,8 @@
 {
 	struct usbtouch_usb *usbtouch = input_get_drvdata(input);
 
-	usb_kill_urb(usbtouch->irq);
+	if (!usbtouch->type->irq_always)
+		usb_kill_urb(usbtouch->irq);
 }
 
 
@@ -969,6 +1030,9 @@
 
 	usb_set_intfdata(intf, usbtouch);
 
+	if (usbtouch->type->irq_always)
+		usb_submit_urb(usbtouch->irq, GFP_KERNEL);
+
 	return 0;
 
 out_free_buffers:
Index: linux-2.6.29-rc2/drivers/input/touchscreen/Kconfig
===================================================================
--- linux-2.6.29-rc2.orig/drivers/input/touchscreen/Kconfig	2009-01-29
10:16:41.433707585 +0000
+++ linux-2.6.29-rc2/drivers/input/touchscreen/Kconfig	2009-01-29
10:16:51.301709658 +0000
@@ -342,6 +342,7 @@
 	  - IRTOUCHSYSTEMS/UNITOP
 	  - IdealTEK URTC1000
 	  - GoTop Super_Q2/GogoPen/PenPower tablets
+	  - Zytronic controllers
 
 	  Have a look at <http://linux.chapter7.ch/touchkit/> for
 	  a usage description and the required user-space stuff.
@@ -426,4 +427,9 @@
 	  To compile this driver as a module, choose M here: the
 	  module will be called tsc2007.
 
+config TOUCHSCREEN_USB_ZYTRONIC
+	default y
+	bool "Zytronic controller" if EMBEDDED
+	depends on TOUCHSCREEN_USB_COMPOSITE
+
 endif


-- 
Daniel Silverstone                              http://www.simtec.co.uk/
PGP mail accepted and encouraged.            Key Id: 2BC8 4016 2068 7895


--
To unsubscribe from this list: send the line "unsubscribe linux-input" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Media Devel]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Linux Wireless Networking]     [Linux Omap]

  Powered by Linux