On Fri, Jan 22, 2021 at 02:26:31PM -0500, Bryan Steele wrote:
> On Fri, Jan 22, 2021 at 07:00:57PM +0100, Marcus Glocker wrote:

[...]

> > > > Considering the hid_is_collection() fix from NetBSD proposed by
> > > > Marcus fixes the issue with ujoy(4) but breaks some other drivers
> > > > (imt(4) and ims(4)), could we not inline it into ujoy(4) for now?
> > > > It's fairly small helper function. Like hid_is_joy_collection()?  
> > > 
> > > I think that could be an XXX workaround until somebody finds a proper,
> > > generic fix for hid_is_collection() ...
> > 
> > That's what you meant, yes?
> 
> Yep, this is what I meant. Hopefully it won't have to stay for long, but
> t would be nice to get ujoy(4) working as many controllers as possible
> so that it can go in.
> 
> Can you send a new full diff thfr@? I still need to test with my USB
> SNES controller, but tentatively this is still ok brynet@

Below is the updated diff, containing the original ujoy(4) diff and
Marcus' ujoy.c that includes ujoy_hid_is_collection().

[...]

> > Can this been updated in the overall diff and re-verified if it still
> > works fine with the other controllers?  It (obviously) works with my
> > PS4 controller.

I built the kernel and device nodes anew with this diff and tested all the
joystick and gamecontroller devices that I have access to with
usbhidctl(1) (XBox 360 gamepad, Logitech F310 in D and X mode, Logitech
Dual Action, Microsoft Sidewinder Precision 2) and all work as expected
via /dev/ujoy/0.

Index: etc/MAKEDEV.common
===================================================================
RCS file: /cvs/src/etc/MAKEDEV.common,v
retrieving revision 1.111
diff -u -p -r1.111 MAKEDEV.common
--- etc/MAKEDEV.common  6 Jul 2020 06:11:26 -0000       1.111
+++ etc/MAKEDEV.common  22 Jan 2021 20:04:39 -0000
@@ -181,6 +181,7 @@ dnl
 target(usb, usb, 0, 1, 2, 3, 4, 5, 6, 7)dnl
 target(usb, uhid, 0, 1, 2, 3, 4, 5, 6, 7)dnl
 twrget(usb, fido, fido)dnl
+twrget(usb, ujoy, ujoy)dnl
 target(usb, ulpt, 0, 1)dnl
 target(usb, ugen, 0, 1, 2, 3, 4, 5, 6, 7)dnl
 target(usb, ttyU, 0, 1, 2, 3)dnl
