On Mon, Jul 03, 2023 at 11:22:45AM +0200, Marc Espie wrote:
> I hope Vladimir will find the time to complete this answer.
>
> As far as Vlad's work goes, he did a presentation last week-end:
> https://www.lre.epita.fr/news_content/SS_summer_week_pres/Vladimir_Driver_OpenBSD.pptx
>
> (sorry for the medium, fortunately we have libreoffice)
>
> In the mean time, here is an updated diff.
>
> I removed the Gaomon stuff, which if anything should be a different patch.
>
> And I cleaned up the 20+ minor style violations I could find...
> (tabs instead of +4 spaces for continued lines, a few non-style compliant
> function declarations and/or code blocks, oh well)
>
> plus an extra malloc.h that snuck in and is not at all needed.
>
> And some typos in comments.
> And a C++ style comment. Oh well
>
> I would really for some version of this to get in soonish.
A few nits below.
I can't really comment on the HID parser logic although I find it a
bit strange to need quirk to attach uwacom.
> Index: dev/hid/hidms.c
> ===================================================================
> RCS file: /cvs/src/sys/dev/hid/hidms.c,v
> retrieving revision 1.9
> diff -u -p -r1.9 hidms.c
> --- dev/hid/hidms.c 16 Jun 2022 20:52:38 -0000 1.9
> +++ dev/hid/hidms.c 3 Jul 2023 09:04:50 -0000
> @@ -61,6 +61,210 @@ int hidmsdebug = 0;
> #define MOUSE_FLAGS_MASK (HIO_CONST | HIO_RELATIVE)
> #define NOTMOUSE(f) (((f) & MOUSE_FLAGS_MASK) != HIO_RELATIVE)
>
> +
> +int
> +stylus_hid_parse(struct hidms *ms, struct hid_data *d, uint32_t *flags)
> +{
> + /* Define stylus reported usages: (maybe macros?) */
> + const uint32_t stylus_usage_tip
> + = HID_USAGE2(HUP_WACOM | HUP_DIGITIZERS, HUD_TIP_SWITCH);
> + const uint32_t stylus_usage_barrel
> + = HID_USAGE2(HUP_WACOM | HUP_DIGITIZERS, HUD_BARREL_SWITCH);
> + const uint32_t stylus_usage_sec_barrel = HID_USAGE2(
> + HUP_WACOM | HUP_DIGITIZERS, HUD_SECONDARY_BARREL_SWITCH);
> + const uint32_t stylus_usage_in_range
> + = HID_USAGE2(HUP_WACOM | HUP_DIGITIZERS, HUD_IN_RANGE);
> + const uint32_t stylus_usage_quality
> + = HID_USAGE2(HUP_WACOM | HUP_DIGITIZERS, HUD_QUALITY);
> + const uint32_t stylus_usage_x
> + = HID_USAGE2(HUP_WACOM | HUP_DIGITIZERS, HUD_WACOM_X);
> + const uint32_t stylus_usage_y
> + = HID_USAGE2(HUP_WACOM | HUP_DIGITIZERS, HUD_WACOM_Y);
> + const uint32_t stylus_usage_pressure
> + = HID_USAGE2(HUP_WACOM | HUP_DIGITIZERS, HUD_TIP_PRESSURE);
> + const uint32_t stylus_usage_distance
> + = HID_USAGE2(HUP_WACOM | HUP_DIGITIZERS, HUD_WACOM_DISTANCE);
> +
> + struct hid_item h;
> +
> + while (hid_get_item(d, &h)) {
> + if (h.kind == hid_input && !(h.flags & HIO_CONST)) {
> + /* All the possible stylus reported usages go here */
> +#ifdef HIDMS_DEBUG
> + printf("stylus usage: 0x%x\n", h.usage);
> +#endif
> + switch (h.usage) {
> + /* Buttons */
> + case stylus_usage_tip:
> + DPRINTF("Stylus usage tip set\n");
> + ms->sc_loc_stylus_btn
> + [ms->sc_num_stylus_buttons++] = h.loc;
> + ms->sc_flags |= HIDMS_TIP;
> + break;
> + case stylus_usage_barrel:
> + DPRINTF("Stylus usage barrel set\n");
> + ms->sc_loc_stylus_btn
> + [ms->sc_num_stylus_buttons++] = h.loc;
> + ms->sc_flags |= HIDMS_BARREL;
> + break;
> + case stylus_usage_sec_barrel:
> + DPRINTF("Stylus usage secondary barrel set\n");
> + ms->sc_loc_stylus_btn
> + [ms->sc_num_stylus_buttons++] = h.loc;
> + ms->sc_flags |= HIDMS_SEC_BARREL;
> + break;
> + case stylus_usage_in_range:
> + DPRINTF("Stylus usage in range set\n");
> + ms->sc_loc_stylus_btn
> + [ms->sc_num_stylus_buttons++] = h.loc;
> + break;
> + case stylus_usage_quality:
> + DPRINTF("Stylus usage quality set\n");
> + ms->sc_loc_stylus_btn
> + [ms->sc_num_stylus_buttons++] = h.loc;
> + break;
> + /* Axes */
> + case stylus_usage_x:
> + DPRINTF("Stylus usage x set\n");
> + ms->sc_loc_x = h.loc;
> + ms->sc_tsscale.minx = h.logical_minimum;
> + ms->sc_tsscale.maxx = h.logical_maximum;
> + ms->sc_flags |= HIDMS_ABSX;
> + break;
> + case stylus_usage_y:
> + DPRINTF("Stylus usage y set\n");
> + ms->sc_loc_y = h.loc;
> + ms->sc_tsscale.miny = h.logical_minimum;
> + ms->sc_tsscale.maxy = h.logical_maximum;
> + ms->sc_flags |= HIDMS_ABSY;
> + break;
> + case stylus_usage_pressure:
> + DPRINTF("Stylus usage pressure set\n");
> + ms->sc_loc_z = h.loc;
> + ms->sc_tsscale.minz = h.logical_minimum;
> + ms->sc_tsscale.maxz = h.logical_maximum;
> + ms->sc_flags |= HIDMS_Z;
> + break;
> + case stylus_usage_distance:
> + DPRINTF("Stylus usage distance set\n");
> + ms->sc_loc_w = h.loc;
> + ms->sc_tsscale.minw = h.logical_minimum;
> + ms->sc_tsscale.maxw = h.logical_maximum;
> + ms->sc_flags |= HIDMS_W;
> + break;
> + default:
> +#ifdef HIDMS_DEBUG
> + printf("Unknown stylus usage: 0x%x, please
> report to the devs!\n",
Not too sure about this messag. I'd drop the "please report to the
devs" part.
> + h.usage);
> +#endif
> + break;
> + }
> + }
> + if (h.kind == hid_endcollection)
> + break;
> + }
> + hid_end_parse(d);
> + if (flags != NULL)
> + *flags = 0;
> + return (0);
> +}
> +
> +int
> +pad_buttons_hid_parser(struct hidms *ms, struct hid_data *d, uint32_t
> *flags)
> +{
> + struct hid_item h;
> +
> + while (hid_get_item(d, &h)) {
> + if (h.kind == hid_input && !(h.flags & HIO_CONST)
> + && h.usage == HID_USAGE2(HUP_WACOM | HUP_DIGITIZERS,
> + HUD_WACOM_PAD_BUTTONS00 | ms->sc_num_pad_buttons)) {
> + ms->sc_loc_pad_btn[ms->sc_num_pad_buttons++] = h.loc;
> + }
> + if (h.kind == hid_endcollection)
> + break;
> + }
> + hid_end_parse(d);
> + if (flags != NULL)
> + *flags = 0;
> + return (0);
> +}
> +
> +int
> +hidms_wacom_setup(struct device *self, struct hidms *ms, uint32_t quirks,
> + int id, void *desc, int dlen)
> +{
> + struct hid_data *global;
> + uint32_t flags;
> + int i;
> +
> + quirks = 0;
> + ms->sc_device = self;
> + ms->sc_rawmode = 1;
> +
> + ms->sc_flags = quirks;
> +
> + /* Set x,y,z and w to zero by default */
> + ms->sc_loc_x.size = 0;
> + ms->sc_loc_y.size = 0;
> + ms->sc_loc_z.size = 0;
> + ms->sc_loc_w.size = 0;
> +
> + if ((global = hid_get_collection_data(desc, dlen,
> + HID_USAGE2(HUP_WACOM | HUP_DIGITIZERS, HUD_DIGITIZER),
> + HCOLL_APPLICATION))) {
> + hid_end_parse(global);
> +
> + struct hid_data *stylus_col;
> + struct hid_data *tablet_keys_col;
> + struct hid_data *battery_col;
> +
> + DPRINTF("found the global collection\n");
> + if ((stylus_col = hid_get_collection_data(desc, dlen,
> + HID_USAGE2(HUP_WACOM | HUP_DIGITIZERS, HUD_STYLUS),
> + HCOLL_PHYSICAL))) {
> + DPRINTF("found stylus collection\n");
> + stylus_hid_parse(ms, stylus_col, &flags);
> + }
> + if ((tablet_keys_col = hid_get_collection_data(desc, dlen,
> + HID_USAGE2(HUP_WACOM | HUP_DIGITIZERS, HUD_TABLET_FKEYS),
> + HCOLL_PHYSICAL))) {
> + DPRINTF("found tablet keys collection\n");
> + pad_buttons_hid_parser(ms, tablet_keys_col, &flags);
> + }
> + if ((battery_col = hid_get_collection_data(desc, dlen,
> + HID_USAGE2(HUP_WACOM | HUP_DIGITIZERS, HUD_WACOM_BATTERY),
> + HCOLL_PHYSICAL))) {
> + DPRINTF("found battery collection\n");
> + /* parse and set the battery info */
> + /* not yet used */
> + hid_end_parse(battery_col);
> + }
> + /*
> + * Ignore the device config, it's not really needed
> + * Ignore the usage 0x10AC which is the debug collection, and
> + * ignore firmware collection and other collections for now
> + */
> + }
> +
> + /* Map the pad and stylus buttons to mouse buttons */
> + for (i = 0; i < ms->sc_num_stylus_buttons; i++)
> + memcpy(&(ms->sc_loc_btn[i]), &(ms->sc_loc_stylus_btn[i]),
> + sizeof(struct hid_location));
> + for (; i < ms->sc_num_pad_buttons + ms->sc_num_stylus_buttons; i++)
> + memcpy(&(ms->sc_loc_btn[i]), &(ms->sc_loc_pad_btn[i]),
> + sizeof(struct hid_location));
> + ms->sc_num_buttons = i;
> + DPRINTF("Buttons inf\n");
> +#ifdef HIDMS_DEBUG
> + for (i = 0; i < ms->sc_num_buttons; i++)
> + printf("size: 0x%x, pos: 0x%x, count: 0x%x\n",
> + ms->sc_loc_btn[i].size, ms->sc_loc_btn[i].pos,
> + ms->sc_loc_btn[i].count);
> +#endif
> + return 0;
> +}
> +
> +
> int
> hidms_setup(struct device *self, struct hidms *ms, uint32_t quirks,
> int id, void *desc, int dlen)
> @@ -74,6 +278,10 @@ hidms_setup(struct device *self, struct
> ms->sc_rawmode = 1;
>
> ms->sc_flags = quirks;
> +
> + /* We are setting up a WACOM tablet, not a mouse */
> + if (quirks == HIDMS_WACOM_SETUP)
> + return hidms_wacom_setup(self, ms, quirks, id, desc, dlen);
>
> if (!hid_locate(desc, dlen, HID_USAGE2(HUP_GENERIC_DESKTOP, HUG_X), id,
> hid_input, &ms->sc_loc_x, &flags))
> Index: dev/usb/usbdevs.h
> ===================================================================
> RCS file: /cvs/src/sys/dev/usb/usbdevs.h,v
> retrieving revision 1.769
> diff -u -p -r1.769 usbdevs.h
> --- dev/usb/usbdevs.h 12 Jun 2023 11:26:54 -0000 1.769
> +++ dev/usb/usbdevs.h 3 Jul 2023 09:04:50 -0000
> @@ -1,4 +1,4 @@
> -/* $OpenBSD: usbdevs.h,v 1.769 2023/06/12 11:26:54 jsg Exp $ */
> +/* $OpenBSD$ */
>
> /*
> * THIS FILE IS AUTOMATICALLY GENERATED. DO NOT EDIT.
> @@ -2117,6 +2117,8 @@
> #define USB_PRODUCT_GARMIN_DAKOTA20 0x23c0 /* Dakota 20 */
> #define USB_PRODUCT_GARMIN_GPSMAP62S 0x2459 /* GPSmap 62s */
>
> +/* Gaomon */
> +
Strange... looks like you edited the file instead of re-generating it.
--
Matthieu Herrb