HID: samsung: Add Samsung wireless keyboard support
authorSandeep C S <sandeep.cs@samsung.com>
Thu, 25 Jan 2024 04:36:26 +0000 (10:06 +0530)
committerJiri Kosina <jkosina@suse.com>
Thu, 25 Jan 2024 08:23:22 +0000 (09:23 +0100)
Add Support for samsung wireless keyboard with input mapping events.

Device 7021 (Samsung wireless keyboard).

Signed-off-by: Sandeep C S <sandeep.cs@samsung.com>
Signed-off-by: Junwan Cho <junwan.cho@samsung.com>
Signed-off-by: Jitender Sajwan <jitender.s21@samsung.com>
Signed-off-by: Jiri Kosina <jkosina@suse.com>
drivers/hid/hid-ids.h
drivers/hid/hid-samsung.c

index fb30e228d35f9a91b6bb395845584d9f073be26c..d7572ab5ea6c098c9e0a52ada6aa7cbb339d9992 100644 (file)
 #define USB_DEVICE_ID_SAITEK_X65       0x0b6a
 
 #define USB_VENDOR_ID_SAMSUNG          0x0419
+#define USB_VENDOR_ID_SAMSUNG_ELECTRONICS              0x04e8
 #define USB_DEVICE_ID_SAMSUNG_IR_REMOTE        0x0001
 #define USB_DEVICE_ID_SAMSUNG_WIRELESS_KBD_MOUSE       0x0600
+#define USB_DEVICE_ID_SAMSUNG_WIRELESS_KBD     0x7021
 
 #define USB_VENDOR_ID_SEMICO                   0x1a2c
 #define USB_DEVICE_ID_SEMICO_USB_KEYKOARD      0x0023
index 97d0bf7d4d7e7d501f56d9ab0e5fece1d7b6eecc..aa8e7805be7615d315564bed446c51a1223886bd 100644 (file)
@@ -139,6 +139,99 @@ static int samsung_kbd_mouse_input_mapping(struct hid_device *hdev,
        return 1;
 }
 
+static int samsung_kbd_input_mapping(struct hid_device *hdev,
+       struct hid_input *hi, struct hid_field *field, struct hid_usage *usage,
+       unsigned long **bit, int *max)
+{
+       if (!(HID_UP_CONSUMER == (usage->hid & HID_USAGE_PAGE) ||
+                       HID_UP_KEYBOARD == (usage->hid & HID_USAGE_PAGE)))
+               return 0;
+
+       dbg_hid("samsung wireless keyboard input mapping event [0x%x]\n",
+               usage->hid & HID_USAGE);
+
+       if (HID_UP_KEYBOARD == (usage->hid & HID_USAGE_PAGE)) {
+               set_bit(EV_REP, hi->input->evbit);
+               switch (usage->hid & HID_USAGE) {
+               case 0x32:
+                       samsung_kbd_mouse_map_key_clear(KEY_BACKSLASH);
+                       break;
+               case 0x64:
+                       samsung_kbd_mouse_map_key_clear(KEY_102ND);
+                       break;
+               /* Only for BR keyboard */
+               case 0x87:
+                       samsung_kbd_mouse_map_key_clear(KEY_RO);
+                       break;
+               default:
+                       return 0;
+               }
+       }
+
+       if (HID_UP_CONSUMER == (usage->hid & HID_USAGE_PAGE)) {
+               switch (usage->hid & HID_USAGE) {
+               /* report 2 */
+               /* MENU */
+               case 0x040:
+                       samsung_kbd_mouse_map_key_clear(KEY_MENU);
+                       break;
+               case 0x18a:
+                       samsung_kbd_mouse_map_key_clear(KEY_MAIL);
+                       break;
+               case 0x196:
+                       samsung_kbd_mouse_map_key_clear(KEY_WWW);
+                       break;
+               case 0x19e:
+                       samsung_kbd_mouse_map_key_clear(KEY_SCREENLOCK);
+                       break;
+               case 0x221:
+                       samsung_kbd_mouse_map_key_clear(KEY_SEARCH);
+                       break;
+               case 0x223:
+                       samsung_kbd_mouse_map_key_clear(KEY_HOMEPAGE);
+                       break;
+               /* Smtart Voice Key */
+               case 0x300:
+                       samsung_kbd_mouse_map_key_clear(BTN_TRIGGER_HAPPY13);
+                       break;
+               /* RECENTAPPS */
+               case 0x301:
+                       samsung_kbd_mouse_map_key_clear(BTN_TRIGGER_HAPPY1);
+                       break;
+               /* APPLICATION */
+               case 0x302:
+                       samsung_kbd_mouse_map_key_clear(BTN_TRIGGER_HAPPY2);
+                       break;
+               /* Voice search */
+               case 0x305:
+                       samsung_kbd_mouse_map_key_clear(BTN_TRIGGER_HAPPY4);
+                       break;
+               /* QPANEL on/off */
+               case 0x306:
+                       samsung_kbd_mouse_map_key_clear(BTN_TRIGGER_HAPPY5);
+                       break;
+               /* SIP on/off */
+               case 0x307:
+                       samsung_kbd_mouse_map_key_clear(BTN_TRIGGER_HAPPY3);
+                       break;
+               /* LANG */
+               case 0x308:
+                       samsung_kbd_mouse_map_key_clear(KEY_LANGUAGE);
+                       break;
+               case 0x30a:
+                       samsung_kbd_mouse_map_key_clear(KEY_BRIGHTNESSDOWN);
+                       break;
+               case 0x30b:
+                       samsung_kbd_mouse_map_key_clear(KEY_BRIGHTNESSUP);
+                       break;
+               default:
+                       return 0;
+               }
+       }
+
+       return 1;
+}
+
 static __u8 *samsung_report_fixup(struct hid_device *hdev, __u8 *rdesc,
        unsigned int *rsize)
 {
@@ -156,6 +249,9 @@ static int samsung_input_mapping(struct hid_device *hdev, struct hid_input *hi,
        if (hdev->product == USB_DEVICE_ID_SAMSUNG_WIRELESS_KBD_MOUSE && hid_is_usb(hdev))
                ret = samsung_kbd_mouse_input_mapping(hdev,
                        hi, field, usage, bit, max);
+       else if (hdev->product == USB_DEVICE_ID_SAMSUNG_WIRELESS_KBD)
+               ret = samsung_kbd_input_mapping(hdev,
+                       hi, field, usage, bit, max);
 
        return ret;
 }
@@ -198,6 +294,7 @@ err_free:
 static const struct hid_device_id samsung_devices[] = {
        { HID_USB_DEVICE(USB_VENDOR_ID_SAMSUNG, USB_DEVICE_ID_SAMSUNG_IR_REMOTE) },
        { HID_USB_DEVICE(USB_VENDOR_ID_SAMSUNG, USB_DEVICE_ID_SAMSUNG_WIRELESS_KBD_MOUSE) },
+       { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SAMSUNG_ELECTRONICS, USB_DEVICE_ID_SAMSUNG_WIRELESS_KBD) },
        { }
 };
 MODULE_DEVICE_TABLE(hid, samsung_devices);