From: Maxim Devaev <mdevaev@gmail.com>
To: Felipe Balbi <balbi@kernel.org>
Cc: gregkh@linuxfoundation.org, sandeen@redhat.com,
linux-usb@vger.kernel.org, mdevaev@gmail.com
Subject: Re: [PATCH] usb: gadget: f_hid: added GET_IDLE and SET_IDLE handlers
Date: Thu, 22 Jul 2021 20:51:32 +0300 [thread overview]
Message-ID: <20210722205132.7a168041@reki> (raw)
In-Reply-To: <87y29ylga5.fsf@kernel.org>
> Felipe Balbi <balbi@kernel.org> writes:
>
> yeah, I don't see any issues with this. If you have access to the tool,
> mind running USBCV on the f_hid gadget? Would be cool to get some
> confirmation that we're within spec.
Thanks for pointing to USBCV. I used a hardware USB protocol analyzer
to understand what was wrong with f_hid, and my hosts only sent idle=0.
Thanks to the test, I realized that I should only use the upper byte
that contains duration. Here a fixed version of the patch,
which successfully passes all HID tests. The idle part:
Now Starting Test: HID Class GET/SET Idle Test (Configuration Index 0)
Start time: Jul 22, 2021 - 20:29:40
No report IDs found in report descriptor for Interface : 0x0
GET/SETIdle test for report ID 0. Setting Idle rate to : 0x7F
No report IDs found in report descriptor for Interface : 0x1
GET/SETIdle test for report ID 0. Setting Idle rate to : 0x7F
Stop time: Jul 22, 2021 - 20:29:41
Duration: 1 second.
Stopping Test [ HID Class GET/SET Idle Test (Configuration Index 0):
Number of: Fails (0); Aborts (0); Warnings (0) ]
From ac56ddc1ab2dfa599a12a3bf064e520d587e89fe Mon Sep 17 00:00:00 2001
From: Maxim Devaev <mdevaev@gmail.com>
Date: Wed, 21 Jul 2021 20:48:28 +0300
Subject: [PATCH] usb: gadget: f_hid: added GET_IDLE and SET_IDLE handlers
The USB HID standard declares mandatory support for GET_IDLE and SET_IDLE
requests for Boot Keyboard. Most hosts can handle their absence, but others
like some old/strange UEFIs and BIOSes consider this a critical error
and refuse to work with f_hid.
This primitive implementation of saving and returning idle is sufficient
to meet the requirements of the standard and these devices.
Signed-off-by: Maxim Devaev <mdevaev@gmail.com>
---
drivers/usb/gadget/function/f_hid.c | 18 ++++++++++++++++++
1 file changed, 18 insertions(+)
diff --git a/drivers/usb/gadget/function/f_hid.c b/drivers/usb/gadget/function/f_hid.c
index 02683ac07..1010f0a3e 100644
--- a/drivers/usb/gadget/function/f_hid.c
+++ b/drivers/usb/gadget/function/f_hid.c
@@ -41,6 +41,7 @@ struct f_hidg {
unsigned char bInterfaceSubClass;
unsigned char bInterfaceProtocol;
unsigned char protocol;
+ unsigned char idle;
unsigned short report_desc_length;
char *report_desc;
unsigned short report_length;
@@ -523,6 +524,14 @@ static int hidg_setup(struct usb_function *f,
goto respond;
break;
+ case ((USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE) << 8
+ | HID_REQ_GET_IDLE):
+ VDBG(cdev, "get_idle\n");
+ length = min_t(unsigned int, length, 1);
+ ((u8 *) req->buf)[0] = hidg->idle;
+ goto respond;
+ break;
+
case ((USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE) << 8
| HID_REQ_SET_REPORT):
VDBG(cdev, "set_report | wLength=%d\n", ctrl->wLength);
@@ -546,6 +555,14 @@ static int hidg_setup(struct usb_function *f,
goto stall;
break;
+ case ((USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE) << 8
+ | HID_REQ_SET_IDLE):
+ VDBG(cdev, "set_idle\n");
+ length = 0;
+ hidg->idle = value >> 8;
+ goto respond;
+ break;
+
case ((USB_DIR_IN | USB_TYPE_STANDARD | USB_RECIP_INTERFACE) << 8
| USB_REQ_GET_DESCRIPTOR):
switch (value >> 8) {
@@ -773,6 +790,7 @@ static int hidg_bind(struct usb_configuration *c, struct usb_function *f)
hidg_interface_desc.bInterfaceSubClass = hidg->bInterfaceSubClass;
hidg_interface_desc.bInterfaceProtocol = hidg->bInterfaceProtocol;
hidg->protocol = HID_REPORT_PROTOCOL;
+ hidg->idle = 1;
hidg_ss_in_ep_desc.wMaxPacketSize = cpu_to_le16(hidg->report_length);
hidg_ss_in_comp_desc.wBytesPerInterval =
cpu_to_le16(hidg->report_length);
--
2.32.0
next prev parent reply other threads:[~2021-07-22 17:51 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-07-21 18:03 [PATCH] usb: gadget: f_hid: added GET_IDLE and SET_IDLE handlers Maxim Devaev
2021-07-22 11:49 ` Felipe Balbi
2021-07-22 17:51 ` Maxim Devaev [this message]
2021-07-23 7:20 ` Felipe Balbi
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=20210722205132.7a168041@reki \
--to=mdevaev@gmail.com \
--cc=balbi@kernel.org \
--cc=gregkh@linuxfoundation.org \
--cc=linux-usb@vger.kernel.org \
--cc=sandeen@redhat.com \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.