mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-09-22 04:31:58 +08:00
HID: apple: Disable Fn-key key-re-mapping on clone keyboards
The Maxxter KB-BT-001 Bluetooth keyboard, which looks somewhat like the Apple Wireless Keyboard, is using the vendor and product IDs (05AC:0239) of the Apple Wireless Keyboard (2009 ANSI version) <sigh>. But its F1 - F10 keys are marked as sending F1 - F10, not the special functions hid-apple.c maps them too; and since its descriptors do not contain the HID_UP_CUSTOM | 0x0003 usage apple-hid looks for for the Fn-key, apple_setup_input() never gets called, so F1 - F6 are mapped to key-codes which have not been set in the keybit array causing them to not send any events at all. The lack of a usage code matching the Fn key in the clone is actually useful as this allows solving this problem in a generic way. This commits adds a fn_found flag and it adds a input_configured callback which checks if this flag is set once all usages have been mapped. If it is not set, then assume this is a clone and clear the quirks bitmap so that the hid-apple code does not add any special handling to this keyboard. This fixes F1 - F6 not sending anything at all and F7 - F12 sending the wrong codes on the Maxxter KB-BT-001 Bluetooth keyboard and on similar clones. Cc: Joao Moreno <mail@joaomoreno.com> Signed-off-by: Hans de Goede <hdegoede@redhat.com> Signed-off-by: Jiri Kosina <jkosina@suse.cz>
This commit is contained in:
parent
a06bb885cf
commit
a5d81646fa
@ -60,6 +60,7 @@ MODULE_PARM_DESC(swap_fn_leftctrl, "Swap the Fn and left Control keys. "
|
|||||||
struct apple_sc {
|
struct apple_sc {
|
||||||
unsigned long quirks;
|
unsigned long quirks;
|
||||||
unsigned int fn_on;
|
unsigned int fn_on;
|
||||||
|
unsigned int fn_found;
|
||||||
DECLARE_BITMAP(pressed_numlock, KEY_CNT);
|
DECLARE_BITMAP(pressed_numlock, KEY_CNT);
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -365,12 +366,15 @@ static int apple_input_mapping(struct hid_device *hdev, struct hid_input *hi,
|
|||||||
struct hid_field *field, struct hid_usage *usage,
|
struct hid_field *field, struct hid_usage *usage,
|
||||||
unsigned long **bit, int *max)
|
unsigned long **bit, int *max)
|
||||||
{
|
{
|
||||||
|
struct apple_sc *asc = hid_get_drvdata(hdev);
|
||||||
|
|
||||||
if (usage->hid == (HID_UP_CUSTOM | 0x0003) ||
|
if (usage->hid == (HID_UP_CUSTOM | 0x0003) ||
|
||||||
usage->hid == (HID_UP_MSVENDOR | 0x0003) ||
|
usage->hid == (HID_UP_MSVENDOR | 0x0003) ||
|
||||||
usage->hid == (HID_UP_HPVENDOR2 | 0x0003)) {
|
usage->hid == (HID_UP_HPVENDOR2 | 0x0003)) {
|
||||||
/* The fn key on Apple USB keyboards */
|
/* The fn key on Apple USB keyboards */
|
||||||
set_bit(EV_REP, hi->input->evbit);
|
set_bit(EV_REP, hi->input->evbit);
|
||||||
hid_map_usage_clear(hi, usage, bit, max, EV_KEY, KEY_FN);
|
hid_map_usage_clear(hi, usage, bit, max, EV_KEY, KEY_FN);
|
||||||
|
asc->fn_found = true;
|
||||||
apple_setup_input(hi->input);
|
apple_setup_input(hi->input);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -397,6 +401,19 @@ static int apple_input_mapped(struct hid_device *hdev, struct hid_input *hi,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int apple_input_configured(struct hid_device *hdev,
|
||||||
|
struct hid_input *hidinput)
|
||||||
|
{
|
||||||
|
struct apple_sc *asc = hid_get_drvdata(hdev);
|
||||||
|
|
||||||
|
if ((asc->quirks & APPLE_HAS_FN) && !asc->fn_found) {
|
||||||
|
hid_info(hdev, "Fn key not found (Apple Wireless Keyboard clone?), disabling Fn key handling\n");
|
||||||
|
asc->quirks = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int apple_probe(struct hid_device *hdev,
|
static int apple_probe(struct hid_device *hdev,
|
||||||
const struct hid_device_id *id)
|
const struct hid_device_id *id)
|
||||||
{
|
{
|
||||||
@ -611,6 +628,7 @@ static struct hid_driver apple_driver = {
|
|||||||
.event = apple_event,
|
.event = apple_event,
|
||||||
.input_mapping = apple_input_mapping,
|
.input_mapping = apple_input_mapping,
|
||||||
.input_mapped = apple_input_mapped,
|
.input_mapped = apple_input_mapped,
|
||||||
|
.input_configured = apple_input_configured,
|
||||||
};
|
};
|
||||||
module_hid_driver(apple_driver);
|
module_hid_driver(apple_driver);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user