Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 7 Jan 2021 23:20:51 GMT
From:      Vladimir Kondratyev <wulf@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Subject:   git: 67de2db2623a - main - Factor-out hardware-independent part of USB HID support to new module
Message-ID:  <202101072320.107NKpWA063323@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help
The branch main has been updated by wulf:

URL: https://cgit.FreeBSD.org/src/commit/?id=67de2db2623a10dc4edec1642b2f8685d5587d7f

commit 67de2db2623a10dc4edec1642b2f8685d5587d7f
Author:     Vladimir Kondratyev <wulf@FreeBSD.org>
AuthorDate: 2020-10-04 22:21:08 +0000
Commit:     Vladimir Kondratyev <wulf@FreeBSD.org>
CommitDate: 2021-01-07 23:18:42 +0000

    Factor-out hardware-independent part of USB HID support to new module
    
    It will be used by the upcoming HID-over-i2C implementation.  Should be
    no-op, except hid.ko module dependency is to be added to affected drivers.
    
    Reviewed by:    hselasky, manu
    Differential revision:  https://reviews.freebsd.org/D27867
---
 etc/mtree/BSD.include.dist    |   2 +
 include/Makefile              |  11 +-
 share/man/man4/atp.4          |   1 +
 share/man/man4/ucycom.4       |   1 +
 share/man/man4/ugold.4        |   1 +
 share/man/man4/uhid.4         |   2 +
 share/man/man4/ukbd.4         |   2 +
 share/man/man4/ums.4          |   1 +
 share/man/man4/wmt.4          |   1 +
 share/man/man4/wsp.4          |   1 +
 sys/amd64/conf/GENERIC        |   3 +
 sys/arm/conf/EFIKA_MX         |   3 +
 sys/arm/conf/GENERIC          |   3 +
 sys/arm/conf/IMX53            |   3 +
 sys/arm/conf/IMX6             |   3 +
 sys/arm/conf/RPI-B            |   3 +
 sys/arm/conf/TEGRA124         |   3 +
 sys/arm/conf/VYBRID           |   3 +
 sys/arm64/conf/GENERIC        |   3 +
 sys/conf/files                |   1 +
 sys/dev/hid/hid.c             |  87 +----
 sys/dev/hid/hid.h             |  43 +--
 sys/dev/hid/hidrdesc.h        |  72 +++-
 sys/dev/sound/usb/uaudio.c    |   1 +
 sys/dev/usb/input/atp.c       |   1 +
 sys/dev/usb/input/uhid.c      |   1 +
 sys/dev/usb/input/ukbd.c      |   1 +
 sys/dev/usb/input/ums.c       |   1 +
 sys/dev/usb/input/usb_rdesc.h | 285 +-------------
 sys/dev/usb/input/wmt.c       |   1 +
 sys/dev/usb/input/wsp.c       |   1 +
 sys/dev/usb/misc/ugold.c      |   1 +
 sys/dev/usb/serial/ucycom.c   |   1 +
 sys/dev/usb/usb_hid.c         | 861 ------------------------------------------
 sys/dev/usb/usbhid.h          | 212 +----------
 sys/i386/conf/GENERIC         |   3 +
 sys/mips/conf/ERL             |   3 +
 sys/mips/conf/JZ4780          |   3 +
 sys/mips/conf/OCTEON1         |   3 +
 sys/modules/Makefile          |   1 +
 sys/modules/hid/Makefile      |   6 +
 sys/modules/hid/hid/Makefile  |   9 +
 sys/powerpc/conf/GENERIC      |   2 +
 sys/powerpc/conf/GENERIC64    |   2 +
 sys/powerpc/conf/GENERIC64LE  |   2 +
 sys/powerpc/conf/MPC85XX      |   3 +
 sys/powerpc/conf/MPC85XXSPE   |   3 +
 sys/powerpc/conf/QORIQ64      |   3 +
 48 files changed, 185 insertions(+), 1478 deletions(-)

diff --git a/etc/mtree/BSD.include.dist b/etc/mtree/BSD.include.dist
index 071fba7e87ac..e7784cbb0a47 100644
--- a/etc/mtree/BSD.include.dist
+++ b/etc/mtree/BSD.include.dist
@@ -54,6 +54,8 @@
         ..
         firewire
         ..
+        hid
+        ..
         hwpmc
         ..
         hyperv
diff --git a/include/Makefile b/include/Makefile
index d374ce739cf4..7e19f66edf71 100644
--- a/include/Makefile
+++ b/include/Makefile
@@ -94,6 +94,10 @@ EVDEV=		input.h \
 		uinput.h
 EVDEVDIR=	${INCLUDEDIR}/dev/evdev
 
+.PATH: ${SRCTOP}/sys/dev/hid
+HID=		hid.h
+HIDDIR=		${INCLUDEDIR}/dev/hid
+
 .PATH: ${SRCTOP}/sys/dev/hyperv/include ${SRCTOP}/sys/dev/hyperv/utilities
 HYPERV=		hv_snapshot.h \
 		hyperv.h
@@ -172,6 +176,7 @@ INCSGROUPS=	INCS \
 		CRYPTO \
 		EVDEV \
 		FS9660 \
+		HID \
 		HYPERV \
 		OPENCRYPTO \
 		PCI \
@@ -287,7 +292,7 @@ copies: .PHONY .META
 		done; \
 	fi
 .endfor
