lkml.org 
[lkml]   [2006]   [Mar]   [8]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
From
SubjectRe: [PATCH] add support for PANJIT TouchSet USB Touchscreen Device
Date
> And what about merging with the existing driver?

something like this? it's compile tested only. not even tested
on an egalax screen since i don't have it around...
if this is ok, we could also merge itmtouch and mtouchusb into a
single driver.

rgds
-daniel

---

diff --git a/drivers/usb/input/Kconfig b/drivers/usb/input/Kconfig
index 5246b35..e1caeb5 100644
--- a/drivers/usb/input/Kconfig
+++ b/drivers/usb/input/Kconfig
@@ -224,12 +224,13 @@ config USB_ITMTOUCH
To compile this driver as a module, choose M here: the
module will be called itmtouch.

-config USB_EGALAX
- tristate "eGalax TouchKit USB Touchscreen Driver"
+config USB_TOUCHKIT
+ tristate "TouchKit USB Touchscreen Driver"
depends on USB && INPUT
---help---
- Say Y here if you want to use a eGalax TouchKit USB
- Touchscreen controller.
+ USB Touchscreen driver for:
+ - eGalax Touchkit USB
+ - PanJit TouchSet USB

The driver has been tested on a Xenarc 700TSV monitor
with eGalax touchscreen.
@@ -240,6 +241,16 @@ config USB_EGALAX
To compile this driver as a module, choose M here: the
module will be called touchkitusb.

+config USB_TOUCHKIT_EGALAX
+ default y
+ bool "eGalax device support" if EMBEDDED
+ depends on USB_TOUCHKIT
+
+config USB_TOUCHKIT_PANJIT
+ default y
+ bool "PanJit device support" if EMBEDDED
+ depends on USB_TOUCHKIT
+
config USB_YEALINK
tristate "Yealink usb-p1k voip phone"
depends on USB && INPUT && EXPERIMENTAL
diff --git a/drivers/usb/input/Makefile b/drivers/usb/input/Makefile
index d512d9f..c630ac9 100644
--- a/drivers/usb/input/Makefile
+++ b/drivers/usb/input/Makefile
@@ -36,7 +36,7 @@ obj-$(CONFIG_USB_KEYSPAN_REMOTE) += keys
obj-$(CONFIG_USB_MOUSE) += usbmouse.o
obj-$(CONFIG_USB_MTOUCH) += mtouchusb.o
obj-$(CONFIG_USB_ITMTOUCH) += itmtouch.o
-obj-$(CONFIG_USB_EGALAX) += touchkitusb.o
+obj-$(CONFIG_USB_TOUCHKIT) += touchkitusb.o
obj-$(CONFIG_USB_POWERMATE) += powermate.o
obj-$(CONFIG_USB_WACOM) += wacom.o
obj-$(CONFIG_USB_ACECAD) += acecad.o
diff --git a/drivers/usb/input/touchkitusb.c b/drivers/usb/input/touchkitusb.c
index 697c5e5..523cf1e 100644
--- a/drivers/usb/input/touchkitusb.c
+++ b/drivers/usb/input/touchkitusb.c
@@ -33,23 +33,8 @@
#include <linux/usb.h>
#include <linux/usb_input.h>

-#define TOUCHKIT_MIN_XC 0x0
-#define TOUCHKIT_MAX_XC 0x07ff
-#define TOUCHKIT_XC_FUZZ 0x0
-#define TOUCHKIT_XC_FLAT 0x0
-#define TOUCHKIT_MIN_YC 0x0
-#define TOUCHKIT_MAX_YC 0x07ff
-#define TOUCHKIT_YC_FUZZ 0x0
-#define TOUCHKIT_YC_FLAT 0x0
-#define TOUCHKIT_REPORT_DATA_SIZE 16
-
-#define TOUCHKIT_DOWN 0x01
-
-#define TOUCHKIT_PKT_TYPE_MASK 0xFE
-#define TOUCHKIT_PKT_TYPE_REPT 0x80
-#define TOUCHKIT_PKT_TYPE_DIAG 0x0A

-#define DRIVER_VERSION "v0.1"
+#define DRIVER_VERSION "v0.3"
#define DRIVER_AUTHOR "Daniel Ritz <daniel.ritz@gmx.ch>"
#define DRIVER_DESC "eGalax TouchKit USB HID Touchscreen Driver"

@@ -57,6 +42,29 @@ static int swap_xy;
module_param(swap_xy, bool, 0644);
MODULE_PARM_DESC(swap_xy, "If set X and Y axes are swapped.");

