From 09d6c2e5235ab7ef933780288f2747fccc2f8c39 Mon Sep 17 00:00:00 2001 From: YOUR_NAME Date: Fri, 6 Aug 2021 09:34:08 +0000 Subject: [PATCH] add rocker&encoder Signed-off-by: YOUR_NAME --- linux-4.19/hi3516dv300_small_patch/hdf.patch | 241 ++++++++++++++++++ .../hi3516dv300_small.patch | 212 --------------- 2 files changed, 241 insertions(+), 212 deletions(-) diff --git a/linux-4.19/hi3516dv300_small_patch/hdf.patch b/linux-4.19/hi3516dv300_small_patch/hdf.patch index 32adadc..7250aef 100644 --- a/linux-4.19/hi3516dv300_small_patch/hdf.patch +++ b/linux-4.19/hi3516dv300_small_patch/hdf.patch @@ -72,4 +72,245 @@ index 000000000000..cb247a4d855c \ No newline at end of file -- 2.25.1 +diff --git a/include/linux/hid.h b/include/linux/hid.h +index a46b6832b373..c61a17de5eb5 100644 +--- a/include/linux/hid.h ++++ b/include/linux/hid.h +@@ -621,6 +621,7 @@ struct hid_device { /* device report descriptor */ + struct list_head debug_list; + spinlock_t debug_list_lock; + wait_queue_head_t debug_wait; ++ void *input_dev; + }; + + #define to_hid_device(pdev) \ +diff --git a/drivers/hid/Makefile b/drivers/hid/Makefile +index bd7ac53b7..d7efd1e3d 100644 +--- a/drivers/hid/Makefile ++++ b/drivers/hid/Makefile +@@ -2,6 +2,15 @@ + # + # Makefile for the HID driver + # ++HDF_ROOT_DIR = -Idrivers/hdf ++ccflags-$(CONFIG_DRIVERS_HDF_INPUT) += $(HDF_ROOT_DIR)/framework/model/input/driver \ ++ $(HDF_ROOT_DIR)/framework/include/core \ ++ $(HDF_ROOT_DIR)/framework/core/common/include/host \ ++ $(HDF_ROOT_DIR)/framework/include/utils \ ++ $(HDF_ROOT_DIR)/framework/include/osal \ ++ $(HDF_ROOT_DIR)/framework/ability/sbuf/include \ ++ $(HDF_ROOT_DIR)/khdf/osal/include \ ++ -I../../../../../third_party/FreeBSD/sys/dev/evdev + hid-y := hid-core.o hid-input.o hid-quirks.o + hid-$(CONFIG_DEBUG_FS) += hid-debug.o + +diff --git a/drivers/hid/hid-input.c b/drivers/hid/hid-input.c +index 11bd2ca22..6f7805698 100644 +--- a/drivers/hid/hid-input.c ++++ b/drivers/hid/hid-input.c +@@ -32,6 +32,10 @@ + #include + #include + ++#if defined(CONFIG_DRIVERS_HDF_INPUT) ++#include "hdf_hid_adapter.h" ++#endif ++ + #include "hid-ids.h" + + #define unk KEY_UNKNOWN +@@ -1365,7 +1369,15 @@ void hidinput_report_event(struct hid_device *hid, struct hid_report *report) + return; + + list_for_each_entry(hidinput, &hid->inputs, list) ++#if defined(CONFIG_DRIVERS_HDF_INPUT) ++ { ++#endif + input_sync(hidinput->input); ++#if defined(CONFIG_DRIVERS_HDF_INPUT) ++ if(hid->input_dev) ++ HidReportEvent(hid->input_dev, EV_SYN, SYN_REPORT, 0); ++ } ++#endif + } + EXPORT_SYMBOL_GPL(hidinput_report_event); + +@@ -1729,6 +1741,35 @@ static inline void hidinput_configure_usages(struct hid_input *hidinput, + report->field[i]->usage + j); + } + ++#if defined(CONFIG_DRIVERS_HDF_INPUT) ++static void transfer_info(struct input_dev *dev) ++{ ++ HidInfo *info = (HidInfo *)kmalloc(sizeof(HidInfo),GFP_KERNEL); ++ if (info == NULL) { ++ printk("%s: malloc failed\n",__func__); ++ return; ++ } ++ info->devName = dev->name; ++ memcpy(info->devProp, dev->propbit, sizeof(unsigned long) * BITS_TO_LONGS(INPUT_PROP_CNT)); ++ memcpy(info->eventType, dev->evbit, sizeof(unsigned long) * BITS_TO_LONGS(EV_CNT)); ++ memcpy(info->keyCode, dev->keybit, sizeof(unsigned long) * BITS_TO_LONGS(KEY_CNT)); ++ memcpy(info->relCode, dev->relbit, sizeof(unsigned long) * BITS_TO_LONGS(REL_CNT)); ++ memcpy(info->absCode, dev->absbit, sizeof(unsigned long) * BITS_TO_LONGS(ABS_CNT)); ++ memcpy(info->miscCode, dev->mscbit, sizeof(unsigned long) * BITS_TO_LONGS(MSC_CNT)); ++ memcpy(info->ledCode, dev->ledbit, sizeof(unsigned long) * BITS_TO_LONGS(LED_CNT)); ++ memcpy(info->soundCode, dev->sndbit, sizeof(unsigned long) * BITS_TO_LONGS(SND_CNT)); ++ memcpy(info->forceCode, dev->ffbit, sizeof(unsigned long) * BITS_TO_LONGS(FF_CNT)); ++ memcpy(info->switchCode, dev->swbit, sizeof(unsigned long) * BITS_TO_LONGS(SW_CNT)); ++ info->bustype = dev->id.bustype; ++ info->vendor = dev->id.vendor; ++ info->product = dev->id.product; ++ info->version = dev->id.version; ++ SendInfoToHdf(info); ++ kfree(info); ++ info = NULL; ++} ++#endif ++ + /* + * Register the input device; print a message. + * Configure the input layer interface +@@ -1811,7 +1852,9 @@ int hidinput_connect(struct hid_device *hid, unsigned int force) + hidinput_cleanup_hidinput(hid, hidinput); + continue; + } +- ++#if defined(CONFIG_DRIVERS_HDF_INPUT) ++ transfer_info(hidinput->input); ++#endif + if (input_register_device(hidinput->input)) + goto out_unwind; + hidinput->registered = true; +diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c +index bde5cef32..f524af2a7 100644 +--- a/drivers/hid/hid-core.c ++++ b/drivers/hid/hid-core.c +@@ -36,6 +36,9 @@ + #include + #include + ++#if defined(CONFIG_DRIVERS_HDF_INPUT) ++#include "hdf_hid_adapter.h" ++#endif + #include "hid-ids.h" + + /* +@@ -1340,6 +1343,11 @@ static void hid_process_event(struct hid_device *hid, struct hid_field *field, + hidinput_hid_event(hid, field, usage, value); + if (hid->claimed & HID_CLAIMED_HIDDEV && interrupt && hid->hiddev_hid_event) + hid->hiddev_hid_event(hid, field, usage, value); ++#if defined(CONFIG_DRIVERS_HDF_INPUT) ++ if (hid->input_dev) { ++ HidReportEvent(hid->input_dev, usage->type, usage->code, value); ++ } ++#endif + } + + /* +@@ -1743,6 +1751,71 @@ static const struct device_attribute dev_attr_country = { + .show = show_country, + }; + ++#if defined(CONFIG_DRIVERS_HDF_INPUT) ++static bool check_mouse(char *name) ++{ ++ static char *option[]={"Mouse", "mouse", "MOUSE", "Razer"}; ++ for (int i = 0; i < 4; i++) { ++ if (strstr(name, option[i])) ++ return true; ++ } ++ return false; ++} ++static bool check_kbd(char *name) ++{ ++ static char *option[]={"Keyboard", "keyboard"}; ++ for (int i = 0; i < 2; i++) { ++ if (strstr(name, option[i])) ++ return true; ++ } ++ return false; ++} ++static bool check_rocker(char *name) ++{ ++ static char *option[]={"Thrustmaster"}; ++ for (int i = 0; i < 1; i++) { ++ if (strstr(name, option[i])) ++ return true; ++ } ++ return false; ++} ++static bool check_encoder(char *name) ++{ ++ if (strcmp(name, "Wired KeyBoard") == 0) { ++ return true; ++ } ++ return false; ++} ++static void notify_connect_event(struct hid_device *hdev) ++{ ++ bool check; ++ int type = -1; ++ HidInfo *dev = (HidInfo *)kmalloc(sizeof(HidInfo), GFP_KERNEL); ++ if (dev == NULL) { ++ printk("%s: malloc failed", __func__); ++ return; ++ } ++ type = check_mouse(hdev->name)?HID_TYPE_MOUSE:type; ++ type = check_kbd(hdev->name)?HID_TYPE_KEYBOARD:type; ++ type = check_rocker(hdev->name)?HID_TYPE_ROCKER:type; ++ type = check_encoder(hdev->name)?HID_TYPE_ENCODER:type; ++ if ( type < 0) { ++ kfree(dev); ++ dev = NULL; ++ return; ++ } ++ ++ dev->devType = type; ++ dev->devName = hdev->name; ++ hdev->input_dev = HidRegisterHdfInputDev(dev); ++ if (hdev->input_dev == NULL) { ++ printk("%s: RegisterInputDevice failed\n", __func__); ++ } ++ kfree(dev); ++ dev = NULL; ++} ++#endif ++ + int hid_connect(struct hid_device *hdev, unsigned int connect_mask) + { + static const char *types[] = { "Device", "Pointer", "Mouse", "Device", +@@ -1832,6 +1905,9 @@ int hid_connect(struct hid_device *hdev, unsigned int connect_mask) + hid_info(hdev, "%s: %s HID v%x.%02x %s [%s] on %s\n", + buf, bus, hdev->version >> 8, hdev->version & 0xff, + type, hdev->name, hdev->phys); ++#if defined(CONFIG_DRIVERS_HDF_INPUT) ++ notify_connect_event(hdev); ++#endif + + return 0; + } +@@ -1847,6 +1923,10 @@ void hid_disconnect(struct hid_device *hdev) + if (hdev->claimed & HID_CLAIMED_HIDRAW) + hidraw_disconnect(hdev); + hdev->claimed = 0; ++#if defined(CONFIG_DRIVERS_HDF_INPUT) ++ if (hdev->input_dev) ++ HidUnregisterHdfInputDev(hdev->input_dev); ++#endif + } + EXPORT_SYMBOL_GPL(hid_disconnect); + +@@ -1931,6 +2011,11 @@ EXPORT_SYMBOL_GPL(hid_hw_open); + */ + void hid_hw_close(struct hid_device *hdev) + { ++#if defined(CONFIG_DRIVERS_HDF_INPUT) ++ if (hdev->input_dev) { ++ return; ++ } ++#endif + mutex_lock(&hdev->ll_open_lock); + if (!--hdev->ll_open_count) + hdev->ll_driver->close(hdev); diff --git a/linux-4.19/hi3516dv300_small_patch/hi3516dv300_small.patch b/linux-4.19/hi3516dv300_small_patch/hi3516dv300_small.patch index 1a912b6..fd00982 100644 --- a/linux-4.19/hi3516dv300_small_patch/hi3516dv300_small.patch +++ b/linux-4.19/hi3516dv300_small_patch/hi3516dv300_small.patch @@ -362567,18 +362567,6 @@ index 000000000000..3a7fad239b09 +#endif /* CONFIG_CMA */ + +#endif -diff --git a/include/linux/hid.h b/include/linux/hid.h -index a46b6832b373..c61a17de5eb5 100644 ---- a/include/linux/hid.h -+++ b/include/linux/hid.h -@@ -621,6 +621,7 @@ struct hid_device { /* device report descriptor */ - struct list_head debug_list; - spinlock_t debug_list_lock; - wait_queue_head_t debug_wait; -+ void *input_dev; - }; - - #define to_hid_device(pdev) \ diff --git a/include/linux/hiedmac.h b/include/linux/hiedmac.h new file mode 100644 index 000000000000..26157899aec8 @@ -364589,204 +364577,4 @@ index 67048f922ff2..e950f32243b6 100755 ipv6_route_test|ipv6_rt) ipv6_route_test;; ipv4_route_test|ipv4_rt) ipv4_route_test;; ipv6_addr_metric) ipv6_addr_metric_test;; -diff --git a/drivers/hid/Makefile b/drivers/hid/Makefile -index bd7ac53b7..d7efd1e3d 100644 ---- a/drivers/hid/Makefile -+++ b/drivers/hid/Makefile -@@ -2,6 +2,15 @@ - # - # Makefile for the HID driver - # -+HDF_ROOT_DIR = -Idrivers/hdf -+ccflags-$(CONFIG_DRIVERS_HDF_INPUT) += $(HDF_ROOT_DIR)/framework/model/input/driver \ -+ $(HDF_ROOT_DIR)/framework/include/core \ -+ $(HDF_ROOT_DIR)/framework/core/common/include/host \ -+ $(HDF_ROOT_DIR)/framework/include/utils \ -+ $(HDF_ROOT_DIR)/framework/include/osal \ -+ $(HDF_ROOT_DIR)/framework/ability/sbuf/include \ -+ $(HDF_ROOT_DIR)/khdf/osal/include \ -+ -I../../../../../third_party/FreeBSD/sys/dev/evdev - hid-y := hid-core.o hid-input.o hid-quirks.o - hid-$(CONFIG_DEBUG_FS) += hid-debug.o - -diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c -index 05122167d..94cfdfbbf 100644 ---- a/drivers/hid/hid-core.c -+++ b/drivers/hid/hid-core.c -@@ -36,6 +36,9 @@ - #include - #include - -+#if defined(CONFIG_DRIVERS_HDF_INPUT) -+#include "hdf_hid_adapter.h" -+#endif - #include "hid-ids.h" - - /* -@@ -1340,6 +1343,11 @@ static void hid_process_event(struct hid_device *hid, struct hid_field *field, - hidinput_hid_event(hid, field, usage, value); - if (hid->claimed & HID_CLAIMED_HIDDEV && interrupt && hid->hiddev_hid_event) - hid->hiddev_hid_event(hid, field, usage, value); -+#if defined(CONFIG_DRIVERS_HDF_INPUT) -+ if (hid->input_dev) { -+ HidReportEvent(hid->input_dev, usage->type, usage->code, value); -+ } -+#endif - } - - /* -@@ -1743,6 +1751,53 @@ static const struct device_attribute dev_attr_country = { - .show = show_country, - }; - -+#if defined(CONFIG_DRIVERS_HDF_INPUT) -+static bool check_mouse(char *name) -+{ -+ static char *option[]={"Mouse", "mouse", "MOUSE", "Razer"}; -+ for (int i = 0; i < 4; i++) { -+ if (strstr(name, option[i])) -+ return true; -+ } -+ return false; -+} -+static bool check_kbd(char *name) -+{ -+ static char *option[]={"Keyboard", "keyboard"}; -+ for (int i = 0; i < 2; i++) { -+ if (strstr(name, option[i])) -+ return true; -+ } -+ return false; -+} -+static void notify_connect_event(struct hid_device *hdev) -+{ -+ bool check; -+ int type = -1; -+ HidInfo *dev = (HidInfo *)kmalloc(sizeof(HidInfo), GFP_KERNEL); -+ if (dev == NULL) { -+ printk("%s: malloc failed", __func__); -+ return; -+ } -+ type = check_mouse(hdev->name)?HID_TYPE_MOUSE:type; -+ type = check_kbd(hdev->name)?HID_TYPE_KEYBOARD:type; -+ if ( type < 0) { -+ kfree(dev); -+ dev = NULL; -+ return; -+ } -+ -+ dev->devType = type; -+ dev->devName = hdev->name; -+ hdev->input_dev = HidRegisterHdfInputDev(dev); -+ if (hdev->input_dev == NULL) { -+ printk("%s: RegisterInputDevice failed\n", __func__); -+ } -+ kfree(dev); -+ dev = NULL; -+} -+#endif -+ - int hid_connect(struct hid_device *hdev, unsigned int connect_mask) - { - static const char *types[] = { "Device", "Pointer", "Mouse", "Device", -@@ -1833,6 +1888,10 @@ int hid_connect(struct hid_device *hdev, unsigned int connect_mask) - buf, bus, hdev->version >> 8, hdev->version & 0xff, - type, hdev->name, hdev->phys); - -+#if defined(CONFIG_DRIVERS_HDF_INPUT) -+ notify_connect_event(hdev); -+#endif -+ - return 0; - } - EXPORT_SYMBOL_GPL(hid_connect); -@@ -1847,6 +1906,10 @@ void hid_disconnect(struct hid_device *hdev) - if (hdev->claimed & HID_CLAIMED_HIDRAW) - hidraw_disconnect(hdev); - hdev->claimed = 0; -+#if defined(CONFIG_DRIVERS_HDF_INPUT) -+ if (hdev->input_dev) -+ HidUnregisterHdfInputDev(hdev->input_dev); -+#endif - } - EXPORT_SYMBOL_GPL(hid_disconnect); - -diff --git a/drivers/hid/hid-input.c b/drivers/hid/hid-input.c -index 11bd2ca22..6f7805698 100644 ---- a/drivers/hid/hid-input.c -+++ b/drivers/hid/hid-input.c -@@ -32,6 +32,10 @@ - #include - #include - -+#if defined(CONFIG_DRIVERS_HDF_INPUT) -+#include "hdf_hid_adapter.h" -+#endif -+ - #include "hid-ids.h" - - #define unk KEY_UNKNOWN -@@ -1365,7 +1369,15 @@ void hidinput_report_event(struct hid_device *hid, struct hid_report *report) - return; - - list_for_each_entry(hidinput, &hid->inputs, list) -+#if defined(CONFIG_DRIVERS_HDF_INPUT) -+ { -+#endif - input_sync(hidinput->input); -+#if defined(CONFIG_DRIVERS_HDF_INPUT) -+ if(hid->input_dev) -+ HidReportEvent(hid->input_dev, EV_SYN, SYN_REPORT, 0); -+ } -+#endif - } - EXPORT_SYMBOL_GPL(hidinput_report_event); - -@@ -1729,6 +1741,35 @@ static inline void hidinput_configure_usages(struct hid_input *hidinput, - report->field[i]->usage + j); - } - -+#if defined(CONFIG_DRIVERS_HDF_INPUT) -+static void transfer_info(struct input_dev *dev) -+{ -+ HidInfo *info = (HidInfo *)kmalloc(sizeof(HidInfo),GFP_KERNEL); -+ if (info == NULL) { -+ printk("%s: malloc failed\n",__func__); -+ return; -+ } -+ info->devName = dev->name; -+ memcpy(info->devProp, dev->propbit, sizeof(unsigned long) * BITS_TO_LONGS(INPUT_PROP_CNT)); -+ memcpy(info->eventType, dev->evbit, sizeof(unsigned long) * BITS_TO_LONGS(EV_CNT)); -+ memcpy(info->keyCode, dev->keybit, sizeof(unsigned long) * BITS_TO_LONGS(KEY_CNT)); -+ memcpy(info->relCode, dev->relbit, sizeof(unsigned long) * BITS_TO_LONGS(REL_CNT)); -+ memcpy(info->absCode, dev->absbit, sizeof(unsigned long) * BITS_TO_LONGS(ABS_CNT)); -+ memcpy(info->miscCode, dev->mscbit, sizeof(unsigned long) * BITS_TO_LONGS(MSC_CNT)); -+ memcpy(info->ledCode, dev->ledbit, sizeof(unsigned long) * BITS_TO_LONGS(LED_CNT)); -+ memcpy(info->soundCode, dev->sndbit, sizeof(unsigned long) * BITS_TO_LONGS(SND_CNT)); -+ memcpy(info->forceCode, dev->ffbit, sizeof(unsigned long) * BITS_TO_LONGS(FF_CNT)); -+ memcpy(info->switchCode, dev->swbit, sizeof(unsigned long) * BITS_TO_LONGS(SW_CNT)); -+ info->bustype = dev->id.bustype; -+ info->vendor = dev->id.vendor; -+ info->product = dev->id.product; -+ info->version = dev->id.version; -+ SendInfoToHdf(info); -+ kfree(info); -+ info = NULL; -+} -+#endif -+ - /* - * Register the input device; print a message. - * Configure the input layer interface -@@ -1811,7 +1852,9 @@ int hidinput_connect(struct hid_device *hid, unsigned int force) - hidinput_cleanup_hidinput(hid, hidinput); - continue; - } -- -+#if defined(CONFIG_DRIVERS_HDF_INPUT) -+ transfer_info(hidinput->input); -+#endif - if (input_register_device(hidinput->input)) - goto out_unwind; - hidinput->registered = true; -- Gitee