Skip to content

Commit e729004

Browse files
Sandeep C SJiri Kosina
authored andcommitted
HID: samsung: Add Samsung wireless bookcover and universal keyboard support
Add support for samsung wireless bookcover and universal keyboard with input mapping events. Device a005 (Samsung wireless bookcover keyboard). Device a006 (Samsung wireless universal keyboard). Device a064 (Samsung wireless multi hogp keyboard). Signed-off-by: Sandeep C S <[email protected]> Signed-off-by: Junwan Cho <[email protected]> Signed-off-by: Jitender Sajwan <[email protected]> Signed-off-by: Gwangho Lee <[email protected]> Signed-off-by: Jiri Kosina <[email protected]>
1 parent 46e779b commit e729004

File tree

2 files changed

+134
-0
lines changed

2 files changed

+134
-0
lines changed

drivers/hid/hid-ids.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1149,6 +1149,9 @@
11491149
#define USB_DEVICE_ID_SAMSUNG_WIRELESS_KBD 0x7021
11501150
#define USB_DEVICE_ID_SAMSUNG_WIRELESS_GAMEPAD 0xa000
11511151
#define USB_DEVICE_ID_SAMSUNG_WIRELESS_ACTIONMOUSE 0xa004
1152+
#define USB_DEVICE_ID_SAMSUNG_WIRELESS_BOOKCOVER 0xa005
1153+
#define USB_DEVICE_ID_SAMSUNG_WIRELESS_UNIVERSAL_KBD 0xa006
1154+
#define USB_DEVICE_ID_SAMSUNG_WIRELESS_MULTI_HOGP_KBD 0xa064
11521155

11531156
#define USB_VENDOR_ID_SEMICO 0x1a2c
11541157
#define USB_DEVICE_ID_SEMICO_USB_KEYKOARD 0x0023

drivers/hid/hid-samsung.c

Lines changed: 131 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -346,6 +346,129 @@ static int samsung_actionmouse_input_mapping(struct hid_device *hdev,
346346
return 1;
347347
}
348348

