diff options
Diffstat (limited to 'drivers/hid/hid-samsung.c')
-rw-r--r-- | drivers/hid/hid-samsung.c | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/drivers/hid/hid-samsung.c b/drivers/hid/hid-samsung.c index 3c1fd8a..3d19fd4 100644 --- a/drivers/hid/hid-samsung.c +++ b/drivers/hid/hid-samsung.c @@ -131,6 +131,61 @@ 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)) { + switch (usage->hid & HID_USAGE) { + set_bit(EV_REP, hi->input->evbit); + /* Only for UK keyboard */ + /* key found */ + case 0x32: samsung_kbd_mouse_map_key_clear(KEY_KBDILLUMTOGGLE); break; + case 0x64: samsung_kbd_mouse_map_key_clear(KEY_BACKSLASH); 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; + /* 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) { @@ -148,6 +203,9 @@ static int samsung_input_mapping(struct hid_device *hdev, struct hid_input *hi, if (USB_DEVICE_ID_SAMSUNG_WIRELESS_KBD_MOUSE == hdev->product) ret = samsung_kbd_mouse_input_mapping(hdev, hi, field, usage, bit, max); + else if (USB_DEVICE_ID_SAMSUNG_WIRELESS_KBD == hdev->product) + ret = samsung_kbd_input_mapping(hdev, + hi, field, usage, bit, max); return ret; } @@ -186,6 +244,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); |