Android平板作为hid设备

有个项目要求平板作为一个扫描枪的hid设备让电脑失败,根据usb设备的文件描述符设置为对应的设备,如下是补丁。

diff --git a/drivers/usb/gadget/android.c b/drivers/usb/gadget/android.c
index f126474..14568c4 100755
--- a/drivers/usb/gadget/android.c
+++ b/drivers/usb/gadget/android.c
@@ -36,6 +36,7 @@
 #include "f_mass_storage.c"
 #include "f_mtp.c"
 #include "f_accessory.c"
+#include "f_hid.c"
 #define USB_ETH_RNDIS y
 #include "f_rndis.c"
 #include "rndis.c"
@@ -1009,6 +1010,81 @@ static struct android_usb_function midi_function = {
        .attributes     = midi_function_attributes,
 };

+static struct hidg_func_descriptor ghid_data = {
+       .subclass = 0,
+       .protocol = 1,
+       .report_length = 8,
+       .report_desc_length = 63,
+       .report_desc = {
+               0x05, 0x01,
+               0x09, 0x06,
+               0xa1, 0x01,
+               0x05, 0x07,
+               0x19, 0xe0,
+               0x29, 0xe7,
+               0x15, 0x00,
+               0x25, 0x01,
+               0x75, 0x01,
+               0x95, 0x08,
+               0x81, 0x02,
+               0x95, 0x01,
+               0x75, 0x08,
+               0x81, 0x03,
+               0x95, 0x05,
+               0x75, 0x01,
+               0x05, 0x08,
+               0x19, 0x01,
+               0x29, 0x05,
+               0x91, 0x02,
+               0x95, 0x01,
+               0x75, 0x03,
+               0x91, 0x03,
+               0x95, 0x06,
+               0x75, 0x08,
+               0x15, 0x00,
+               0x25, 0x65,
+               0x05, 0x07,
+               0x19, 0x00,
+               0x29, 0x65,
+               0x81, 0x00,
+               0xc0
+       }
+};