+
+struct touchkit_usb;
+struct touchkit_device_info {
+ int min_xc, max_xc;
+ int min_yc, max_yc;
+
+ void (*process_pkt) (struct touchkit_usb *touchkit, struct pt_regs *regs, char *pkt, int len);
+ int (*read_data) (char *pkt, int *x, int *y, int *touch);
+
+};
+
+/* eGalax specific part */
+#define EGALAX_DOWN 0x01
+#define EGALAX_PKT_TYPE_MASK 0xFE
+#define EGALAX_PKT_TYPE_REPT 0x80
+#define EGALAX_PKT_TYPE_DIAG 0x0A
+
+/* PanJit specific part */
+#define PANJIT_DOWN 0x01
+
+
+/* a touchkit device */
+#define TOUCHKIT_REPORT_DATA_SIZE 16
struct touchkit_usb {
unsigned char *data;
dma_addr_t data_dma;
@@ -65,76 +73,106 @@ struct touchkit_usb {
struct urb *irq;
struct usb_device *udev;
struct input_dev *input;
+ struct touchkit_device_info *type;
char name[128];
char phys[64];
};

+
+enum {
+ DEVTPYE_DUMMY = -1,
+ DEVTYPE_EGALAX,
+ DEVTYPE_PANJIT,
+};
+
static struct usb_device_id touchkit_devices[] = {
- {USB_DEVICE(0x3823, 0x0001)},
- {USB_DEVICE(0x0123, 0x0001)},
- {USB_DEVICE(0x0eef, 0x0001)},
- {USB_DEVICE(0x0eef, 0x0002)},
+#ifdef CONFIG_USB_TOUCHKIT_EGALAX
+ /* eGalax devices */
+ {USB_DEVICE(0x3823, 0x0001), .driver_info = DEVTYPE_EGALAX},
+ {USB_DEVICE(0x0123, 0x0001), .driver_info = DEVTYPE_EGALAX},
+ {USB_DEVICE(0x0eef, 0x0001), .driver_info = DEVTYPE_EGALAX},
+ {USB_DEVICE(0x0eef, 0x0002), .driver_info = DEVTYPE_EGALAX},
+#endif
+
+#ifdef CONFIG_USB_TOUCHKIT_PANJIT
+ /* PanJit devices */
+ {USB_DEVICE(0x134c, 0x0001), .driver_info = DEVTYPE_PANJIT},
+ {USB_DEVICE(0x134c, 0x0002), .driver_info = DEVTYPE_PANJIT},
+ {USB_DEVICE(0x134c, 0x0003), .driver_info = DEVTYPE_PANJIT},
+ {USB_DEVICE(0x134c, 0x0004), .driver_info = DEVTYPE_PANJIT},
+#endif
+
{}
};

-/* helpers to read the data */
-static inline int touchkit_get_touched(char *data)
-{
- return (data[0] & TOUCHKIT_DOWN) ? 1 : 0;
-}
+/* data readers */

-static inline int touchkit_get_x(char *data)
+#ifdef CONFIG_USB_TOUCHKIT_EGALAX
+static int egalax_read_data(char *pkt, int *x, int *y, int *touch)
{
- return ((data[3] & 0x0F) << 7) | (data[4] & 0x7F);
+ if ((pkt[0] & EGALAX_PKT_TYPE_MASK) != EGALAX_PKT_TYPE_REPT)
+ return 0;
+
+ *x = ((pkt[3] & 0x0F) << 7) | (pkt[4] & 0x7F);
+ *y = ((pkt[1] & 0x0F) << 7) | (pkt[2] & 0x7F);
+ *touch = (pkt[0] & EGALAX_DOWN) ? 1 : 0;
+
+ return 1;
+
}
+#endif

-static inline int touchkit_get_y(char *data)
+#ifdef CONFIG_USB_TOUCHKIT_PANJIT
+static int panjit_read_data(char *pkt, int *x, int *y, int *touch)
{
- return ((data[1] & 0x0F) << 7) | (data[2] & 0x7F);
-}
+ *x = pkt[1] | (pkt[2] << 8);
+ *y = pkt[3] | (pkt[4] << 8);
+ *touch = (pkt[0] & EGALAX_DOWN) ? 1 : 0;

+ return 1;
+}
+#endif

-/* processes one input packet. */
+/* processes one input packet. generic */
static void touchkit_process_pkt(struct touchkit_usb *touchkit,
- struct pt_regs *regs, char *pkt)
+ struct pt_regs *regs, char *pkt, int len)
{
- int x, y;
+ int x, y, touch;

- /* only process report packets */
- if ((pkt[0] & TOUCHKIT_PKT_TYPE_MASK) != TOUCHKIT_PKT_TYPE_REPT)
- return;
+ if (!touchkit->type->read_data(pkt, &x, &y, &touch))
+ return;
+
+ input_regs(touchkit->input, regs);
+ input_report_key(touchkit->input, BTN_TOUCH, touch);

if (swap_xy) {
- y = touchkit_get_x(pkt);
- x = touchkit_get_y(pkt);
+ input_report_abs(touchkit->input, ABS_X, y);
+ input_report_abs(touchkit->input, ABS_Y, x);
} else {
- x = touchkit_get_x(pkt);
- y = touchkit_get_y(pkt);
+ input_report_abs(touchkit->input, ABS_X, x);
+ input_report_abs(touchkit->input, ABS_Y, y);
}
-
- input_regs(touchkit->input, regs);
- input_report_key(touchkit->input, BTN_TOUCH, touchkit_get_touched(pkt));
- input_report_abs(touchkit->input, ABS_X, x);
- input_report_abs(touchkit->input, ABS_Y, y);
input_sync(touchkit->input);
}