-.for i in ${LDIRS} ${LSUBDIRS:Ndev/agp:Ndev/acpica:Ndev/evdev:Ndev/hyperv:Ndev/pci:Ndev/veriexec} ${LSUBSUBDIRS}
+.for i in ${LDIRS} ${LSUBDIRS:Ndev/agp:Ndev/acpica:Ndev/evdev:Ndev/hid:Ndev/hyperv:Ndev/pci:Ndev/veriexec} ${LSUBSUBDIRS}
 	cd ${SRCTOP}/sys; \
 	${INSTALL} -C ${TAG_ARGS} -o ${BINOWN} -g ${BINGRP} -m 444 $i/*.h \
 	    ${SDESTDIR}${INCLUDEDIR}/$i
@@ -323,7 +328,7 @@ symlinks: .PHONY .META
 	cd ${SRCTOP}; ${INSTALL_SYMLINK} ${TAG_ARGS:D${TAG_ARGS},dev} \
 	    $$(printf '../../../%s ' sys/$i/*.h) ${SDESTDIR}${INCLUDEDIR}/$i
 .endfor
-.for i in ${LSUBDIRS:Ndev/agp:Ndev/acpica:Ndev/evdev:Ndev/hyperv:Ndev/pci:Ndev/veriexec}
+.for i in ${LSUBDIRS:Ndev/agp:Ndev/acpica:Ndev/evdev:Ndev/hid:Ndev/hyperv:Ndev/pci:Ndev/veriexec}
 	cd ${SRCTOP}; ${INSTALL_SYMLINK} ${TAG_ARGS:D${TAG_ARGS},dev} \
 	    $$(printf '../../../../%s ' sys/$i/*.h) ${SDESTDIR}${INCLUDEDIR}/$i
 .endfor
@@ -335,6 +340,8 @@ symlinks: .PHONY .META
 	${INSTALL_SYMLINK} ${TAG_ARGS:D${TAG_ARGS},dev} \
 	    $$(printf '../../../../sys/dev/evdev/%s ' input.h input-event-codes.h uinput.h) \
 	    ${SDESTDIR}${INCLUDEDIR}/dev/evdev;
+	${INSTALL_SYMLINK} ${TAG_ARGS:D${TAG_ARGS},dev} ../../../../sys/dev/hid/hid.h \
+	    ${SDESTDIR}${INCLUDEDIR}/dev/hid; \
 	${INSTALL_SYMLINK} ${TAG_ARGS:D${TAG_ARGS},dev} ../../../../sys/dev/hyperv/include/hyperv.h \
 	    ${SDESTDIR}${INCLUDEDIR}/dev/hyperv; \
 	${INSTALL_SYMLINK} ${TAG_ARGS:D${TAG_ARGS},dev} ../../../../sys/dev/hyperv/utilities/hv_snapshot.h \
diff --git a/share/man/man4/atp.4 b/share/man/man4/atp.4
index c32618815d22..b622bb0b6380 100644
--- a/share/man/man4/atp.4
+++ b/share/man/man4/atp.4
@@ -38,6 +38,7 @@ To compile this driver into the kernel, place the following lines into
 your kernel configuration file:
 .Bd -ragged -offset indent
 .Cd "device atp"
+.Cd "device hid"
 .Cd "device usb"
 .Ed
 .Pp
diff --git a/share/man/man4/ucycom.4 b/share/man/man4/ucycom.4
index c5764cbe9a58..ec410ab0ff78 100644
--- a/share/man/man4/ucycom.4
+++ b/share/man/man4/ucycom.4
@@ -39,6 +39,7 @@ place the following line in your
 kernel configuration file:
 .Bd -ragged -offset indent
 .Cd "device usb"
+.Cd "device hid"
 .Cd "device ucom"
 .Cd "device ucycom"
 .Ed
diff --git a/share/man/man4/ugold.4 b/share/man/man4/ugold.4
index f75440de2134..79d2e5749f2d 100644
--- a/share/man/man4/ugold.4
+++ b/share/man/man4/ugold.4
@@ -28,6 +28,7 @@ To compile this driver into the kernel, place the following lines into
 your kernel configuration file:
 .Bd -ragged -offset indent
 .Cd "device usb"
+.Cd "device hid"
 .Cd "device ugold"
 .Ed
 .Pp
diff --git a/share/man/man4/uhid.4 b/share/man/man4/uhid.4
index bcb1b78fdd12..491a2e871e76 100644
--- a/share/man/man4/uhid.4
+++ b/share/man/man4/uhid.4
@@ -41,6 +41,8 @@ place the following line in your
 kernel configuration file:
 .Bd -ragged -offset indent
 .Cd "device uhid"
+.Cd "device hid"
+.Cd "device usb"
 .Ed
 .Pp
 Alternatively, to load the driver as a
diff --git a/share/man/man4/ukbd.4 b/share/man/man4/ukbd.4
index 0b58446fcb77..f443f51ce8e1 100644
--- a/share/man/man4/ukbd.4
+++ b/share/man/man4/ukbd.4
@@ -36,6 +36,8 @@ place the following line in your
 kernel configuration file:
 .Bd -ragged -offset indent
 .Cd "device ukbd"
+.Cd "device hid"
+.Cd "device usb"
 .Ed
 .Pp
 Alternatively, to load the driver as a
diff --git a/share/man/man4/ums.4 b/share/man/man4/ums.4
index cbc94160b260..b27c55cef738 100644
--- a/share/man/man4/ums.4
+++ b/share/man/man4/ums.4
@@ -36,6 +36,7 @@ place the following lines in your
 kernel configuration file:
 .Bd -ragged -offset indent
 .Cd "device ums"
+.Cd "device hid"
 .Cd "device uhci"
 .Cd "device ohci"
 .Cd "device usb"
diff --git a/share/man/man4/wmt.4 b/share/man/man4/wmt.4
index ddea0a6b45d3..e09fc5286fe2 100644
--- a/share/man/man4/wmt.4
+++ b/share/man/man4/wmt.4
@@ -36,6 +36,7 @@ your kernel configuration file:
 .Bd -ragged -offset indent
 .Cd "device wmt"
 .Cd "device usb"
+.Cd "device hid"
 .Cd "device evdev"
 .Ed
 .Pp
diff --git a/share/man/man4/wsp.4 b/share/man/man4/wsp.4
index 0a8cc0fe410b..70a1219533dc 100644
--- a/share/man/man4/wsp.4
+++ b/share/man/man4/wsp.4
@@ -35,6 +35,7 @@ To compile this driver into the kernel, place the following lines into
 your kernel configuration file:
 .Bd -ragged -offset indent
 .Cd "device wsp"
+.Cd "device hid"
 .Cd "device usb"
 .Ed
 .Pp
diff --git a/sys/amd64/conf/GENERIC b/sys/amd64/conf/GENERIC
index 9b1fb0182e72..c7802969ba4b 100644
--- a/sys/amd64/conf/GENERIC
+++ b/sys/amd64/conf/GENERIC
@@ -380,3 +380,6 @@ device		netmap			# netmap(4) support
 options 	EVDEV_SUPPORT		# evdev support in legacy drivers
 device		evdev			# input event device support
 device		uinput			# install /dev/uinput cdev
+
+# HID support
+device		hid			# Generic HID support
diff --git a/sys/arm/conf/EFIKA_MX b/sys/arm/conf/EFIKA_MX
index be5f5f35570d..724d742e03af 100644
--- a/sys/arm/conf/EFIKA_MX
+++ b/sys/arm/conf/EFIKA_MX
@@ -116,6 +116,9 @@ device		wlan_ccmp		# 802.11 CCMP support
 device		wlan_tkip		# 802.11 TKIP support
 device		wlan_amrr		# AMRR transmit rate control algorithm
 
+# HID support
+device		hid			# Generic HID support
+
 # Flattened Device Tree
 options 	FDT			# Configure using FDT/DTB data
 options 	FDT_DTB_STATIC
diff --git a/sys/arm/conf/GENERIC b/sys/arm/conf/GENERIC
index 35056f7640dc..0f0522eb9802 100644
--- a/sys/arm/conf/GENERIC
+++ b/sys/arm/conf/GENERIC
@@ -280,6 +280,9 @@ device		aw_sid		# Allwinner Secure ID EFUSE
 # Thermal sensors
 device		aw_thermal	# Allwinner Thermal Sensor Controller
 
+# HID support
+device		hid		# Generic HID support
+
 # Flattened Device Tree
 options 	FDT			# Configure using FDT/DTB data
 makeoptions	MODULES_EXTRA+="dtb/allwinner"
diff --git a/sys/arm/conf/IMX53 b/sys/arm/conf/IMX53
index be18afda6094..0372cb62088d 100644
--- a/sys/arm/conf/IMX53
+++ b/sys/arm/conf/IMX53
@@ -113,6 +113,9 @@ device		wlan_amrr		# AMRR transmit rate control algorithm
 #device  	mmc			# SD/MMC protocol
 #device  	mmcsd			# SDCard disk device
 
+# HID support
+device		hid			# Generic HID support
+
 
 # Flattened Device Tree
 options 	FDT			# Configure using FDT/DTB data
diff --git a/sys/arm/conf/IMX6 b/sys/arm/conf/IMX6
index 808dac4bf910..6d8388ff0d60 100644
--- a/sys/arm/conf/IMX6
+++ b/sys/arm/conf/IMX6
@@ -106,6 +106,9 @@ device		u3g			# USB modems
 #device		wlan_tkip		# 802.11 TKIP support
 #device		wlan_amrr		# AMRR transmit rate control algorithm
 
+# HID support
+device		hid			# Generic HID support
+
 device		vt
 device		kbdmux
 device		ukbd
diff --git a/sys/arm/conf/RPI-B b/sys/arm/conf/RPI-B
index e456d33742b8..36eaff0c0f28 100644
--- a/sys/arm/conf/RPI-B
+++ b/sys/arm/conf/RPI-B
@@ -89,6 +89,9 @@ device		sound
 
 device		fdt_pinctrl
 
+# HID support
+device		hid			# Generic HID support
+
 # Flattened Device Tree
 options 	FDT			# Configure using FDT/DTB data
 # Note:  DTB is normally loaded and modified by RPi boot loader, then
diff --git a/sys/arm/conf/TEGRA124 b/sys/arm/conf/TEGRA124
index a6c731dedcf2..68d7bf037525 100644
--- a/sys/arm/conf/TEGRA124
+++ b/sys/arm/conf/TEGRA124
@@ -130,6 +130,9 @@ device		drm2
 #device		sound
 #device		snd_hda
 
+# HID support
+device		hid			# Generic HID support
+
 # Flattened Device Tree
 options 	FDT			# Configure using FDT/DTB data
 device  	fdt_pinctrl
diff --git a/sys/arm/conf/VYBRID b/sys/arm/conf/VYBRID
index 856fe41bb3f3..e7ded5f42d82 100644
--- a/sys/arm/conf/VYBRID
+++ b/sys/arm/conf/VYBRID
@@ -103,5 +103,8 @@ device		vt
 device		kbdmux
 device		ukbd
 
+# HID support
+device		hid			# Generic HID support
+
 # Flattened Device Tree
 options 	FDT			# Configure using FDT/DTB data
diff --git a/sys/arm64/conf/GENERIC b/sys/arm64/conf/GENERIC
index f7f446c6c881..dc9278a998e2 100644
--- a/sys/arm64/conf/GENERIC
+++ b/sys/arm64/conf/GENERIC
@@ -380,3 +380,6 @@ device		acpi
 
 # DTBs
 makeoptions	MODULES_EXTRA="dtb/allwinner dtb/freescale dtb/imx8 dtb/nvidia dtb/mv dtb/rockchip dtb/rpi"
+
+# HID support
+device		hid		# Generic HID support
diff --git a/sys/conf/files b/sys/conf/files
index 7cfb32560af6..a192877d1e98 100644
--- a/sys/conf/files
+++ b/sys/conf/files
@@ -1815,6 +1815,7 @@ dev/gpio/gpio_if.m		optional gpio
 dev/gpio/gpiobus_if.m		optional gpio
 dev/gpio/gpiopps.c		optional gpiopps fdt
 dev/gpio/ofw_gpiobus.c		optional fdt gpio
+dev/hid/hid.c			optional hid
 dev/hifn/hifn7751.c		optional hifn
 dev/hptiop/hptiop.c		optional hptiop scbus
 dev/hwpmc/hwpmc_logging.c	optional hwpmc
diff --git a/sys/dev/hid/hid.c b/sys/dev/hid/hid.c
index 22e5fb5446c3..61b7587a6c62 100644
--- a/sys/dev/hid/hid.c
+++ b/sys/dev/hid/hid.c
@@ -779,91 +779,6 @@ hid_is_collection(const void *desc, usb_size_t size, int32_t usage)
 	return (err);
 }
 
-/*------------------------------------------------------------------------*
- *	hid_get_descriptor_from_usb
- *
- * This function will search for a HID descriptor between two USB
- * interface descriptors.
- *
- * Return values:
- * NULL: No more HID descriptors.
- * Else: Pointer to HID descriptor.
- *------------------------------------------------------------------------*/
-struct usb_hid_descriptor *
-hid_get_descriptor_from_usb(struct usb_config_descriptor *cd,
-    struct usb_interface_descriptor *id)
-{
-	struct usb_descriptor *desc = (void *)id;
-
-	if (desc == NULL) {
-		return (NULL);
-	}
-	while ((desc = usb_desc_foreach(cd, desc))) {
-		if ((desc->bDescriptorType == UDESC_HID) &&
-		    (desc->bLength >= USB_HID_DESCRIPTOR_SIZE(0))) {
-			return (void *)desc;
-		}
-		if (desc->bDescriptorType == UDESC_INTERFACE) {
-			break;
-		}
-	}
-	return (NULL);
-}
-
-/*------------------------------------------------------------------------*
- *	usbd_req_get_hid_desc
- *
- * This function will read out an USB report descriptor from the USB
- * device.
- *
- * Return values:
- * NULL: Failure.
- * Else: Success. The pointer should eventually be passed to free().
- *------------------------------------------------------------------------*/
-usb_error_t
-usbd_req_get_hid_desc(struct usb_device *udev, struct mtx *mtx,
-    void **descp, uint16_t *sizep,
-    struct malloc_type *mem, uint8_t iface_index)
-{
-	struct usb_interface *iface = usbd_get_iface(udev, iface_index);
-	struct usb_hid_descriptor *hid;
-	usb_error_t err;
-
-	if ((iface == NULL) || (iface->idesc == NULL)) {
-		return (USB_ERR_INVAL);
-	}
-	hid = hid_get_descriptor_from_usb
-	    (usbd_get_config_descriptor(udev), iface->idesc);
-
-	if (hid == NULL) {
-		return (USB_ERR_IOERROR);
-	}
-	*sizep = UGETW(hid->descrs[0].wDescriptorLength);
-	if (*sizep == 0) {
-		return (USB_ERR_IOERROR);
-	}
-	if (mtx)
-		mtx_unlock(mtx);
-
-	*descp = malloc(*sizep, mem, M_ZERO | M_WAITOK);
-
-	if (mtx)
-		mtx_lock(mtx);
-
-	if (*descp == NULL) {
-		return (USB_ERR_NOMEM);
-	}
-	err = usbd_req_get_report_descriptor
-	    (udev, mtx, *descp, *sizep, iface_index);
-
-	if (err) {
-		free(*descp, mem);
-		*descp = NULL;
-		return (err);
-	}
-	return (USB_ERR_NORMAL_COMPLETION);
-}
-
 /*------------------------------------------------------------------------*
  * calculate HID item resolution. unit/mm for distances, unit/rad for angles
  *------------------------------------------------------------------------*/