@@ -365,6 +366,10 @@ __devitem(fido, fido, fido/* nodes, fido
 _mkdev(fido, fido, {-RMlist[${#RMlist[*]}]=";mkdir -p fido;rm -f" n=0
        while [ $n -lt 4 ];do M fido/$n c major_fido_c $n 666;n=Add($n, 1);done
        MKlist[${#MKlist[*]}]=";chmod 555 fido"-})dnl
+__devitem(ujoy, ujoy, ujoy/* nodes, ujoy)dnl
+_mkdev(ujoy, ujoy, {-RMlist[${#RMlist[*]}]=";mkdir -p ujoy;rm -f" n=0
+       while [ $n -lt 4 ];do M ujoy/$n c major_ujoy_c $n 444;n=Add($n, 1);done
+       MKlist[${#MKlist[*]}]=";chmod 555 ujoy"-})dnl
 __devitem(ulpt, ulpt*, Printer devices)dnl
 _mcdev({-ulpt-}, ulpt*, {-ulpt-}, {-major_ulpt_c-}, 600)dnl
 __devitem(ttyU, ttyU*, USB serial ports,ucom)dnl
Index: etc/etc.alpha/MAKEDEV.md
===================================================================
RCS file: /cvs/src/etc/etc.alpha/MAKEDEV.md,v
retrieving revision 1.76
diff -u -p -r1.76 MAKEDEV.md
--- etc/etc.alpha/MAKEDEV.md    6 Jul 2020 06:11:26 -0000       1.76
+++ etc/etc.alpha/MAKEDEV.md    22 Jan 2021 20:04:39 -0000
@@ -56,6 +56,7 @@ _DEV(uall)
 _DEV(ugen, 48)
 _DEV(uhid, 46)
 _DEV(fido, 70)
+_DEV(ujoy, 72)
 _DEV(ulpt, 47)
 _DEV(usb, 45)
 _TITLE(spec)
Index: etc/etc.amd64/MAKEDEV.md
===================================================================
RCS file: /cvs/src/etc/etc.amd64/MAKEDEV.md,v
retrieving revision 1.76
diff -u -p -r1.76 MAKEDEV.md
--- etc/etc.amd64/MAKEDEV.md    6 Jul 2020 06:11:26 -0000       1.76
+++ etc/etc.amd64/MAKEDEV.md    22 Jan 2021 20:04:39 -0000
@@ -60,6 +60,7 @@ _DEV(uall)
 _DEV(ugen, 63)
 _DEV(uhid, 62)
 _DEV(fido, 98)
+_DEV(ujoy, 100)
 _DEV(ulpt, 64)
 _DEV(usb, 61)
 _TITLE(spec)
Index: etc/etc.arm64/MAKEDEV.md
===================================================================
RCS file: /cvs/src/etc/etc.arm64/MAKEDEV.md,v
retrieving revision 1.10
diff -u -p -r1.10 MAKEDEV.md
--- etc/etc.arm64/MAKEDEV.md    6 Jul 2020 06:11:26 -0000       1.10
+++ etc/etc.arm64/MAKEDEV.md    22 Jan 2021 20:04:39 -0000
@@ -52,6 +52,7 @@ _DEV(uall)
 _DEV(ugen, 63)
 _DEV(uhid, 62)
 _DEV(fido, 98)
+_DEV(ujoy, 100)
 _DEV(ulpt, 64)
 _DEV(usb, 61)
 _TITLE(spec)
Index: etc/etc.armv7/MAKEDEV.md
===================================================================
RCS file: /cvs/src/etc/etc.armv7/MAKEDEV.md,v
retrieving revision 1.18
diff -u -p -r1.18 MAKEDEV.md
--- etc/etc.armv7/MAKEDEV.md    6 Jul 2020 06:11:26 -0000       1.18
+++ etc/etc.armv7/MAKEDEV.md    22 Jan 2021 20:04:39 -0000
@@ -61,6 +61,7 @@ _DEV(uall)
 _DEV(ugen, 70)
 _DEV(uhid, 65)
 _DEV(fido, 106)
+_DEV(ujoy, 108)
 _DEV(ulpt, 66)
 _DEV(usb, 64)
 _TITLE(spec)
Index: etc/etc.hppa/MAKEDEV.md
===================================================================
RCS file: /cvs/src/etc/etc.hppa/MAKEDEV.md,v
retrieving revision 1.65
diff -u -p -r1.65 MAKEDEV.md
--- etc/etc.hppa/MAKEDEV.md     6 Jul 2020 06:11:26 -0000       1.65
+++ etc/etc.hppa/MAKEDEV.md     22 Jan 2021 20:04:39 -0000
@@ -54,6 +54,7 @@ _DEV(uall)
 _DEV(usb, 40)
 _DEV(uhid, 41)
 _DEV(fido, 61)
+_DEV(ujoy, 63)
 _DEV(ugen, 42)
 _DEV(ulpt, 43)
 _DEV(ttyU, 45)
Index: etc/etc.i386/MAKEDEV.md
===================================================================
RCS file: /cvs/src/etc/etc.i386/MAKEDEV.md,v
retrieving revision 1.91
diff -u -p -r1.91 MAKEDEV.md
--- etc/etc.i386/MAKEDEV.md     6 Jul 2020 06:11:27 -0000       1.91
+++ etc/etc.i386/MAKEDEV.md     22 Jan 2021 20:04:39 -0000
@@ -61,6 +61,7 @@ _DEV(uall)
 _DEV(ugen, 63)
 _DEV(uhid, 62)
 _DEV(fido, 98)
+_DEV(ujoy, 100)
 _DEV(ulpt, 64)
 _DEV(usb, 61)
 _TITLE(spec)
Index: etc/etc.landisk/MAKEDEV.md
===================================================================
RCS file: /cvs/src/etc/etc.landisk/MAKEDEV.md,v
retrieving revision 1.48
diff -u -p -r1.48 MAKEDEV.md
--- etc/etc.landisk/MAKEDEV.md  6 Jul 2020 06:11:27 -0000       1.48
+++ etc/etc.landisk/MAKEDEV.md  22 Jan 2021 20:04:39 -0000
@@ -65,6 +65,7 @@ _DEV(uall)
 _DEV(ugen, 70)
 _DEV(uhid, 65)
 _DEV(fido, 106)
+_DEV(ujoy, 108)
 _DEV(ulpt, 66)
 _DEV(usb, 64)
 _TITLE(spec)
Index: etc/etc.loongson/MAKEDEV.md
===================================================================
RCS file: /cvs/src/etc/etc.loongson/MAKEDEV.md,v
retrieving revision 1.32
diff -u -p -r1.32 MAKEDEV.md
--- etc/etc.loongson/MAKEDEV.md 6 Jul 2020 06:11:27 -0000       1.32
+++ etc/etc.loongson/MAKEDEV.md 22 Jan 2021 20:04:39 -0000
@@ -60,6 +60,7 @@ _DEV(uall)
 _DEV(ugen, 63)
 _DEV(uhid, 62)
 _DEV(fido, 88)
+_DEV(ujoy, 90)
 _DEV(ulpt, 64)
 _DEV(usb, 61)
 _TITLE(spec)
Index: etc/etc.macppc/MAKEDEV.md
===================================================================
RCS file: /cvs/src/etc/etc.macppc/MAKEDEV.md,v
retrieving revision 1.75
diff -u -p -r1.75 MAKEDEV.md
--- etc/etc.macppc/MAKEDEV.md   6 Jul 2020 06:11:27 -0000       1.75
+++ etc/etc.macppc/MAKEDEV.md   22 Jan 2021 20:04:39 -0000
@@ -70,6 +70,7 @@ _DEV(ttyU, 66)
 _DEV(ugen, 63)
 _DEV(uhid, 62)
 _DEV(fido, 90)
+_DEV(ujoy, 92)
 _DEV(ulpt, 64)
 _DEV(usb, 61)
 _TITLE(spec)
Index: etc/etc.octeon/MAKEDEV.md
===================================================================
RCS file: /cvs/src/etc/etc.octeon/MAKEDEV.md,v
retrieving revision 1.19
diff -u -p -r1.19 MAKEDEV.md
--- etc/etc.octeon/MAKEDEV.md   6 Jul 2020 06:11:27 -0000       1.19
+++ etc/etc.octeon/MAKEDEV.md   22 Jan 2021 20:04:39 -0000
@@ -67,6 +67,7 @@ _DEV(uall)
 _DEV(usb, 61)
 _DEV(uhid, 62)
 _DEV(fido, 76)
+_DEV(ujoy, 78)
 _TITLE(spec)
 _DEV(au, 44)
 _DEV(bio, 49)
Index: etc/etc.powerpc64/MAKEDEV.md
===================================================================
RCS file: /cvs/src/etc/etc.powerpc64/MAKEDEV.md,v
retrieving revision 1.6
diff -u -p -r1.6 MAKEDEV.md
--- etc/etc.powerpc64/MAKEDEV.md        24 Oct 2020 21:10:41 -0000      1.6
+++ etc/etc.powerpc64/MAKEDEV.md        22 Jan 2021 20:04:39 -0000
@@ -52,6 +52,7 @@ _DEV(uall)
 _DEV(ugen, 49)
 _DEV(uhid, 50)
 _DEV(fido, 51)
+_DEV(ujoy, 94)
 _DEV(ulpt, 65)
 _DEV(usb, 48)
 _TITLE(spec)
Index: etc/etc.sgi/MAKEDEV.md
===================================================================
RCS file: /cvs/src/etc/etc.sgi/MAKEDEV.md,v
retrieving revision 1.54
diff -u -p -r1.54 MAKEDEV.md
--- etc/etc.sgi/MAKEDEV.md      6 Jul 2020 06:11:27 -0000       1.54
+++ etc/etc.sgi/MAKEDEV.md      22 Jan 2021 20:04:39 -0000
@@ -69,6 +69,7 @@ _DEV(uall)
 _DEV(ugen, 63)
 _DEV(uhid, 62)
 _DEV(fido, 76)
+_DEV(ujoy, 78)
 _DEV(ulpt, 64)
 _DEV(usb, 61)
 _TITLE(spec)
Index: etc/etc.sparc64/MAKEDEV.md
===================================================================
RCS file: /cvs/src/etc/etc.sparc64/MAKEDEV.md,v
retrieving revision 1.95
diff -u -p -r1.95 MAKEDEV.md
--- etc/etc.sparc64/MAKEDEV.md  22 Jul 2020 14:04:37 -0000      1.95
+++ etc/etc.sparc64/MAKEDEV.md  22 Jan 2021 20:04:39 -0000
@@ -104,6 +104,7 @@ _DEV(uall)
 _DEV(ugen, 92)
 _DEV(uhid, 91)
 _DEV(fido, 137)
+_DEV(ujoy, 139)
 _DEV(ulpt, 93)
 _DEV(usb, 90)
 _TITLE(spec)
Index: share/man/man4/Makefile
===================================================================
RCS file: /cvs/src/share/man/man4/Makefile,v
retrieving revision 1.790
diff -u -p -r1.790 Makefile
--- share/man/man4/Makefile     6 Dec 2020 20:48:12 -0000       1.790
+++ share/man/man4/Makefile     22 Jan 2021 20:05:06 -0000
@@ -84,7 +84,7 @@ MAN=  aac.4 abcrtc.4 abl.4 ac97.4 acphy.4
        ubsec.4 ucom.4 uchcom.4 ucrcom.4 ucycom.4 ukspan.4 uslhcom.4 \
        udav.4 udcf.4 udl.4 udp.4 udsbr.4 \
        uftdi.4 ugen.4 ugl.4 ugold.4 uguru.4 uhci.4 uhid.4 uhidev.4 uipaq.4 \
-       uk.4 ukbd.4 \
+       ujoy.4 uk.4 ukbd.4 \
        ukphy.4 ulpt.4 umass.4 umb.4 umbg.4 umcs.4 umct.4 umidi.4 umodem.4 \
        ums.4 umsm.4 umstc.4 umt.4 unix.4 uonerng.4 uow.4 uoaklux.4 uoakrh.4 \
        uoakv.4 upd.4 upgt.4 upl.4 uplcom.4 ural.4 ure.4 url.4 urlphy.4 \
Index: share/man/man4/uhidev.4
===================================================================
RCS file: /cvs/src/share/man/man4/uhidev.4,v
retrieving revision 1.12
diff -u -p -r1.12 uhidev.4
--- share/man/man4/uhidev.4     21 Aug 2020 19:02:46 -0000      1.12
+++ share/man/man4/uhidev.4     22 Jan 2021 20:05:06 -0000
@@ -40,6 +40,7 @@
 .Cd "ucycom*  at uhidev?"
 .Cd "ugold*   at uhidev?"
 .Cd "uhid*    at uhidev?"
+.Cd "ujoy*    at uhidev?"
 .Cd "ukbd*    at uhidev?"
 .Cd "ums*     at uhidev?"
 .Cd "umstc*   at uhidev?"
@@ -73,6 +74,7 @@ only dispatches data to them based on th
 .Xr ucycom 4 ,
 .Xr ugold 4 ,
 .Xr uhid 4 ,
+.Xr ujoy 4 ,
 .Xr ukbd 4 ,
 .Xr ums 4 ,
 .Xr umstc 4 ,
Index: share/man/man4/ujoy.4
===================================================================
RCS file: share/man/man4/ujoy.4
diff -N share/man/man4/ujoy.4
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ share/man/man4/ujoy.4       22 Jan 2021 20:05:06 -0000
@@ -0,0 +1,53 @@
+.\" $OpenBSD: ujoy.4,v 1.4 2020/08/21 19:02:46 mglocker Exp $
+.\"
+.\" Copyright (c) 2020 Thomas Frohwein <[email protected]>
+.\" Copyright (c) 2020 Bryan Steele    <[email protected]>
+.\"
+.\" Permission to use, copy, modify, and distribute this software for any
+.\" purpose with or without fee is hereby granted, provided that the above
+.\" copyright notice and this permission notice appear in all copies.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+.\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+.\"
+.Dd $Mdocdate: December 27 2020 $
+.Dt UJOY 4
+.Os
+.Sh NAME
+.Nm ujoy
+.Nd USB joystick/gamecontroller
+.Sh SYNOPSIS
+.Cd "ujoy* at uhidev?"
+.Sh DESCRIPTION
+The
+.Nm
+driver provides support for USB joysticks and other gamecontrollers.
+They are Human Interface Devices (HID) which can be accessed via the
+.Pa /dev/ujoy/N
+interface.
+.Pp
+The driver is compatible with the
+.Xr read 2 ,
+and a subset of
+.Xr ioctl 2
+operations of the generic
+.Xr uhid 4
+device.
+.Sh FILES
+.Bl -tag -width /dev/ujoy/* -compact
+.It Pa /dev/ujoy/*
+.El
+.Sh SEE ALSO
+.Xr uhid 4 ,
+.Xr uhidev 4 ,
+.Xr usb 4
+.Sh HISTORY
+The
+.Nm
+driver first appeared in
+.Ox 6.9 .
Index: share/man/man4/usb.4
===================================================================
RCS file: /cvs/src/share/man/man4/usb.4,v
retrieving revision 1.203
diff -u -p -r1.203 usb.4
--- share/man/man4/usb.4        21 Aug 2020 20:38:56 -0000      1.203
+++ share/man/man4/usb.4        22 Jan 2021 20:05:06 -0000
@@ -255,6 +255,8 @@ TEMPer gold HID thermometer and hygromet
 Generic driver for Human Interface Devices
 .It Xr uhidev 4
 Base driver for all Human Interface Devices
+.It Xr ujoy 4
+USB joysticks/gamecontrollers
 .It Xr ukbd 4
 USB keyboards that follow the boot protocol
 .It Xr ums 4
Index: sys/arch/alpha/alpha/conf.c
===================================================================
RCS file: /cvs/src/sys/arch/alpha/alpha/conf.c,v
retrieving revision 1.88
diff -u -p -r1.88 conf.c
--- sys/arch/alpha/alpha/conf.c 6 Jul 2020 04:32:25 -0000       1.88
+++ sys/arch/alpha/alpha/conf.c 22 Jan 2021 20:05:06 -0000
@@ -113,6 +113,7 @@ cdev_decl(cy);
 #include "usb.h"
 #include "uhid.h"
 #include "fido.h"
+#include "ujoy.h"
 #include "ugen.h"
 #include "ulpt.h"
 #include "ucom.h"
@@ -207,6 +208,7 @@ struct cdevsw       cdevsw[] =
        cdev_switch_init(NSWITCH,switch), /* 69: switch(4) control interface */
        cdev_fido_init(NFIDO,fido),     /* 70: FIDO/U2F security key */
        cdev_pppx_init(NPPPX,pppac),    /* 71: PPP Access Concentrator */
+       cdev_ujoy_init(NUJOY,ujoy),     /* 72: USB joystick/gamecontroller */
 };
 int    nchrdev = nitems(cdevsw);
 