349+
static int samsung_universal_kbd_input_mapping(struct hid_device *hdev,
350+
struct hid_input *hi, struct hid_field *field, struct hid_usage *usage,
351+
unsigned long **bit, int *max)
352+
{
353+
if (!(HID_UP_CONSUMER == (usage->hid & HID_USAGE_PAGE) ||
354+
HID_UP_KEYBOARD == (usage->hid & HID_USAGE_PAGE)))
355+
return 0;
356+
357+
dbg_hid("samsung wireless keyboard input mapping event [0x%x]\n",
358+
usage->hid & HID_USAGE);
359+
360+
if (HID_UP_KEYBOARD == (usage->hid & HID_USAGE_PAGE)) {
361+
set_bit(EV_REP, hi->input->evbit);
362+
switch (usage->hid & HID_USAGE) {
363+
case 0x32:
364+
samsung_kbd_mouse_map_key_clear(KEY_BACKSLASH);
365+
break;
366+
case 0x64:
367+
samsung_kbd_mouse_map_key_clear(KEY_102ND);
368+
break;
369+
/* Only for BR keyboard */
370+
case 0x87:
371+
samsung_kbd_mouse_map_key_clear(KEY_RO);
372+
break;
373+
default:
374+
return 0;
375+
}
376+
}
377+
378+
if (HID_UP_CONSUMER == (usage->hid & HID_USAGE_PAGE)) {
379+
switch (usage->hid & HID_USAGE) {
380+
/* report 2 */
381+
/* MENU */
382+
case 0x040:
383+
samsung_kbd_mouse_map_key_clear(KEY_MENU);
384+
break;
385+
case 0x18a:
386+
samsung_kbd_mouse_map_key_clear(KEY_MAIL);
387+
break;
388+
case 0x196:
389+
samsung_kbd_mouse_map_key_clear(KEY_WWW);
390+
break;
391+
case 0x19e:
392+
samsung_kbd_mouse_map_key_clear(KEY_SCREENLOCK);
393+
break;
394+
case 0x221:
395+
samsung_kbd_mouse_map_key_clear(KEY_SEARCH);
396+
break;
397+
case 0x223:
398+
samsung_kbd_mouse_map_key_clear(KEY_HOMEPAGE);
399+
break;
400+
/* RECENTAPPS */
401+
case 0x301:
402+
samsung_kbd_mouse_map_key_clear(BTN_TRIGGER_HAPPY1);
403+
break;
404+
/* APPLICATION */
405+
case 0x302:
406+
samsung_kbd_mouse_map_key_clear(BTN_TRIGGER_HAPPY2);
407+
break;
408+
/* Voice search */
409+
case 0x305:
410+
samsung_kbd_mouse_map_key_clear(BTN_TRIGGER_HAPPY4);
411+
break;
412+
/* QPANEL on/off */
413+
case 0x306:
414+
samsung_kbd_mouse_map_key_clear(BTN_TRIGGER_HAPPY5);
415+
break;
416+
/* SIP on/off */
417+
case 0x307:
418+
samsung_kbd_mouse_map_key_clear(BTN_TRIGGER_HAPPY3);
419+
break;
420+
/* LANG */
421+
case 0x308:
422+
samsung_kbd_mouse_map_key_clear(KEY_LANGUAGE);
423+
break;
424+
case 0x30a:
425+
samsung_kbd_mouse_map_key_clear(KEY_BRIGHTNESSDOWN);
426+
break;
427+
case 0x070:
428+
samsung_kbd_mouse_map_key_clear(KEY_BRIGHTNESSDOWN);
429+
break;
430+
case 0x30b:
431+
samsung_kbd_mouse_map_key_clear(KEY_BRIGHTNESSUP);
432+
break;
433+
case 0x06f:
434+
samsung_kbd_mouse_map_key_clear(KEY_BRIGHTNESSUP);
435+
break;
436+
/* S-Finder */
437+
case 0x304:
438+
samsung_kbd_mouse_map_key_clear(BTN_TRIGGER_HAPPY7);
439+
break;
440+
/* Screen Capture */
441+
case 0x303:
442+
samsung_kbd_mouse_map_key_clear(KEY_SYSRQ);
443+
break;
444+
/* Multi Window */
445+
case 0x309:
446+
samsung_kbd_mouse_map_key_clear(BTN_TRIGGER_HAPPY9);
447+
break;
448+
/* HotKey App 1 */
449+
case 0x071:
450+
samsung_kbd_mouse_map_key_clear(0x2f5);
451+
break;
452+
/* HotKey App 2 */
453+
case 0x072:
454+
samsung_kbd_mouse_map_key_clear(0x2f6);
455+
break;
456+
/* HotKey App 3 */
457+
case 0x073:
458+
samsung_kbd_mouse_map_key_clear(0x2f7);
459+
break;
460+
/* Dex */
461+
case 0x06e:
462+
samsung_kbd_mouse_map_key_clear(0x2bd);
463+
break;
464+
default:
465+
return 0;
466+
}
467+
}
468+
469+
return 1;
470+
}
471+
349472
static __u8 *samsung_report_fixup(struct hid_device *hdev, __u8 *rdesc,
350473
unsigned int *rsize)
351474
{
@@ -372,6 +495,12 @@ static int samsung_input_mapping(struct hid_device *hdev, struct hid_input *hi,
372495
else if (hdev->product == USB_DEVICE_ID_SAMSUNG_WIRELESS_ACTIONMOUSE)
373496
ret = samsung_actionmouse_input_mapping(hdev,
374497
hi, field, usage, bit, max);
498+
else if (hdev->product == USB_DEVICE_ID_SAMSUNG_WIRELESS_UNIVERSAL_KBD)
499+
ret = samsung_universal_kbd_input_mapping(hdev,
500+
hi, field, usage, bit, max);
501+
else if (hdev->product == USB_DEVICE_ID_SAMSUNG_WIRELESS_MULTI_HOGP_KBD)
502+
ret = samsung_universal_kbd_input_mapping(hdev,
503+
hi, field, usage, bit, max);
375504

376505
return ret;
377506
}
@@ -417,6 +546,8 @@ static const struct hid_device_id samsung_devices[] = {
417546
{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SAMSUNG_ELECTRONICS, USB_DEVICE_ID_SAMSUNG_WIRELESS_KBD) },
418547
{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SAMSUNG_ELECTRONICS, USB_DEVICE_ID_SAMSUNG_WIRELESS_GAMEPAD) },
419548
{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SAMSUNG_ELECTRONICS, USB_DEVICE_ID_SAMSUNG_WIRELESS_ACTIONMOUSE) },
549+
{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SAMSUNG_ELECTRONICS, USB_DEVICE_ID_SAMSUNG_WIRELESS_UNIVERSAL_KBD) },
550+
{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SAMSUNG_ELECTRONICS, USB_DEVICE_ID_SAMSUNG_WIRELESS_MULTI_HOGP_KBD) },
420551
{ }
421552
};
422553
MODULE_DEVICE_TABLE(hid, samsung_devices);

0 commit comments

Comments
 (0)