rust-for-linux.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Peter Hutterer <peter.hutterer@who-t.net>
To: Rahul Rameshbabu <sergeantsagara@protonmail.com>
Cc: linux-input@vger.kernel.org, rust-for-linux@vger.kernel.org,
	"Benjamin Tissoires" <bentiss@kernel.org>,
	"Miguel Ojeda" <ojeda@kernel.org>,
	"Alex Gaynor" <alex.gaynor@gmail.com>,
	"Boqun Feng" <boqun.feng@gmail.com>,
	"Gary Guo" <gary@garyguo.net>,
	"Björn Roy Baron" <bjorn3_gh@protonmail.com>,
	"Benno Lossin" <benno.lossin@proton.me>,
	"Andreas Hindborg" <a.hindborg@kernel.org>,
	"Alice Ryhl" <aliceryhl@google.com>,
	"Trevor Gross" <tmgross@umich.edu>,
	"Danilo Krummrich" <dakr@kernel.org>,
	"Daniel Brooks" <db48x@db48x.net>
Subject: Re: [PATCH v1 3/3] rust: hid: Glorious Gaming PC Race Model O and O- mice reference driver
Date: Thu, 3 Jul 2025 20:36:19 +1000	[thread overview]
Message-ID: <20250703103619.GA1972569@quokka> (raw)
In-Reply-To: <20250629045031.92358-5-sergeantsagara@protonmail.com>

