Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
linux
Commits
90c5f464
Commit
90c5f464
authored
Dec 16, 2020
by
Jiri Kosina
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'for-5.11/asus' into for-linus
Support for ASUS N-Key keyboard, from Luke D Jones
parents
36ed0958
b92b8024
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
110 additions
and
14 deletions
+110
-14
drivers/hid/hid-asus.c
drivers/hid/hid-asus.c
+109
-14
drivers/hid/hid-ids.h
drivers/hid/hid-ids.h
+1
-0
No files found.
drivers/hid/hid-asus.c
View file @
90c5f464
...
...
@@ -48,6 +48,8 @@ MODULE_DESCRIPTION("Asus HID Keyboard and TouchPad");
#define INPUT_REPORT_ID 0x5d
#define FEATURE_KBD_REPORT_ID 0x5a
#define FEATURE_KBD_REPORT_SIZE 16
#define FEATURE_KBD_LED_REPORT_ID1 0x5d
#define FEATURE_KBD_LED_REPORT_ID2 0x5e
#define SUPPORT_KBD_BACKLIGHT BIT(0)
...
...
@@ -80,6 +82,7 @@ MODULE_DESCRIPTION("Asus HID Keyboard and TouchPad");
#define QUIRK_T101HA_DOCK BIT(9)
#define QUIRK_T90CHI BIT(10)
#define QUIRK_MEDION_E1239T BIT(11)
#define QUIRK_ROG_NKEY_KEYBOARD BIT(12)
#define I2C_KEYBOARD_QUIRKS (QUIRK_FIX_NOTEBOOK_REPORT | \
QUIRK_NO_INIT_REPORTS | \
...
...
@@ -332,6 +335,28 @@ static int asus_raw_event(struct hid_device *hdev,
if
(
drvdata
->
quirks
&
QUIRK_MEDION_E1239T
)
return
asus_e1239t_event
(
drvdata
,
data
,
size
);
if
(
drvdata
->
quirks
&
QUIRK_ROG_NKEY_KEYBOARD
)
{
/*
* Skip these report ID, the device emits a continuous stream associated
* with the AURA mode it is in which looks like an 'echo'.
*/
if
(
report
->
id
==
FEATURE_KBD_LED_REPORT_ID1
||
report
->
id
==
FEATURE_KBD_LED_REPORT_ID2
)
{
return
-
1
;
/* Additional report filtering */
}
else
if
(
report
->
id
==
FEATURE_KBD_REPORT_ID
)
{
/*
* G14 and G15 send these codes on some keypresses with no
* discernable reason for doing so. We'll filter them out to avoid
* unmapped warning messages later.
*/
if
(
data
[
1
]
==
0xea
||
data
[
1
]
==
0xec
||
data
[
1
]
==
0x02
||
data
[
1
]
==
0x8a
||
data
[
1
]
==
0x9e
)
{
return
-
1
;
}
}
}
return
0
;
}
...
...
@@ -344,7 +369,11 @@ static int asus_kbd_set_report(struct hid_device *hdev, u8 *buf, size_t buf_size
if
(
!
dmabuf
)
return
-
ENOMEM
;
ret
=
hid_hw_raw_request
(
hdev
,
FEATURE_KBD_REPORT_ID
,
dmabuf
,
/*
* The report ID should be set from the incoming buffer due to LED and key
* interfaces having different pages
*/
ret
=
hid_hw_raw_request
(
hdev
,
buf
[
0
],
dmabuf
,
buf_size
,
HID_FEATURE_REPORT
,
HID_REQ_SET_REPORT
);
kfree
(
dmabuf
);
...
...
@@ -397,6 +426,51 @@ static int asus_kbd_get_functions(struct hid_device *hdev,
return
ret
;
}
static
int
rog_nkey_led_init
(
struct
hid_device
*
hdev
)
{
u8
buf_init_start
[]
=
{
FEATURE_KBD_LED_REPORT_ID1
,
0xB9
};
u8
buf_init2
[]
=
{
FEATURE_KBD_LED_REPORT_ID1
,
0x41
,
0x53
,
0x55
,
0x53
,
0x20
,
0x54
,
0x65
,
0x63
,
0x68
,
0x2e
,
0x49
,
0x6e
,
0x63
,
0x2e
,
0x00
};
u8
buf_init3
[]
=
{
FEATURE_KBD_LED_REPORT_ID1
,
0x05
,
0x20
,
0x31
,
0x00
,
0x08
};
int
ret
;
hid_info
(
hdev
,
"Asus initialise N-KEY Device"
);
/* The first message is an init start */
ret
=
asus_kbd_set_report
(
hdev
,
buf_init_start
,
sizeof
(
buf_init_start
));
if
(
ret
<
0
)
{
hid_warn
(
hdev
,
"Asus failed to send init start command: %d
\n
"
,
ret
);
return
ret
;
}
/* Followed by a string */
ret
=
asus_kbd_set_report
(
hdev
,
buf_init2
,
sizeof
(
buf_init2
));
if
(
ret
<
0
)
{
hid_warn
(
hdev
,
"Asus failed to send init command 1.0: %d
\n
"
,
ret
);
return
ret
;
}
/* Followed by a string */
ret
=
asus_kbd_set_report
(
hdev
,
buf_init3
,
sizeof
(
buf_init3
));
if
(
ret
<
0
)
{
hid_warn
(
hdev
,
"Asus failed to send init command 1.1: %d
\n
"
,
ret
);
return
ret
;
}
/* begin second report ID with same data */
buf_init2
[
0
]
=
FEATURE_KBD_LED_REPORT_ID2
;
buf_init3
[
0
]
=
FEATURE_KBD_LED_REPORT_ID2
;
ret
=
asus_kbd_set_report
(
hdev
,
buf_init2
,
sizeof
(
buf_init2
));
if
(
ret
<
0
)
{
hid_warn
(
hdev
,
"Asus failed to send init command 2.0: %d
\n
"
,
ret
);
return
ret
;
}
ret
=
asus_kbd_set_report
(
hdev
,
buf_init3
,
sizeof
(
buf_init3
));
if
(
ret
<
0
)
hid_warn
(
hdev
,
"Asus failed to send init command 2.1: %d
\n
"
,
ret
);
return
ret
;
}
static
void
asus_kbd_backlight_set
(
struct
led_classdev
*
led_cdev
,
enum
led_brightness
brightness
)
{
...
...
@@ -460,19 +534,25 @@ static int asus_kbd_register_leds(struct hid_device *hdev)
unsigned
char
kbd_func
;
int
ret
;
/* Initialize keyboard */
ret
=
asus_kbd_init
(
hdev
);
if
(
ret
<
0
)
return
ret
;
if
(
drvdata
->
quirks
&
QUIRK_ROG_NKEY_KEYBOARD
)
{
ret
=
rog_nkey_led_init
(
hdev
);
if
(
ret
<
0
)
return
ret
;
}
else
{
/* Initialize keyboard */
ret
=
asus_kbd_init
(
hdev
);
if
(
ret
<
0
)
return
ret
;
/* Get keyboard functions */
ret
=
asus_kbd_get_functions
(
hdev
,
&
kbd_func
);
if
(
ret
<
0
)
return
ret
;
/* Get keyboard functions */
ret
=
asus_kbd_get_functions
(
hdev
,
&
kbd_func
);
if
(
ret
<
0
)
return
ret
;
/* Check for backlight support */
if
(
!
(
kbd_func
&
SUPPORT_KBD_BACKLIGHT
))
return
-
ENODEV
;
/* Check for backlight support */
if
(
!
(
kbd_func
&
SUPPORT_KBD_BACKLIGHT
))
return
-
ENODEV
;
}
drvdata
->
kbd_backlight
=
devm_kzalloc
(
&
hdev
->
dev
,
sizeof
(
struct
asus_kbd_leds
),
...
...
@@ -751,8 +831,8 @@ static int asus_input_mapping(struct hid_device *hdev,
usage
->
hid
==
(
HID_UP_GENDEVCTRLS
|
0x0026
)))
return
-
1
;
/* ASUS-specific keyboard hotkeys */
if
((
usage
->
hid
&
HID_USAGE_PAGE
)
==
0xff310000
)
{
/* ASUS-specific keyboard hotkeys
and led backlight
*/
if
((
usage
->
hid
&
HID_USAGE_PAGE
)
==
HID_UP_ASUSVENDOR
)
{
switch
(
usage
->
hid
&
HID_USAGE
)
{
case
0x10
:
asus_map_key_clear
(
KEY_BRIGHTNESSDOWN
);
break
;
case
0x20
:
asus_map_key_clear
(
KEY_BRIGHTNESSUP
);
break
;
...
...
@@ -780,6 +860,18 @@ static int asus_input_mapping(struct hid_device *hdev,
/* Fn+F5 "fan" symbol on FX503VD */
case
0x99
:
asus_map_key_clear
(
KEY_PROG4
);
break
;
/* Fn+F5 "fan" symbol on N-Key keyboard */
case
0xae
:
asus_map_key_clear
(
KEY_PROG4
);
break
;
/* Fn+Ret "Calc" symbol on N-Key keyboard */
case
0x92
:
asus_map_key_clear
(
KEY_CALC
);
break
;
/* Fn+Left Aura mode previous on N-Key keyboard */
case
0xb2
:
asus_map_key_clear
(
KEY_PROG2
);
break
;
/* Fn+Right Aura mode next on N-Key keyboard */
case
0xb3
:
asus_map_key_clear
(
KEY_PROG3
);
break
;
default:
/* ASUS lazily declares 256 usages, ignore the rest,
* as some make the keyboard appear as a pointer device. */
...
...
@@ -1126,6 +1218,9 @@ static const struct hid_device_id asus_devices[] = {
{
HID_USB_DEVICE
(
USB_VENDOR_ID_ASUSTEK
,
USB_DEVICE_ID_ASUSTEK_FX503VD_KEYBOARD
),
QUIRK_USE_KBD_BACKLIGHT
},
{
HID_USB_DEVICE
(
USB_VENDOR_ID_ASUSTEK
,
USB_DEVICE_ID_ASUSTEK_ROG_NKEY_KEYBOARD
),
QUIRK_USE_KBD_BACKLIGHT
|
QUIRK_ROG_NKEY_KEYBOARD
},
{
HID_USB_DEVICE
(
USB_VENDOR_ID_ASUSTEK
,
USB_DEVICE_ID_ASUSTEK_T100TA_KEYBOARD
),
QUIRK_T100_KEYBOARD
|
QUIRK_NO_CONSUMER_USAGES
},
...
...
drivers/hid/hid-ids.h
View file @
90c5f464
...
...
@@ -190,6 +190,7 @@
#define USB_DEVICE_ID_ASUSTEK_ROG_KEYBOARD1 0x1854
#define USB_DEVICE_ID_ASUSTEK_ROG_KEYBOARD2 0x1837
#define USB_DEVICE_ID_ASUSTEK_ROG_KEYBOARD3 0x1822
#define USB_DEVICE_ID_ASUSTEK_ROG_NKEY_KEYBOARD 0x1866
#define USB_DEVICE_ID_ASUSTEK_FX503VD_KEYBOARD 0x1869
#define USB_VENDOR_ID_ATEN 0x0557
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment