Project

General

Profile

Actions

Bug #1968

closed

ukbd patch

Added by masterblaster about 13 years ago. Updated about 13 years ago.

Status:
Closed
Priority:
Normal
Assignee:
-
Category:
-
Target version:
-
Start date:
Due date:
% Done:

0%

Estimated time:

Description

Hi all,

as i am new to kernel drivers, i suppose (just looking at usbd_get_quirks() prototype) that the quirk for usb keyboard was set the wrong way.
I don't even know if the quirk is needed at all, as no device is marked with UQ_NO_SET_PROTO ...

Without this patch uhci driver doesn't generate an interrupt when Fn key is pressed on Apple usb keyboard (it took me days to realize this...).

I just want to map Fn key to 'insert' keycode. For that it's than enough to set ukbd_trtab1=102 in ukbd.c ,but i don't know if to hardcode this violates any standard. Does it?

Thanks!


Files

Actions #1

Updated by alexh about 13 years ago

On 25/01/11 06:29, Magliano Andrea wrote:

Without this patch uhci driver doesn't generate an interrupt when Fn key is pressed on Apple usb keyboard (it took me days to realize this...).

With this patch that code is probably skipped unconditionally in the
normal case.

I just want to map Fn key to 'insert' keycode. For that it's than enough to set ukbd_trtab1=102 in ukbd.c ,but i don't know if to hardcode this violates any standard. Does it?

Why don't you just set the quirk NO_SET_PROTO for that device? That will
have the same effect.

0001-set-usb-quirk-the-right-way.patch

From 639a855e36f1bf7b1d6120ba5c2bd1a871614ead Mon Sep 17 00:00:00 2001
From: Charlie <>
Date: Tue, 25 Jan 2011 06:58:43 +0100
Subject: [PATCH] set usb quirk the right way

---
sys/dev/usbmisc/ukbd/ukbd.c | 2
1 files changed, 1 insertions(
), 1 deletions()

diff --git a/sys/dev/usbmisc/ukbd/ukbd.c b/sys/dev/usbmisc/ukbd/ukbd.c
index 2099921..e3adf78 100644
--- a/sys/dev/usbmisc/ukbd/ukbd.c
+++ b/sys/dev/usbmisc/ukbd/ukbd.c
@ -1460,7 +1460,7 @ bLength=%d bDescriptorType=%d bEndpointAddress=%d-%s bmAttributes=%d wMaxPacketS
return EINVAL;
}

- if ((usbd_get_quirks(state->ks_uaa->device)->uq_flags & UQ_NO_SET_PROTO) == 0) {
+ if (usbd_get_quirks(state->ks_uaa->device)->uq_flags & UQ_NO_SET_PROTO) {

This makes no sense. The original condition was: "If we are asked not to
set a proto skip this section, otherwise call usbd_set_protocol".

Now it is: "If we are asked not to set a proto, set a proto.".

err = usbd_set_protocol(state->ks_iface, 0);
DPRINTFN);
if (err) {
-- 1.7.3.2

Actions #2

Updated by masterblaster about 13 years ago

Hallo Alex,

bin btw in chat als randy1 unterwegs.

On 1/25/2011, ""Alex Hornung \(via DragonFly issue tracker\)"
" <"Alex Hornung \(via DragonFly issue
tracker\)"
> wrote:

Alex Hornung <> added the comment:

On 25/01/11 06:29, Magliano Andrea wrote:

Without this patch uhci driver doesn't generate an interrupt when Fn key is pressed on Apple usb keyboard (it took me days to realize this...).

With this patch that code is probably skipped unconditionally in the
normal case.

I just want to map Fn key to 'insert' keycode. For that it's than enough to set ukbd_trtab1=102 in ukbd.c ,but i don't know if to hardcode this violates any standard. Does it?

Why don't you just set the quirk NO_SET_PROTO for that device? That will
have the same effect.

0001-set-usb-quirk-the-right-way.patch

From 639a855e36f1bf7b1d6120ba5c2bd1a871614ead Mon Sep 17 00:00:00 2001
From: Charlie <>
Date: Tue, 25 Jan 2011 06:58:43 +0100
Subject: [PATCH] set usb quirk the right way

---
sys/dev/usbmisc/ukbd/ukbd.c | 2
1 files changed, 1 insertions(
), 1 deletions()

diff --git a/sys/dev/usbmisc/ukbd/ukbd.c b/sys/dev/usbmisc/ukbd/ukbd.c
index 2099921..e3adf78 100644
--- a/sys/dev/usbmisc/ukbd/ukbd.c
+++ b/sys/dev/usbmisc/ukbd/ukbd.c
@ -1460,7 +1460,7 @ bLength=%d bDescriptorType=%d bEndpointAddress=%d-%s bmAttributes=%d wMaxPacketS
return EINVAL;
}

- if ((usbd_get_quirks(state->ks_uaa->device)->uq_flags & UQ_NO_SET_PROTO) == 0) {
+ if (usbd_get_quirks(state->ks_uaa->device)->uq_flags & UQ_NO_SET_PROTO) {

This makes no sense. The original condition was: "If we are asked not to
set a proto skip this section, otherwise call usbd_set_protocol".

Das verstehe ich nicht ganz; usbd_get_quirks() bedeutet: wenn es ein
quirk fuer den device gibt, dann...

In der Tat es gibt kein quirk fuer den keyboard, trotzdem setzt der
original code den protocol zu 0.

Aus usb_quirks.h:
#define UQ_NO_SET_PROTO 0x0001 /* cannot handle SET PROTOCOL. */

was bedeuten soll, dass der device den protocol nicht setzen kann, darum
usbd_set_protocol(state->ks_iface, 0) zwingen, was in dem Fall nicht
noetig ist (?)

Now it is: "If we are asked not to set a proto, set a proto.".

err = usbd_set_protocol(state->ks_iface, 0);
DPRINTFN);
if (err) {
-- 1.7.3.2

----------
status: unread -> chatting

_____________________________________________
DragonFly issue tracker <>
<http://bugs.dragonflybsd.org/issue1968>
_____________________________________________

Actions #3

Updated by y0n3t4n1 about 13 years ago

Hi,

On Tue, Jan 25, 2011 at 07:29:10AM +0100, Magliano Andrea wrote:

as i am new to kernel drivers, i suppose (just looking at usbd_get_quirks() prototype) that the quirk for usb keyboard was set the wrong way.

The code as is looks correct to me: set the protocol unless the quirk is set.
Instead, try adding a quirk like below to usb_quirks[] (NOTE: the ids may be
different from yours) and rebuild the usb.ko if kldstat command shows it,
or the kernel if not.

diff --git a/sys/bus/usb/usb_quirks.c b/sys/bus/usb/usb_quirks.c
index 4ef50d3..20573f2 100644
--- a/sys/bus/usb/usb_quirks.c
++ b/sys/bus/usb/usb_quirks.c
@ -57,6 +57,9 @ static const struct usbd_quirk_entry {
u_int16_t bcdDevice;
struct usbd_quirks quirks;
} usb_quirks[] = {
/* Apple USB keyboard /
+ { .idVendor = 0x05ac, .idProduct = 0x021d, .bcdDevice = ANY,
+ .quirks = { UQ_NO_SET_PROTO}},
/
KYE Niche mouse */ { .idVendor = 0x0458, .idProduct = 0x0001, .bcdDevice = 0x100,
.quirks = { UQ_NO_SET_PROTO}},

Cheers.

Actions #4

Updated by josepht about 13 years ago

See Issue1970 for resolution.

Actions

Also available in: Atom PDF