add: readme
This commit is contained in:
parent
6eb74aad46
commit
2f1f11d1bb
21
README.md
Normal file
21
README.md
Normal file
@ -0,0 +1,21 @@
|
||||
# KernelPatch / APatch - Android Generic BT Keyboard Fix
|
||||
|
||||
### Description
|
||||
|
||||
This is a [KernelPatch](https://github.com/bmax121/KernelPatch) / [APatch](https://github.com/bmax121/APatch) module used to fix an
|
||||
issue with the Samsung Galaxy Tab S7 on some kernels where a Bluetooth keyboard connects but fails to work.
|
||||
|
||||
The underlying issue is that some cheap keyboards report their USB Vendor ID as `0x04E8` and Product ID as `0x7021`, which is the
|
||||
same as a Samsung Wireless Keyboard. This causes the Samsung HID driver to claim the device, which doesn't support the keyboard properly.
|
||||
|
||||
This patch blocks the Samsung driver from matching these devices and prevents custom quirks from being applied, allowing the generic HID driver to handle them instead.
|
||||
|
||||
### Installation
|
||||
|
||||
Install the patch by copying the `sam_hid_kbd_rem.kpm` file to your device, opening APatch, and loading/installing the module.
|
||||
|
||||
### Kernel Patch
|
||||
|
||||
You can also patch the kernel directly by applying the provided patch file `sam_hid_kbd_rem.patch`. At the time of writing this, the patch was
|
||||
applied to the [LineageOS/android_kernel_samsung_sm8250](https://github.com/LineageOS/android_kernel_samsung_sm8250/tree/8acbe9760ef02f0d044c0f0ec1bb469fa383fb07)
|
||||
at hash `8acbe9760ef02f0d044c0f0ec1bb469fa383fb07`.
|
145
sam_hid_kbd_rem.patch
Normal file
145
sam_hid_kbd_rem.patch
Normal file
@ -0,0 +1,145 @@
|
||||
diff --git i/drivers/hid/hid-quirks.c w/drivers/hid/hid-quirks.c
|
||||
index f30faf09823c..2a8334e66db3 100644
|
||||
--- i/drivers/hid/hid-quirks.c
|
||||
+++ w/drivers/hid/hid-quirks.c
|
||||
@@ -638,7 +638,6 @@ static const struct hid_device_id hid_have_special_driver[] = {
|
||||
#if IS_ENABLED(CONFIG_HID_SAMSUNG)
|
||||
{ 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) },
|
||||
{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SAMSUNG_ELECTRONICS, USB_DEVICE_ID_SAMSUNG_WIRELESS_GAMEPAD) },
|
||||
{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SAMSUNG_ELECTRONICS, USB_DEVICE_ID_SAMSUNG_WIRELESS_ACTIONMOUSE) },
|
||||
{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SAMSUNG_ELECTRONICS, USB_DEVICE_ID_SAMSUNG_WIRELESS_BOOKCOVER) },
|
||||
diff --git i/drivers/hid/hid-samsung.c w/drivers/hid/hid-samsung.c
|
||||
index 75825e3dd26b..4e2ce1476981 100644
|
||||
--- i/drivers/hid/hid-samsung.c
|
||||
+++ w/drivers/hid/hid-samsung.c
|
||||
@@ -130,110 +130,6 @@ 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 */
|
||||
-#ifdef CONFIG_HID_KK_UPGRADE
|
||||
- case 0x32:
|
||||
- samsung_kbd_mouse_map_key_clear(KEY_KBDILLUMTOGGLE);
|
||||
- break;
|
||||
- case 0x64:
|
||||
- samsung_kbd_mouse_map_key_clear(KEY_BACKSLASH);
|
||||
- break;
|
||||
-#else
|
||||
- case 0x32:
|
||||
- samsung_kbd_mouse_map_key_clear(KEY_BACKSLASH);
|
||||
- break;
|
||||
- case 0x64:
|
||||
- samsung_kbd_mouse_map_key_clear(KEY_102ND);
|
||||
- break;
|
||||
-#endif
|
||||
- /* 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 int samsung_gamepad_input_mapping(struct hid_device *hdev,
|
||||
struct hid_input *hi, struct hid_field *field, struct hid_usage *usage,
|
||||
unsigned long **bit, int *max)
|
||||
@@ -499,9 +395,6 @@ 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 (hdev->product == USB_DEVICE_ID_SAMSUNG_WIRELESS_KBD)
|
||||
- ret = samsung_kbd_input_mapping(hdev,
|
||||
- hi, field, usage, bit, max);
|
||||
else if (hdev->product == USB_DEVICE_ID_SAMSUNG_WIRELESS_GAMEPAD)
|
||||
ret = samsung_gamepad_input_mapping(hdev,
|
||||
hi, field, usage, bit, max);
|
||||
@@ -555,7 +448,6 @@ static int samsung_probe(struct hid_device *hdev,
|
||||
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) },
|
||||
{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SAMSUNG_ELECTRONICS, USB_DEVICE_ID_SAMSUNG_WIRELESS_GAMEPAD) },
|
||||
{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SAMSUNG_ELECTRONICS, USB_DEVICE_ID_SAMSUNG_WIRELESS_ACTIONMOUSE) },
|
||||
{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SAMSUNG_ELECTRONICS, USB_DEVICE_ID_SAMSUNG_WIRELESS_UNIVERSAL_KBD) },
|
Loading…
x
Reference in New Issue
Block a user