查看: 385|回复: 3

[hi3531/hi3535/hi3536] 用3536做的hid不能同时注册鼠标和键盘驱动。

[复制链接]
发表于 2018-7-12 19:34:40 | 显示全部楼层 |阅读模式
小弟使用3536做Gadget的hid,参考了网上的代码
  1. /* hid descriptor for a keyboard */
  2. static struct hidg_func_descriptor pcdm8168_keyboard_data = {
  3.     .subclass        = 0, /* No subclass */
  4.     .protocol        = 1, /* Keyboard */
  5.     .report_length        = 8,
  6.     .report_desc_length    = 63,
  7.     .report_desc        = {
  8.         0x05, 0x01,    /* USAGE_PAGE (Generic Desktop)     */
  9.         0x09, 0x06,    /* USAGE (Keyboard) */
  10.         0xa1, 0x01,    /* COLLECTION (Application) */
  11.         0x05, 0x07,    /* USAGE_PAGE (Keyboard) */
  12.         0x19, 0xe0,    /* USAGE_MINIMUM (Keyboard LeftControl) */
  13.         0x29, 0xe7,    /* USAGE_MAXIMUM (Keyboard Right GUI) */
  14.         0x15, 0x00,    /* LOGICAL_MINIMUM (0) */
  15.         0x25, 0x01,    /* LOGICAL_MAXIMUM (1) */
  16.         0x75, 0x01,    /* REPORT_SIZE (1) */
  17.         0x95, 0x08,    /* REPORT_COUNT (8) */
  18.         0x81, 0x02,    /* INPUT (Data,Var,Abs) */
  19.         0x95, 0x01,    /* REPORT_COUNT (1) */
  20.         0x75, 0x08,    /* REPORT_SIZE (8) */
  21.         0x81, 0x03,    /* INPUT (Cnst,Var,Abs) */
  22.         0x95, 0x05,    /* REPORT_COUNT (5) */
  23.         0x75, 0x01,    /* REPORT_SIZE (1) */
  24.         0x05, 0x08,    /* USAGE_PAGE (LEDs) */
  25.         0x19, 0x01,    /* USAGE_MINIMUM (Num Lock) */
  26.         0x29, 0x05,    /* USAGE_MAXIMUM (Kana) */
  27.         0x91, 0x02,    /* OUTPUT (Data,Var,Abs) */
  28.         0x95, 0x01,    /* REPORT_COUNT (1) */
  29.         0x75, 0x03,    /* REPORT_SIZE (3) */
  30.         0x91, 0x03,    /* OUTPUT (Cnst,Var,Abs) */
  31.         0x95, 0x06,    /* REPORT_COUNT (6) */
  32.         0x75, 0x08,    /* REPORT_SIZE (8) */
  33.         0x15, 0x00,    /* LOGICAL_MINIMUM (0) */
  34.         0x25, 0x65,    /* LOGICAL_MAXIMUM (101) */
  35.         0x05, 0x07,    /* USAGE_PAGE (Keyboard) */
  36.         0x19, 0x00,    /* USAGE_MINIMUM (Reserved) */
  37.         0x29, 0x65,    /* USAGE_MAXIMUM (Keyboard Application) */
  38.         0x81, 0x00,    /* INPUT (Data,Ary,Abs) */
  39.         0xc0        /* END_COLLECTION */
  40.     }
  41. };
  42. /*hid descriptor for a mouse*/
  43. static struct hidg_func_descriptor pcdm8168_mouse_data = {
  44.     .subclass = 0,  /*NO SubClass*/
  45.     .protocol = 2,  /*Mouse*/
  46.     .report_length = 4,
  47.     .report_desc_length = 52,
  48.     .report_desc={
  49.         0x05, 0x01,  /*Usage Page (Generic Desktop Controls)*/
  50.         0x09, 0x02,  /*Usage (Mouse)*/
  51.         0xa1, 0x01,  /*Collction (Application)*/
  52.         0x09, 0x01,  /*Usage (pointer)*/
  53.         0xa1, 0x00,  /*Collction (Physical)*/
  54.         0x05, 0x09,  /*Usage Page (Button)*/
  55.         0x19, 0x01,  /*Usage Minimum(1)*/
  56.         0x29, 0x03,  /*Usage Maximum(3) */
  57.         0x15, 0x00,  /*Logical Minimum(1)*/
  58.         0x25, 0x01,  /*Logical Maximum(1)*/
  59.         0x95, 0x03,  /*Report Count(5)  */
  60.         0x75, 0x01,  /*Report Size(1)*/
  61.         0x81, 0x02,  /*Input(Data,Variable,Absolute,BitFiled)*/
  62.         0x95, 0x01,  /*Report Count(1)*/
  63.         0x75, 0x05,  /*Report Size(5) */
  64.         0x81, 0x01,  /*Input(Constant,Array,Absolute,BitFiled) */
  65.         0x05, 0x01,  /*Usage Page (Generic Desktop Controls)*/
  66.         0x09, 0x30,  /*Usage(x)*/
  67.         0x09, 0x31,  /*Usage(y)*/
  68.         0x09, 0x38,  /*Usage(Wheel)*/
  69.         0x15, 0x81,  /*Logical Minimum(-127)*/
  70.         0x25, 0x7f,  /*Logical Maximum(127)*/
  71.         0x75, 0x08,  /*Report Size(8)*/
  72.         0x95, 0x02,  /*Report Count(2)  */
  73.         0x81, 0x06,  /*Input(Data,Variable,Relative,BitFiled)*/
  74.         0xc0,   /*End Collection*/
  75.         0xc0    /*End Collection*/
  76.     }
  77. };

  78. static struct platform_device pcdm8168_hid_keyboard = {
  79.     .name = "hidg",
  80.     .id            = 0,
  81.     .num_resources = 0,
  82.     .resource    = 0,
  83.     .dev.platform_data = &pcdm8168_keyboard_data,
  84. };

  85. static struct platform_device pcdm8168_hid_mouse = {
  86.     .name = "hidg",
  87.     .id            = 1,
  88.     .num_resources = 0,
  89.     .resource    = 0,
  90.     .dev.platform_data = &pcdm8168_mouse_data,
  91. };

  92. static int __init hidg_init(void)
  93. {
  94.         int status;

  95.     status = platform_device_register(&pcdm8168_hid_keyboard);
  96.     if (status < 0)
  97.     {
  98.         printk("platform_driver hid keyboard:*****wrong\n");
  99.         platform_device_unregister(&pcdm8168_hid_keyboard);
  100.         return status;
  101.     }

  102.     status = platform_device_register(&pcdm8168_hid_mouse);
  103.     if (status < 0)
  104.     {
  105.         printk("platform_driver hid mouse:*****wrong\n");      
  106.         platform_device_unregister(&pcdm8168_hid_mouse);   
  107.         return status;
  108.     }

  109.         status = platform_driver_probe(&hidg_plat_driver,
  110.                                 hidg_plat_driver_probe);
  111.         if (status < 0)
  112.                 return status;

  113.         status = usb_composite_probe(&hidg_driver);
  114.         if (status < 0)
  115.                 platform_driver_unregister(&hidg_plat_driver);

  116.         return status;
  117. }
  118. module_init(hidg_init);

  119. static void __exit hidg_cleanup(void)
  120. {
  121.     platform_driver_unregister(&hidg_plat_driver);
  122.     platform_device_unregister(&pcdm8168_hid_keyboard);
  123.     platform_device_unregister(&pcdm8168_hid_mouse);       
  124.     usb_composite_unregister(&hidg_driver);       
  125. }
  126. module_exit(hidg_cleanup);