@@ -1013,3 +928,5 @@ hid_is_keyboard(const void *d_ptr, uint16_t d_len)
 		return (1);
 	return (0);
 }
+
+MODULE_VERSION(hid, 1);
diff --git a/sys/dev/hid/hid.h b/sys/dev/hid/hid.h
index 926c404dca55..b1829318bda1 100644
--- a/sys/dev/hid/hid.h
+++ b/sys/dev/hid/hid.h
@@ -28,38 +28,8 @@
  * SUCH DAMAGE.
  */
 
-#ifndef _USB_HID_H_
-#define	_USB_HID_H_
-
-#ifndef USB_GLOBAL_INCLUDE_FILE
-#include <dev/usb/usb_endian.h>
-#endif
-
-#define	UR_GET_HID_DESCRIPTOR	0x06
-#define	UDESC_HID		0x21
-#define	UDESC_REPORT		0x22
-#define	UDESC_PHYSICAL		0x23
-#define	UR_SET_HID_DESCRIPTOR	0x07
-#define	UR_GET_REPORT		0x01
-#define	UR_SET_REPORT		0x09
-#define	UR_GET_IDLE		0x02
-#define	UR_SET_IDLE		0x0a
-#define	UR_GET_PROTOCOL		0x03
-#define	UR_SET_PROTOCOL		0x0b
-
-struct usb_hid_descriptor {
-	uByte	bLength;
-	uByte	bDescriptorType;
-	uWord	bcdHID;
-	uByte	bCountryCode;
-	uByte	bNumDescriptors;
-	struct {
-		uByte	bDescriptorType;
-		uWord	wDescriptorLength;
-	}	descrs[1];
-} __packed;
-
-#define	USB_HID_DESCRIPTOR_SIZE(n) (9+((n)*3))
+#ifndef _HID_HID_H_
+#define	_HID_HID_H_
 
 /* Usage pages */
 #define	HUP_UNDEFINED		0x0000