Index: sys/arch/alpha/conf/GENERIC
===================================================================
RCS file: /cvs/src/sys/arch/alpha/conf/GENERIC,v
retrieving revision 1.266
diff -u -p -r1.266 GENERIC
--- sys/arch/alpha/conf/GENERIC 23 May 2020 06:28:29 -0000      1.266
+++ sys/arch/alpha/conf/GENERIC 22 Jan 2021 20:05:06 -0000
@@ -107,6 +107,7 @@ uslhcom* at uhidev?                 # Silicon Labs CP2
 ucom*  at uslhcom?
 uhid*  at uhidev?                      # USB generic HID support
 fido*  at uhidev?                      # FIDO/U2F security key support
+ujoy*  at uhidev?                      # USB joystick/gamecontroller support
 upd*   at uhidev?                      # USB Power Devices sensors
 aue*   at uhub?                        # ADMtek AN986 Pegasus Ethernet
 #atu*  at uhub?                        # Atmel AT76c50x based 802.11b
Index: sys/arch/amd64/amd64/conf.c
===================================================================
RCS file: /cvs/src/sys/arch/amd64/amd64/conf.c,v
retrieving revision 1.72
diff -u -p -r1.72 conf.c
--- sys/arch/amd64/amd64/conf.c 7 Oct 2020 13:37:33 -0000       1.72
+++ sys/arch/amd64/amd64/conf.c 22 Jan 2021 20:05:06 -0000
@@ -139,6 +139,7 @@ cdev_decl(cy);
 #include "usb.h"
 #include "uhid.h"
 #include "fido.h"
+#include "ujoy.h"
 #include "ugen.h"
 #include "ulpt.h"
 #include "ucom.h"
@@ -288,6 +289,7 @@ struct cdevsw       cdevsw[] =
        cdev_switch_init(NSWITCH,switch), /* 97: switch(4) control interface */
        cdev_fido_init(NFIDO,fido),     /* 98: FIDO/U2F security keys */
        cdev_pppx_init(NPPPX,pppac),    /* 99: PPP Access Concentrator */
