hid.h 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. #pragma once
  2. #include <common/stddef.h>
  3. #define __HID_USAGE_TABLE_SIZE 64 // usage stack的大小
  4. #define HID_MAX_REPORT 300 // 最大允许的hid report数目(包括feature、input、output)
  5. #define HID_MAX_PATH_SIZE 16 // maximum depth for path
  6. // 这部分请参考hid_1_11.pdf Section 6.2.2.4
  7. #define HID_ITEM_COLLECTION 0xA0
  8. #define HID_ITEM_END_COLLECTION 0xC0
  9. #define HID_ITEM_FEATURE 0xB0
  10. #define HID_ITEM_INPUT 0x80
  11. #define HID_ITEM_OUTPUT 0x90
  12. /**
  13. * @brief 枚举hid的usage page列表。
  14. * 原始数据请见<HID Usage Tables FOR Universal Serial Bus (USB)>。
  15. * 该文件可从usb.org下载
  16. */
  17. enum HID_USAGE_PAGE_TYPES
  18. {
  19. HID_USAGE_PAGE_GEN_DESKTOP = 0x1,
  20. HID_USAGE_PAGE_SIMU_CTRL, // simulation controls
  21. HID_USAGE_PAGE_VR_CTRL, // vr controls page
  22. HID_USAGE_PAGE_SPORT_CTRL, // sport controls
  23. HID_USAGE_PAGE_GAME_CTRL, // game controls
  24. HID_USAGE_PAGE_GEN_DEVICE_CTRL, // general device controls
  25. HID_USAGE_PAGE_KBD_KPD, // keyboard/ keypad page
  26. HID_USAGE_PAGE_LED, // LED
  27. HID_USAGE_PAGE_BUTTON, // button page
  28. HID_USAGE_PAGE_ORDINAL, // ordinal page
  29. HID_USAGE_PAGE_TEL_DEVICE, // telephony device
  30. HID_USAGE_PAGE_CONSUMER, // consumer page
  31. HID_USAGE_PAGE_DIGITIZER, // digitizers page
  32. HID_USAGE_PAGE_HAPTICS, // haptics page
  33. HID_USAGE_PAGE_PHY_INPUT_DEVICE, // physical input device page
  34. HID_USAGE_PAGE_UNICODE = 0x10, // unicode page
  35. HID_USAGE_PAGE_EYE_HEAD_TRACKER = 0x12, // eye and head trackers page
  36. HID_USAGE_PAGE_AUX_DISPLAY = 0x14, // auxiliary display page
  37. HID_USAGE_PAGE_SENSORS = 0x20, // sensors page
  38. HID_USAGE_PAGE_MEDICAL = 0x40, // medical instruments
  39. HID_USAGE_PAGE_BRAILLE_DISPLAY, // barille display
  40. HID_USAGE_PAGE_LIGHTNING_ILLU = 0x59, // lighting and illumination page
  41. HID_USAGE_PAGE_MONITOR = 0x80, // monitor page
  42. HID_USAGE_PAGE_MONITOR_ENUMERATED, // monitor enumerated page
  43. HID_USAGE_PAGE_VESA_VIRT_CTRL, // VESA virtual controls page
  44. HID_USAGE_PAGE_POWER = 0x84, // power page
  45. HID_USAGE_PAGE_BATTERY_SYSTEM, // battery system page
  46. HID_USAGE_PAGE_BARCODE_SCANNER = 0x8c, // barcode scanner page
  47. HID_USAGE_PAGE_SCALES, // scales page
  48. HID_USAGE_PAGE_MAGNET_STRIPE_READER, // magnetic stript reader page
  49. HID_USAGE_PAGE_CAMERA_CONTROL = 0x90, // camera control page
  50. HID_USAGE_PAGE_ARCADE, // arcade page
  51. HID_USAGE_PAGE_GAMING_DEVICE, // gaming device page
  52. HID_USAGE_PAGE_FIDO_ALLIANCE = 0xf1d0, // FIDO alliance page
  53. };
  54. /**
  55. * @brief usage type for HID_USAGE_PAGE_GEN_DESKTOP page
  56. *
  57. */
  58. enum USAGE_TYPE_GENDESK
  59. {
  60. HID_USAGE_GENDESK_UNDEF = 0, // undefined
  61. HID_USAGE_GENDESK_POINTER,
  62. HID_USAGE_GENDESK_MOUSE,
  63. HID_USAGE_GENDESK_KEYBOARD = 0x6,
  64. HID_USAGE_GENDESK_POINTER_X = 0x30,
  65. HID_USAGE_GENDESK_POINTER_Y,
  66. HID_USAGE_GENDESK_WHEEL = 0x38,
  67. HID_USAGE_GENDESK_NOTHING = 0xff,
  68. };
  69. /**
  70. * @brief 描述hid path中的一个节点
  71. *
  72. */
  73. struct hid_node_t
  74. {
  75. int u_page;
  76. int usage;
  77. };
  78. /**
  79. * @brief 描述一条hid path
  80. *
  81. */
  82. struct hid_path_t
  83. {
  84. int size; // 路径中的节点数目
  85. struct hid_node_t node[HID_MAX_PATH_SIZE];
  86. };
  87. /**
  88. * @brief Describe a HID Data with its location in report
  89. *
  90. */
  91. struct hid_data_t
  92. {
  93. int value; // hid对象的值
  94. struct hid_path_t path; // hid path
  95. int report_count; // count of reports for this usage type
  96. int offset; // offset of data in report
  97. int size; // size of data in bits
  98. uint8_t report_id; // report id(from incoming report)
  99. uint8_t type; // 数据类型:FEATURE / INPUT / OUTPUT
  100. uint8_t attribute; // report field attribute. (2 = (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position))
  101. // (6 = (Data,Var,Rel,No Wrap,Linear,Preferred State,No Null Position))
  102. int8_t unit_exp; // unit exponent;
  103. uint32_t unit; // HID unit
  104. int logical_min; // Logical min
  105. int logical_max; // Logical max
  106. int phys_min; // Physical min
  107. int phys_max; // Physical max
  108. };
  109. /**
  110. * @brief hid解析器
  111. *
  112. */
  113. struct hid_parser
  114. {
  115. const uint8_t *report_desc; // 指向report descriptor的指针
  116. int report_desc_size; // report descriptor的大小(字节)
  117. int pos; // report_desc中,当前正在处理的位置
  118. uint8_t item; // 暂存当前的item
  119. uint32_t value; // 暂存当前的值
  120. struct hid_data_t data; // 存储当前的环境
  121. int offset_table[HID_MAX_REPORT][3]; // 存储 hid report的ID、type、offset
  122. int report_count; // hid report的数量
  123. int count; // local items的计数
  124. uint32_t u_page;
  125. struct hid_node_t usage_table[__HID_USAGE_TABLE_SIZE]; // Usage stack
  126. int usage_size; // usage的数量
  127. int usage_min;
  128. int usage_max;
  129. int cnt_objects; // report descriptor中的对象数目
  130. int cnt_report; // report desc中的report数目
  131. };
  132. struct hid_usage_types_string
  133. {
  134. int value;
  135. const char *string;
  136. };
  137. struct hid_usage_pages_string
  138. {
  139. int value;
  140. struct hid_usage_types_string *types;
  141. const char *string;
  142. };
  143. int hid_parse_report(const void *report_data, const int len);
  144. bool hid_parse_find_object(const void *hid_report, const int report_size, struct hid_data_t *data);