+
+static int hidg_function_init(struct android_usb_function *f,
+               struct usb_composite_dev *cdev)
+{
+       ghid_setup(cdev->gadget, 2);
+       return 0;
+}
+
+static void hidg_function_cleanup(struct android_usb_function *f)
+{
+       ghid_cleanup();
+       return;
+}
+
+static int hidg_function_bind_config(struct android_usb_function *f,
+               struct usb_configuration *c)
+{
+       if(ghid_data.report_desc_length)
+               hidg_bind_config(c, &ghid_data, 0);
+       return 0;
+}
+static void hidg_function_unbind_config(struct android_usb_function *f,
+               struct usb_configuration *c)
+{
+       return;
+}
+
+static struct android_usb_function hidg_function = {
+       .name           = "hidg",
+       .init           = hidg_function_init,
+       .cleanup        = hidg_function_cleanup,
+       .bind_config    = hidg_function_bind_config,
+       .unbind_config  = hidg_function_unbind_config,
+};
+
 static struct android_usb_function *supported_functions[] = {
        &ffs_function,
        &acm_function,
@@ -1019,6 +1095,7 @@ static struct android_usb_function *supported_functions[] = {
        &accessory_function,
        &audio_source_function,
        &midi_function,
+       &hidg_function,
        NULL
 };

diff --git a/drivers/usb/gadget/f_hid.c b/drivers/usb/gadget/f_hid.c
index 6e69a8e..d7205b6 100644
--- a/drivers/usb/gadget/f_hid.c
+++ b/drivers/usb/gadget/f_hid.c
@@ -560,7 +560,7 @@ const struct file_operations f_hidg_fops = {
        .llseek         = noop_llseek,
 };

-static int __init hidg_bind(struct usb_configuration *c, struct usb_function *f)
+static int hidg_bind(struct usb_configuration *c, struct usb_function *f)

 {
        struct usb_ep           *ep;
        struct f_hidg           *hidg = func_to_hidg(f);
@@ -689,8 +689,8 @@ static struct usb_gadget_strings *ct_func_strings[] = {
 /*-------------------------------------------------------------------------*/
 /*                             usb_configuration                           */

-int __init hidg_bind_config(struct usb_configuration *c,
-                           struct hidg_func_descriptor *fdesc, int index)
+int hidg_bind_config(struct usb_configuration *c,
+            struct hidg_func_descriptor *fdesc, int index)
 {
        struct f_hidg *hidg;
        int status;
@@ -743,7 +743,7 @@ int __init hidg_bind_config(struct usb_configuration *c,
        return status;
 }

-int __init ghid_setup(struct usb_gadget *g, int count)
+int ghid_setup(struct usb_gadget *g, int count)
 {
        int status;
        dev_t dev;
 

diff --git a/init.rk30board.usb.rc b/init.rk30board.usb.rc
old mode 100644
new mode 100755
index 6640910..613f3f9
--- a/init.rk30board.usb.rc
+++ b/init.rk30board.usb.rc
@@ -139,4 +139,12 @@ on property:sys.usb.config=rndis,dm
     write /sys/class/android_usb/android0/functions ${sys.usb.config}
     write /sys/class/android_usb/android0/enable 1
     setprop sys.usb.state ${sys.usb.config}
+
+on property:sys.usb.config=hidg
+       write /sys/class/android_usb/android0/enable 0
+       write /sys/class/android_usb/android0/idVendor 0471
+       write /sys/class/android_usb/android0/idProduct e002
+       write /sys/class/android_usb/android0/functions ${sys.usb.config}
+       write /sys/class/android_usb/android0/enable 1
+       setprop sys.usb.state ${sys.usb.config}

diff --git a/ueventd.rockchip.rc b/ueventd.rockchip.rc
index cc1f393..3428fcf 100644
--- a/ueventd.rockchip.rc
+++ b/ueventd.rockchip.rc
@@ -49,13 +49,13 @@
+/dev/hidg0              0666   radio           radio
+/dev/ttyACM0            0666   radio        radio
 

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Android 编程中连接 HID 设备,需要使用 USB Host API。以下是一个简单的示例代码,可以帮助你开始: ```java public class MainActivity extends AppCompatActivity { private static final String TAG = "HID Demo"; private static final int VID = 0x1234; // Vendor ID of your HID device private static final int PID = 0x5678; // Product ID of your HID device private UsbManager mUsbManager; private UsbDevice mDevice; private UsbDeviceConnection mConnection; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mUsbManager = (UsbManager) getSystemService(Context.USB_SERVICE); // Find the HID device by vendor ID and product ID for (UsbDevice device : mUsbManager.getDeviceList().values()) { if (device.getVendorId() == VID && device.getProductId() == PID) { mDevice = device; break; } } if (mDevice == null) { Log.e(TAG, "HID device not found!"); return; } // Request permission to access the HID device PendingIntent permissionIntent = PendingIntent.getBroadcast(this, 0, new Intent("com.example.hid.USB_PERMISSION"), 0); mUsbManager.requestPermission(mDevice, permissionIntent); // Open the HID device connection mConnection = mUsbManager.openDevice(mDevice); if (mConnection == null) { Log.e(TAG, "Failed to open HID device!"); return; } // Claim the HID interface UsbInterface intf = mDevice.getInterface(0); mConnection.claimInterface(intf, true); // Start reading input reports from the HID device byte[] buffer = new byte[intf.getEndpoint(0).getMaxPacketSize()]; UsbRequest request = new UsbRequest(); request.initialize(mConnection, intf.getEndpoint(0)); request.queue(buffer, buffer.length); while (true) { UsbRequest response = mConnection.requestWait(); if (response != null && response.getEndpoint() == intf.getEndpoint(0)) { Log.i(TAG, "Received HID input report: " + Arrays.toString(buffer)); request.queue(buffer, buffer.length); } } } } ``` 在这个示例代码中,我们首先使用 USB Host API 找到 HID 设备,然后请求访问权限、打开设备连接、声明接口,并开始读取输入报告。你需要根据你的 HID 设备的 VID 和 PID 更新代码中的常量。注意,这个示例仅仅是一个起步示例,你需要根据你的具体需求进行更多的定制和调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值