@@ -346,6 +346,129 @@ static int samsung_actionmouse_input_mapping(struct hid_device *hdev,
346
346
return 1 ;
347
347
}
348
348
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
+
349
472
static __u8 * samsung_report_fixup (struct hid_device * hdev , __u8 * rdesc ,
350
473
unsigned int * rsize )
351
474
{
@@ -372,6 +495,12 @@ static int samsung_input_mapping(struct hid_device *hdev, struct hid_input *hi,
372
495
else if (hdev -> product == USB_DEVICE_ID_SAMSUNG_WIRELESS_ACTIONMOUSE )
373
496
ret = samsung_actionmouse_input_mapping (hdev ,
374
497
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 );
375
504
376
505
return ret ;
377
506
}
@@ -417,6 +546,8 @@ static const struct hid_device_id samsung_devices[] = {
417
546
{ HID_BLUETOOTH_DEVICE (USB_VENDOR_ID_SAMSUNG_ELECTRONICS , USB_DEVICE_ID_SAMSUNG_WIRELESS_KBD ) },
418
547
{ HID_BLUETOOTH_DEVICE (USB_VENDOR_ID_SAMSUNG_ELECTRONICS , USB_DEVICE_ID_SAMSUNG_WIRELESS_GAMEPAD ) },
419
548
{ 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 ) },
420
551
{ }
421
552
};
422
553
MODULE_DEVICE_TABLE (hid , samsung_devices );
0 commit comments