+       cdev_ujoy_init(NUJOY,ujoy),     /* 100: USB joystick/gamecontroller */
 };
 int    nchrdev = nitems(cdevsw);
 
Index: sys/arch/amd64/conf/GENERIC
===================================================================
RCS file: /cvs/src/sys/arch/amd64/conf/GENERIC,v
retrieving revision 1.495
diff -u -p -r1.495 GENERIC
--- sys/arch/amd64/conf/GENERIC 15 Nov 2020 16:47:12 -0000      1.495
+++ sys/arch/amd64/conf/GENERIC 22 Jan 2021 20:05:07 -0000
@@ -286,6 +286,7 @@ uslhcom* at uhidev?         # Silicon Labs CP21
 ucom*  at uslhcom?
 uhid*  at uhidev?              # USB generic HID support
 fido*  at uhidev?              # FIDO/U2F security key support
+ujoy*  at uhidev?              # USB joystick/gamecontroller support
 upd*   at uhidev?              # USB Power Devices sensors
 umstc* at uhidev?              # Microsoft Surface Type Cover
 aue*   at uhub?                # ADMtek AN986 Pegasus Ethernet
Index: sys/arch/arm/arm/conf.c
===================================================================
RCS file: /cvs/src/sys/arch/arm/arm/conf.c,v
retrieving revision 1.55
diff -u -p -r1.55 conf.c
--- sys/arch/arm/arm/conf.c     6 Jul 2020 04:32:25 -0000       1.55
+++ sys/arch/arm/arm/conf.c     22 Jan 2021 20:05:07 -0000
@@ -126,6 +126,7 @@ cdev_decl(pci);
 #include "ugen.h"
 #include "uhid.h"
 #include "fido.h"
+#include "ujoy.h"
 #include "ulpt.h"
 
 /*
@@ -383,6 +384,7 @@ struct cdevsw cdevsw[] = {
        cdev_switch_init(NSWITCH,switch),       /* 105: switch(4) control 
interface */
        cdev_fido_init(NFIDO,fido),             /* 106: FIDO/U2F security key */
        cdev_pppx_init(NPPPX,pppac),            /* 107: PPP Access Concentrator 
*/
+       cdev_ujoy_init(NUJOY,ujoy),             /* 108: USB 
joystick/gamecontroller */
 };
 
 int nblkdev = nitems(bdevsw);
Index: sys/arch/arm64/arm64/conf.c
===================================================================
RCS file: /cvs/src/sys/arch/arm64/arm64/conf.c,v
retrieving revision 1.16
diff -u -p -r1.16 conf.c
--- sys/arch/arm64/arm64/conf.c 7 Oct 2020 13:37:32 -0000       1.16
+++ sys/arch/arm64/arm64/conf.c 22 Jan 2021 20:05:07 -0000
@@ -110,6 +110,7 @@ cdev_decl(spkr);
 #include "usb.h"
 #include "uhid.h"
 #include "fido.h"
+#include "ujoy.h"
 #include "ugen.h"
 #include "ulpt.h"
 #include "ucom.h"
@@ -248,6 +249,7 @@ struct cdevsw       cdevsw[] =
        cdev_switch_init(NSWITCH,switch), /* 97: switch(4) control interface */
        cdev_fido_init(NFIDO,fido),     /* 98: FIDO/U2F security key */
        cdev_pppx_init(NPPPX,pppac),    /* 99: PPP Access Concentrator */
+       cdev_ujoy_init(NUJOY,ujoy),     /* 100: USB joystick/gamecontroller */
 };
 int    nchrdev = nitems(cdevsw);
 
Index: sys/arch/arm64/conf/GENERIC
===================================================================
RCS file: /cvs/src/sys/arch/arm64/conf/GENERIC,v
retrieving revision 1.183
diff -u -p -r1.183 GENERIC
--- sys/arch/arm64/conf/GENERIC 19 Jan 2021 19:14:39 -0000      1.183
+++ sys/arch/arm64/conf/GENERIC 22 Jan 2021 20:05:07 -0000
@@ -369,6 +369,7 @@ uslhcom*    at uhidev?              # Silicon Labs CP21
 ucom*          at uslhcom?
 uhid*          at uhidev?              # USB generic HID support
 fido*          at uhidev?              # FIDO/U2F security key support
+ujoy*          at uhidev?              # USB joystick/gamecontroller support
 upd*           at uhidev?              # USB Power Devices sensors
 aue*           at uhub?                # ADMtek AN986 Pegasus Ethernet
 atu*           at uhub?                # Atmel AT76c50x based 802.11b
Index: sys/arch/armv7/conf/GENERIC
===================================================================
RCS file: /cvs/src/sys/arch/armv7/conf/GENERIC,v
retrieving revision 1.132
diff -u -p -r1.132 GENERIC
--- sys/arch/armv7/conf/GENERIC 23 Jun 2020 13:57:05 -0000      1.132
+++ sys/arch/armv7/conf/GENERIC 22 Jan 2021 20:05:07 -0000
@@ -321,6 +321,7 @@ uslhcom* at uhidev?         # Silicon Labs CP21
 ucom*  at uslhcom?
 uhid*  at uhidev?              # USB generic HID support
 fido*  at uhidev?              # FIDO/U2F security key support
+ujoy*  at uhidev?              # USB joystick/gamecontroller support
 upd*   at uhidev?              # USB Power Devices sensors
 aue*   at uhub?                # ADMtek AN986 Pegasus Ethernet
 atu*   at uhub?                # Atmel AT76c50x based 802.11b
Index: sys/arch/hppa/conf/GENERIC
===================================================================
RCS file: /cvs/src/sys/arch/hppa/conf/GENERIC,v
retrieving revision 1.180
diff -u -p -r1.180 GENERIC
--- sys/arch/hppa/conf/GENERIC  17 Dec 2019 13:08:55 -0000      1.180
+++ sys/arch/hppa/conf/GENERIC  22 Jan 2021 20:05:07 -0000
@@ -111,6 +111,7 @@ ukbd*       at uhidev?              # USB keyboard
 wskbd* at ukbd? mux 1
 uhid*  at uhidev?              # USB generic HID support
 fido*  at uhidev?              # FIDO/U2F security key support
+ujoy*  at uhidev?              # USB joystick/gamecontroller support
 upd*   at uhidev?              # USB Power Devices sensors
 aue*   at uhub?                # ADMtek AN986 Pegasus Ethernet
 url*   at uhub?                # Realtek RTL8150L based adapters
Index: sys/arch/hppa/hppa/conf.c
===================================================================
RCS file: /cvs/src/sys/arch/hppa/hppa/conf.c,v
retrieving revision 1.70
diff -u -p -r1.70 conf.c
--- sys/arch/hppa/hppa/conf.c   6 Jul 2020 04:32:25 -0000       1.70
+++ sys/arch/hppa/hppa/conf.c   22 Jan 2021 20:05:07 -0000
@@ -114,6 +114,7 @@ cdev_decl(pci);
 #include "usb.h"
 #include "uhid.h"
 #include "fido.h"
+#include "ujoy.h"
 #include "ugen.h"
 #include "ulpt.h"
 #include "ucom.h"
