On Sun, Feb 12, 2012 at 5:53 AM, Adam Nielsen <a.niel...@shikadi.net> wrote: > Well, I seem to have had some success! > >> Yes, that is all I mean. Based on your later info, it means there >> would be some code that looks like this: >> >> if (packet_size == 8&& data[0] == 2) >> // Do pen processing >> else if (packet_size == 6&& data[0] == 4) >> // Do button processing. > > > This worked quite well. I do however get two identical devices appearing > (both tablets with buttons) rather than one tablet and one set of buttons as > I think would be more logical. Not sure how to address this though.
Its wacom_setup_input_capabilities() job to declare and not declare correct events for each interface. Right now, all devices have an X/Y so you'll have a new case of button only. For temporary hack, I'd check for pktlen or interface # in that function to hide what you need. For other multi-interface cases, 1 interface is a stylus tablet and 1 interface is a touchpad so we 1st set and then check device_type to see what events to hide. We kinda need a new device type that says Pad-only. Probably a fixed value of 0 to mean !Pen and !Touch will be good enough for now. > > >> Agree. Looks like 8 it is. When 1 USB device has 2 interfaces, each >> interface can have a different packet length. In Wacom driver, our >> convention is to put the pen's packet length in the table your >> modifying and then set at run time for the other interface. > > > Is there an example of where this is set at runtime? I used your example: > > >> if (intf->cur_altsetting->desc.bInterfaceNumber == 1) { > > > And hacked it into wacom_sys.c which worked, but of course only on my PC > with this one tablet. > Yes, check in wacom_parse_hid(). It looks for clues in HID report to see what interface is and set both pktlen and device_type. If it finds no hints then it defaults to a pen device with what ever packet size is set in structure. I think this is first device I've seen with a "System Control" usage so that could probably be used to detect the button interface and override the pen/pktlen defaults. > >>>> Thats all on stylus. Sometimes they include extra info like max X/Y >>>> values and resolution but doesn't look like it in this report. You'll >>>> have to figure those out at some point and fill them in structures. > > > Done that, and it turns out they match exactly with the DTF521, which I > guess isn't surprising for a model called DTI520. :-) > > >> Interesting. Your USB hub works a little different then mine with >> over specifying packet size to receive. I think its related to >> needing 2 button presses for buttons. > > > Yes, it seems that it waits until the buffer is full before returning data. > Once I figured out the correct buffer sizes everything became very > responsive. > >>> 024008f5 002d0000 >>> aabbxxxx yyyypppz >> >> >> Ok. You've got what looks like new packet format. > > > Many thanks for all your pointers! I have now successfully gotten the > device to report all its events in evtest. The X and Y coordinates work > fine, pressure seems to work too, and all of the buttons work - both the > stylus buttons and the pushbuttons on the display surface! > I think this is a record for how fast someone has gotten a new device with so many differences working! > Surprisingly the X and Y values (and also the pressure) are in big-endian > order. Suddenly all the weird results I was getting before make a lot more > sense! > > input_report_key(input, BTN_STYLUS, data[7] & 0x01); > input_report_key(input, BTN_STYLUS2, data[7] & 0x02); > input_report_abs(input, ABS_X, be16_to_cpup((__be16 *)&data[2])); > input_report_abs(input, ABS_Y, be16_to_cpup((__be16 *)&data[4])); > pressure = (data[6] << 1) | ((data[7] & 0x80) >> 7); > if (pressure < 0) > pressure = features->pressure_max + pressure + 1; > input_report_abs(input, ABS_PRESSURE, pressure); > > Unfortunately once I reached this point the X driver stopped working. It > detects the device but "xinput test" doesn't report any output. I'm a bit > stumped at this because I haven't changed anything in the X driver and the > events are all being reported correctly by the kernel. > > Looking at the X output, it looks like it is reading the tablet interface as > a "pad" (only looking for the buttons and there aren't any here) and reading > the other interface as a tablet (where there is no tablet, only buttons.) I > can't see where this is set - any hints? Maybe I need to better separate > the two devices, and not report a button/tablet when there isn't one. > Can you send output from "xinput list" and snippet of your /var/log/Xorg.0.log were each wacom input is detected? It woud also be helpful to see the initial output of evtest for your stylus device where it prints out the supported capabilities. > >>>> This says the 1st 5 bits in packet map to buttons and have on/off single >>>> values. >>>> >>>> Above has values between 6 and 10 so are more than 1 bit. Not sure >>>> what it is but there are 3 of them. And then 5 of something else and >>>> 3 of another thing follows. > > > Not sure how that ends up applying to the data the device sends via USB: > > if (data[0] == 0x04) { > input_report_key(input, BTN_BACK, data[1] & 0x01); /* up */ > input_report_key(input, BTN_FORWARD, data[1] & 0x02); /* down */ > input_report_key(input, BTN_LEFT, data[1] & 0x04); > input_report_key(input, BTN_RIGHT, data[1] & 0x08); > input_report_key(input, BTN_EXTRA, data[1] & 0x10); /* both Ctrls */ > > input_report_key(input, BTN_0, data[2] & 0x02); > input_report_key(input, BTN_1, data[2] & 0x04); > input_report_key(input, BTN_2, data[2] & 0x01); > input_report_key(input, BTN_3, data[2] & 0x08); > input_report_key(input, BTN_4, data[2] & 0x10); > > return 1; > > } > Oh, I see now. HID report was declaring buttons 1-5 using 5 bits followed by 3 trash bits then buttons 6-10 using more 5 bits and 3 more trash bits. The statefullness of HID reports can be very confusing. >> Yep. And feel free to keep asking question. Hopefully we can get a >> working driver out of this. > > > Thanks again for your assistance with this. It looks like I'm getting close > to a working driver! > > Cheers, > Adam. > ------------------------------------------------------------------------------ Virtualization & Cloud Management Using Capacity Planning Cloud computing makes use of virtualization - but cloud computing also focuses on allowing computing to be delivered as a service. http://www.accelacomm.com/jaw/sfnl/114/51521223/ _______________________________________________ Linuxwacom-devel mailing list Linuxwacom-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linuxwacom-devel