Hello,

I managed to get the Wacom One, aka CTL-472 working. It's a small
graphics tablet with no extra buttons. I's more recent than the already
supported CTL-490.

Changes:
- It reports little endian values for X / Y coordinates
- 0x0202 needs to be written to feature report ID 2 before it starts
  sending interrupts (I got this hint from the graphire tablet support
  in the netbsd uhidev driver)
- The reported X/Y resolution is twice as big
- The button 0 workaround via pressure is not necessary

Relevant for testing:
There is a bug, that was already there before. The tablet must be
connected when Xorg is starting. Otherwise the tablet resolution is not
correctly mapped to the screen resolution.

This is my first contribution in the device-driver area.
What do you think about it?

Best Regards,
Stefan

Index: sys/dev/usb/usbdevs.h
===================================================================
RCS file: /cvs/src/sys/dev/usb/usbdevs.h,v
retrieving revision 1.752
diff -u -p -u -p -r1.752 usbdevs.h
--- sys/dev/usb/usbdevs.h       18 May 2021 14:23:53 -0000      1.752
+++ sys/dev/usb/usbdevs.h       6 Jun 2021 17:27:24 -0000
@@ -4582,6 +4582,7 @@
 #define        USB_PRODUCT_WACOM_GRAPHIRE4_4X5 0x0015          /* Graphire4 
Classic A6 */
 #define        USB_PRODUCT_WACOM_INTUOSA5      0x0021          /* Intuos A5 */
 #define        USB_PRODUCT_WACOM_INTUOS_DRAW   0x033b          /* Intuos Draw 
(CTL-490) */
+#define        USB_PRODUCT_WACOM_ONE_S         0x037a          /* One 
(CTL-472) */
 #define        USB_PRODUCT_WACOM_INTUOS_PRO_S  0x0392          /* Intuos Pro S 
*/
 
 /* WAGO Kontakttechnik products */
Index: sys/dev/usb/uwacom.c
===================================================================
RCS file: /cvs/src/sys/dev/usb/uwacom.c,v
retrieving revision 1.2
diff -u -p -u -p -r1.2 uwacom.c
--- sys/dev/usb/uwacom.c        23 Aug 2020 11:08:02 -0000      1.2
+++ sys/dev/usb/uwacom.c        6 Jun 2021 17:27:24 -0000
@@ -39,6 +39,8 @@ struct uwacom_softc {
        struct uhidev           sc_hdev;
        struct hidms            sc_ms;
        struct hid_location     sc_loc_tip_press;
+       int                     sc_big_endian;
+       int                     sc_use_pressure;
 };
 
 struct cfdriver uwacom_cd = {
@@ -47,7 +49,8 @@ struct cfdriver uwacom_cd = {
 
 
 const struct usb_devno uwacom_devs[] = {
-       { USB_VENDOR_WACOM, USB_PRODUCT_WACOM_INTUOS_DRAW }
+       { USB_VENDOR_WACOM, USB_PRODUCT_WACOM_INTUOS_DRAW },
+       { USB_VENDOR_WACOM, USB_PRODUCT_WACOM_ONE_S }
 };
 
 int    uwacom_match(struct device *, void *, void *);
@@ -102,6 +105,8 @@ uwacom_attach(struct device *parent, str
        sc->sc_hdev.sc_parent = uha->parent;
        sc->sc_hdev.sc_udev = uaa->device;
        sc->sc_hdev.sc_report_id = uha->reportid;
+       sc->sc_big_endian = 0;
+       sc->sc_use_pressure = 0;
 
        usbd_set_idle(uha->parent->sc_udev, uha->parent->sc_ifaceno, 0, 0);
 
@@ -121,9 +126,25 @@ uwacom_attach(struct device *parent, str
        ms->sc_loc_y.size = 16;
 
        ms->sc_tsscale.minx = 0;
-       ms->sc_tsscale.maxx = 7600;
        ms->sc_tsscale.miny = 0;
-       ms->sc_tsscale.maxy = 4750;
+       if (uha->uaa->product == USB_PRODUCT_WACOM_ONE_S) {
+               static uByte reportbuf[2];
+               reportbuf[0] = 0x02;
+               reportbuf[1] = 0x02;
+               uhidev_set_report(uha->parent, UHID_FEATURE_REPORT, 2,
+                               &reportbuf, 2);
+               ms->sc_tsscale.maxx = 15200;
+               ms->sc_tsscale.maxy = 9500;
+       }
+
+       if (uha->uaa->product == USB_PRODUCT_WACOM_INTUOS_DRAW) {
+               sc->sc_big_endian = 1;
+               sc->sc_use_pressure = 1;
+               sc->sc_loc_tip_press.pos = 43;
+               sc->sc_loc_tip_press.size = 8;
+               ms->sc_tsscale.maxx = 7600;
+               ms->sc_tsscale.maxy = 4750;
+       }
 
        ms->sc_loc_btn[0].pos = 0;
        ms->sc_loc_btn[0].size = 1;
@@ -132,9 +153,6 @@ uwacom_attach(struct device *parent, str
        ms->sc_loc_btn[2].pos = 2;
        ms->sc_loc_btn[2].size = 1;
 
-       sc->sc_loc_tip_press.pos = 43;
-       sc->sc_loc_tip_press.size = 8;
-
        hidms_attach(ms, &uwacom_accessops);
 }
 
@@ -163,19 +181,26 @@ uwacom_intr(struct uhidev *addr, void *b
        if ((data[0] & 0xf0) == 0xc0)
                return;
 
-       x = be16toh(hid_get_data(data, len, &ms->sc_loc_x));
-       y = be16toh(hid_get_data(data, len, &ms->sc_loc_y));
-       pressure = hid_get_data(data, len, &sc->sc_loc_tip_press);
+       if (sc->sc_big_endian == 1) {
+               x = be16toh(hid_get_data(data, len, &ms->sc_loc_x));
+               y = be16toh(hid_get_data(data, len, &ms->sc_loc_y));
+       } else {
+               x = le16toh(hid_get_data(data, len, &ms->sc_loc_x));
+               y = le16toh(hid_get_data(data, len, &ms->sc_loc_y));
+       }
 
        for (i = 0; i < ms->sc_num_buttons; i++)
                if (hid_get_data(data, len, &ms->sc_loc_btn[i]))
                        buttons |= (1 << i);
 
        /* button 0 reporting is flaky, use tip pressure for it */
-       if (pressure >10)
-               buttons |= 1;
-       else
-               buttons &= ~1;
+       if (sc->sc_use_pressure == 1) {
+               pressure = hid_get_data(data, len, &sc->sc_loc_tip_press);
+               if (pressure >10)
+                       buttons |= 1;
+               else
+                       buttons &= ~1;
+       }
 
        if (x != 0 || y != 0 || buttons != ms->sc_buttons) {
                wsmouse_position(ms->sc_wsmousedev, x, y);
Index: share/man/man4/uwacom.4
===================================================================
RCS file: /cvs/src/share/man/man4/uwacom.4,v
retrieving revision 1.2
diff -u -p -u -p -r1.2 uwacom.4
--- share/man/man4/uwacom.4     12 Sep 2016 10:39:06 -0000      1.2
+++ share/man/man4/uwacom.4     6 Jun 2021 17:27:24 -0000
@@ -42,6 +42,7 @@ driver supports the following Wacom tabl
 .Bl -column "Intuos Draw" "Model Number" -offset 6n
 .It Em Name Ta Em Model Number
 .It Li Intuos Draw Ta CTL-490
+.It Li One Ta CTL-472
 .El
 .Sh SEE ALSO
 .Xr uhidev 4 ,

Reply via email to