@@ -191,6 +192,7 @@ struct cdevsw   cdevsw[] =
        cdev_switch_init(NSWITCH,switch), /* 60: switch(4) control interface */
        cdev_fido_init(NFIDO,fido),     /* 61: FIDO/U2F security key */
        cdev_pppx_init(NPPPX,pppac),    /* 62: PPP Access Concentrator */
+       cdev_ujoy_init(NUJOY,ujoy),     /* 63: USB joystick/gamecontroller */
 };
 int nchrdev = nitems(cdevsw);
 
Index: sys/arch/i386/conf/GENERIC
===================================================================
RCS file: /cvs/src/sys/arch/i386/conf/GENERIC,v
retrieving revision 1.853
diff -u -p -r1.853 GENERIC
--- sys/arch/i386/conf/GENERIC  12 Sep 2020 15:01:05 -0000      1.853
+++ sys/arch/i386/conf/GENERIC  22 Jan 2021 20:05:07 -0000
@@ -284,6 +284,7 @@ uticom* at uhub?            # TI serial
 ucom*  at uticom?
 uhid*  at uhidev?              # USB generic HID support
 fido*  at uhidev?              # FIDO/U2F security key support
+ujoy*  at uhidev?              # USB joystick/gamecontroller support
 upd*   at uhidev?              # USB Power Devices sensors
 aue*   at uhub?                # ADMtek AN986 Pegasus Ethernet
 atu*   at uhub?                # Atmel AT76c50x based 802.11b
Index: sys/arch/i386/i386/conf.c
===================================================================
RCS file: /cvs/src/sys/arch/i386/i386/conf.c,v
retrieving revision 1.170
diff -u -p -r1.170 conf.c
--- sys/arch/i386/i386/conf.c   6 Jul 2020 04:32:25 -0000       1.170
+++ sys/arch/i386/i386/conf.c   22 Jan 2021 20:05:07 -0000
@@ -140,6 +140,7 @@ cdev_decl(cy);
 #include "usb.h"
 #include "uhid.h"
 #include "fido.h"
+#include "ujoy.h"
 #include "ugen.h"
 #include "ulpt.h"
 #include "ucom.h"
@@ -288,6 +289,7 @@ struct cdevsw       cdevsw[] =
        cdev_switch_init(NSWITCH,switch), /* 97: switch(4) control interface */
        cdev_fido_init(NFIDO,fido),     /* 98: FIDO/U2F security key */
        cdev_pppx_init(NPPPX,pppac),    /* 99: PPP Access Concentrator */
+       cdev_ujoy_init(NUJOY,ujoy),     /* 100: USB joystick/gamecontroller */
 };
 int    nchrdev = nitems(cdevsw);
 
Index: sys/arch/landisk/conf/GENERIC
===================================================================
RCS file: /cvs/src/sys/arch/landisk/conf/GENERIC,v
retrieving revision 1.55
diff -u -p -r1.55 GENERIC
--- sys/arch/landisk/conf/GENERIC       17 Dec 2019 13:08:55 -0000      1.55
+++ sys/arch/landisk/conf/GENERIC       22 Jan 2021 20:05:07 -0000
@@ -137,6 +137,7 @@ uslhcom* at uhidev?         # Silicon Labs CP21
 ucom*  at uslhcom?
 uhid*  at uhidev?              # USB generic HID support
 fido*  at uhidev?              # FIDO/U2F security key support
+ujoy*  at uhidev?              # USB joystick/gamecontroller support
 upd*   at uhidev?              # USB Power Devices sensors
 aue*   at uhub?                # ADMtek AN986 Pegasus Ethernet
 atu*   at uhub?                # Atmel AT76c50x based 802.11b
Index: sys/arch/landisk/landisk/conf.c
===================================================================
RCS file: /cvs/src/sys/arch/landisk/landisk/conf.c,v
retrieving revision 1.42
diff -u -p -r1.42 conf.c
--- sys/arch/landisk/landisk/conf.c     6 Jul 2020 04:32:25 -0000       1.42
+++ sys/arch/landisk/landisk/conf.c     22 Jan 2021 20:05:07 -0000
@@ -116,6 +116,7 @@ cdev_decl(pci);
 #include "ugen.h"
 #include "uhid.h"
 #include "fido.h"
+#include "ujoy.h"
 #include "ulpt.h"
 
 /*
@@ -357,6 +358,7 @@ struct cdevsw cdevsw[] = {
        cdev_switch_init(NSWITCH,switch),       /* 105: switch(4) control 
interface */
        cdev_fido_init(NFIDO,fido),             /* 106: FIDO/U2F security key */
        cdev_pppx_init(NPPPX,pppac),            /* 107: PPP Access Concentrator 
*/
+       cdev_ujoy_init(NUJOY,ujoy),             /* 108: USB 
joystick/gamecontroller */
 };
 
 int nblkdev = nitems(bdevsw);
Index: sys/arch/loongson/conf/GENERIC
===================================================================
RCS file: /cvs/src/sys/arch/loongson/conf/GENERIC,v
retrieving revision 1.62
diff -u -p -r1.62 GENERIC
--- sys/arch/loongson/conf/GENERIC      30 Sep 2020 22:23:41 -0000      1.62
+++ sys/arch/loongson/conf/GENERIC      22 Jan 2021 20:05:07 -0000
@@ -164,6 +164,7 @@ uslhcom*    at uhidev?      # Silicon Labs CP21
 ucom*          at uslhcom?
 uhid*          at uhidev?      # USB generic HID support
 fido*          at uhidev?      # FIDO/U2F security key support
+ujoy*          at uhidev?      # USB joystick/gamecontroller support
 upd*           at uhidev?      # USB Power Devices sensors
 atu*           at uhub?        # Atmel AT76c50x based 802.11b
 aue*           at uhub?        # ADMtek AN986 Pegasus Ethernet  
Index: sys/arch/loongson/loongson/conf.c
===================================================================
RCS file: /cvs/src/sys/arch/loongson/loongson/conf.c,v
retrieving revision 1.29
diff -u -p -r1.29 conf.c
--- sys/arch/loongson/loongson/conf.c   6 Jul 2020 04:32:25 -0000       1.29
+++ sys/arch/loongson/loongson/conf.c   22 Jan 2021 20:05:07 -0000
@@ -123,6 +123,7 @@ cdev_decl(pci);
 #include "usb.h"
 #include "uhid.h"
 #include "fido.h"
+#include "ujoy.h"
 #include "ugen.h"
 #include "ulpt.h"
 #include "ucom.h"
@@ -228,6 +229,7 @@ struct cdevsw       cdevsw[] =
        cdev_drm_init(NDRM,drm),        /* 87: drm */
        cdev_fido_init(NFIDO,fido),     /* 88: FIDO/U2F security key */
        cdev_pppx_init(NPPPX,pppac),    /* 89: PPP Access Concentrator */
+       cdev_ujoy_init(NUJOY,ujoy),     /* 90: USB joystick/gamecontroller */
 };
 
 int    nchrdev = nitems(cdevsw);
