On Wed, Dec 7, 2011 at 12:42 PM, Chris Bagwell <ch...@cnpbagwell.com> wrote: > On Wed, Dec 7, 2011 at 2:16 PM, Jason Gerecke <killert...@gmail.com> wrote: >> This patch breaks the Graphire 4. The X driver appears to get confused >> about what buttons are being pressed. This happens with all tools, >> from what I can tell. Only the right mouse button appears to work >> correctly, and can be used to get the driver back in sync with reality >> until you make another non-right click. > > I think I see the bug in patch. I'll point it out below and try to > send an updated patch at another time. > >> >> Jason >> >> --- >> Day xee-nee-svsh duu-'ushtlh-ts'it; >> nuu-wee-ya' duu-xan' 'vm-nvshtlh-ts'it. >> Huu-chan xuu naa~-gha. >> >> >> >> On Thu, Dec 1, 2011 at 8:02 PM, <ch...@cnpbagwell.com> wrote: >>> From: Chris Bagwell <ch...@cnpbagwell.com> >>> >>> Don't work so hard to not report events. Let input event >>> filtering do its thing for us. Makes it easier to follow >>> data parsing vs. event sending features. >>> >>> Left in event filtering for overlapping events and had >>> a purpose for preventing events. >>> >>> Signed-off-by: Chris Bagwell <ch...@cnpbagwell.com> >>> --- >>> drivers/input/tablet/wacom_wac.c | 141 >>> ++++++++++++++++++++++--------------- >>> 1 files changed, 84 insertions(+), 57 deletions(-) >>> >>> diff --git a/drivers/input/tablet/wacom_wac.c >>> b/drivers/input/tablet/wacom_wac.c >>> index 7b69a21..7acc87b 100644 >>> --- a/drivers/input/tablet/wacom_wac.c >>> +++ b/drivers/input/tablet/wacom_wac.c >>> @@ -206,9 +206,10 @@ static int wacom_graphire_irq(struct wacom_wac *wacom) >>> struct wacom_features *features = &wacom->features; >>> unsigned char *data = wacom->data; >>> struct input_dev *input = wacom->input; >>> - int prox; >>> - int rw = 0; >>> int retval = 0; >>> + int prox, x = 0, y = 0, p = 0, d = 0, pen = 0, btn1 = 0, btn2 = 0; >>> + int btnl = 0, btnm = 0, btnr = 0, btnb = 0, btnf = 0; >>> + int rw = 0, aw = 0; >>> >>> if (data[0] != WACOM_REPORT_PENABLED) { >>> dbg("wacom_graphire_irq: received unknown report #%d", >>> data[0]); >>> @@ -216,86 +217,112 @@ static int wacom_graphire_irq(struct wacom_wac >>> *wacom) >>> } >>> >>> prox = data[1] & 0x80; >>> - if (prox || wacom->id[0]) { >>> - if (prox) { >>> - switch ((data[1] >> 5) & 3) { >>> + if (prox) { >>> + switch ((data[1] >> 5) & 3) { >>> >>> - case 0: /* Pen */ >>> - wacom->tool[0] = BTN_TOOL_PEN; >>> - wacom->id[0] = STYLUS_DEVICE_ID; >>> - break; >>> + case 0: /* Pen */ >>> + wacom->tool[0] = BTN_TOOL_PEN; >>> + break; >>> >>> - case 1: /* Rubber */ >>> - wacom->tool[0] = BTN_TOOL_RUBBER; >>> - wacom->id[0] = ERASER_DEVICE_ID; >>> - break; >>> + case 1: /* Rubber */ >>> + wacom->tool[0] = BTN_TOOL_RUBBER; >>> + break; >>> >>> - case 2: /* Mouse with wheel */ >>> - input_report_key(input, BTN_MIDDLE, data[1] >>> & 0x04); >>> - /* fall through */ >>> + case 2: /* Mouse with wheel */ >>> + btnm = data[1] & 0x04; >>> + /* fall through */ >>> >>> - case 3: /* Mouse without wheel */ >>> - wacom->tool[0] = BTN_TOOL_MOUSE; >>> - wacom->id[0] = CURSOR_DEVICE_ID; >>> - break; >>> - } >>> + case 3: /* Mouse without wheel */ >>> + wacom->tool[0] = BTN_TOOL_MOUSE; >>> + break; >>> } >>> - input_report_abs(input, ABS_X, le16_to_cpup((__le16 >>> *)&data[2])); >>> - input_report_abs(input, ABS_Y, le16_to_cpup((__le16 >>> *)&data[4])); >>> + x = le16_to_cpup((__le16 *)&data[2]); >>> + y = le16_to_cpup((__le16 *)&data[4]); >>> if (wacom->tool[0] != BTN_TOOL_MOUSE) { >>> - input_report_abs(input, ABS_PRESSURE, data[6] | >>> ((data[7] & 0x01) << 8)); >>> - input_report_key(input, BTN_TOUCH, data[1] & 0x01); >>> - input_report_key(input, BTN_STYLUS, data[1] & 0x02); >>> - input_report_key(input, BTN_STYLUS2, data[1] & >>> 0x04); >>> + p = data[6] | ((data[7] & 0x01) << 8); >>> + pen = data[1] & 0x01; >>> + btn1 = data[1] & 0x02; >>> + btn2 = data[1] & 0x04; >>> } else { >>> - input_report_key(input, BTN_LEFT, data[1] & 0x01); >>> - input_report_key(input, BTN_RIGHT, data[1] & 0x02); >>> + btnl = data[1] & 0x01; >>> + btnr = data[1] & 0x02; >>> if (features->type == WACOM_G4 || >>> features->type == WACOM_MO) { >>> - input_report_abs(input, ABS_DISTANCE, >>> data[6] & 0x3f); >>> + d = data[6] & 0x3f; >>> rw = (data[7] & 0x04) - (data[7] & 0x03); >>> } else { >>> - input_report_abs(input, ABS_DISTANCE, >>> data[7] & 0x3f); >>> + d = data[7] & 0x3f; >>> rw = -(signed char)data[6]; >>> } >>> - input_report_rel(input, REL_WHEEL, rw); >>> } >>> + } >>> >>> - if (!prox) >>> - wacom->id[0] = 0; >>> - input_report_key(input, wacom->tool[0], prox); >>> - input_sync(input); /* sync last event */ >>> + input_report_abs(input, ABS_X, x); >>> + input_report_abs(input, ABS_Y, y); >>> + input_report_abs(input, ABS_PRESSURE, p); >>> + input_report_key(input, BTN_TOUCH, pen); >>> + input_report_key(input, BTN_STYLUS, btn1); >>> + input_report_key(input, BTN_STYLUS2, btn2); >>> + input_report_abs(input, ABS_DISTANCE, d); >>> + input_report_rel(input, REL_WHEEL, rw); >>> + input_report_key(input, BTN_MIDDLE, btnm); >>> + >>> + /* Buttons on the mouse puck are sending the same events as >>> + * buttons located on the tablet. >>> + * >>> + * The following is to only send these overlapping events >>> + * when pressed and once more upon release so that the >>> + * two sources are not fighting each other. >>> + * >>> + * It would be odd for user to click the mouse puck and tablet >>> + * buttons at same time. >>> + */ >>> + if (btnl || btnr || wacom->id[0]) { >>> + input_report_key(input, BTN_LEFT, btnl); >>> + input_report_key(input, BTN_RIGHT, btnr); >>> + wacom->id[0] = 0; >>> } > > That should be something like this. Without it, we were never sending > the button release event. > > if (btnl || btnr || wacom->id[0]) { > wacom->id[0] = CURSOR_DEVICE_ID; > input_report_key(input, BTN_LEFT, btnl); > input_report_key(input, BTN_RIGHT, btnr); > if (wacom->id[0]) > wacom->id[0] = 0; > } > > Could be more bugs lurking, I'm sure. > > Chris > >>> >>> + input_report_key(input, wacom->tool[0], prox); >>> + input_sync(input); /* sync last event */ >>> + >>> /* send pad data */ >>> switch (features->type) { >>> case WACOM_G4: >>> - prox = data[7] & 0xf8; >>> - if (prox || wacom->id[1]) { >>> - wacom->id[1] = PAD_DEVICE_ID; >>> - input_report_key(input, BTN_BACK, (data[7] & 0x40)); >>> - input_report_key(input, BTN_FORWARD, (data[7] & >>> 0x80)); >>> - rw = ((data[7] & 0x18) >> 3) - ((data[7] & 0x20) >> >>> 3); >>> - input_report_rel(input, REL_WHEEL, rw); >>> - if (!prox) >>> - wacom->id[1] = 0; >>> - retval = 1; >>> - } >>> + btnb = (data[7] & 0x40); >>> + btnf = (data[7] & 0x80); >>> + aw = ((data[7] & 0x18) >> 3) - ((data[7] & 0x20) >> 3); >>> + input_report_key(input, BTN_BACK, (data[7] & 0x40)); >>> + input_report_key(input, BTN_FORWARD, (data[7] & 0x80)); >>> + input_report_rel(input, REL_WHEEL, aw); >>> + retval = 1; >>> + >>> break; >>> >>> case WACOM_MO: >>> - prox = (data[7] & 0xf8) || data[8]; >>> - if (prox || wacom->id[1]) { >>> + btnb = (data[7] & 0x08); >>> + btnf = (data[7] & 0x10); >>> + aw = (data[8] & 0x7f); >>> + input_report_key(input, BTN_BACK, btnb); >>> + input_report_key(input, BTN_FORWARD, btnf); >>> + input_report_abs(input, ABS_WHEEL, aw); >>> + >>> + /* See comment for mouse puck buttons above */ >>> + btnl = 0; >>> + btnr = 0; >>> + prox = data[7] & 0x60; >>> + if (prox) { >>> + btnl = (data[7] & 0x20); >>> + btnr = (data[7] & 0x40); >>> wacom->id[1] = PAD_DEVICE_ID; >>> - input_report_key(input, BTN_BACK, (data[7] & 0x08)); >>> - input_report_key(input, BTN_LEFT, (data[7] & 0x20)); >>> - input_report_key(input, BTN_FORWARD, (data[7] & >>> 0x10)); >>> - input_report_key(input, BTN_RIGHT, (data[7] & >>> 0x40)); >>> - input_report_abs(input, ABS_WHEEL, (data[8] & >>> 0x7f)); >>> - if (!prox) >>> - wacom->id[1] = 0; >>> - retval = 1; >>> + }; >>> + if (prox || wacom->id[1]) { >>> + input_report_key(input, BTN_LEFT, btnl); >>> + input_report_key(input, BTN_RIGHT, btnr); >>> + wacom->id[1] = 0; >>> } >>> + retval = 1; >>> + >>> break; >>> } >>> exit: >>> -- >>> 1.7.7.3 >>>
Applied the suggested changes and recompiled, but doesn't appear to have changed the behavior. Right click still gets things into a sane state, left and middle buttons still acting up. Jason --- Day xee-nee-svsh duu-'ushtlh-ts'it; nuu-wee-ya' duu-xan' 'vm-nvshtlh-ts'it. Huu-chan xuu naa~-gha. ------------------------------------------------------------------------------ Cloud Services Checklist: Pricing and Packaging Optimization This white paper is intended to serve as a reference, checklist and point of discussion for anyone considering optimizing the pricing and packaging model of a cloud services business. Read Now! http://www.accelacomm.com/jaw/sfnl/114/51491232/ _______________________________________________ Linuxwacom-devel mailing list Linuxwacom-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linuxwacom-devel