@@ -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+
349472static __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};
422553MODULE_DEVICE_TABLE (hid , samsung_devices );
0 commit comments