Index: sys/arch/macppc/conf/GENERIC
===================================================================
RCS file: /cvs/src/sys/arch/macppc/conf/GENERIC,v
retrieving revision 1.271
diff -u -p -r1.271 GENERIC
--- sys/arch/macppc/conf/GENERIC        24 Jan 2020 04:44:14 -0000      1.271
+++ sys/arch/macppc/conf/GENERIC        22 Jan 2021 20:05:07 -0000
@@ -260,6 +260,7 @@ uslhcom* at uhidev?         # Silicon Labs CP21
 ucom*  at uslhcom?
 uhid*  at uhidev?              # USB generic HID support
 fido*  at uhidev?              # FIDO/U2F security key support
+ujoy*  at uhidev?              # USB joystick/gamecontroller support
 upd*   at uhidev?              # USB Power Devices sensors
 aue*   at uhub?                # ADMtek AN986 Pegasus Ethernet
 atu*   at uhub?                # Atmel AT76c50x based 802.11b
Index: sys/arch/macppc/macppc/conf.c
===================================================================
RCS file: /cvs/src/sys/arch/macppc/macppc/conf.c,v
retrieving revision 1.72
diff -u -p -r1.72 conf.c
--- sys/arch/macppc/macppc/conf.c       6 Jul 2020 04:32:25 -0000       1.72
+++ sys/arch/macppc/macppc/conf.c       22 Jan 2021 20:05:07 -0000
@@ -98,6 +98,7 @@ cdev_decl(com);
 #include "usb.h"
 #include "uhid.h"
 #include "fido.h"
+#include "ujoy.h"
 #include "ugen.h"
 #include "ulpt.h"
 #include "ucom.h"
@@ -231,6 +232,7 @@ struct cdevsw cdevsw[] = {
        cdev_switch_init(NSWITCH,switch), /* 89: switch(4) control interface */
        cdev_fido_init(NFIDO,fido),     /* 90: FIDO/U2F security key */
        cdev_pppx_init(NPPPX,pppac),    /* 91: PPP Access Concentrator */
+       cdev_ujoy_init(NUJOY,ujoy),     /* 92: USB joystick/gamecontroller */
 };
 int nchrdev = nitems(cdevsw);
 
Index: sys/arch/octeon/conf/GENERIC
===================================================================
RCS file: /cvs/src/sys/arch/octeon/conf/GENERIC,v
retrieving revision 1.56
diff -u -p -r1.56 GENERIC
--- sys/arch/octeon/conf/GENERIC        25 Oct 2020 10:33:31 -0000      1.56
+++ sys/arch/octeon/conf/GENERIC        22 Jan 2021 20:05:08 -0000
@@ -156,6 +156,7 @@ uslhcom*    at uhidev?      # Silicon Labs CP211
 ucom*          at uslhcom?
 uhid*          at uhidev?      # USB generic HID support
 fido*          at uhidev?      # FIDO/U2F security key support
+ujoy*          at uhidev?      # USB joystick/gamecontroller support
 upd*           at uhidev?      # USB Power Devices sensors
 aue*           at uhub?        # ADMtek AN986 Pegasus Ethernet
 atu*           at uhub?        # Atmel AT76c50x based 802.11b
Index: sys/arch/octeon/octeon/conf.c
===================================================================
RCS file: /cvs/src/sys/arch/octeon/octeon/conf.c,v
retrieving revision 1.25
diff -u -p -r1.25 conf.c
--- sys/arch/octeon/octeon/conf.c       6 Jul 2020 04:32:25 -0000       1.25
+++ sys/arch/octeon/octeon/conf.c       22 Jan 2021 20:05:08 -0000
@@ -136,6 +136,7 @@ cdev_decl(pci);
 #include "usb.h"
 #include "uhid.h"
 #include "fido.h"
+#include "ujoy.h"
 #include "ugen.h"
 #include "ulpt.h"
 #include "ucom.h"
@@ -235,6 +236,7 @@ struct cdevsw       cdevsw[] =
        cdev_switch_init(NSWITCH,switch), /* 75: switch(4) control interface */
        cdev_fido_init(NFIDO,fido),     /* 76: FIDO/U2F security key */
        cdev_pppx_init(NPPPX,pppac),    /* 77: PPP Access Concentrator */
+       cdev_ujoy_init(NUJOY,ujoy),     /* 78: USB joystick/gamecontroller */
 };
 
 int    nchrdev = nitems(cdevsw);
Index: sys/arch/powerpc64/conf/GENERIC
===================================================================
RCS file: /cvs/src/sys/arch/powerpc64/conf/GENERIC,v
retrieving revision 1.22
diff -u -p -r1.22 GENERIC
--- sys/arch/powerpc64/conf/GENERIC     16 Nov 2020 19:04:57 -0000      1.22
+++ sys/arch/powerpc64/conf/GENERIC     22 Jan 2021 20:05:08 -0000
@@ -126,6 +126,7 @@ uslhcom* at uhidev?         # Silicon Labs CP21
 ucom*  at uslhcom?
 uhid*  at uhidev?              # USB generic HID support
 fido*  at uhidev?              # FIDO/U2F security key support
+ujoy*  at uhidev?              # USB joystick/gamecontroller support
 upd*   at uhidev?              # USB Power Devices sensors
 umstc* at uhidev?              # Microsoft Surface Type Cover
 aue*   at uhub?                # ADMtek AN986 Pegasus Ethernet
Index: sys/arch/powerpc64/powerpc64/conf.c
===================================================================
RCS file: /cvs/src/sys/arch/powerpc64/powerpc64/conf.c,v
retrieving revision 1.10
diff -u -p -r1.10 conf.c
--- sys/arch/powerpc64/powerpc64/conf.c 24 Oct 2020 21:06:56 -0000      1.10
+++ sys/arch/powerpc64/powerpc64/conf.c 22 Jan 2021 20:05:08 -0000
@@ -64,6 +64,7 @@ cdev_decl(com);
 #include "drm.h"
 #include "dt.h"
 #include "fido.h"
+#include "ujoy.h"
 #include "fuse.h"
 #include "hotplug.h"
 #include "ipmi.h"
@@ -203,6 +204,7 @@ struct cdevsw cdevsw[] =
 #else
        cdev_notdef(),                  /* 93 */
 #endif
+       cdev_ujoy_init(NUJOY,ujoy),     /* 94: USB joystick/gamecontroller */
 };
 int    nchrdev = nitems(cdevsw);
 
Index: sys/arch/sgi/conf/GENERIC-IP27
===================================================================
RCS file: /cvs/src/sys/arch/sgi/conf/GENERIC-IP27,v
retrieving revision 1.66
diff -u -p -r1.66 GENERIC-IP27
--- sys/arch/sgi/conf/GENERIC-IP27      17 Dec 2019 13:08:56 -0000      1.66
+++ sys/arch/sgi/conf/GENERIC-IP27      22 Jan 2021 20:05:08 -0000
@@ -128,6 +128,7 @@ uslhcom*    at uhidev?      # Silicon Labs CP211
 ucom*          at uslhcom?
 uhid*          at uhidev?      # USB generic HID support
 fido*          at uhidev?      # FIDO/U2F security key support
+ujoy*          at uhidev?      # USB joystick/gamecontroller support
 atu*           at uhub?        # Atmel AT76c50x based 802.11b
 aue*           at uhub?        # ADMtek AN986 Pegasus Ethernet  
 axe*           at uhub?        # ASIX Electronics AX88172 USB Ethernet
