diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c index c957c4b..228fd90 100644 --- a/drivers/hid/hid-core.c +++ b/drivers/hid/hid-core.c @@ -1500,6 +1500,7 @@ static const struct hid_device_id hid_have_special_driver[] = { { HID_USB_DEVICE(USB_VENDOR_ID_ZEROPLUS, 0x0005) }, { HID_USB_DEVICE(USB_VENDOR_ID_ZEROPLUS, 0x0030) }, { HID_USB_DEVICE(USB_VENDOR_ID_ZYDACRON, USB_DEVICE_ID_ZYDACRON_REMOTE_CONTROL) }, + { HID_USB_DEVICE(0x1f2d, 0x0064) }, { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_PRESENTER_8K_BT) }, { } @@ -1837,6 +1838,7 @@ static const struct hid_device_id hid_ignore_list[] = { { HID_USB_DEVICE(USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_1_PHIDGETSERVO_20) }, { HID_USB_DEVICE(USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_8_8_4_IF_KIT) }, { HID_USB_DEVICE(USB_VENDOR_ID_YEALINK, USB_DEVICE_ID_YEALINK_P1K_P4K_B2K) }, + { HID_USB_DEVICE(0x1fd2, 0x0064) }, { } }; @@ -1883,6 +1885,7 @@ static const struct hid_device_id hid_mouse_ignore_list[] = { { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING5_JIS) }, { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY) }, { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY) }, + { HID_USB_DEVICE(0x1fd2, 0x0064) }, { } }; diff --git a/drivers/hid/usbhid/hid-core.c b/drivers/hid/usbhid/hid-core.c index 38c261a..9a79e9f 100644 --- a/drivers/hid/usbhid/hid-core.c +++ b/drivers/hid/usbhid/hid-core.c @@ -240,6 +240,7 @@ static void hid_irq_in(struct urb *urb) struct usbhid_device *usbhid = hid->driver_data; int status; + switch (urb->status) { case 0: /* success */ usbhid_mark_busy(usbhid); @@ -654,6 +655,7 @@ int usbhid_open(struct hid_device *hid) struct usbhid_device *usbhid = hid->driver_data; int res; + mutex_lock(&hid_open_mut); if (!hid->open++) { res = usb_autopm_get_interface(usbhid->intf); @@ -983,6 +985,7 @@ static int usbhid_start(struct hid_device *hid) struct usbhid_device *usbhid = hid->driver_data; unsigned int n, insize = 0; int ret; + clear_bit(HID_DISCONNECTED, &usbhid->iofl); @@ -1156,6 +1159,7 @@ static int usbhid_probe(struct usb_interface *intf, const struct usb_device_id * size_t len; int ret; + dbg_hid("HID probe called for ifnum %d\n", intf->altsetting->desc.bInterfaceNumber); diff --git a/drivers/input/touchscreen/usbtouchscreen.c b/drivers/input/touchscreen/usbtouchscreen.c index 73fd664..b5c1c0f 100644 --- a/drivers/input/touchscreen/usbtouchscreen.c +++ b/drivers/input/touchscreen/usbtouchscreen.c @@ -59,11 +59,13 @@ #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."); -static int hwcalib_xy; +static int hwcalib_xy ; module_param(hwcalib_xy, bool, 0644); MODULE_PARM_DESC(hwcalib_xy, "If set hw-calibrated X/Y are used if available"); @@ -138,6 +140,7 @@ enum { DEVTYPE_ZYTRONIC, DEVTYPE_TC45USB, DEVTYPE_NEXIO, + DEVTYPE_DELL_ST2220T, }; #define USB_DEVICE_HID_CLASS(vend, prod) \ @@ -195,7 +198,6 @@ static const struct usb_device_id usbtouch_devices[] = { #ifdef CONFIG_TOUCHSCREEN_USB_IRTOUCH {USB_DEVICE(0x595a, 0x0001), .driver_info = DEVTYPE_IRTOUCH}, - {USB_DEVICE(0x6615, 0x0001), .driver_info = DEVTYPE_IRTOUCH}, #endif #ifdef CONFIG_TOUCHSCREEN_USB_IDEALTEK @@ -238,6 +240,11 @@ 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 + +{USB_DEVICE(0x1fd2, 0x0064), .driver_info = DEVTYPE_DELL_ST2220T}, + +#endif {} }; @@ -335,6 +342,109 @@ static int panjit_read_data(struct usbtouch_usb *dev, unsigned char *pkt) } #endif +/*................................................................. + * Dell - ST2220T Initialization + *...............................................................*/ + +#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; + + //dev->touch = (pkt[2] & 0x03) ? 1 : 0; + + 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) + { + printk("%s - Failed : to Get Memory \n",__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); + } + + 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,6 +1249,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 + };