qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: "François Revol" <revol@free.fr>
To: qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCH] [RFC] usb-wacom
Date: Thu, 14 Aug 2008 04:21:55 +0200 CEST	[thread overview]
Message-ID: <216579131-BeMail@laptop> (raw)
In-Reply-To: <48A392C1.2050107@codemonkey.ws>

[-- Attachment #1: Type: text/plain, Size: 2809 bytes --]

> Can you please send the patch to the mailing list attached as a
> text/plain attachment or inlined.  Then we can review and possibly
> commit it.

Sorry, not used to this ml.
Here it is.
Btw, you top-posted ;)

François.

> François Revol wrote:
> > Hi there.
> > We use QEMU a lot to debug Haiku, http://haiku-os.org/
> > I also wrote a little php script that use it to demo images online,
> > serving a VNC java applet to connect to it with VNC.
> > http://dev.haiku-os.org/browser/haiku/trunk/3rdparty/mmu_man/onlinedemo/haiku.php
> > > > It's a bit like what live.OSZoo does, but simpler.
> >
> > To accomodate the VNC setup, I tried to use the usb tablet
> > emulation.
> > It turns out Haiku has a driver for Wacom tablets:
> >
> > http://dev.haiku-os.org/browser/haiku/trunk/src/add-ons/kernel/drivers/input/wacom
> > > > http://dev.haiku-os.org/browser/haiku/trunk/src/add-ons/input_server/devices/wacom
> > > >
> > However, it didn't really work very well with qemu's usb-wacom
> > code.
> >
> > First, mouse stayed in the top-left corner... Seems coords were set
> > to
> > 0,0 when no button is pressed, which is wrong, most tablets
> > actually
> > sense the stylus even when it's not yet touching the surface.
> >
> > Also, coords were wrong.
> > Our driver takes the pos from the hardware, and scales them from
> > model-
> > dependant hardcoded max values:
> > http://dev.haiku-os.org/browser/haiku/trunk/src/add-ons/input_server/devices/wacom/TabletDevice.cpp#L115
> > > > down to [0.0f, 1.0f], which represents the whole screen.
> > Since QEMU reports absolute mouse position scaled from screen size
> > to
> > INT16_MAX this didn't really work.
> > Now, I'm not sure those max values are correct for all Penpartner
> > devices, or if they were calibrated on a specific item.
> > Best would be to actually read them from the HID descriptor, but
> > QEMU
> > doesn't provide one, and I read some penpartner tablets actually
> > have
> > wrong descriptors anyway.
> >
> > Finaly, I fixed button handling according to our driver, not sure
> > all
> > drivers handle them the same. pressure indicates left button, and a
> > flag tells about right one. I mapped middle button to the eraser to
> > at
> > least be useful in tablet-aware software though I'm not sure it's
> > the
> > best way.
> >
> > And... oh well seems we don't need to tell we have a contact, the
> > driver assumes it always for penpartner so it seems correct.
> >
> > I left debug macro I used just in case.
> >
> > http://revolf.free.fr/beos/patches/qemu-usb-wacom-for-haiku.diff.txt
> > > >
> > Now at least it works perfectly with our driver, appart from high
> > cpu
> > usage but that's surely be fixed by polling less often.
> >
> > Comments ?


[-- Attachment #2: qemu-usb-wacom-for-haiku.diff.txt --]
[-- Type: text/plain, Size: 1567 bytes --]

Index: hw/usb-wacom.c
===================================================================
--- hw/usb-wacom.c	(révision 5002)
+++ hw/usb-wacom.c	(copie de travail)
@@ -29,6 +29,16 @@
 #include "console.h"
 #include "usb.h"
 
+/* debug usb-wacom */
+//#define DEBUG_USB_WACOM
+
+#ifdef DEBUG_USB_WACOM
+#define DPRINTF(fmt, args...) \
+do { printf("usb-wacom: " fmt , ##args); } while (0)
+#else
+#define DPRINTF(fmt, args...)
+#endif
+
 /* Interface requests */
 #define WACOM_GET_REPORT	0x2101
 #define WACOM_SET_REPORT	0x2109
@@ -132,8 +142,8 @@
 {
     USBWacomState *s = opaque;
 
-    s->x = x;
-    s->y = y;
+    s->x = (x * 5040 / 0x7FFF);
+    s->y = (y * 3780 / 0x7FFF);
     s->dz += dz;
     s->buttons_state = buttons_state;
 }
@@ -199,26 +209,22 @@
     if (s->buttons_state & MOUSE_EVENT_LBUTTON)
         b |= 0x01;
     if (s->buttons_state & MOUSE_EVENT_RBUTTON)
-        b |= 0x02;
+        b |= 0x40;
     if (s->buttons_state & MOUSE_EVENT_MBUTTON)
-        b |= 0x04;
+        b |= 0x20; /* eraser */
 
     if (len < 7)
         return 0;
 
     buf[0] = s->mode;
-    buf[5] = 0x00;
-    if (b) {
-        buf[1] = s->x & 0xff;
-        buf[2] = s->x >> 8;
-        buf[3] = s->y & 0xff;
-        buf[4] = s->y >> 8;
+    buf[5] = 0x00 | (b & 0xf0);
+    buf[1] = s->x & 0xff;
+    buf[2] = s->x >> 8;
+    buf[3] = s->y & 0xff;
+    buf[4] = s->y >> 8;
+    if (b & 0x3f) {
         buf[6] = 0;
     } else {
-        buf[1] = 0;
-        buf[2] = 0;
-        buf[3] = 0;
-        buf[4] = 0;
         buf[6] = (unsigned char) -127;
     }
 

  reply	other threads:[~2008-08-14  2:20 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-08-14  0:07 [Qemu-devel] [PATCH] [RFC] usb-wacom François Revol
2008-08-14  2:04 ` Anthony Liguori
2008-08-14  2:21   ` François Revol [this message]
2008-08-14 10:23 ` Jamie Lokier
2008-08-14 12:04   ` François Revol
2008-08-14 12:26     ` Jamie Lokier
2008-08-14 12:44       ` François Revol
2008-08-14 11:52 ` andrzej zaborowski
2008-08-14 12:17   ` François Revol

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=216579131-BeMail@laptop \
    --to=revol@free.fr \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).