Index: sys/arch/sgi/conf/GENERIC-IP30
===================================================================
RCS file: /cvs/src/sys/arch/sgi/conf/GENERIC-IP30,v
retrieving revision 1.59
diff -u -p -r1.59 GENERIC-IP30
--- sys/arch/sgi/conf/GENERIC-IP30      17 Dec 2019 13:08:56 -0000      1.59
+++ sys/arch/sgi/conf/GENERIC-IP30      22 Jan 2021 20:05:08 -0000
@@ -119,6 +119,7 @@ uslhcom*    at uhidev?      # Silicon Labs CP211
 ucom*          at uslhcom?
 uhid*          at uhidev?      # USB generic HID support
 fido*          at uhidev?      # FIDO/U2F security key support
+ujoy*          at uhidev?      # USB joystick/gamecontroller support
 atu*           at uhub?        # Atmel AT76c50x based 802.11b
 aue*           at uhub?        # ADMtek AN986 Pegasus Ethernet  
 axe*           at uhub?        # ASIX Electronics AX88172 USB Ethernet
Index: sys/arch/sgi/conf/GENERIC-IP32
===================================================================
RCS file: /cvs/src/sys/arch/sgi/conf/GENERIC-IP32,v
retrieving revision 1.50
diff -u -p -r1.50 GENERIC-IP32
--- sys/arch/sgi/conf/GENERIC-IP32      17 Dec 2019 13:08:56 -0000      1.50
+++ sys/arch/sgi/conf/GENERIC-IP32      22 Jan 2021 20:05:08 -0000
@@ -111,6 +111,7 @@ uslhcom*    at uhidev?      # Silicon Labs CP211
 ucom*          at uslhcom?
 uhid*          at uhidev?      # USB generic HID support
 fido*          at uhidev?      # FIDO/U2F security key support
+ujoy*          at uhidev?      # USB joystick/gamecontroller support
 atu*           at uhub?        # Atmel AT76c50x based 802.11b
 aue*           at uhub?        # ADMtek AN986 Pegasus Ethernet  
 axe*           at uhub?        # ASIX Electronics AX88172 USB Ethernet
Index: sys/arch/sgi/sgi/conf.c
===================================================================
RCS file: /cvs/src/sys/arch/sgi/sgi/conf.c,v
retrieving revision 1.43
diff -u -p -r1.43 conf.c
--- sys/arch/sgi/sgi/conf.c     6 Jul 2020 04:32:25 -0000       1.43
+++ sys/arch/sgi/sgi/conf.c     22 Jan 2021 20:05:08 -0000
@@ -122,6 +122,7 @@ cdev_decl(pci);
 #include "usb.h"
 #include "uhid.h"
 #include "fido.h"
+#include "ujoy.h"
 #include "ugen.h"
 #include "ulpt.h"
 #include "ucom.h"
@@ -215,6 +216,7 @@ struct cdevsw       cdevsw[] =
        cdev_switch_init(NSWITCH,switch), /* 75: switch(4) control interface */
        cdev_fido_init(NFIDO,fido),     /* 76: FIDO/U2F security key */
        cdev_pppx_init(NPPPX,pppac),    /* 77: PPP Access Concentrator */
+       cdev_ujoy_init(NUJOY,ujoy),     /* 78: USB joystick/gamecontroller */
 };
 
 int    nchrdev = nitems(cdevsw);
Index: sys/arch/sparc64/conf/GENERIC
===================================================================
RCS file: /cvs/src/sys/arch/sparc64/conf/GENERIC,v
retrieving revision 1.314
diff -u -p -r1.314 GENERIC
--- sys/arch/sparc64/conf/GENERIC       17 Dec 2019 13:08:56 -0000      1.314
+++ sys/arch/sparc64/conf/GENERIC       22 Jan 2021 20:05:08 -0000
@@ -224,6 +224,7 @@ umsm*       at uhub?                # Qualcomm MSM EVDO
 ucom*  at umsm?
 uhid*  at uhidev?              # USB generic HID support
 fido*  at uhidev?              # FIDO/U2F security key support
+ujoy*  at uhidev?              # USB joystick/gamecontroller support
 upd*   at uhidev?              # USB Power Devices sensors
 aue*   at uhub?                # ADMtek AN986 Pegasus Ethernet
 atu*   at uhub?                # Atmel AT76c50x based 802.11b
Index: sys/arch/sparc64/sparc64/conf.c
===================================================================
RCS file: /cvs/src/sys/arch/sparc64/sparc64/conf.c,v
retrieving revision 1.84
diff -u -p -r1.84 conf.c
--- sys/arch/sparc64/sparc64/conf.c     6 Jul 2020 04:32:25 -0000       1.84
+++ sys/arch/sparc64/sparc64/conf.c     22 Jan 2021 20:05:08 -0000
@@ -104,6 +104,7 @@ cdev_decl(pci);
 #include "usb.h"
 #include "uhid.h"
 #include "fido.h"
+#include "ujoy.h"
 #include "ugen.h"
 #include "ulpt.h"
 #include "ucom.h"
@@ -297,6 +298,7 @@ struct cdevsw       cdevsw[] =
        cdev_switch_init(NSWITCH,switch), /* 136: switch(4) control interface */
        cdev_fido_init(NFIDO,fido),     /* 137: FIDO/U2F security key */
        cdev_pppx_init(NPPPX,pppac),    /* 138: PPP Access Concentrator */
+       cdev_ujoy_init(NUJOY,ujoy),     /* 139: USB joystick/gamecontroller */
 };
 int    nchrdev = nitems(cdevsw);
 
Index: sys/dev/usb/files.usb
===================================================================
RCS file: /cvs/src/sys/dev/usb/files.usb,v
retrieving revision 1.143
diff -u -p -r1.143 files.usb
--- sys/dev/usb/files.usb       31 May 2020 18:15:37 -0000      1.143
+++ sys/dev/usb/files.usb       22 Jan 2021 20:05:10 -0000
@@ -74,12 +74,17 @@ file        dev/usb/uhidev.c                uhidev
 # Generic HID devices
 device uhid: hid
 attach uhid at uhidbus
-file   dev/usb/uhid.c                  uhid | fido             needs-flag
+file   dev/usb/uhid.c                  uhid | fido | ujoy      needs-flag
 
 # FIDO/U2F security keys
 device  fido: hid
 attach fido at uhidbus
 file   dev/usb/fido.c                  fido                    needs-flag
+
+# USB Joysticks/Gamecontrollers
+device ujoy: hid
+attach ujoy at uhidbus
+file   dev/usb/ujoy.c                  ujoy                    needs-flag
 
 # Keyboards
 file   dev/usb/ukbdmap.c               hidkbd
Index: sys/dev/usb/uhid.c
===================================================================
RCS file: /cvs/src/sys/dev/usb/uhid.c,v
retrieving revision 1.81
diff -u -p -r1.81 uhid.c
--- sys/dev/usb/uhid.c  25 Dec 2020 12:59:52 -0000      1.81
+++ sys/dev/usb/uhid.c  22 Jan 2021 20:05:10 -0000
@@ -36,6 +36,7 @@
  */
 
 #include "fido.h"
+#include "ujoy.h"
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -96,6 +97,10 @@ uhid_lookup(dev_t dev)
 #if NFIDO > 0
        else if (cdev->d_open == fidoopen)
                cd = &fido_cd;
