各位大佬有没有解析报告描述符的程序例程?

USB中文网 2021-08-24 15:33:24 编辑

清忱:
这个没有

清忱:
我都是通过反推的

清忱:
你可以看你的是什么设备

清忱:
然后参照HID提供的反解析

清忱:
http://www.usbzh.com/article/detail-13.html

Frogmouth :
如果要兼容不同厂家的hid设备 但是上报的数据格式不同,就得解析报告描述符 不解析的话有什么好办法处理呢

清忱:
没有好的办法,只有解析

Frogmouth :
这个解析不得好复杂好麻烦

crazy_code :
你是要解析所有的HID设备描述符 ?

Frogmouth :
实在不行抓包 每个设备都抓包 然后通过描述符指定设备

Frogmouth :
不用啊 因为我做的事绘画板之类的 只需要他的坐标 压力 这些 但是每个厂家 描述符定义不一样

Frogmouth :
数据上报格式有些许不同

crazy_code :
要是键盘和鼠标的话, 可以通过set protocol命令, 将设备强制到boot模式

crazy_code :
你也可以看看你的设备支不支持boot模式, 要是支持boot模式, 那数据格式就是固定的

Frogmouth :
ok

Frogmouth :
感谢大佬

Frogmouth :
我去看看

crazy_code :
嗯, boot模式就是在bios模式下, 为了简化相关设计, 数据格式固定的


结贴:
本站提供一个WINDOWS版本的HID报告描述符分析工具,下载地址:http://www.usbzh.com/article/detail-537.html

USB中文网 2021-07-07 23:34:02 编辑

感谢本QQ技术交流群LY大佬的分享,本人代笔现将报表描述符的ubuntu解析方法整理如下文所示。

在Linux Ubuntu操作系统下,可使用命令行对插入的设备进行HID报表描述分析.
首先将HID设备接入系统中,使用find命令行列出所设备信息.

如:

find . -name rdesc

则系统会以列表的形式显示含有报表描述符的设备,如

/sys/kernel/debug/hid/0003\:291A\:3301.0003/rdesc

然后使用cat输出报表描述符,输出结果并进行了解析

cat /sys/kernel/debug/hid/0003\:291A\:3301.0003/rdesc 
05 0c 09 01 a1 01 85 01 15 00 25 01 09 e9 09 ea 09 e2 09 cd 09 b5 09 b6 09 b0 09 b1 75 01 95 08 81 42 c0 05 0b 09 01 a1 01 85 02 15 00 25 01 09 20 09 21 09 23 09 2f 75 01 95 04 81 22 95 04 81 01 05 08 85 03 15 00 25 01 09 18 75 01 95 01 91 22 75 07 91 01 85 04 15 00 25 01 09 09 75 01 95 01 91 22 75 07 91 01 85 05 15 00 25 01 09 20 75 01 95 01 91 22 75 07 91 01 85 06 15 00 25 01 09 08 09 17 09 19 09 1a 09 1e 09 1f 09 21 09 22 09 23 09 24 09 25 09 26 75 01 95 0c 91 22 75 07 91 01 c0 

  INPUT(1)[INPUT]
    Field(0)
      Application(Consumer.0001)
      Usage(8)
        Consumer.00e9
        Consumer.00ea
        Consumer.00e2
        Consumer.00cd
        Consumer.00b5
        Consumer.00b6
        Consumer.00b0
        Consumer.00b1
      Logical Minimum(0)
      Logical Maximum(1)
      Report Size(1)
      Report Count(8)
      Report Offset(0)
      Flags( Variable Absolute NullState )
  INPUT(2)[INPUT]
    Field(0)
      Application(000b.0001)
      Usage(4)
        000b.0020
        000b.0021
        000b.0023
        000b.002f
      Logical Minimum(0)
      Logical Maximum(1)
      Report Size(1)
      Report Count(4)
      Report Offset(0)
      Flags( Variable Absolute NoPreferredState )
  OUTPUT(3)[OUTPUT]
    Field(0)
      Application(000b.0001)
      Usage(1)
        LED.0018
      Logical Minimum(0)
      Logical Maximum(1)
      Report Size(1)
      Report Count(1)
      Report Offset(0)
      Flags( Variable Absolute NoPreferredState )
  OUTPUT(4)[OUTPUT]
    Field(0)
      Application(000b.0001)
      Usage(1)
        LED.0009
      Logical Minimum(0)
      Logical Maximum(1)
      Report Size(1)
      Report Count(1)
      Report Offset(0)
      Flags( Variable Absolute NoPreferredState )
  OUTPUT(5)[OUTPUT]
    Field(0)
      Application(000b.0001)
      Usage(1)
        LED.0020
      Logical Minimum(0)
      Logical Maximum(1)
      Report Size(1)
      Report Count(1)
      Report Offset(0)
      Flags( Variable Absolute NoPreferredState )
  OUTPUT(6)[OUTPUT]
    Field(0)
      Application(000b.0001)
      Usage(12)
        LED.0008
        LED.0017
        LED.0019
        LED.001a
        LED.001e
        LED.001f
        LED.0021
        LED.0022
        LED.0023
        LED.0024
        LED.0025
        LED.0026
      Logical Minimum(0)
      Logical Maximum(1)
      Report Size(1)
      Report Count(12)
      Report Offset(0)
      Flags( Variable Absolute NoPreferredState )

    Consumer.00e9 ---> Key.VolumeUp
    Consumer.00ea ---> Key.VolumeDown
    Consumer.00e2 ---> Key.Mute
    Consumer.00cd ---> Key.PlayPause
    Consumer.00b5 ---> Key.NextSong
    Consumer.00b6 ---> Key.PreviousSong
    Consumer.00b0 ---> Key.Play
    Consumer.00b1 ---> Key.Pause
    000b.0020 ---> Sync.Report
    000b.0021 ---> Sync.Report
    000b.0023 ---> Sync.Report
    000b.002f ---> Key.?
    LED.0018 ---> Sync.Report
    LED.0009 ---> LED.Mute
    LED.0020 ---> Sync.Report
    LED.0008 ---> Sync.Report
    LED.0017 ---> Sync.Report
    LED.0019 ---> LED.?
    LED.001a ---> Sync.Report
    LED.001e ---> Sync.Report
    LED.001f ---> Sync.Report
    LED.0021 ---> Sync.Report
    LED.0022 ---> Sync.Report
    LED.0023 ---> Sync.Report
    LED.0024 ---> Sync.Report
    LED.0025 ---> Sync.Report
    LED.0026 ---> Sync.Report