复制代码

但是某一时刻只能注册一个键盘或者鼠标设备。要是像上面的代码注册两个设备会出现
g_hid gadget: hidg_bind FAILED
WARN::dwc_otg_pcd_ep_dequeue:2364: bad argument

insmod: can't insert 'g_hid.ko': No such device
的错误,由于查看比较早的版本文档有usb device的寄存器描述的,但是比较新的文档没有。
所以小弟按照早期的文档修改了寄存器改为USB device模式himm 0x1212007C 0x1001B3A0。但是只能单独使用鼠标或者使用键盘。小弟跟了代码发现似乎是USB端点不足,不知道是不是寄存器没设置对还是代码没写对,hid.c的代码没改什么就是加了上面的代码而已。
求做过的大神帮忙指点指点。谢谢了。
发表于 2018-7-12 22:46:03 | 显示全部楼层
USB gadget hid
主要实现让dm8168被识别成鼠标和键盘,以达到可以远程控制和dm8168相连的pc

你是不是想采集电脑的视频还能用3536的usb模拟电脑的鼠标和键盘输入。
哥们你太有材了,我怎么没有想到还有这样的应用。支持你
 楼主| 发表于 2018-7-18 09:36:55 | 显示全部楼层
blacktangel 发表于 2018-7-12 22:46
USB gadget hid
主要实现让dm8168被识别成鼠标和键盘,以达到可以远程控制和dm8168相连的pc

是的大神现在想实现远程控制PC,就像用网线把usb线延长一样,请问3536的能同时实现鼠标和键盘吗?现在已经能实现鼠标或者键盘,网上找的别人是用3519做的。
发表于 2019-3-14 14:11:14 | 显示全部楼层
描述1:
《Hi3536 H.265解码处理器简介.pdf》中描述
2 个USB 2.0 HOST 接口,支持Hub 功能
1 个USB 3.0 HOST 接口,支持Hub 功能
描述2:
《Hi3519V101 专业型HD IP Camera SoC产品简介.pdf》中描述
1个USB3.0/2.0 Host/Device接口

从描述1,描述2得出结论是:3536不支持Device模式。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

© 2008-2017 当前位置 易百纳技术社区论坛 返回 易百纳技术社区 ( 苏ICP备14036084 )   Powered by Discuz! X3.1
快速回复 返回顶部 返回列表