+#endif
+#if NUJOY > 0
+       else if (cdev->d_open == ujoyopen)
+               cd = &ujoy_cd;
 #endif
        else
                return (NULL);
Index: sys/dev/usb/uhid.h
===================================================================
RCS file: /cvs/src/sys/dev/usb/uhid.h,v
retrieving revision 1.1
diff -u -p -r1.1 uhid.h
--- sys/dev/usb/uhid.h  17 Dec 2019 13:08:54 -0000      1.1
+++ sys/dev/usb/uhid.h  22 Jan 2021 20:05:10 -0000
@@ -48,6 +48,7 @@ struct uhid_softc {
 
 extern struct cfdriver uhid_cd;
 extern struct cfdriver fido_cd;
+extern struct cfdriver ujoy_cd;
 
 #define        UHIDUNIT(dev)   (minor(dev))
 #define        UHID_CHUNK      128     /* chunk size for read */
Index: sys/dev/usb/ujoy.c
===================================================================
RCS file: sys/dev/usb/ujoy.c
diff -N sys/dev/usb/ujoy.c
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ sys/dev/usb/ujoy.c  22 Jan 2021 20:05:10 -0000
@@ -0,0 +1,149 @@
+/*     $OpenBSD$ */
+
+/*
+ * Copyright (c) 2020 Thomas Frohwein  <[email protected]>
+ * Copyright (c) 2020 Bryan Steele     <[email protected]>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/kernel.h>
+#include <sys/malloc.h>
+#include <sys/signalvar.h>
+#include <sys/device.h>
+#include <sys/ioctl.h>
+#include <sys/conf.h>
+#include <sys/tty.h>
+#include <sys/selinfo.h>
+#include <sys/proc.h>
+#include <sys/vnode.h>
+#include <sys/poll.h>
+#include <sys/fcntl.h>
+
+#include <dev/usb/usb.h>
+#include <dev/usb/usbhid.h>
+
+#include <dev/usb/usbdevs.h>
+#include <dev/usb/usbdi.h>
+#include <dev/usb/usbdi_util.h>
+
+#include <dev/usb/uhidev.h>
+#include <dev/usb/uhid.h>
+
+int ujoy_match(struct device *, void *, void *);
+
+struct cfdriver ujoy_cd = {
+       NULL, "ujoy", DV_DULL
+};
+
+const struct cfattach ujoy_ca = {
+       sizeof(struct uhid_softc),
+       ujoy_match,
+       uhid_attach,
+       uhid_detach,
+};
+
+/*
+ * XXX workaround:
+ *
+ * This is a copy of sys/dev/hid/hid.c:hid_is_collection(), synced up to the
+ * NetBSD version.  Our current hid_is_collection() is not playing nice with
+ * all HID devices like the PS4 controller.  But applying this version
+ * globally breaks other HID devices like ims(4) and imt(4).  Until our global
+ * hid_is_collection() can't be fixed to play nice with all HID devices, we
+ * go for this dedicated ujoy(4) version.
+ */
+int
+ujoy_hid_is_collection(const void *desc, int size, uint8_t id, int32_t usage)
+{
+       struct hid_data *hd;
+       struct hid_item hi;
+       uint32_t coll_usage = ~0;
+
+       hd = hid_start_parse(desc, size, hid_input);
+       if (hd == NULL)
+               return (0);
+
+       while (hid_get_item(hd, &hi)) {
+               if (hi.kind == hid_collection &&
+                   hi.collection == HCOLL_APPLICATION)
+                       coll_usage = hi.usage;
+
+               if (hi.kind == hid_endcollection)
+                       coll_usage = ~0;
+
+               if (hi.kind == hid_input &&
+                   coll_usage == usage &&
+                   hi.report_ID == id) {
+                       hid_end_parse(hd);
+                       return (1);
+               }
+       }
+       hid_end_parse(hd);
+
+       return (0);
+}
+
+int
+ujoy_match(struct device *parent, void *match, void *aux)
+{
+       struct uhidev_attach_arg *uha = (struct uhidev_attach_arg *)aux;
+       int                       size;
+       void                     *desc;
+       int                       ret = UMATCH_NONE;
+
+       if (uha->reportid == UHIDEV_CLAIM_ALLREPORTID)
+               return (ret);
+
+       /* Find the general usage page and gamecontroller collections */
+       uhidev_get_report_desc(uha->parent, &desc, &size);
+
+       if (ujoy_hid_is_collection(desc, size, uha->reportid,
+           HID_USAGE2(HUP_GENERIC_DESKTOP, HUG_JOYSTICK)))
+               ret = UMATCH_IFACECLASS;
+
+       if (ujoy_hid_is_collection(desc, size, uha->reportid,
+           HID_USAGE2(HUP_GENERIC_DESKTOP, HUG_GAME_PAD)))
+               ret = UMATCH_IFACECLASS;
+
+       return (ret);
+}
+
+int
+ujoyopen(dev_t dev, int flag, int mode, struct proc *p)
+{
+       /* Restrict ujoy devices to read operations */
+       if ((flag & FWRITE))
+               return (EPERM);
+       return (uhid_do_open(dev, flag, mode, p));
+}
+
+int
+ujoyioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, struct proc *p)
+{
+       switch (cmd) {
+       case FIONBIO:
+       case FIOASYNC:
+       case USB_GET_DEVICEINFO:
+       case USB_GET_REPORT:
+       case USB_GET_REPORT_DESC:
+       case USB_GET_REPORT_ID:
+               break;
+       default:
+               return (EPERM);
+       }
+
+       return (uhidioctl(dev, cmd, addr, flag, p));
+}
Index: sys/sys/conf.h
===================================================================
RCS file: /cvs/src/sys/sys/conf.h,v
retrieving revision 1.155
diff -u -p -r1.155 conf.h
--- sys/sys/conf.h      6 Jul 2020 04:11:26 -0000       1.155
+++ sys/sys/conf.h      22 Jan 2021 20:05:10 -0000
@@ -383,6 +383,13 @@ extern struct cdevsw cdevsw[];
        (dev_type_stop((*))) enodev, 0, dev_init(c,uhid,poll), \
        (dev_type_mmap((*))) enodev, 0, 0, dev_init(c,uhid,kqfilter) }
 
+/* open, close, read, write, ioctl, poll, kqfilter */
+#define        cdev_ujoy_init(c,n) { \
+       dev_init(c,n,open), dev_init(c,uhid,close), dev_init(c,uhid,read), \
+       dev_init(c,uhid,write), dev_init(c,ujoy,ioctl), \
+       (dev_type_stop((*))) enodev, 0, dev_init(c,uhid,poll), \
+       (dev_type_mmap((*))) enodev, 0, 0, dev_init(c,uhid,kqfilter) }
+
 /* open, close, init */
 #define cdev_pci_init(c,n) { \
        dev_init(c,n,open), dev_init(c,n,close), (dev_type_read((*))) enodev, \
@@ -624,6 +631,7 @@ cdev_decl(usb);
 cdev_decl(ugen);
 cdev_decl(uhid);
 cdev_decl(fido);
+cdev_decl(ujoy);
 cdev_decl(ucom);
 cdev_decl(ulpt);
 cdev_decl(urio);

Reply via email to