>From 9f4e8d811c1b9fc9552f243fb1d577b2cc67553f Mon Sep 17 00:00:00 2001 From: gopal Date: Tue, 9 Aug 2011 15:15:51 +0530 Subject: [PATCH] We have created Support for DELL-ST2220T TochScreen Monitor Signed-off-by: gopal --- drivers/input/touchscreen/usbtouchscreen.c | 99 +++++++++++++++++++++++++++- 1 files changed, 98 insertions(+), 1 deletions(-) diff --git a/drivers/input/touchscreen/usbtouchscreen.c b/drivers/input/touchscreen/usbtouchscreen.c index 73fd664..beef39f 100644 --- a/drivers/input/touchscreen/usbtouchscreen.c +++ b/drivers/input/touchscreen/usbtouchscreen.c @@ -59,6 +59,8 @@ #define DRIVER_AUTHOR "Daniel Ritz " #define DRIVER_DESC "USB Touchscreen Driver" +#define CONFIG_TOUCHSCREEN_USB_DELL_ST2220T + static int swap_xy; module_param(swap_xy, bool, 0644); MODULE_PARM_DESC(swap_xy, "If set X and Y axes are swapped."); @@ -138,6 +140,7 @@ enum { DEVTYPE_ZYTRONIC, DEVTYPE_TC45USB, DEVTYPE_NEXIO, + DEVTYPE_DELL_ST2220T, }; #define USB_DEVICE_HID_CLASS(vend, prod) \ @@ -238,6 +241,10 @@ static const struct usb_device_id usbtouch_devices[] = { {USB_DEVICE_AND_INTERFACE_INFO(0x1870, 0x0001, 0x0a, 0x00, 0x00), .driver_info = DEVTYPE_NEXIO}, #endif +#ifdef CONFIG_TOUCHSCREEN_USB_DELL_ST2220T +/*Dell-st2220t*/ +{USB_DEVICE(0x1fd2, 0x0064), .driver_info = DEVTYPE_DELL_ST2220T}, +#endif {} }; @@ -335,6 +342,84 @@ static int panjit_read_data(struct usbtouch_usb *dev, unsigned char *pkt) } #endif +/***************************************************************************** +* Dell-ST2220T +*/ +#ifdef CONFIG_TOUCHSCREEN_USB_DELL_ST2220T +#define ST2220T_VENDOR_REQ 0x22 +static int st2220t_read_data(struct usbtouch_usb *dev, unsigned char *pkt) +{ + if (pkt[9] != 0xff && pkt[11]) { + dev->x = (pkt[10] << 8) | pkt[9]; + dev->y = (pkt[12] << 8) | pkt[11]; + dev->x = ((dev->x) * 9) - 0x200; + dev->y = (dev->y) * 15; + input_report_abs(dev->input, ABS_X, dev->x) + input_report_abs(dev->input, ABS_Y, dev->y); + } + dev->x = (pkt[4] << 8) | pkt[3]; + dev->y = (pkt[6] << 8) | pkt[5]; + dev->x = ((dev->x) * 9) - 0x200; + dev->y = (dev->y) * 15; + return 1; +} + +static int st2220t_init(struct usbtouch_usb *usbtouch) +{ + int ret, i; + struct usb_device *udev = interface_to_usbdev(usbtouch->interface); + char *ctrl_buf; + + /*Allocate Memory For Control transfer Buffer */ + + ctrl_buf = kmalloc(64, GFP_KERNEL); + if (ctrl_buf == NULL) { + dbg("%s - Failed : to Get Memory", + __func__); + return -1; + } + + /* Following Control Request is Very Imp + To Start USB Interrupt transaction + this request is SET_REPORT H->D with Data as 07,02,02 */ + + ctrl_buf[0] = 0x07; + ctrl_buf[1] = 0x02; + ctrl_buf[2] = 0x02; + for (i = 0; i < 3; i++) { + ret = usb_control_msg(udev, usb_sndctrlpipe(udev, 0), 0x09, + 0x21, 0x0307, 0x00, ctrl_buf, + 0x03, USB_CTRL_SET_TIMEOUT); + dbg("%s - usb_control_msg - 0x21 0x09 - bytes|err: %d\n", + __func__, ret); + + if (ret == 0) + break; + msleep(150); + } + + if (ret < 0) { + dbg("%s - Failed to Initialize the DELL-ST2220 Touch Monitor\n", + __func__); + return -1; + } + + msleep(150); + for (i = 0; i < 6; i++) { + ret = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), + 0x01, 0xA1, 0x308, 0x00, ctrl_buf, 2, + USB_CTRL_SET_TIMEOUT); + + dbg("%s - usb_control_msg - bytes|err: %d", + __func__, ret); + dbg(" %x %x\n", ctrl_buf[0], ctrl_buf[1]); + msleep(50); + } + + kfree(ctrl_buf); + return 0; +} +#endif /***************************************************************************** * 3M/Microtouch Part @@ -1139,8 +1224,20 @@ static struct usbtouch_device_info usbtouch_dev_info[] = { .exit = nexio_exit, }, #endif -}; +#ifdef CONFIG_TOUCHSCREEN_USB_DELL_ST2220T + + [DEVTYPE_DELL_ST2220T] = { + .min_xc = 0x0, + .max_xc = 0x4000, + .min_yc = 0x0, + .max_yc = 0x4000, + .rept_size = 0x0e, + .read_data = st2220t_read_data, + .init = st2220t_init, + }, +#endif +}; /***************************************************************************** * Generic Part -- 1.7.6