@@ -206,7 +176,6 @@ struct usb_hid_descriptor {
 #define	HUM_DEGREE	0x14
 
 #if defined(_KERNEL) || defined(_STANDALONE)
-struct usb_config_descriptor;
 
 #define	HID_ITEM_MAXUSAGE	4
 
@@ -271,14 +240,8 @@ uint32_t hid_get_data_unsigned(const uint8_t *buf, usb_size_t len,
 void hid_put_data_unsigned(uint8_t *buf, usb_size_t len,
 	    struct hid_location *loc, unsigned int value);
 int	hid_is_collection(const void *desc, usb_size_t size, int32_t usage);
-struct usb_hid_descriptor *hid_get_descriptor_from_usb(
-	    struct usb_config_descriptor *cd,
-	    struct usb_interface_descriptor *id);
-usb_error_t usbd_req_get_hid_desc(struct usb_device *udev, struct mtx *mtx,
-	    void **descp, uint16_t *sizep, struct malloc_type *mem,
-	    uint8_t iface_index);
 int32_t	hid_item_resolution(struct hid_item *hi);
 int	hid_is_mouse(const void *d_ptr, uint16_t d_len);
 int	hid_is_keyboard(const void *d_ptr, uint16_t d_len);
 #endif	/* _KERNEL || _STANDALONE */
-#endif	/* _USB_HID_H_ */
+#endif	/* _HID_HID_H_ */
diff --git a/sys/dev/hid/hidrdesc.h b/sys/dev/hid/hidrdesc.h
index 889381e82c15..f6cbb755cd24 100644
--- a/sys/dev/hid/hidrdesc.h
+++ b/sys/dev/hid/hidrdesc.h
@@ -33,7 +33,7 @@
  * This file contains replacements for broken HID report descriptors.
  */
 
-#define	UHID_GRAPHIRE_REPORT_DESCR(...) \
+#define	HID_GRAPHIRE_REPORT_DESCR(...) \
     0x05, 0x0d,                    /*  USAGE_PAGE (Digitizers)		*/\
     0x09, 0x01,                    /*  USAGE (Digitizer)		*/\
     0xa1, 0x01,                    /*  COLLECTION (Application)		*/\
@@ -97,7 +97,7 @@
     0xb1, 0x02,                    /*    FEATURE (Data,Var,Abs)		*/\
     0xc0,                          /*  END_COLLECTION			*/\
 
-#define	UHID_GRAPHIRE3_4X5_REPORT_DESCR(...) \
+#define	HID_GRAPHIRE3_4X5_REPORT_DESCR(...) \
     0x05, 0x01,                    /* USAGE_PAGE (Generic Desktop)	*/\
     0x09, 0x02,                    /* USAGE (Mouse)			*/\
     0xa1, 0x01,                    /* COLLECTION (Application)		*/\
@@ -184,7 +184,7 @@
  * The descriptor has no output report format, thus preventing you from
  * controlling the LEDs and the built-in rumblers.
  */
-#define	UHID_XB360GP_REPORT_DESCR(...) \
+#define	HID_XB360GP_REPORT_DESCR(...) \
     0x05, 0x01,		/* USAGE PAGE (Generic Desktop)		*/\
     0x09, 0x05,		/* USAGE (Gamepad)			*/\
     0xa1, 0x01,		/* COLLECTION (Application)		*/\
@@ -277,7 +277,7 @@
     0xc0		/* END COLLECTION			*/\
 
 /* Fixed report descriptor for Super Nintendo gamepads */
-#define	UHID_SNES_REPORT_DESCR(...) \
+#define	HID_SNES_REPORT_DESCR(...) \
     0x05, 0x01,         /*  Usage Page (Desktop),           */\
     0x09, 0x04,         /*  Usage (Joystik),                */\
     0xA1, 0x01,         /*  Collection (Application),       */\
@@ -304,3 +304,67 @@
     0x81, 0x01,         /*          Input (Constant),       */\
     0xC0,               /*      End Collection,             */\
     0xC0                /*  End Collection                  */
+
+/* HID mouse boot protocol descriptor */
+#define	HID_MOUSE_BOOTPROTO_DESCR(...) \
+    0x05, 0x01,		/* Usage Page (Generic Desktop Ctrls)	*/\
+    0x09, 0x02,		/* Usage (Mouse)			*/\
+    0xA1, 0x01,		/* Collection (Application)		*/\
+    0x09, 0x01,		/*   Usage (Pointer)			*/\
+    0xA1, 0x00,		/*   Collection (Physical)		*/\
+    0x95, 0x03,		/*     Report Count (3)			*/\
+    0x75, 0x01,		/*     Report Size (1)			*/\
+    0x05, 0x09,		/*     Usage Page (Button)		*/\
+    0x19, 0x01,		/*     Usage Minimum (0x01)		*/\
+    0x29, 0x03,		/*     Usage Maximum (0x03)		*/\
+    0x15, 0x00,		/*     Logical Minimum (0)		*/\
+    0x25, 0x01,		/*     Logical Maximum (1)		*/\
+    0x81, 0x02,		/*     Input (Data,Var,Abs)		*/\
+    0x95, 0x01,		/*     Report Count (1)			*/\
+    0x75, 0x05,		/*     Report Size (5)			*/\
+    0x81, 0x03,		/*     Input (Const)			*/\
+    0x75, 0x08,		/*     Report Size (8)			*/\
+    0x95, 0x02,		/*     Report Count (2)			*/\
+    0x05, 0x01,		/*     Usage Page (Generic Desktop Ctrls) */\
+    0x09, 0x30,		/*     Usage (X)			*/\
+    0x09, 0x31,		/*     Usage (Y)			*/\
+    0x15, 0x81,		/*     Logical Minimum (-127)		*/\
+    0x25, 0x7F,		/*     Logical Maximum (127)		*/\
+    0x81, 0x06,		/*     Input (Data,Var,Rel)		*/\
+    0xC0,      		/*   End Collection			*/\
+    0xC0,      		/* End Collection			*/
+
+/* HID keyboard boot protocol descriptor */
+#define	HID_KBD_BOOTPROTO_DESCR(...) \
+    0x05, 0x01,		/* Usage Page (Generic Desktop Ctrls)	*/\
+    0x09, 0x06,		/* Usage (Keyboard)			*/\
+    0xA1, 0x01,		/* Collection (Application)		*/\
+    0x05, 0x07,		/*   Usage Page (Kbrd/Keypad)		*/\
+    0x19, 0xE0,		/*   Usage Minimum (0xE0)		*/\
+    0x29, 0xE7,		/*   Usage Maximum (0xE7)		*/\
+    0x15, 0x00,		/*   Logical Minimum (0)		*/\
+    0x25, 0x01,		/*   Logical Maximum (1)		*/\
+    0x75, 0x01,		/*   Report Size (1)			*/\
+    0x95, 0x08,		/*   Report Count (8)			*/\
+    0x81, 0x02,		/*   Input (Data,Var,Abs)		*/\
+    0x95, 0x01,		/*   Report Count (1)			*/\
+    0x75, 0x08,		/*   Report Size (8)			*/\
+    0x81, 0x01,		/*   Input (Const,Array,Abs)		*/\
+    0x95, 0x03,		/*   Report Count (3)			*/\
+    0x75, 0x01,		/*   Report Size (1)			*/\
+    0x05, 0x08,		/*   Usage Page (LEDs)			*/\
+    0x19, 0x01,		/*   Usage Minimum (Num Lock)		*/\
+    0x29, 0x03,		/*   Usage Maximum (Scroll Lock)	*/\
+    0x91, 0x02,		/*   Output (Data,Var,Abs)		*/\
+    0x95, 0x05,		/*   Report Count (5)			*/\
+    0x75, 0x01,		/*   Report Size (1)			*/\
+    0x91, 0x01,		/*   Output (Const,Array,Abs)		*/\
+    0x95, 0x06,		/*   Report Count (6)			*/\
+    0x75, 0x08,		/*   Report Size (8)			*/\
+    0x15, 0x00,		/*   Logical Minimum (0)		*/\
+    0x26, 0xFF, 0x00,	/*   Logical Maximum (255)		*/\
+    0x05, 0x07,		/*   Usage Page (Kbrd/Keypad)		*/\
+    0x19, 0x00,		/*   Usage Minimum (0x00)		*/\
+    0x2A, 0xFF, 0x00,	/*   Usage Maximum (0xFF)		*/\
+    0x81, 0x00,		/*   Input (Data,Array,Abs)		*/\
+    0xC0,		/* End Collection			*/
diff --git a/sys/dev/sound/usb/uaudio.c b/sys/dev/sound/usb/uaudio.c
index cfad299dc313..126f0494bac2 100644
--- a/sys/dev/sound/usb/uaudio.c
+++ b/sys/dev/sound/usb/uaudio.c
@@ -6210,6 +6210,7 @@ uaudio_hid_detach(struct uaudio_softc *sc)
 DRIVER_MODULE_ORDERED(uaudio, uhub, uaudio_driver, uaudio_devclass, NULL, 0, SI_ORDER_ANY);
 MODULE_DEPEND(uaudio, usb, 1, 1, 1);
 MODULE_DEPEND(uaudio, sound, SOUND_MINVER, SOUND_PREFVER, SOUND_MAXVER);
+MODULE_DEPEND(uaudio, hid, 1, 1, 1);
 MODULE_VERSION(uaudio, 1);
 USB_PNP_HOST_INFO(uaudio_devs);
 USB_PNP_HOST_INFO(uaudio_vendor_midi);
diff --git a/sys/dev/usb/input/atp.c b/sys/dev/usb/input/atp.c
index 4fbdb06dd167..7b9b1eb04c9c 100644
--- a/sys/dev/usb/input/atp.c
+++ b/sys/dev/usb/input/atp.c
@@ -2633,6 +2633,7 @@ static driver_t atp_driver = {
 
 DRIVER_MODULE(atp, uhub, atp_driver, atp_devclass, NULL, 0);
 MODULE_DEPEND(atp, usb, 1, 1, 1);
+MODULE_DEPEND(atp, hid, 1, 1, 1);
 MODULE_VERSION(atp, 1);
 USB_PNP_HOST_INFO(fg_devs);
 USB_PNP_HOST_INFO(wsp_devs);
diff --git a/sys/dev/usb/input/uhid.c b/sys/dev/usb/input/uhid.c
index a8a3bcb2f6c2..97c27608049c 100644
--- a/sys/dev/usb/input/uhid.c
+++ b/sys/dev/usb/input/uhid.c
@@ -907,5 +907,6 @@ static driver_t uhid_driver = {
 
 DRIVER_MODULE(uhid, uhub, uhid_driver, uhid_devclass, NULL, 0);
 MODULE_DEPEND(uhid, usb, 1, 1, 1);
+MODULE_DEPEND(uhid, hid, 1, 1, 1);
 MODULE_VERSION(uhid, 1);
 USB_PNP_HOST_INFO(uhid_devs);
diff --git a/sys/dev/usb/input/ukbd.c b/sys/dev/usb/input/ukbd.c
index 4f27bf95b948..261a4b5aef95 100644
--- a/sys/dev/usb/input/ukbd.c
+++ b/sys/dev/usb/input/ukbd.c
@@ -2185,6 +2185,7 @@ static driver_t ukbd_driver = {
 
 DRIVER_MODULE(ukbd, uhub, ukbd_driver, ukbd_devclass, ukbd_driver_load, 0);
 MODULE_DEPEND(ukbd, usb, 1, 1, 1);
+MODULE_DEPEND(ukbd, hid, 1, 1, 1);
 #ifdef EVDEV_SUPPORT
 MODULE_DEPEND(ukbd, evdev, 1, 1, 1);
 #endif
diff --git a/sys/dev/usb/input/ums.c b/sys/dev/usb/input/ums.c
index 69d177d62bc4..038ed8121df1 100644
--- a/sys/dev/usb/input/ums.c
+++ b/sys/dev/usb/input/ums.c
@@ -1213,6 +1213,7 @@ static driver_t ums_driver = {
 
 DRIVER_MODULE(ums, uhub, ums_driver, ums_devclass, NULL, 0);
 MODULE_DEPEND(ums, usb, 1, 1, 1);
+MODULE_DEPEND(ums, hid, 1, 1, 1);
 #ifdef EVDEV_SUPPORT
 MODULE_DEPEND(ums, evdev, 1, 1, 1);
 #endif
diff --git a/sys/dev/usb/input/usb_rdesc.h b/sys/dev/usb/input/usb_rdesc.h
index 889381e82c15..5dbfdb91f3f2 100644
--- a/sys/dev/usb/input/usb_rdesc.h
+++ b/sys/dev/usb/input/usb_rdesc.h
@@ -1,11 +1,7 @@
 /*-
  * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
  *
- * Copyright (c) 2000 Nick Hibma <n_hibma@FreeBSD.org>
- * All rights reserved.
- *
- * Copyright (c) 2005 Ed Schouten <ed@FreeBSD.org>
- * All rights reserved.
+ * Copyright (c) 2020 Vladimir Kondratyev <wulf@FreeBSD.org>
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -30,277 +26,14 @@
  *
  * $FreeBSD$
  *
- * This file contains replacements for broken HID report descriptors.
+ * This a proxy file for replacements for broken HID report descriptors.
  */
 
-#define	UHID_GRAPHIRE_REPORT_DESCR(...) \
-    0x05, 0x0d,                    /*  USAGE_PAGE (Digitizers)		*/\
-    0x09, 0x01,                    /*  USAGE (Digitizer)		*/\
-    0xa1, 0x01,                    /*  COLLECTION (Application)		*/\
-    0x85, 0x02,                    /*    REPORT_ID (2)			*/\
-    0x05, 0x0d,                    /*    USAGE_PAGE (Digitizers)	*/\
-    0x09, 0x01,                    /*    USAGE (Digitizer)		*/\
-    0xa1, 0x00,                    /*    COLLECTION (Physical)		*/\
-    0x15, 0x00,                    /*      LOGICAL_MINIMUM (0)		*/\
-    0x25, 0x01,                    /*      LOGICAL_MAXIMUM (1)		*/\
-    0x09, 0x33,                    /*      USAGE (Touch)		*/\
-    0x95, 0x01,                    /*      REPORT_COUNT (1)		*/\
-    0x75, 0x01,                    /*      REPORT_SIZE (1)		*/\
-    0x81, 0x02,                    /*      INPUT (Data,Var,Abs)		*/\
-    0x09, 0x44,                    /*      USAGE (Barrel Switch)	*/\
-    0x95, 0x02,                    /*      REPORT_COUNT (2)		*/\
-    0x75, 0x01,                    /*      REPORT_SIZE (1)		*/\
-    0x81, 0x02,                    /*      INPUT (Data,Var,Abs)		*/\
-    0x09, 0x00,                    /*      USAGE (Undefined)		*/\
-    0x95, 0x02,                    /*      REPORT_COUNT (2)		*/\
-    0x75, 0x01,                    /*      REPORT_SIZE (1)		*/\
-    0x81, 0x03,                    /*      INPUT (Cnst,Var,Abs)		*/\
-    0x09, 0x3c,                    /*      USAGE (Invert)		*/\
-    0x95, 0x01,                    /*      REPORT_COUNT (1)		*/\
-    0x75, 0x01,                    /*      REPORT_SIZE (1)		*/\
-    0x81, 0x02,                    /*      INPUT (Data,Var,Abs)		*/\
-    0x09, 0x38,                    /*      USAGE (Transducer Index)	*/\
-    0x95, 0x01,                    /*      REPORT_COUNT (1)		*/\
-    0x75, 0x01,                    /*      REPORT_SIZE (1)		*/\
-    0x81, 0x02,                    /*      INPUT (Data,Var,Abs)		*/\
-    0x09, 0x32,                    /*      USAGE (In Range)		*/\
-    0x95, 0x01,                    /*      REPORT_COUNT (1)		*/\
-    0x75, 0x01,                    /*      REPORT_SIZE (1)		*/\
-    0x81, 0x02,                    /*      INPUT (Data,Var,Abs)		*/\
-    0x05, 0x01,                    /*      USAGE_PAGE (Generic Desktop)	*/\
-    0x09, 0x30,                    /*      USAGE (X)			*/\
-    0x15, 0x00,                    /*      LOGICAL_MINIMUM (0)		*/\
-    0x26, 0xde, 0x27,              /*      LOGICAL_MAXIMUM (10206)	*/\
-    0x95, 0x01,                    /*      REPORT_COUNT (1)		*/\
-    0x75, 0x10,                    /*      REPORT_SIZE (16)		*/\
-    0x81, 0x02,                    /*      INPUT (Data,Var,Abs)		*/\
-    0x09, 0x31,                    /*      USAGE (Y)			*/\
-    0x26, 0xfe, 0x1c,              /*      LOGICAL_MAXIMUM (7422)	*/\
-    0x95, 0x01,                    /*      REPORT_COUNT (1)		*/\
-    0x75, 0x10,                    /*      REPORT_SIZE (16)		*/\
-    0x81, 0x02,                    /*      INPUT (Data,Var,Abs)		*/\
-    0x05, 0x0d,                    /*      USAGE_PAGE (Digitizers)	*/\
-    0x09, 0x30,                    /*      USAGE (Tip Pressure)		*/\
-    0x26, 0xff, 0x01,              /*      LOGICAL_MAXIMUM (511)	*/\
-    0x95, 0x01,                    /*      REPORT_COUNT (1)		*/\
-    0x75, 0x10,                    /*      REPORT_SIZE (16)		*/\
-    0x81, 0x02,                    /*      INPUT (Data,Var,Abs)		*/\
-    0xc0,                          /*    END_COLLECTION			*/\
-    0x05, 0x0d,                    /*    USAGE_PAGE (Digitizers)	*/\
-    0x09, 0x00,                    /*    USAGE (Undefined)		*/\
-    0x85, 0x02,                    /*    REPORT_ID (2)			*/\
-    0x95, 0x01,                    /*    REPORT_COUNT (1)		*/\
-    0xb1, 0x02,                    /*    FEATURE (Data,Var,Abs)		*/\
-    0x09, 0x00,                    /*    USAGE (Undefined)		*/\
-    0x85, 0x03,                    /*    REPORT_ID (3)			*/\
-    0x95, 0x01,                    /*    REPORT_COUNT (1)		*/\
-    0xb1, 0x02,                    /*    FEATURE (Data,Var,Abs)		*/\
-    0xc0,                          /*  END_COLLECTION			*/\
-
-#define	UHID_GRAPHIRE3_4X5_REPORT_DESCR(...) \
-    0x05, 0x01,                    /* USAGE_PAGE (Generic Desktop)	*/\
-    0x09, 0x02,                    /* USAGE (Mouse)			*/\
-    0xa1, 0x01,                    /* COLLECTION (Application)		*/\
-    0x85, 0x01,                    /*   REPORT_ID (1)			*/\
-    0x09, 0x01,                    /*   USAGE (Pointer)			*/\
-    0xa1, 0x00,                    /*   COLLECTION (Physical)		*/\
-    0x05, 0x09,                    /*     USAGE_PAGE (Button)		*/\
-    0x19, 0x01,                    /*     USAGE_MINIMUM (Button 1)	*/\
-    0x29, 0x03,                    /*     USAGE_MAXIMUM (Button 3)	*/\
-    0x15, 0x00,                    /*     LOGICAL_MINIMUM (0)		*/\
-    0x25, 0x01,                    /*     LOGICAL_MAXIMUM (1)		*/\
-    0x95, 0x03,                    /*     REPORT_COUNT (3)		*/\
-    0x75, 0x01,                    /*     REPORT_SIZE (1)		*/\
-    0x81, 0x02,                    /*     INPUT (Data,Var,Abs)		*/\
-    0x95, 0x01,                    /*     REPORT_COUNT (1)		*/\
-    0x75, 0x05,                    /*     REPORT_SIZE (5)		*/\
-    0x81, 0x01,                    /*     INPUT (Cnst,Ary,Abs)		*/\
-    0x05, 0x01,                    /*     USAGE_PAGE (Generic Desktop)	*/\
-    0x09, 0x30,                    /*     USAGE (X)			*/\
-    0x09, 0x31,                    /*     USAGE (Y)			*/\
-    0x09, 0x38,                    /*     USAGE (Wheel)			*/\
-    0x15, 0x81,                    /*     LOGICAL_MINIMUM (-127)	*/\
-    0x25, 0x7f,                    /*     LOGICAL_MAXIMUM (127)		*/\
-    0x75, 0x08,                    /*     REPORT_SIZE (8)		*/\
-    0x95, 0x03,                    /*     REPORT_COUNT (3)		*/\
-    0x81, 0x06,                    /*     INPUT (Data,Var,Rel)		*/\
-    0xc0,                          /*   END_COLLECTION			*/\
-    0xc0,                          /* END_COLLECTION			*/\
-    0x05, 0x0d,                    /* USAGE_PAGE (Digitizers)		*/\
-    0x09, 0x01,                    /* USAGE (Pointer)			*/\
-    0xa1, 0x01,                    /* COLLECTION (Applicaption)		*/\
-    0x85, 0x02,                    /*   REPORT_ID (2)			*/\
-    0x05, 0x0d,                    /*   USAGE_PAGE (Digitizers)		*/\
-    0x09, 0x01,                    /*   USAGE (Digitizer)		*/\
-    0xa1, 0x00,                    /*   COLLECTION (Physical)		*/\
-    0x09, 0x33,                    /*     USAGE (Touch)			*/\
-    0x09, 0x44,                    /*     USAGE (Barrel Switch)		*/\
-    0x09, 0x44,                    /*     USAGE (Barrel Switch)		*/\
-    0x15, 0x00,                    /*     LOGICAL_MINIMUM (0)		*/\
-    0x25, 0x01,                    /*     LOGICAL_MAXIMUM (1)		*/\
-    0x75, 0x01,                    /*     REPORT_SIZE (1)		*/\
-    0x95, 0x03,                    /*     REPORT_COUNT (3)		*/\
-    0x81, 0x02,                    /*     INPUT (Data,Var,Abs)		*/\
-    0x75, 0x01,                    /*     REPORT_SIZE (1)		*/\
-    0x95, 0x02,                    /*     REPORT_COUNT (2)		*/\
-    0x81, 0x01,                    /*     INPUT (Cnst,Ary,Abs)		*/\
-    0x09, 0x3c,                    /*     USAGE (Invert)		*/\
-    0x09, 0x38,                    /*     USAGE (Transducer Index)	*/\
-    0x09, 0x32,                    /*     USAGE (In Range)		*/\
-    0x75, 0x01,                    /*     REPORT_SIZE (1)		*/\
-    0x95, 0x03,                    /*     REPORT_COUNT (3)		*/\
-    0x81, 0x02,                    /*     INPUT (Data,Var,Abs)		*/\
-    0x05, 0x01,                    /*     USAGE_PAGE (Generic Desktop)	*/\
-    0x09, 0x30,                    /*     USAGE (X)			*/\
-    0x15, 0x00,                    /*     LOGICAL_MINIMUM (0)		*/\
-    0x26, 0xde, 0x27,              /*     LOGICAL_MAXIMUM (10206)	*/\
-    0x75, 0x10,                    /*     REPORT_SIZE (16)		*/\
-    0x95, 0x01,                    /*     REPORT_COUNT (1)		*/\
-    0x81, 0x02,                    /*     INPUT (Data,Var,Abs)		*/\
-    0x09, 0x31,                    /*     USAGE (Y)			*/\
-    0x26, 0xfe, 0x1c,              /*     LOGICAL_MAXIMUM (7422)	*/\
-    0x75, 0x10,                    /*     REPORT_SIZE (16)		*/\
-    0x95, 0x01,                    /*     REPORT_COUNT (1)		*/\
-    0x81, 0x02,                    /*     INPUT (Data,Var,Abs)		*/\
-    0x05, 0x0d,                    /*     USAGE_PAGE (Digitizers)	*/\
-    0x09, 0x30,                    /*     USAGE (Tip Pressure)		*/\
-    0x26, 0xff, 0x01,              /*     LOGICAL_MAXIMUM (511)		*/\
-    0x75, 0x10,                    /*     REPORT_SIZE (16)		*/\
-    0x95, 0x01,                    /*     REPORT_COUNT (1)		*/\
-    0x81, 0x02,                    /*     INPUT (Data,Var,Abs)		*/\
-    0xc0,                          /*   END_COLLECTION			*/\
-    0x05, 0x0d,                    /*   USAGE_PAGE (Digitizers)		*/\
-    0x09, 0x00,                    /*   USAGE (Undefined)		*/\
-    0x85, 0x02,                    /*   REPORT_ID (2)			*/\
-    0x95, 0x01,                    /*   REPORT_COUNT (1)		*/\
-    0xb1, 0x02,                    /*   FEATURE (Data,Var,Abs)		*/\
-    0x09, 0x00,                    /*   USAGE (Undefined)		*/\
-    0x85, 0x03,                    /*   REPORT_ID (3)			*/\
-    0x95, 0x01,                    /*   REPORT_COUNT (1)		*/\
-    0xb1, 0x02,                    /*   FEATURE (Data,Var,Abs)		*/\
-    0xc0                           /* END_COLLECTION			*/\
-
-/*
- * The descriptor has no output report format, thus preventing you from
- * controlling the LEDs and the built-in rumblers.
- */
-#define	UHID_XB360GP_REPORT_DESCR(...) \
-    0x05, 0x01,		/* USAGE PAGE (Generic Desktop)		*/\
-    0x09, 0x05,		/* USAGE (Gamepad)			*/\
-    0xa1, 0x01,		/* COLLECTION (Application)		*/\
-    /* Unused */\
-    0x75, 0x08,		/*  REPORT SIZE (8)			*/\
-    0x95, 0x01,		/*  REPORT COUNT (1)			*/\
-    0x81, 0x01,		/*  INPUT (Constant)			*/\
-    /* Byte count */\
-    0x75, 0x08,		/*  REPORT SIZE (8)			*/\
-    0x95, 0x01,		/*  REPORT COUNT (1)			*/\
-    0x05, 0x01,		/*  USAGE PAGE (Generic Desktop)	*/\
-    0x09, 0x3b,		/*  USAGE (Byte Count)			*/\
-    0x81, 0x01,		/*  INPUT (Constant)			*/\
-    /* D-Pad */\
-    0x05, 0x01,		/*  USAGE PAGE (Generic Desktop)	*/\
-    0x09, 0x01,		/*  USAGE (Pointer)			*/\
-    0xa1, 0x00,		/*  COLLECTION (Physical)		*/\
-    0x75, 0x01,		/*   REPORT SIZE (1)			*/\
-    0x15, 0x00,		/*   LOGICAL MINIMUM (0)		*/\
-    0x25, 0x01,		/*   LOGICAL MAXIMUM (1)		*/\
-    0x35, 0x00,		/*   PHYSICAL MINIMUM (0)		*/\
-    0x45, 0x01,		/*   PHYSICAL MAXIMUM (1)		*/\
-    0x95, 0x04,		/*   REPORT COUNT (4)			*/\
-    0x05, 0x01,		/*   USAGE PAGE (Generic Desktop)	*/\
-    0x09, 0x90,		/*   USAGE (D-Pad Up)			*/\
-    0x09, 0x91,		/*   USAGE (D-Pad Down)			*/\
-    0x09, 0x93,		/*   USAGE (D-Pad Left)			*/\
-    0x09, 0x92,		/*   USAGE (D-Pad Right)		*/\
-    0x81, 0x02,		/*   INPUT (Data, Variable, Absolute)	*/\
-    0xc0,		/*  END COLLECTION			*/\
-    /* Buttons 5-11 */\
-    0x75, 0x01,		/*  REPORT SIZE (1)			*/\
-    0x15, 0x00,		/*  LOGICAL MINIMUM (0)			*/\
-    0x25, 0x01,		/*  LOGICAL MAXIMUM (1)			*/\
-    0x35, 0x00,		/*  PHYSICAL MINIMUM (0)		*/\
-    0x45, 0x01,		/*  PHYSICAL MAXIMUM (1)		*/\
-    0x95, 0x07,		/*  REPORT COUNT (7)			*/\
-    0x05, 0x09,		/*  USAGE PAGE (Button)			*/\
-    0x09, 0x08,		/*  USAGE (Button 8)			*/\
-    0x09, 0x07,		/*  USAGE (Button 7)			*/\
-    0x09, 0x09,		/*  USAGE (Button 9)			*/\
-    0x09, 0x0a,		/*  USAGE (Button 10)			*/\
-    0x09, 0x05,		/*  USAGE (Button 5)			*/\
-    0x09, 0x06,		/*  USAGE (Button 6)			*/\
-    0x09, 0x0b,		/*  USAGE (Button 11)			*/\
-    0x81, 0x02,		/*  INPUT (Data, Variable, Absolute)	*/\
-    /* Unused */\
-    0x75, 0x01,		/*  REPORT SIZE (1)			*/\
-    0x95, 0x01,		/*  REPORT COUNT (1)			*/\
-    0x81, 0x01,		/*  INPUT (Constant)			*/\
-    /* Buttons 1-4 */\
-    0x75, 0x01,		/*  REPORT SIZE (1)			*/\
-    0x15, 0x00,		/*  LOGICAL MINIMUM (0)			*/\
-    0x25, 0x01,		/*  LOGICAL MAXIMUM (1)			*/\
-    0x35, 0x00,		/*  PHYSICAL MINIMUM (0)		*/\
-    0x45, 0x01,		/*  PHYSICAL MAXIMUM (1)		*/\
-    0x95, 0x04,		/*  REPORT COUNT (4)			*/\
-    0x05, 0x09,		/*  USAGE PAGE (Button)			*/\
-    0x19, 0x01,		/*  USAGE MINIMUM (Button 1)		*/\
-    0x29, 0x04,		/*  USAGE MAXIMUM (Button 4)		*/\
-    0x81, 0x02,		/*  INPUT (Data, Variable, Absolute)	*/\
-    /* Triggers */\
-    0x75, 0x08,		/*  REPORT SIZE (8)			*/\
-    0x15, 0x00,		/*  LOGICAL MINIMUM (0)			*/\
-    0x26, 0xff, 0x00,	/*  LOGICAL MAXIMUM (255)		*/\
-    0x35, 0x00,		/*  PHYSICAL MINIMUM (0)		*/\
-    0x46, 0xff, 0x00,	/*  PHYSICAL MAXIMUM (255)		*/\
-    0x95, 0x02,		/*  REPORT SIZE (2)			*/\
-    0x05, 0x01,		/*  USAGE PAGE (Generic Desktop)	*/\
-    0x09, 0x32,		/*  USAGE (Z)				*/\
-    0x09, 0x35,		/*  USAGE (Rz)				*/\
-    0x81, 0x02,		/*  INPUT (Data, Variable, Absolute)	*/\
-    /* Sticks */\
-    0x75, 0x10,		/*  REPORT SIZE (16)			*/\
-    0x16, 0x00, 0x80,	/*  LOGICAL MINIMUM (-32768)		*/\
-    0x26, 0xff, 0x7f,	/*  LOGICAL MAXIMUM (32767)		*/\
-    0x36, 0x00, 0x80,	/*  PHYSICAL MINIMUM (-32768)		*/\
-    0x46, 0xff, 0x7f,	/*  PHYSICAL MAXIMUM (32767)		*/\
-    0x95, 0x04,		/*  REPORT COUNT (4)			*/\
-    0x05, 0x01,		/*  USAGE PAGE (Generic Desktop)	*/\
-    0x09, 0x30,		/*  USAGE (X)				*/\
-    0x09, 0x31,		/*  USAGE (Y)				*/\
-    0x09, 0x33,		/*  USAGE (Rx)				*/\
-    0x09, 0x34,		/*  USAGE (Ry)				*/\
-    0x81, 0x02,		/*  INPUT (Data, Variable, Absolute)	*/\
-    /* Unused */\
-    0x75, 0x30,		/*  REPORT SIZE (48)			*/\
-    0x95, 0x01,		/*  REPORT COUNT (1)			*/\
-    0x81, 0x01,		/*  INPUT (Constant)			*/\
-    0xc0		/* END COLLECTION			*/\
+#include <dev/hid/hidrdesc.h>
 
-/* Fixed report descriptor for Super Nintendo gamepads */
-#define	UHID_SNES_REPORT_DESCR(...) \
-    0x05, 0x01,         /*  Usage Page (Desktop),           */\
-    0x09, 0x04,         /*  Usage (Joystik),                */\
-    0xA1, 0x01,         /*  Collection (Application),       */\
-    0xA1, 0x02,         /*      Collection (Logical),       */\
-    0x14,               /*          Logical Minimum (0),    */\
-    0x75, 0x08,         /*          Report Size (8),        */\
-    0x95, 0x03,         /*          Report Count (3),       */\
-    0x81, 0x01,         /*          Input (Constant),       */\
-    0x26, 0xFF, 0x00,   /*          Logical Maximum (255),  */\
-    0x95, 0x02,         /*          Report Count (2),       */\
-    0x09, 0x30,         /*          Usage (X),              */\
-    0x09, 0x31,         /*          Usage (Y),              */\
-    0x81, 0x02,         /*          Input (Variable),       */\
-    0x75, 0x01,         /*          Report Size (1),        */\
-    0x95, 0x04,         /*          Report Count (4),       */\
-    0x81, 0x01,         /*          Input (Constant),       */\
-    0x25, 0x01,         /*          Logical Maximum (1),    */\
-    0x95, 0x0A,         /*          Report Count (10),      */\
*** 1323 LINES SKIPPED ***



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202101072320.107NKpWA063323>