-static int touchkit_get_pkt_len(char *buf)
+#ifdef CONFIG_USB_TOUCHKIT_EGALAX
+/* eGalax specific packet processing */
+static int egalax_get_pkt_len(char *buf)
{
- switch (buf[0] & TOUCHKIT_PKT_TYPE_MASK) {
- case TOUCHKIT_PKT_TYPE_REPT:
+ switch (buf[0] & EGALAX_PKT_TYPE_MASK) {
+ case EGALAX_PKT_TYPE_REPT:
return 5;

- case TOUCHKIT_PKT_TYPE_DIAG:
+ case EGALAX_PKT_TYPE_DIAG:
return buf[1] + 2;
}

return 0;
}

-static void touchkit_process(struct touchkit_usb *touchkit, int len,
- struct pt_regs *regs)
+static void egalax_process(struct touchkit_usb *touchkit,
+ struct pt_regs *regs, char *pkt, int len)
{
char *buffer;
int pkt_len, buf_len, pos;
@@ -145,9 +183,9 @@ static void touchkit_process(struct touc

/* if only 1 byte in buffer, add another one to get length */
if (touchkit->buf_len == 1)
- touchkit->buffer[1] = touchkit->data[0];
+ touchkit->buffer[1] = pkt[0];

- pkt_len = touchkit_get_pkt_len(touchkit->buffer);
+ pkt_len = egalax_get_pkt_len(touchkit->buffer);

/* unknown packet: drop everything */
if (!pkt_len)
@@ -155,13 +193,13 @@ static void touchkit_process(struct touc

/* append, process */
tmp = pkt_len - touchkit->buf_len;
- memcpy(touchkit->buffer + touchkit->buf_len, touchkit->data, tmp);
- touchkit_process_pkt(touchkit, regs, touchkit->buffer);
+ memcpy(touchkit->buffer + touchkit->buf_len, pkt, tmp);
+ touchkit_process_pkt(touchkit, regs, touchkit->buffer, pkt_len);

- buffer = touchkit->data + tmp;
+ buffer = pkt + tmp;
buf_len = len - tmp;
} else {
- buffer = touchkit->data;
+ buffer = pkt;
buf_len = len;
}

@@ -176,7 +214,7 @@ static void touchkit_process(struct touc
pos = 0;
while (pos < buf_len) {
/* get packet len */
- pkt_len = touchkit_get_pkt_len(buffer + pos);
+ pkt_len = egalax_get_pkt_len(buffer + pos);

/* unknown packet: drop everything */
if (unlikely(!pkt_len))
@@ -184,7 +222,7 @@ static void touchkit_process(struct touc

/* full packet: process */
if (likely(pkt_len <= buf_len)) {
- touchkit_process_pkt(touchkit, regs, buffer + pos);
+ touchkit_process_pkt(touchkit, regs, buffer + pos, pkt_len);
} else {
/* incomplete packet: save in buffer */
memcpy(touchkit->buffer, buffer + pos, buf_len - pos);
@@ -193,6 +231,7 @@ static void touchkit_process(struct touc
pos += pkt_len;
}
}
+#endif


static void touchkit_irq(struct urb *urb, struct pt_regs *regs)
@@ -222,7 +261,7 @@ static void touchkit_irq(struct urb *urb
goto exit;
}

- touchkit_process(touchkit, urb->actual_length, regs);
+ touchkit->type->process_pkt(touchkit, regs, touchkit->data, urb->actual_length);

exit:
retval = usb_submit_urb(urb, GFP_ATOMIC);
@@ -237,7 +276,7 @@ static int touchkit_open(struct input_de

touchkit->irq->dev = touchkit->udev;

- if (usb_submit_urb(touchkit->irq, GFP_ATOMIC))
+ if (usb_submit_urb(touchkit->irq, GFP_KERNEL))
return -EIO;

return 0;
@@ -254,7 +293,7 @@ static int touchkit_alloc_buffers(struct
struct touchkit_usb *touchkit)
{
touchkit->data = usb_buffer_alloc(udev, TOUCHKIT_REPORT_DATA_SIZE,
- SLAB_ATOMIC, &touchkit->data_dma);
+ SLAB_KERNEL, &touchkit->data_dma);

if (!touchkit->data)
return -1;
@@ -270,6 +309,35 @@ static void touchkit_free_buffers(struct
touchkit->data, touchkit->data_dma);
}

+
+/* the different device descriptors */
+static struct touchkit_device_info touchkit_dev_info[] = {
+#ifdef CONFIG_USB_TOUCHKIT_EGALAX
+ [DEVTYPE_EGALAX] = {
+ .min_xc = 0x0,
+ .max_xc = 0x07ff,
+ .min_yc = 0x0,
+ .max_yc = 0x07ff,
+
+ .process_pkt = egalax_process,
+ .read_data = egalax_read_data,
+ },
+#endif
+
+#ifdef CONFIG_USB_TOUCHKIT_PANJIT
+ [DEVTYPE_PANJIT] = {
+ .min_xc = 0x0,
+ .max_xc = 0x0fff,
+ .min_yc = 0x0,
+ .max_yc = 0x0fff,
+
+ .process_pkt = touchkit_process_pkt,
+ .read_data = panjit_read_data,
+ },
+#endif
+};
+
+
static int touchkit_probe(struct usb_interface *intf,
const struct usb_device_id *id)
{
@@ -298,6 +366,7 @@ static int touchkit_probe(struct usb_int

touchkit->udev = udev;
touchkit->input = input_dev;
+ touchkit->type = &touchkit_dev_info[id->driver_info];

if (udev->manufacturer)
strlcpy(touchkit->name, udev->manufacturer, sizeof(touchkit->name));
@@ -327,10 +396,8 @@ static int touchkit_probe(struct usb_int

input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_ABS);
input_dev->keybit[LONG(BTN_TOUCH)] = BIT(BTN_TOUCH);
- input_set_abs_params(input_dev, ABS_X, TOUCHKIT_MIN_XC, TOUCHKIT_MAX_XC,
- TOUCHKIT_XC_FUZZ, TOUCHKIT_XC_FLAT);
- input_set_abs_params(input_dev, ABS_Y, TOUCHKIT_MIN_YC, TOUCHKIT_MAX_YC,
- TOUCHKIT_YC_FUZZ, TOUCHKIT_YC_FLAT);
+ input_set_abs_params(input_dev, ABS_X, touchkit->type->min_xc, touchkit->type->max_xc, 0, 0);
+ input_set_abs_params(input_dev, ABS_Y, touchkit->type->min_yc, touchkit->type->max_yc, 0, 0);

usb_fill_int_urb(touchkit->irq, touchkit->udev,
usb_rcvintpipe(touchkit->udev, 0x81),
diff --git a/drivers/usb/input/hid-core.c b/drivers/usb/input/hid-core.c
index 07a012f..2155513 100644
--- a/drivers/usb/input/hid-core.c
+++ b/drivers/usb/input/hid-core.c
@@ -1460,6 +1460,12 @@ void hid_init_reports(struct hid_device
#define USB_VENDOR_ID_HP 0x03f0
#define USB_DEVICE_ID_HP_USBHUB_KB 0x020c

+#define USB_VENDOR_ID_TOUCHSET 0x134c
+#define USB_DEVICE_ID_TOUCHSET_INITIAL 0x0001
+#define USB_DEVICE_ID_TOUCHSET_JUNIOR 0x0002
+#define USB_DEVICE_ID_TOUCHSET_TRIAD 0x0003
+#define USB_DEVICE_ID_TOUCHSET_QUATA 0x0004
+
/*
* Alphabetically sorted blacklist by quirk type.
*/
@@ -1605,6 +1611,11 @@ static const struct hid_blacklist {
{ USB_VENDOR_ID_APPLE, 0x030A, HID_QUIRK_POWERBOOK_HAS_FN },
{ USB_VENDOR_ID_APPLE, 0x030B, HID_QUIRK_POWERBOOK_HAS_FN },

+ { USB_VENDOR_ID_TOUCHSET, USB_DEVICE_ID_TOUCHSET_INITIAL, HID_QUIRK_BADPAD },
+ { USB_VENDOR_ID_TOUCHSET, USB_DEVICE_ID_TOUCHSET_JUNIOR, HID_QUIRK_BADPAD },
+ { USB_VENDOR_ID_TOUCHSET, USB_DEVICE_ID_TOUCHSET_TRIAD, HID_QUIRK_BADPAD },
+ { USB_VENDOR_ID_TOUCHSET, USB_DEVICE_ID_TOUCHSET_QUATA, HID_QUIRK_BADPAD },
+
{ 0, 0 }
};

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/

\
 
 \ /
  Last update: 2006-03-08 23:48    [W:0.258 / U:0.104 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site