On Sun, Jun 29, 2025 at 04:51:22AM +0000, Rahul Rameshbabu wrote:
> Demonstrate how to perform a report fixup from a Rust HID driver. The mice
> specify the const flag incorrectly in the consumer input report descriptor,
> which leads to inputs being ignored. Correctly patch the report descriptor for
> the Model O and O- mice.
> 
> Portions of the HID report post-fixup:
> device 0:0
> ...
> 0x81, 0x06,                    //  Input (Data,Var,Rel)               84
> ...
> 0x81, 0x06,                    //  Input (Data,Var,Rel)               112
> ...
> 0x81, 0x06,                    //  Input (Data,Var,Rel)               140
> 
> Signed-off-by: Rahul Rameshbabu <sergeantsagara@protonmail.com>
> ---
>  MAINTAINERS                      |  7 ++++
>  drivers/hid/Kconfig              |  8 +++++
>  drivers/hid/Makefile             |  1 +
>  drivers/hid/hid-glorious.c       |  2 ++
>  drivers/hid/hid_glorious_rust.rs | 62 ++++++++++++++++++++++++++++++++
>  5 files changed, 80 insertions(+)
>  create mode 100644 drivers/hid/hid_glorious_rust.rs
> 
> diff --git a/MAINTAINERS b/MAINTAINERS
> index 487750d9fd1e..80849f76c6c3 100644
> --- a/MAINTAINERS
> +++ b/MAINTAINERS
> @@ -10200,6 +10200,13 @@ L:	platform-driver-x86@vger.kernel.org
>  S:	Maintained
>  F:	drivers/platform/x86/gigabyte-wmi.c
>  
> +GLORIOUS RUST DRIVER [RUST]
> +M:	Rahul Rameshbabu <sergeantsagara@protonmail.com>
> +L:	linux-input@vger.kernel.org
> +S:	Maintained
> +T:	git git://git.kernel.org/pub/scm/linux/kernel/git/hid/hid.git
> +F:	drivers/hid/hid_glorious_rust.rs
> +
>  GNSS SUBSYSTEM
>  M:	Johan Hovold <johan@kernel.org>
>  S:	Maintained
> diff --git a/drivers/hid/Kconfig b/drivers/hid/Kconfig
> index 5c8839ddc999..3592a4de113f 100644
> --- a/drivers/hid/Kconfig
> +++ b/drivers/hid/Kconfig
> @@ -406,6 +406,14 @@ config HID_GLORIOUS
>  	  Support for Glorious PC Gaming Race mice such as
>  	  the Glorious Model O, O- and D.
>  
> +config HID_GLORIOUS_RUST
> +	tristate "Glorious O and O- mice Rust reference driver"
> +	depends on USB_HID
> +	depends on RUST_HID_ABSTRACTIONS
> +	help
> +	  Support for Glorious PC Gaming Race O and O- mice
> +	  in Rust
> +
>  config HID_HOLTEK
>  	tristate "Holtek HID devices"
>  	depends on USB_HID
> diff --git a/drivers/hid/Makefile b/drivers/hid/Makefile
> index 10ae5dedbd84..bd86b3db5d88 100644
> --- a/drivers/hid/Makefile
> +++ b/drivers/hid/Makefile
> @@ -55,6 +55,7 @@ obj-$(CONFIG_HID_FT260)		+= hid-ft260.o
>  obj-$(CONFIG_HID_GEMBIRD)	+= hid-gembird.o
>  obj-$(CONFIG_HID_GFRM)		+= hid-gfrm.o
>  obj-$(CONFIG_HID_GLORIOUS)  += hid-glorious.o
> +obj-$(CONFIG_HID_GLORIOUS_RUST)	+= hid_glorious_rust.o
>  obj-$(CONFIG_HID_VIVALDI_COMMON) += hid-vivaldi-common.o
>  obj-$(CONFIG_HID_GOODIX_SPI)	+= hid-goodix-spi.o
>  obj-$(CONFIG_HID_GOOGLE_HAMMER)	+= hid-google-hammer.o
> diff --git a/drivers/hid/hid-glorious.c b/drivers/hid/hid-glorious.c
> index 5bbd81248053..d7362852c20f 100644
> --- a/drivers/hid/hid-glorious.c
> +++ b/drivers/hid/hid-glorious.c
> @@ -76,8 +76,10 @@ static int glorious_probe(struct hid_device *hdev,
>  }
>  
>  static const struct hid_device_id glorious_devices[] = {
> +#if !IS_ENABLED(CONFIG_HID_GLORIOUS_RUST)
>  	{ HID_USB_DEVICE(USB_VENDOR_ID_SINOWEALTH,
>  		USB_DEVICE_ID_GLORIOUS_MODEL_O) },
> +#endif
>  	{ HID_USB_DEVICE(USB_VENDOR_ID_SINOWEALTH,
>  		USB_DEVICE_ID_GLORIOUS_MODEL_D) },
>  	{ HID_USB_DEVICE(USB_VENDOR_ID_LAVIEW,
> diff --git a/drivers/hid/hid_glorious_rust.rs b/drivers/hid/hid_glorious_rust.rs
> new file mode 100644
> index 000000000000..de602ae33b2d
> --- /dev/null
> +++ b/drivers/hid/hid_glorious_rust.rs
> @@ -0,0 +1,62 @@
> +// SPDX-License-Identifier: GPL-2.0
> +
> +// Copyright (C) 2025 Rahul Rameshbabu <sergeantsagara@protonmail.com>
> +
> +//! Rust reference HID driver for Glorious Model O and O- mice
> +
> +use kernel::{self, hid, prelude::*};
> +
> +const USB_VENDOR_ID_SINOWEALTH: u32 = 0x258a;
> +const USB_DEVICE_ID_GLORIOUS_MODEL_O: u32 = 0x0036;
> +
> +struct GloriousRust;
> +
> +kernel::hid_device_table!(
> +    HID_TABLE,
> +    MODULE_HID_TABLE,
> +    <GloriousRust as hid::Driver>::IdInfo,
> +    [(
> +        hid::DeviceId::new_usb(
> +            hid::Group::Generic,
> +            USB_VENDOR_ID_SINOWEALTH,
> +            USB_DEVICE_ID_GLORIOUS_MODEL_O,
> +        ),
> +        (),
> +    )]
> +);
> +
> +#[vtable]
> +impl hid::Driver for GloriousRust {
> +    type IdInfo = ();
> +    const ID_TABLE: hid::IdTable<Self::IdInfo> = &HID_TABLE;
> +
> +    /// Glorious Model O and O- specify the const flag in the consumer input
> +    /// report descriptor, which leads to inputs being ignored. Fix this by
> +    /// patching the descriptor.
> +    fn report_fixup<'a, 'b: 'a>(_hdev: &hid::Device, rdesc: &'b mut [u8]) -> &'a [u8] {
> +        if rdesc.len() == 213
> +            && rdesc[84] == 129
> +            && rdesc[112] == 129
> +            && rdesc[140] == 129
> +            && rdesc[85] == 3
> +            && rdesc[113] == 3
> +            && rdesc[141] == 3

fwiw, all tools that I've used in the past print hex for the hid
report descriptor items (including the excerpt in your commit message)
so IMO using hex here would be more useful.

Also at least in my head the items are logical groups, so this comparison
should arguably be:

> +            && (rdesc[84] == 129 && rdesc[85] == 3)

with extra () to hopefully stop rustfmt from breaking it up.

(pls ignore me if your approach is already a common pattern in the kernel)

Cheers,
  Peter

> +        {
> +            pr_info!("patching Glorious Model O consumer control report descriptor\n");
> +
> +            rdesc[85] = hid::MAIN_ITEM_VARIABLE | hid::MAIN_ITEM_RELATIVE;
> +            rdesc[113] = hid::MAIN_ITEM_VARIABLE | hid::MAIN_ITEM_RELATIVE;
> +            rdesc[141] = hid::MAIN_ITEM_VARIABLE | hid::MAIN_ITEM_RELATIVE;
> +        }
> +
> +        rdesc
> +    }
> +}
> +
> +kernel::module_hid_driver! {
> +    type: GloriousRust,
> +    name: "GloriousRust",
> +    authors: ["Rahul Rameshbabu <sergeantsagara@protonmail.com>"],
> +    description: "Rust reference HID driver for Glorious Model O and O- mice",
> +    license: "GPL",
> +}
> -- 
> 2.49.0
> 
> 
> 

  parent reply	other threads:[~2025-07-03 10:38 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-06-29  4:51 [PATCH v1 0/3] Initial work for Rust abstraction for HID device driver development Rahul Rameshbabu
2025-06-29  4:51 ` [PATCH v1 1/3] HID: core: Change hid_driver to use a const char* for name Rahul Rameshbabu
2025-06-29  4:51 ` [PATCH v1 2/3] rust: core abstractions for HID drivers Rahul Rameshbabu
2025-06-29  8:45   ` Danilo Krummrich
2025-07-03  6:37     ` Jiri Kosina
2025-07-03  8:01       ` Benjamin Tissoires
2025-07-03  8:20         ` Danilo Krummrich
2025-07-05  7:31           ` Rahul Rameshbabu
2025-07-05 10:41             ` Miguel Ojeda
2025-07-06  3:03               ` Rahul Rameshbabu
2025-07-05 10:54             ` Danilo Krummrich
2025-06-29  4:51 ` [PATCH v1 3/3] rust: hid: Glorious Gaming PC Race Model O and O- mice reference driver Rahul Rameshbabu
2025-06-29  9:22   ` Danilo Krummrich
2025-07-03 10:36   ` Peter Hutterer [this message]
2025-07-05 13:01 ` [PATCH v1 0/3] Initial work for Rust abstraction for HID device driver development Aditya Garg

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20250703103619.GA1972569@quokka \
    --to=peter.hutterer@who-t.net \
    --cc=a.hindborg@kernel.org \
    --cc=alex.gaynor@gmail.com \
    --cc=aliceryhl@google.com \
    --cc=benno.lossin@proton.me \
    --cc=bentiss@kernel.org \
    --cc=bjorn3_gh@protonmail.com \
    --cc=boqun.feng@gmail.com \
    --cc=dakr@kernel.org \
    --cc=db48x@db48x.net \
    --cc=gary@garyguo.net \
    --cc=linux-input@vger.kernel.org \
    --cc=ojeda@kernel.org \
    --cc=rust-for-linux@vger.kernel.org \
    --cc=sergeantsagara@protonmail.com \
    --cc=tmgross@umich.edu \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).