[Title] Emulator multitouch supporting
authorgiwoong.kim <giwoong.kim@samsung.com>
Thu, 8 Dec 2011 05:16:36 +0000 (14:16 +0900)
committergiwoong.kim <giwoong.kim@samsung.com>
Thu, 8 Dec 2011 05:16:36 +0000 (14:16 +0900)
[Type] Feature
[Module] Dirver / wacom
[Priority] Major
[CQ#] n/a
[Redmine#] 2184
[Problem] no support for multitouch
[Cause] wacom driver is tablet type
[Solution] convert to touchscreen type
[TestCase] Ctrl key + mouse click

drivers/input/tablet/wacom.h [changed mode: 0644->0755]
drivers/input/tablet/wacom_sys.c [changed mode: 0644->0755]
drivers/input/tablet/wacom_wac.c [changed mode: 0644->0755]
drivers/input/tablet/wacom_wac.h [changed mode: 0644->0755]

old mode 100644 (file)
new mode 100755 (executable)
index 9114ae1..2c09224
@@ -123,6 +123,7 @@ extern void wacom_report_rel(void *wcombo, unsigned int rel_type, int rel_data);
 extern void wacom_report_key(void *wcombo, unsigned int key_type, int key_data);
 extern void wacom_input_event(void *wcombo, unsigned int type, unsigned int code, int value);
 extern void wacom_input_sync(void *wcombo);
+extern void wacom_input_mt_sync(void *wcombo);
 extern void wacom_init_input_dev(struct input_dev *input_dev, struct wacom_wac *wacom_wac);
 extern void input_dev_g4(struct input_dev *input_dev, struct wacom_wac *wacom_wac);
 extern void input_dev_g(struct input_dev *input_dev, struct wacom_wac *wacom_wac);
old mode 100644 (file)
new mode 100755 (executable)
index ea30c98..b9cbd16
@@ -149,6 +149,11 @@ void wacom_input_sync(void *wcombo)
        input_sync(get_input_dev((struct wacom_combo *)wcombo));
 }
 
+void wacom_input_mt_sync(void *wcombo)
+{
+       input_mt_sync(get_input_dev((struct wacom_combo *)wcombo));
+}
+
 static int wacom_open(struct input_dev *dev)
 {
        struct wacom *wacom = input_get_drvdata(dev);
@@ -487,8 +492,12 @@ static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *i
        }
 
        input_dev->evbit[0] |= BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS);
+       input_dev->keybit[BIT_WORD(BTN_TOUCH)] |= BIT_MASK(BTN_TOUCH);
+#if 0 //convert device type for emulator
        input_dev->keybit[BIT_WORD(BTN_DIGI)] |= BIT_MASK(BTN_TOOL_PEN) |
                BIT_MASK(BTN_TOUCH) | BIT_MASK(BTN_STYLUS);
+#endif
+
        input_set_abs_params(input_dev, ABS_X, 0, features->x_max, 4, 0);
        input_set_abs_params(input_dev, ABS_Y, 0, features->y_max, 4, 0);
        input_set_abs_params(input_dev, ABS_PRESSURE, 0, features->pressure_max, 0, 0);
@@ -499,6 +508,12 @@ static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *i
        }
        input_dev->absbit[BIT_WORD(ABS_MISC)] |= BIT_MASK(ABS_MISC);
 
+       /* for multitouch */
+       input_set_abs_params(input_dev, ABS_MT_TRACKING_ID, 0, 1, 0, 0);
+       input_set_abs_params(input_dev, ABS_MT_TOUCH_MAJOR, 0, features->pressure_max, 0, 0);
+       input_set_abs_params(input_dev, ABS_MT_POSITION_X, 0, features->touch_x_max, 0, 0);
+       input_set_abs_params(input_dev, ABS_MT_POSITION_Y, 0, features->touch_y_max, 0, 0);
+
        wacom_init_input_dev(input_dev, wacom_wac);
 
        usb_fill_int_urb(wacom->irq, dev,
old mode 100644 (file)
new mode 100755 (executable)
index c896d6a..8d6f239
@@ -38,6 +38,7 @@ static int wacom_penpartner_irq(struct wacom_wac *wacom, void *wcombo)
                        }
                        break;
                case 2:
+#if 0
                        wacom_report_key(wcombo, BTN_TOOL_PEN, 1);
                        wacom_report_abs(wcombo, ABS_MISC, STYLUS_DEVICE_ID); /* report tool id */
                        wacom_report_abs(wcombo, ABS_X, wacom_le16_to_cpu(&data[1]));
@@ -45,6 +46,24 @@ static int wacom_penpartner_irq(struct wacom_wac *wacom, void *wcombo)
                        wacom_report_abs(wcombo, ABS_PRESSURE, (signed char)data[6] + 127);
                        wacom_report_key(wcombo, BTN_TOUCH, ((signed char)data[6] > -80) && !(data[5] & 0x20));
                        wacom_report_key(wcombo, BTN_STYLUS, (data[5] & 0x40));
+#else
+                       if ((signed char)data[6] > -127) { //pressed
+                               wacom_report_abs(wcombo, ABS_MT_TRACKING_ID, data[5]);
+                               wacom_report_abs(wcombo, ABS_MT_TOUCH_MAJOR, 5);
+                               wacom_report_abs(wcombo, ABS_MT_POSITION_X, wacom_le16_to_cpu(&data[1]));
+                               wacom_report_abs(wcombo, ABS_MT_POSITION_Y, wacom_le16_to_cpu(&data[3]));
+                               wacom_input_mt_sync(wcombo);
+                       } else { //release
+                               if (data[5] == 1) {
+                                       wacom_report_abs(wcombo, ABS_MT_TRACKING_ID, 1);
+                                       wacom_report_abs(wcombo, ABS_MT_TOUCH_MAJOR, 0);
+                                       wacom_input_mt_sync(wcombo);
+                               }
+                               wacom_report_abs(wcombo, ABS_MT_TRACKING_ID, 0);
+                               wacom_report_abs(wcombo, ABS_MT_TOUCH_MAJOR, 0);
+                               wacom_input_mt_sync(wcombo);
+                       }
+#endif
                        break;
                default:
                        printk(KERN_INFO "wacom_penpartner_irq: received unknown report #%d\n", data[0]);
@@ -797,7 +816,7 @@ void wacom_init_input_dev(struct input_dev *input_dev, struct wacom_wac *wacom_w
                        input_dev_pl(input_dev, wacom_wac);
                        /* fall through */
                case PENPARTNER:
-                       input_dev_pt(input_dev, wacom_wac);
+                       //input_dev_pt(input_dev, wacom_wac);
                        break;
        }
        return;
old mode 100644 (file)
new mode 100755 (executable)