Date: Sat, 9 Jan 2021 22:39:44 -0800 From: Ryan Libby <rlibby@freebsd.org> To: Vladimir Kondratyev <wulf@freebsd.org> Cc: src-committers <src-committers@freebsd.org>, dev-commits-src-all@freebsd.org, dev-commits-src-main@freebsd.org Subject: Re: git: afd590d9e566 - main - hid: Import hidmap and bunch of drivers based on it Message-ID: <CAHgpiFx0%2B9tOHjPv9yUbzNQdywxxUm3=FkqK3HBEnWJaOCVQxA@mail.gmail.com> In-Reply-To: <202101072320.107NKosW063030@gitrepo.freebsd.org> References: <202101072320.107NKosW063030@gitrepo.freebsd.org>
next in thread | previous in thread | raw e-mail | index | archive | help
On Thu, Jan 7, 2021 at 3:21 PM Vladimir Kondratyev <wulf@freebsd.org> wrote: > > The branch main has been updated by wulf: > > URL: https://cgit.FreeBSD.org/src/commit/?id=afd590d9e56686e179cbbf626ec567aeaaa49199 > > commit afd590d9e56686e179cbbf626ec567aeaaa49199 > Author: Vladimir Kondratyev <wulf@FreeBSD.org> > AuthorDate: 2020-10-14 22:02:15 +0000 > Commit: Vladimir Kondratyev <wulf@FreeBSD.org> > CommitDate: 2021-01-07 23:18:44 +0000 > > hid: Import hidmap and bunch of drivers based on it > > hidmap is a kernel module that maps HID input usages to evdev events. > > Following dependent drivers is included in the commit: > > hms - HID mouse driver. > hcons - Consumer page AKA Multimedia keys driver. > hsctrl - System Controls page (Power/Sleep keys) driver. > ps4dshock - Sony DualShock 4 gamepad driver. > > Reviewed by: hselasky > Differential revision: https://reviews.freebsd.org/D27993 > --- > share/man/man4/Makefile | 4 + > share/man/man4/hcons.4 | 98 +++ > share/man/man4/hms.4 | 115 +++ > share/man/man4/hsctrl.4 | 98 +++ > share/man/man4/ps4dshock.4 | 109 +++ > sys/conf/files | 5 + > sys/dev/hid/hcons.c | 295 ++++++++ > sys/dev/hid/hidmap.c | 832 +++++++++++++++++++++ > sys/dev/hid/hidmap.h | 262 +++++++ > sys/dev/hid/hms.c | 267 +++++++ > sys/dev/hid/hsctrl.c | 110 +++ > sys/dev/hid/ps4dshock.c | 1406 ++++++++++++++++++++++++++++++++++++ > sys/modules/hid/Makefile | 7 +- > sys/modules/hid/hcons/Makefile | 9 + > sys/modules/hid/hidmap/Makefile | 9 + > sys/modules/hid/hms/Makefile | 9 + > sys/modules/hid/hsctrl/Makefile | 9 + > sys/modules/hid/ps4dshock/Makefile | 9 + > 18 files changed, 3652 insertions(+), 1 deletion(-) > > diff --git a/share/man/man4/Makefile b/share/man/man4/Makefile > index 02d1bca75a3f..60c1b5f19a9b 100644 > --- a/share/man/man4/Makefile > +++ b/share/man/man4/Makefile > @@ -180,11 +180,13 @@ MAN= aac.4 \ > gre.4 \ > h_ertt.4 \ > hconf.4 \ > + hcons.4 \ > hidbus.4 \ > hidquirk.4 \ > hidraw.4 \ > hifn.4 \ > hkbd.4 \ > + hms.4 \ > hmt.4 \ > hpet.4 \ > ${_hpt27xx.4} \ > @@ -192,6 +194,7 @@ MAN= aac.4 \ > ${_hptmv.4} \ > ${_hptnr.4} \ > ${_hptrr.4} \ > + hsctrl.4 \ > ${_hv_kvp.4} \ > ${_hv_netvsc.4} \ > ${_hv_storvsc.4} \ > @@ -432,6 +435,7 @@ MAN= aac.4 \ > ppi.4 \ > procdesc.4 \ > proto.4 \ > + ps4dshock.4 \ > psm.4 \ > pst.4 \ > pt.4 \ > diff --git a/share/man/man4/hcons.4 b/share/man/man4/hcons.4 > new file mode 100644 > index 000000000000..a8fe22983453 > --- /dev/null > +++ b/share/man/man4/hcons.4 > @@ -0,0 +1,98 @@ > +.\" 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 > +.\" are met: > +.\" 1. Redistributions of source code must retain the above copyright > +.\" notice, this list of conditions and the following disclaimer. > +.\" 2. Redistributions in binary form must reproduce the above copyright > +.\" notice, this list of conditions and the following disclaimer in the > +.\" documentation and/or other materials provided with the distribution. > +.\" > +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND > +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE > +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE > +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE > +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL > +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS > +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) > +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT > +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY > +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF > +.\" SUCH DAMAGE. > +.\" > +.\" $FreeBSD$ > +.\" > +.Dd September 14, 2020 > +.Dt HCONS 4 > +.Os > +.Sh NAME > +.Nm hcons > +.Nd HID consumer page controls driver > +.Sh SYNOPSIS > +To compile this driver into the kernel, > +place the following lines in your > +kernel configuration file: > +.Bd -ragged -offset indent > +.Cd "device hcons" > +.Cd "device hid" > +.Cd "device hidbus" > +.Cd "device hidmap" > +.Cd "device evdev" > +.Ed > +.Pp > +Alternatively, to load the driver as a > +module at boot time, place the following line in > +.Xr loader.conf 5 : > +.Bd -literal -offset indent > +hgame_load="YES" > +.Ed > +.Sh DESCRIPTION > +The > +.Nm > +driver provides support for HID consumer page controls most often used as > +"Multimedia keys" found on many keyboards. > +.Pp > +The > +.Pa /dev/input/event* > +device presents the consumer page controls as a > +.Ar evdev > +type device. > +.Sh SYSCTL VARIABLES > +The following variable is available as both > +.Xr sysctl 8 > +variable and > +.Xr loader 8 > +tunable: > +.Bl -tag -width indent > +.It Va dev.hcons.X.debug > +Debug output level, where 0 is debugging disabled and larger values increase > +debug message verbosity. > +Default is 0. > +.El > +.Pp > +It default value is set with > +.Xr loader 8 > +tunable: > +.Bl -tag -width indent > +.It Va hw.hid.hcons.debug > +.El > +.Sh FILES > +.Bl -tag -width /dev/input/event* -compact > +.It Pa /dev/input/event* > +input event device node. > +.El > +.Sh SEE ALSO > +.Xr iichid 4 , > +.Xr usbhid 4 > +.Sh HISTORY > +The > +.Nm > +driver first appeared in > +.Fx 13.0. > +.Sh AUTHORS > +.An -nosplit > +The > +.Nm > +driver was written by > +.An Vladimir Kondratyev Aq Mt wulf@FreeBSD.org . > diff --git a/share/man/man4/hms.4 b/share/man/man4/hms.4 > new file mode 100644 > index 000000000000..eb413e943976 > --- /dev/null > +++ b/share/man/man4/hms.4 > @@ -0,0 +1,115 @@ > +.\" Copyright (c) > +.\" 1999 Nick Hibma <n_hibma@FreeBSD.org>. All rights reserved. > +.\" 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 > +.\" are met: > +.\" 1. Redistributions of source code must retain the above copyright > +.\" notice, this list of conditions and the following disclaimer. > +.\" 2. Redistributions in binary form must reproduce the above copyright > +.\" notice, this list of conditions and the following disclaimer in the > +.\" documentation and/or other materials provided with the distribution. > +.\" > +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND > +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE > +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE > +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE > +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL > +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS > +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) > +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT > +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY > +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF > +.\" SUCH DAMAGE. > +.\" > +.\" $FreeBSD$ > +.\" > +.Dd September 12, 2020 > +.Dt HMS 4 > +.Os > +.Sh NAME > +.Nm hms > +.Nd HID mouse driver > +.Sh SYNOPSIS > +To compile this driver into the kernel, > +place the following lines in your > +kernel configuration file: > +.Bd -ragged -offset indent > +.Cd "device hms" > +.Cd "device hidbus" > +.Cd "device hid" > +.Cd "device evdev" > +.Ed > +.Pp > +Alternatively, to load the driver as a > +module at boot time, place the following line in > +.Xr loader.conf 5 : > +.Bd -literal -offset indent > +hms_load="YES" > +.Ed > +.Sh DESCRIPTION > +The > +.Nm > +driver provides support for HID mice that attach to the HID transport > +backend. > +See > +.Xr iichid 4 > +or > +.Xr usbhid 4 . > +Supported are > +mice with any number of buttons, mice with a wheel and absolute mice. > +.Pp > +The > +.Pa /dev/input/eventX > +device presents the mouse as a > +.Ar evdev > +type device. > +.Sh SYSCTL VARIABLES > +The following variable is available as both > +.Xr sysctl 8 > +variable and > +.Xr loader 8 > +tunable: > +.Bl -tag -width indent > +.It Va dev.hms.X.debug > +Debug output level, where 0 is debugging disabled and larger values increase > +debug message verbosity. > +Default is 0. > +.El > +.Pp > +It default value is derived from > +.Xr loader 8 > +tunable: > +.Bl -tag -width indent > +.It Va hw.hid.hms.debug > +.El > +.Sh FILES > +.Bl -tag -width /dev/input/eventX -compact > +.It Pa /dev/input/eventX > +input event device node. > +.El > +.Sh SEE ALSO > +.Xr iichid 4 , > +.Xr usbhid 4 , > +.Xr xorg.conf 5 Pq Pa ports/x11/xorg > +.\.Xr moused 8 > +.Sh BUGS > +.Nm > +cannot act like > +.Xr sysmouse 4 > +.Sh AUTHORS > +.An -nosplit > +The > +.Nm > +driver was written by > +.An Vladimir Kondratyev Aq Mt wulf@FreeBSD.org . > +.Pp > +This manual page was originally written by > +.An Nick Hibma Aq Mt n_hibma@FreeBSD.org > +for > +.Xr umt 4 > +driver and was adopted for > +.Nm > +by > +.An Vladimir Kondratyev Aq Mt wulf@FreeBSD.org . > diff --git a/share/man/man4/hsctrl.4 b/share/man/man4/hsctrl.4 > new file mode 100644 > index 000000000000..ba7976c3c03d > --- /dev/null > +++ b/share/man/man4/hsctrl.4 > @@ -0,0 +1,98 @@ > +.\" 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 > +.\" are met: > +.\" 1. Redistributions of source code must retain the above copyright > +.\" notice, this list of conditions and the following disclaimer. > +.\" 2. Redistributions in binary form must reproduce the above copyright > +.\" notice, this list of conditions and the following disclaimer in the > +.\" documentation and/or other materials provided with the distribution. > +.\" > +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND > +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE > +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE > +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE > +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL > +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS > +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) > +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT > +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY > +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF > +.\" SUCH DAMAGE. > +.\" > +.\" $FreeBSD$ > +.\" > +.Dd September 14, 2020 > +.Dt HSCTRL 4 > +.Os > +.Sh NAME > +.Nm hsctrl > +.Nd HID system controls driver > +.Sh SYNOPSIS > +To compile this driver into the kernel, > +place the following lines in your > +kernel configuration file: > +.Bd -ragged -offset indent > +.Cd "device hsctrl" > +.Cd "device hid" > +.Cd "device hidbus" > +.Cd "device hidmap" > +.Cd "device evdev" > +.Ed > +.Pp > +Alternatively, to load the driver as a > +module at boot time, place the following line in > +.Xr loader.conf 5 : > +.Bd -literal -offset indent > +hgame_load="YES" > +.Ed > +.Sh DESCRIPTION > +The > +.Nm > +driver provides support for HID system controls most often used as > +"Power off/Sleep keys" found on many keyboards. > +.Pp > +The > +.Pa /dev/input/event* > +device presents the consumer page controls as a > +.Ar evdev > +type device. > +.Sh SYSCTL VARIABLES > +The following variable is available as both > +.Xr sysctl 8 > +variable and > +.Xr loader 8 > +tunable: > +.Bl -tag -width indent > +.It Va dev.hsctrl.X.debug > +Debug output level, where 0 is debugging disabled and larger values increase > +debug message verbosity. > +Default is 0. > +.El > +.Pp > +It default value is set with > +.Xr loader 8 > +tunable: > +.Bl -tag -width indent > +.It Va hw.hid.hsctrl.debug > +.El > +.Sh FILES > +.Bl -tag -width /dev/input/event* -compact > +.It Pa /dev/input/event* > +input event device node. > +.El > +.Sh SEE ALSO > +.Xr iichid 4 , > +.Xr usbhid 4 > +.Sh HISTORY > +The > +.Nm > +driver first appeared in > +.Fx 13.0. > +.Sh AUTHORS > +.An -nosplit > +The > +.Nm > +driver was written by > +.An Vladimir Kondratyev Aq Mt wulf@FreeBSD.org . > diff --git a/share/man/man4/ps4dshock.4 b/share/man/man4/ps4dshock.4 > new file mode 100644 > index 000000000000..e2295533989f > --- /dev/null > +++ b/share/man/man4/ps4dshock.4 > @@ -0,0 +1,109 @@ > +.\" 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 > +.\" are met: > +.\" 1. Redistributions of source code must retain the above copyright > +.\" notice, this list of conditions and the following disclaimer. > +.\" 2. Redistributions in binary form must reproduce the above copyright > +.\" notice, this list of conditions and the following disclaimer in the > +.\" documentation and/or other materials provided with the distribution. > +.\" > +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND > +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE > +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE > +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE > +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL > +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS > +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) > +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT > +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY > +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF > +.\" SUCH DAMAGE. > +.\" > +.\" $FreeBSD$ > +.\" > +.Dd September 19, 2020 > +.Dt PS4DSHOCK 4 > +.Os > +.Sh NAME > +.Nm ps4dshock > +.Nd Sony PlayStation 4 Dualshock 4 gamepad driver > +.Sh SYNOPSIS > +To compile this driver into the kernel, > +place the following lines in your > +kernel configuration file: > +.Bd -ragged -offset indent > +.Cd "device ps4dshock" > +.Cd "device hid" > +.Cd "device hidbus" > +.Cd "device hidmap" > +.Cd "device evdev" > +.Ed > +.Pp > +Alternatively, to load the driver as a > +module at boot time, place the following line in > +.Xr loader.conf 5 : > +.Bd -literal -offset indent > +ps4dshock_load="YES" > +.Ed > +.Sh DESCRIPTION > +The > +.Nm > +driver provides support for Sony PlayStation 4 Dualshock 4 gamepad driver. > +.Pp > +The > +.Pa /dev/input/event* > +device presents the game controller as a > +.Ar evdev > +type device. > +.Sh SYSCTL VARIABLES > +Next parameters are available as > +.Xr sysctl 8 > +variables. > +Debug parameter is available as > +.Xr loader 8 > +tunable as well. > +.Bl -tag -width indent > +.It Va dev.p4dshock.*.led_state > +LED state: 0 - off, 1 - on, 2 - blinking. > +.It Va dev.p4dshock.*.led_color_r > +LED color. > +Red component. > +.It Va dev.p4dshock.*.led_color_g > +LED color. > +Green component. > +.It Va dev.p4dshock.*.led_color_b > +LED color. > +Blue component. > +.It Va dev.p4dshock.*.led_delay_on > +LED blink. > +On delay, msecs. > +.It Va dev.p4dshock.*.led_delay_off > +LED blink. > +Off delay, msecs. > +.It Va hw.hid.ps4dshock.debug > +Debug output level, where 0 is debugging disabled and larger values increase > +debug message verbosity. > +Default is 0. > +.El > +.Sh FILES > +.Bl -tag -width /dev/input/event* -compact > +.It Pa /dev/input/event* > +input event device node. > +.El > +.Sh BUGS > +The > +.Nm > +does not support force-feedback events. > +.Sh HISTORY > +The > +.Nm > +driver first appeared in > +.Fx 13.0. > +.Sh AUTHORS > +.An -nosplit > +The > +.Nm > +driver was written by > +.An Vladimir Kondratyev Aq Mt wulf@FreeBSD.org . > diff --git a/sys/conf/files b/sys/conf/files > index cea809deb039..31a06150a329 100644 > --- a/sys/conf/files > +++ b/sys/conf/files > @@ -1816,13 +1816,18 @@ dev/gpio/gpiobus_if.m optional gpio > dev/gpio/gpiopps.c optional gpiopps fdt > dev/gpio/ofw_gpiobus.c optional fdt gpio > dev/hid/hconf.c optional hconf > +dev/hid/hcons.c optional hcons > dev/hid/hid.c optional hid > dev/hid/hid_if.m optional hid > dev/hid/hidbus.c optional hidbus > +dev/hid/hidmap.c optional hidmap > dev/hid/hidquirk.c optional hid > dev/hid/hidraw.c optional hidraw > dev/hid/hkbd.c optional hkbd > +dev/hid/hms.c optional hms > dev/hid/hmt.c optional hmt hconf > +dev/hid/hsctrl.c optional hsctrl > +dev/hid/ps4dshock.c optional ps4dshock > 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/hcons.c b/sys/dev/hid/hcons.c > new file mode 100644 > index 000000000000..559e84d468f3 > --- /dev/null > +++ b/sys/dev/hid/hcons.c > @@ -0,0 +1,295 @@ > +/*- > + * SPDX-License-Identifier: BSD-2-Clause-FreeBSD > + * > + * 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 > + * are met: > + * 1. Redistributions of source code must retain the above copyright > + * notice, this list of conditions and the following disclaimer. > + * 2. Redistributions in binary form must reproduce the above copyright > + * notice, this list of conditions and the following disclaimer in the > + * documentation and/or other materials provided with the distribution. > + * > + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND > + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE > + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE > + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE > + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL > + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS > + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) > + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT > + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY > + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF > + * SUCH DAMAGE. > + */ > + > +#include <sys/cdefs.h> > +__FBSDID("$FreeBSD$"); > + > +/* > + * Consumer Controls usage page driver > + * https://www.usb.org/sites/default/files/documents/hut1_12v2.pdf > + */ > + > +#include <sys/param.h> > +#include <sys/bitstring.h> > +#include <sys/bus.h> > +#include <sys/kernel.h> > +#include <sys/module.h> > +#include <sys/sysctl.h> > + > +#include <dev/evdev/input.h> > +#include <dev/evdev/evdev.h> > + > +#include <dev/hid/hid.h> > +#include <dev/hid/hidbus.h> > +#include <dev/hid/hidmap.h> > + > +static hidmap_cb_t hcons_rel_volume_cb; > + > +#define HCONS_MAP_KEY(usage, code) \ > + { HIDMAP_KEY(HUP_CONSUMER, usage, code) } > +#define HCONS_MAP_ABS(usage, code) \ > + { HIDMAP_ABS(HUP_CONSUMER, usage, code) } > +#define HCONS_MAP_REL(usage, code) \ > + { HIDMAP_REL(HUP_CONSUMER, usage, code) } > +#define HCONS_MAP_REL_CB(usage, callback) \ > + { HIDMAP_REL_CB(HUP_CONSUMER, usage, &callback) } > + > +static const struct hidmap_item hcons_map[] = { > + HCONS_MAP_KEY(0x030, KEY_POWER), > + HCONS_MAP_KEY(0x031, KEY_RESTART), > + HCONS_MAP_KEY(0x032, KEY_SLEEP), > + HCONS_MAP_KEY(0x034, KEY_SLEEP), > + HCONS_MAP_KEY(0x035, KEY_KBDILLUMTOGGLE), > + HCONS_MAP_KEY(0x036, BTN_MISC), > + HCONS_MAP_KEY(0x040, KEY_MENU), /* Menu */ > + HCONS_MAP_KEY(0x041, KEY_SELECT), /* Menu Pick */ > + HCONS_MAP_KEY(0x042, KEY_UP), /* Menu Up */ > + HCONS_MAP_KEY(0x043, KEY_DOWN), /* Menu Down */ > + HCONS_MAP_KEY(0x044, KEY_LEFT), /* Menu Left */ > + HCONS_MAP_KEY(0x045, KEY_RIGHT), /* Menu Right */ > + HCONS_MAP_KEY(0x046, KEY_ESC), /* Menu Escape */ > + HCONS_MAP_KEY(0x047, KEY_KPPLUS), /* Menu Value Increase */ > + HCONS_MAP_KEY(0x048, KEY_KPMINUS), /* Menu Value Decrease */ > + HCONS_MAP_KEY(0x060, KEY_INFO), /* Data On Screen */ > + HCONS_MAP_KEY(0x061, KEY_SUBTITLE), /* Closed Caption */ > + HCONS_MAP_KEY(0x063, KEY_VCR), /* VCR/TV */ > + HCONS_MAP_KEY(0x065, KEY_CAMERA), /* Snapshot */ > + HCONS_MAP_KEY(0x069, KEY_RED), > + HCONS_MAP_KEY(0x06a, KEY_GREEN), > + HCONS_MAP_KEY(0x06b, KEY_BLUE), > + HCONS_MAP_KEY(0x06c, KEY_YELLOW), > + HCONS_MAP_KEY(0x06d, KEY_ASPECT_RATIO), > + HCONS_MAP_KEY(0x06f, KEY_BRIGHTNESSUP), > + HCONS_MAP_KEY(0x070, KEY_BRIGHTNESSDOWN), > + HCONS_MAP_KEY(0x072, KEY_BRIGHTNESS_TOGGLE), > + HCONS_MAP_KEY(0x073, KEY_BRIGHTNESS_MIN), > + HCONS_MAP_KEY(0x074, KEY_BRIGHTNESS_MAX), > + HCONS_MAP_KEY(0x075, KEY_BRIGHTNESS_AUTO), > + HCONS_MAP_KEY(0x079, KEY_KBDILLUMUP), > + HCONS_MAP_KEY(0x07a, KEY_KBDILLUMDOWN), > + HCONS_MAP_KEY(0x07c, KEY_KBDILLUMTOGGLE), > + HCONS_MAP_KEY(0x082, KEY_VIDEO_NEXT), > + HCONS_MAP_KEY(0x083, KEY_LAST), > + HCONS_MAP_KEY(0x084, KEY_ENTER), > + HCONS_MAP_KEY(0x088, KEY_PC), > + HCONS_MAP_KEY(0x089, KEY_TV), > + HCONS_MAP_KEY(0x08a, KEY_WWW), > + HCONS_MAP_KEY(0x08b, KEY_DVD), > + HCONS_MAP_KEY(0x08c, KEY_PHONE), > + HCONS_MAP_KEY(0x08d, KEY_PROGRAM), > + HCONS_MAP_KEY(0x08e, KEY_VIDEOPHONE), > + HCONS_MAP_KEY(0x08f, KEY_GAMES), > + HCONS_MAP_KEY(0x090, KEY_MEMO), > + HCONS_MAP_KEY(0x091, KEY_CD), > + HCONS_MAP_KEY(0x092, KEY_VCR), > + HCONS_MAP_KEY(0x093, KEY_TUNER), > + HCONS_MAP_KEY(0x094, KEY_EXIT), > + HCONS_MAP_KEY(0x095, KEY_HELP), > + HCONS_MAP_KEY(0x096, KEY_TAPE), > + HCONS_MAP_KEY(0x097, KEY_TV2), > + HCONS_MAP_KEY(0x098, KEY_SAT), > + HCONS_MAP_KEY(0x09a, KEY_PVR), > + HCONS_MAP_KEY(0x09c, KEY_CHANNELUP), > + HCONS_MAP_KEY(0x09d, KEY_CHANNELDOWN), > + HCONS_MAP_KEY(0x0a0, KEY_VCR2), > + HCONS_MAP_KEY(0x0b0, KEY_PLAY), > + HCONS_MAP_KEY(0x0b1, KEY_PAUSE), > + HCONS_MAP_KEY(0x0b2, KEY_RECORD), > + HCONS_MAP_KEY(0x0b3, KEY_FASTFORWARD), > + HCONS_MAP_KEY(0x0b4, KEY_REWIND), > + HCONS_MAP_KEY(0x0b5, KEY_NEXTSONG), > + HCONS_MAP_KEY(0x0b6, KEY_PREVIOUSSONG), > + HCONS_MAP_KEY(0x0b7, KEY_STOPCD), > + HCONS_MAP_KEY(0x0b8, KEY_EJECTCD), > + HCONS_MAP_KEY(0x0bc, KEY_MEDIA_REPEAT), > + HCONS_MAP_KEY(0x0b9, KEY_SHUFFLE), > + HCONS_MAP_KEY(0x0bf, KEY_SLOW), > + HCONS_MAP_KEY(0x0cd, KEY_PLAYPAUSE), > + HCONS_MAP_KEY(0x0cf, KEY_VOICECOMMAND), > + HCONS_MAP_ABS(0x0e0, ABS_VOLUME), > + HCONS_MAP_REL_CB(0x0e0, hcons_rel_volume_cb), > + HCONS_MAP_KEY(0x0e2, KEY_MUTE), > + HCONS_MAP_KEY(0x0e5, KEY_BASSBOOST), > + HCONS_MAP_KEY(0x0e9, KEY_VOLUMEUP), > + HCONS_MAP_KEY(0x0ea, KEY_VOLUMEDOWN), > + HCONS_MAP_KEY(0x0f5, KEY_SLOW), > + HCONS_MAP_KEY(0x181, KEY_BUTTONCONFIG), > + HCONS_MAP_KEY(0x182, KEY_BOOKMARKS), > + HCONS_MAP_KEY(0x183, KEY_CONFIG), > + HCONS_MAP_KEY(0x184, KEY_WORDPROCESSOR), > + HCONS_MAP_KEY(0x185, KEY_EDITOR), > + HCONS_MAP_KEY(0x186, KEY_SPREADSHEET), > + HCONS_MAP_KEY(0x187, KEY_GRAPHICSEDITOR), > + HCONS_MAP_KEY(0x188, KEY_PRESENTATION), > + HCONS_MAP_KEY(0x189, KEY_DATABASE), > + HCONS_MAP_KEY(0x18a, KEY_MAIL), > + HCONS_MAP_KEY(0x18b, KEY_NEWS), > + HCONS_MAP_KEY(0x18c, KEY_VOICEMAIL), > + HCONS_MAP_KEY(0x18d, KEY_ADDRESSBOOK), > + HCONS_MAP_KEY(0x18e, KEY_CALENDAR), > + HCONS_MAP_KEY(0x18f, KEY_TASKMANAGER), > + HCONS_MAP_KEY(0x190, KEY_JOURNAL), > + HCONS_MAP_KEY(0x191, KEY_FINANCE), > + HCONS_MAP_KEY(0x192, KEY_CALC), > + HCONS_MAP_KEY(0x193, KEY_PLAYER), > + HCONS_MAP_KEY(0x194, KEY_FILE), > + HCONS_MAP_KEY(0x196, KEY_WWW), > + HCONS_MAP_KEY(0x199, KEY_CHAT), > + HCONS_MAP_KEY(0x19c, KEY_LOGOFF), > + HCONS_MAP_KEY(0x19e, KEY_COFFEE), > + HCONS_MAP_KEY(0x19f, KEY_CONTROLPANEL), > + HCONS_MAP_KEY(0x1a2, KEY_APPSELECT), > + HCONS_MAP_KEY(0x1a3, KEY_NEXT), > + HCONS_MAP_KEY(0x1a4, KEY_PREVIOUS), > + HCONS_MAP_KEY(0x1a6, KEY_HELP), > + HCONS_MAP_KEY(0x1a7, KEY_DOCUMENTS), > + HCONS_MAP_KEY(0x1ab, KEY_SPELLCHECK), > + HCONS_MAP_KEY(0x1ae, KEY_KEYBOARD), > + HCONS_MAP_KEY(0x1b1, KEY_SCREENSAVER), > + HCONS_MAP_KEY(0x1b4, KEY_FILE), > + HCONS_MAP_KEY(0x1b6, KEY_IMAGES), > + HCONS_MAP_KEY(0x1b7, KEY_AUDIO), > + HCONS_MAP_KEY(0x1b8, KEY_VIDEO), > + HCONS_MAP_KEY(0x1bc, KEY_MESSENGER), > + HCONS_MAP_KEY(0x1bd, KEY_INFO), > + HCONS_MAP_KEY(0x1cb, KEY_ASSISTANT), > + HCONS_MAP_KEY(0x201, KEY_NEW), > + HCONS_MAP_KEY(0x202, KEY_OPEN), > + HCONS_MAP_KEY(0x203, KEY_CLOSE), > + HCONS_MAP_KEY(0x204, KEY_EXIT), > + HCONS_MAP_KEY(0x207, KEY_SAVE), > + HCONS_MAP_KEY(0x208, KEY_PRINT), > + HCONS_MAP_KEY(0x209, KEY_PROPS), > + HCONS_MAP_KEY(0x21a, KEY_UNDO), > + HCONS_MAP_KEY(0x21b, KEY_COPY), > + HCONS_MAP_KEY(0x21c, KEY_CUT), > + HCONS_MAP_KEY(0x21d, KEY_PASTE), > + HCONS_MAP_KEY(0x21f, KEY_FIND), > + HCONS_MAP_KEY(0x221, KEY_SEARCH), > + HCONS_MAP_KEY(0x222, KEY_GOTO), > + HCONS_MAP_KEY(0x223, KEY_HOMEPAGE), > + HCONS_MAP_KEY(0x224, KEY_BACK), > + HCONS_MAP_KEY(0x225, KEY_FORWARD), > + HCONS_MAP_KEY(0x226, KEY_STOP), > + HCONS_MAP_KEY(0x227, KEY_REFRESH), > + HCONS_MAP_KEY(0x22a, KEY_BOOKMARKS), > + HCONS_MAP_KEY(0x22d, KEY_ZOOMIN), > + HCONS_MAP_KEY(0x22e, KEY_ZOOMOUT), > + HCONS_MAP_KEY(0x22f, KEY_ZOOMRESET), > + HCONS_MAP_KEY(0x232, KEY_FULL_SCREEN), > + HCONS_MAP_KEY(0x233, KEY_SCROLLUP), > + HCONS_MAP_KEY(0x234, KEY_SCROLLDOWN), > + HCONS_MAP_REL(0x238, REL_HWHEEL), /* AC Pan */ > + HCONS_MAP_KEY(0x23d, KEY_EDIT), > + HCONS_MAP_KEY(0x25f, KEY_CANCEL), > + HCONS_MAP_KEY(0x269, KEY_INSERT), > + HCONS_MAP_KEY(0x26a, KEY_DELETE), > + HCONS_MAP_KEY(0x279, KEY_REDO), > + HCONS_MAP_KEY(0x289, KEY_REPLY), > + HCONS_MAP_KEY(0x28b, KEY_FORWARDMAIL), > + HCONS_MAP_KEY(0x28c, KEY_SEND), > + HCONS_MAP_KEY(0x29d, KEY_KBD_LAYOUT_NEXT), > + HCONS_MAP_KEY(0x2c7, KEY_KBDINPUTASSIST_PREV), > + HCONS_MAP_KEY(0x2c8, KEY_KBDINPUTASSIST_NEXT), > + HCONS_MAP_KEY(0x2c9, KEY_KBDINPUTASSIST_PREVGROUP), > + HCONS_MAP_KEY(0x2ca, KEY_KBDINPUTASSIST_NEXTGROUP), > + HCONS_MAP_KEY(0x2cb, KEY_KBDINPUTASSIST_ACCEPT), > + HCONS_MAP_KEY(0x2cc, KEY_KBDINPUTASSIST_CANCEL), > + HCONS_MAP_KEY(0x29f, KEY_SCALE), > +}; > + > +static const struct hid_device_id hcons_devs[] = { > + { HID_TLC(HUP_CONSUMER, HUC_CONTROL) }, > +}; > + > +/* > + * Emulate relative Consumer volume usage with pressing > + * VOLUMEUP and VOLUMEDOWN keys appropriate number of times > + */ > +static int > +hcons_rel_volume_cb(HIDMAP_CB_ARGS) > +{ > + struct evdev_dev *evdev = HIDMAP_CB_GET_EVDEV(); > + int32_t code; > + int nrepeats; > + > + switch (HIDMAP_CB_GET_STATE()) { > + case HIDMAP_CB_IS_ATTACHING: > + evdev_support_event(evdev, EV_KEY); > + evdev_support_key(evdev, KEY_VOLUMEUP); > + evdev_support_key(evdev, KEY_VOLUMEDOWN); > + break; > + case HIDMAP_CB_IS_RUNNING: > + /* Nothing to report. */ > + if (ctx.data == 0) > + return (ENOMSG); > + code = ctx.data > 0 ? KEY_VOLUMEUP : KEY_VOLUMEDOWN; > + for (nrepeats = abs(ctx.data); nrepeats > 0; nrepeats--) { > + evdev_push_key(evdev, code, 1); > + evdev_push_key(evdev, code, 0); > + } > + } This broke the gcc build in about a half dozen places due to -Wswitch, e.g. here. If you like, I can prepare an inelegant patch adding either default cases or all the ignored cases to all of them. > + > + return (0); > +} > + > +static int > +hcons_probe(device_t dev) > +{ > + return (HIDMAP_PROBE(device_get_softc(dev), dev, > + hcons_devs, hcons_map, "Consumer Control")); > +} > + > +static int > +hcons_attach(device_t dev) > +{ > + return (hidmap_attach(device_get_softc(dev))); > +} > + > +static int > +hcons_detach(device_t dev) > +{ > + return (hidmap_detach(device_get_softc(dev))); > +} > + > +static devclass_t hcons_devclass; > +static device_method_t hcons_methods[] = { > + DEVMETHOD(device_probe, hcons_probe), > + DEVMETHOD(device_attach, hcons_attach), > + DEVMETHOD(device_detach, hcons_detach), > + > + DEVMETHOD_END > +}; > + > +DEFINE_CLASS_0(hcons, hcons_driver, hcons_methods, sizeof(struct hidmap)); > +DRIVER_MODULE(hcons, hidbus, hcons_driver, hcons_devclass, NULL, 0); > +MODULE_DEPEND(hcons, hid, 1, 1, 1); > +MODULE_DEPEND(hcons, hidbus, 1, 1, 1); > +MODULE_DEPEND(hcons, hidmap, 1, 1, 1); > +MODULE_DEPEND(hcons, evdev, 1, 1, 1); > +MODULE_VERSION(hcons, 1); > +HID_PNP_INFO(hcons_devs); > diff --git a/sys/dev/hid/hidmap.c b/sys/dev/hid/hidmap.c > new file mode 100644 > index 000000000000..163d63c20232 > --- /dev/null > +++ b/sys/dev/hid/hidmap.c > @@ -0,0 +1,832 @@ > +/*- > + * SPDX-License-Identifier: BSD-2-Clause-FreeBSD > + * > + * 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 > + * are met: > + * 1. Redistributions of source code must retain the above copyright > + * notice, this list of conditions and the following disclaimer. > + * 2. Redistributions in binary form must reproduce the above copyright > + * notice, this list of conditions and the following disclaimer in the > + * documentation and/or other materials provided with the distribution. > + * > + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND > + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE > + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE > + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE > + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL > + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS > + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) > + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT > + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY > + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF > + * SUCH DAMAGE. > + */ > + > +#include <sys/cdefs.h> > +__FBSDID("$FreeBSD$"); > + > +/* > + * Abstract 1 to 1 HID input usage to evdev event mapper driver. > + */ > + > +#include "opt_hid.h" > + > +#include <sys/param.h> > +#include <sys/bus.h> > +#include <sys/kernel.h> > +#include <sys/lock.h> > +#include <sys/malloc.h> > +#include <sys/module.h> > +#include <sys/sysctl.h> > +#include <sys/systm.h> > + > +#include <dev/evdev/input.h> > +#include <dev/evdev/evdev.h> > + > +#include <dev/hid/hid.h> > +#include <dev/hid/hidbus.h> > +#include <dev/hid/hidmap.h> > + > +#ifdef HID_DEBUG > +#define DPRINTFN(hm, n, fmt, ...) do { \ > + if ((hm)->debug_var != NULL && *(hm)->debug_var >= (n)) { \ > + device_printf((hm)->dev, "%s: " fmt, \ > + __FUNCTION__ ,##__VA_ARGS__); \ > + } \ > +} while (0) > +#define DPRINTF(hm, ...) DPRINTFN(hm, 1, __VA_ARGS__) > +#else > +#define DPRINTF(...) do { } while (0) > +#define DPRINTFN(...) do { } while (0) > +#endif > + > +static evdev_open_t hidmap_ev_open; > +static evdev_close_t hidmap_ev_close; > + > +#define HIDMAP_WANT_MERGE_KEYS(hm) ((hm)->key_rel != NULL) > + > +#define HIDMAP_FOREACH_ITEM(hm, mi, uoff) \ > + for (u_int _map = 0, _item = 0, _uoff_priv = -1; \ > + ((mi) = hidmap_get_next_map_item( \ > + (hm), &_map, &_item, &_uoff_priv, &(uoff))) != NULL;) > + > +static inline bool > +hidmap_get_next_map_index(const struct hidmap_item *map, int nmap_items, > + uint32_t *index, uint16_t *usage_offset) > +{ > + > + ++*usage_offset; > + if ((*index != 0 || *usage_offset != 0) && > + *usage_offset >= map[*index].nusages) { > + ++*index; > + *usage_offset = 0; > + } > + > + return (*index < nmap_items); > +} > + > +static inline const struct hidmap_item * > +hidmap_get_next_map_item(struct hidmap *hm, u_int *map, u_int *item, > + u_int *uoff_priv, uint16_t *uoff) > +{ > + > + *uoff = *uoff_priv; > + while (!hidmap_get_next_map_index( > + hm->map[*map], hm->nmap_items[*map], item, uoff)) { > + ++*map; > + *item = 0; > + *uoff = -1; > + if (*map >= hm->nmaps) > + return (NULL); > + } > + *uoff_priv = *uoff; > + > + return (hm->map[*map] + *item); > +} > + > +void > +_hidmap_set_debug_var(struct hidmap *hm, int *debug_var) > +{ > +#ifdef HID_DEBUG > + hm->debug_var = debug_var; > +#endif > +} > + > +static int > +hidmap_ev_close(struct evdev_dev *evdev) > +{ > + return (hidbus_intr_stop(evdev_get_softc(evdev))); > +} > + > +static int > +hidmap_ev_open(struct evdev_dev *evdev) > +{ > + return (hidbus_intr_start(evdev_get_softc(evdev))); > +} > + > +void > +hidmap_support_key(struct hidmap *hm, uint16_t key) > +{ > + if (hm->key_press == NULL) { > + hm->key_press = malloc(howmany(KEY_CNT, 8), M_DEVBUF, > + M_ZERO | M_WAITOK); > *** 2864 LINES SKIPPED ***
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CAHgpiFx0%2B9tOHjPv9yUbzNQdywxxUm3=FkqK3HBEnWJaOCVQxA>