报表描述符解析

参考网址:https://www.slashdev.ca/2010/05/08/get-usb-report-descriptor-with-linux/

USB中文网 2021-06-22 19:41:14 编辑

本人将ReactOS源代码的hidparser.sys源程序移植到应用层了,对http://www.usbzh.com/article/detail-32.html 这个鼠标描述符进行了解析,解析后的结果是

193253597049
从数据长度上来看是正确后,不知道别的是否正常。明天再调试一下。
main.cpp源代码为:


int main()
{
    HIDP_DEVICE_DESC Hidp ;

    UCHAR Report[] = {
     0x05, 0x01, // Global Generic Desktop
         0x09, 0x02, // Local Mouse
         0xa1, 0x01, // Main app collection
         0x09, 0x01, // Local Pointer
         0xa1, 0x00, // Main phy collection
         0x95, 0x03, // Global ReportCount
         0x75, 0x01, // Global ReportSize
         0x05, 0x09, // Global Button
         0x19, 0x01, // Local Usage Min
         0x29, 0x03, // Local Usage Max
         0x15, 0x00, // Global Logical Min
         0x25, 0x01, // Global Logical Max
         0x81, 0x02, // Main Input(Data,Var,Abs)
         0x95, 0x01, // Global ReportCount
         0x75, 0x05, // Global ReportSize
         0x81, 0x03, // Main Input(Cnsr,Var,Abs)
         0x95, 0x03, 0x75, 0x08, // Global ReportCount Global ReportSize
         0x05, 0x01, // Global Generic Desktip
         0x09, 0x30, // Local X
         0x09, 0x31, // Local Y
         0x09, 0x38, // Locak Wheel
         0x15, 0x81, // Global Logical Min
         0x25, 0x7f, // Global Logical Max
         0x81, 0x06, // Main Input(Data,Var,Rel)
         0xc0      // Main End collection
    };

    HidP_GetCollectionDescription((PHIDP_REPORT_DESCRIPTOR)Report, sizeof(Report), 0, &Hidp);
    return 0;
}

工程文件目录文件:

2021/06/22  19:29    <DIR>          .
2021/06/22  19:29    <DIR>          ..
2021/06/22  17:27            23,168 api.cpp
2021/06/22  17:29             7,921 context.cpp
2021/06/22  19:29    <DIR>          Debug
2021/06/22  17:48             8,933 hidp.cpp
2020/04/09  18:06               236 hidp.h
2021/06/22  17:49            34,719 hidparser.cpp
2021/06/22  17:44            10,320 hidparser.h
2021/06/22  17:28             7,623 hidparser.vcxproj
2021/06/22  17:28             1,788 hidparser.vcxproj.filters
2021/06/22  16:59               168 hidparser.vcxproj.user
2021/06/22  19:29             3,007 main.cpp
2021/06/22  17:47            19,933 main.h
2021/06/22  17:48            40,574 parser.cpp
2021/06/22  17:07             8,634 parser.h

什么是hidparser.sys 可参见:http://www.usbzh.com/zone/detail-31.html