138 lines
4.3 KiB
Diff
138 lines
4.3 KiB
Diff
diff --git a/drivers/usb/gadget/android.c b/drivers/usb/gadget/android.c
|
|
index ced63c82ae7..41ac7ac18ca 100644
|
|
--- a/drivers/usb/gadget/android.c
|
|
+++ b/drivers/usb/gadget/android.c
|
|
@@ -55,20 +55,21 @@
|
|
#include "u_ctrl_hsic.c"
|
|
#include "u_data_hsic.c"
|
|
#include "u_ctrl_hsuart.c"
|
|
#include "u_data_hsuart.c"
|
|
#include "f_ccid.c"
|
|
#include "f_mtp.c"
|
|
#include "f_accessory.c"
|
|
#include "f_hid.h"
|
|
#include "f_hid_android_keyboard.c"
|
|
#include "f_hid_android_mouse.c"
|
|
+#include "f_hid_android_u2f.c"
|
|
#include "f_rndis.c"
|
|
#include "rndis.c"
|
|
#include "f_qc_ecm.c"
|
|
#include "f_mbim.c"
|
|
#include "f_qc_rndis.c"
|
|
#include "u_data_ipa.c"
|
|
#include "u_bam_data.c"
|
|
#include "f_ecm.c"
|
|
#include "u_ether.c"
|
|
#include "u_qc_ether.c"
|
|
@@ -2855,21 +2856,21 @@ static int uasp_function_bind_config(struct android_usb_function *f,
|
|
|
|
static struct android_usb_function uasp_function = {
|
|
.name = "uasp",
|
|
.init = uasp_function_init,
|
|
.cleanup = uasp_function_cleanup,
|
|
.bind_config = uasp_function_bind_config,
|
|
};
|
|
|
|
static int hid_function_init(struct android_usb_function *f, struct usb_composite_dev *cdev)
|
|
{
|
|
- return ghid_setup(cdev->gadget, 2);
|
|
+ return ghid_setup(cdev->gadget, 3);
|
|
}
|
|
|
|
static void hid_function_cleanup(struct android_usb_function *f)
|
|
{
|
|
ghid_cleanup();
|
|
}
|
|
|
|
static int hid_function_bind_config(struct android_usb_function *f, struct usb_configuration *c)
|
|
{
|
|
int ret;
|
|
@@ -2878,20 +2879,26 @@ static int hid_function_bind_config(struct android_usb_function *f, struct usb_c
|
|
if (ret) {
|
|
pr_info("%s: hid_function_bind_config keyboard failed: %d\n", __func__, ret);
|
|
return ret;
|
|
}
|
|
printk(KERN_INFO "hid mouse\n");
|
|
ret = hidg_bind_config(c, &ghid_device_android_mouse, 1);
|
|
if (ret) {
|
|
pr_info("%s: hid_function_bind_config mouse failed: %d\n", __func__, ret);
|
|
return ret;
|
|
}
|
|
+ printk(KERN_INFO "hid u2f\n");
|
|
+ ret = hidg_bind_config(c, &ghid_device_android_u2f, 2);
|
|
+ if (ret) {
|
|
+ pr_info("%s: hid_function_bind_config u2f failed: %d\n", __func__, ret);
|
|
+ return ret;
|
|
+ }
|
|
return 0;
|
|
}
|
|
|
|
static struct android_usb_function hid_function = {
|
|
.name = "hid",
|
|
.init = hid_function_init,
|
|
.cleanup = hid_function_cleanup,
|
|
.bind_config = hid_function_bind_config,
|
|
};
|
|
|
|
diff --git a/drivers/usb/gadget/f_hid.c b/drivers/usb/gadget/f_hid.c
|
|
index 155d9fb3a08..117bc00feac 100644
|
|
--- a/drivers/usb/gadget/f_hid.c
|
|
+++ b/drivers/usb/gadget/f_hid.c
|
|
@@ -57,21 +57,21 @@ struct f_hidg {
|
|
int minor;
|
|
struct cdev cdev;
|
|
struct usb_function func;
|
|
|
|
struct usb_ep *in_ep;
|
|
struct usb_ep *out_ep;
|
|
};
|
|
|
|
/* Hacky device list to fix f_hidg_write being called after device destroyed.
|
|
It covers only most common race conditions, there will be rare crashes anyway. */
|
|
-enum { HACKY_DEVICE_LIST_SIZE = 4 };
|
|
+enum { HACKY_DEVICE_LIST_SIZE = 6 };
|
|
static struct f_hidg *hacky_device_list[HACKY_DEVICE_LIST_SIZE];
|
|
static void hacky_device_list_add(struct f_hidg *hidg)
|
|
{
|
|
int i;
|
|
for (i = 0; i < HACKY_DEVICE_LIST_SIZE; i++) {
|
|
if (!hacky_device_list[i]) {
|
|
hacky_device_list[i] = hidg;
|
|
return;
|
|
}
|
|
}
|
|
diff --git a/drivers/usb/gadget/f_hid_android_u2f.c b/drivers/usb/gadget/f_hid_android_u2f.c
|
|
new file mode 100644
|
|
index 00000000000..950c244e032
|
|
--- /dev/null
|
|
+++ b/drivers/usb/gadget/f_hid_android_u2f.c
|
|
@@ -0,0 +1,28 @@
|
|
+#include <linux/platform_device.h>
|
|
+#include <linux/usb/g_hid.h>
|
|
+
|
|
+/* HID descriptor for a mouse */
|
|
+static struct hidg_func_descriptor ghid_device_android_u2f = {
|
|
+ .subclass = 0x01, /* Boot Interface Subclass */
|
|
+ .protocol = 0x00, /* Raw HID */
|
|
+ .report_length = 512,
|
|
+ .report_desc_length = 34,
|
|
+ .report_desc = {
|
|
+ 0x06, 0xD0, 0xF1, // Usage Page (FIDO Usage Page)
|
|
+ 0x09, 0x01, // Usage (FIDO Usage U2F HID)
|
|
+ 0xA1, 0x01, // Collection (Application)
|
|
+ 0x09, 0x20, // Usage (FIDO Usage Data In)
|
|
+ 0x15, 0x00, // Logical Minimum (0)
|
|
+ 0x26, 0xFF, 0x00, // Logical Maximum (255)
|
|
+ 0x75, 0x08, // Report Size (8)
|
|
+ 0x95, 0x40, // Report Count (HID Input Report Bytes)
|
|
+ 0x81, 0x02, // Input (HID Data & HID Absolute & HID Variable)
|
|
+ 0x09, 0x21, // Usage (FIDO Usage Data Out)
|
|
+ 0x15, 0x00, // Logical Minimum (0)
|
|
+ 0x26, 0xFF, 0x00, // Logical Maximum (255)
|
|
+ 0x75, 0x08, // Report Size (8)
|
|
+ 0x95, 0x40, // Report Count (HID Output Report Bytes)
|
|
+ 0x91, 0x02, // Output (HID Data & HID Absolute & HID Variable)
|
|
+ 0xC0 // End Collection
|
|
+ }
|
|
+};
|