HidSpec.h 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329
  1. /*
  2. ********************************************************************************
  3. * USB Hid Driver
  4. *
  5. * (c) Copyright 2006-2010, All winners Co,Ld.
  6. * All Right Reserved
  7. *
  8. * FileName : HidSpec.h
  9. *
  10. * Author : Javen
  11. *
  12. * Date : 2010.06.02
  13. *
  14. * Description : Hid 协议相关
  15. *
  16. * Others : NULL
  17. *
  18. * History:
  19. * <time> <version > <author> <desc>
  20. * 2010.06.02 1.0 Javen build this file
  21. *
  22. ********************************************************************************
  23. */
  24. #ifndef __HIDPUB_H__
  25. #define __HIDPUB_H__
  26. #define __packed __attribute__((__packed__))
  27. //----------------------------------------------------------------------
  28. // Hid Class descriptor
  29. //----------------------------------------------------------------------
  30. /* Sub Class */
  31. #define USB_HID_SUBCLASS_NONE 0x00
  32. #define USB_HID_SUBCLASS_BOOT_INTERFACE 0x01
  33. /* Protocol */
  34. #define USB_HID_PROTOCOL_NONE 0x00
  35. #define USB_HID_PROTOCOL_KEYBOARD 0x01
  36. #define USB_HID_PROTOCOL_MOUSE 0x02
  37. /* HID class requests */
  38. #define USB_HID_HID_REQ_GET_REPORT 0x01
  39. #define USB_HID_REQ_GET_IDLE 0x02
  40. #define USB_HID_REQ_GET_PROTOCOL 0x03
  41. #define USB_HID_REQ_SET_REPORT 0x09
  42. #define USB_HID_REQ_SET_IDLE 0x0A
  43. #define USB_HID_REQ_SET_PROTOCOL 0x0B
  44. /* HID class descriptor types */
  45. #define USB_HID_DT_HID (USB_TYPE_CLASS | 0x01)
  46. #define USB_HID_DT_REPORT (USB_TYPE_CLASS | 0x02)
  47. #define USB_HID_DT_PHYSICAL (USB_TYPE_CLASS | 0x03)
  48. #define USB_HID_MAX_DESCRIPTOR_SIZE 4096
  49. /* hid spec 1.11. page 68 */
  50. typedef struct _usbHidClassDescriptor{
  51. unsigned char bDescriptorType; /* Report descriptor type */
  52. unsigned short wDescriptorLength; /* Total length of report descriptor */
  53. }__packed usbHidClassDescriptor_t;
  54. typedef struct _usbHidDescriptor{
  55. unsigned char bLength; /* size of this descriptor */
  56. unsigned char bDescriptorType; /* Hid decriptor type */
  57. unsigned short bcdHID; /* Hid Class Specification release number in BCD */
  58. unsigned char bCountryCode; /* Hardware target country */
  59. unsigned char bNumDescriptors; /* Number of HID class descriptor to follow */
  60. usbHidClassDescriptor_t desc[1]; /* report descriptor */
  61. }__packed usbHidDescriptor_t;
  62. /* Hid Report type */
  63. #define USB_HID_REPORT_INPUT 0x00
  64. #define USB_HID_REPORT_OUTPUT 0x01
  65. #define USB_HID_REPORT_FEATURE 0x02
  66. //----------------------------------------------------------------------
  67. // Hid spec
  68. //----------------------------------------------------------------------
  69. /*
  70. * This is the local environment. It is persistent up the next main-item.
  71. */
  72. #define USB_HID_MAX_USAGES 8192
  73. #define USB_HID_DEFAULT_NUM_COLLECTIONS 16
  74. #define USB_HID_REPORT_TYPES 3
  75. #define USB_HID_MIN_BUFFER_SIZE 64 /* make sure there is at least a packet size of space */
  76. #define USB_HID_MAX_BUFFER_SIZE 4096 /* 4kb */
  77. #define USB_HID_CONTROL_FIFO_SIZE 256 /* to init devices with >100 reports */
  78. #define USB_HID_OUTPUT_FIFO_SIZE 64
  79. /* HID report item format */
  80. #define USB_HID_ITEM_FORMAT_SHORT 0
  81. #define USB_HID_ITEM_FORMAT_LONG 1
  82. /* Special tag indicating long items */
  83. #define USB_HID_ITEM_TAG_LONG 15
  84. /* HID report descriptor item type (prefix bit 2,3) */
  85. #define USB_HID_ITEM_TYPE_MAIN 0
  86. #define USB_HID_ITEM_TYPE_GLOBAL 1
  87. #define USB_HID_ITEM_TYPE_LOCAL 2
  88. #define USB_HID_ITEM_TYPE_RESERVED 3
  89. /* HID report descriptor main item tags */
  90. #define USB_HID_MAIN_ITEM_TAG_INPUT 8
  91. #define USB_HID_MAIN_ITEM_TAG_OUTPUT 9
  92. #define USB_HID_MAIN_ITEM_TAG_FEATURE 11
  93. #define USB_HID_MAIN_ITEM_TAG_BEGIN_COLLECTION 10
  94. #define USB_HID_MAIN_ITEM_TAG_END_COLLECTION 12
  95. /* HID report descriptor main item contents */
  96. #define USB_HID_MAIN_ITEM_CONSTANT 0x001
  97. #define USB_HID_MAIN_ITEM_VARIABLE 0x002
  98. #define USB_HID_MAIN_ITEM_RELATIVE 0x004
  99. #define USB_HID_MAIN_ITEM_WRAP 0x008
  100. #define USB_HID_MAIN_ITEM_NONLINEAR 0x010
  101. #define USB_HID_MAIN_ITEM_NO_PREFERRED 0x020
  102. #define USB_HID_MAIN_ITEM_NULL_STATE 0x040
  103. #define USB_HID_MAIN_ITEM_VOLATILE 0x080
  104. #define USB_HID_MAIN_ITEM_BUFFERED_BYTE 0x100
  105. /* HID report descriptor collection item types */
  106. #define USB_HID_COLLECTION_PHYSICAL 0x00
  107. #define USB_HID_COLLECTION_APPLICATION 0x01
  108. #define USB_HID_COLLECTION_LOGICAL 0x02
  109. #define USB_HID_COLLECTION_REPORT 0x03
  110. #define USB_HID_COLLECTION_NAMED_ARRAY 0x04
  111. #define USB_HID_COLLECTION_USAGE_SWITCH 0x05
  112. #define USB_HID_COLLECTION_USAGE_MODIFIER 0x06
  113. /* HID report descriptor global item tags */
  114. #define USB_HID_GLOBAL_ITEM_TAG_USAGE_PAGE 0
  115. #define USB_HID_GLOBAL_ITEM_TAG_LOGICAL_MINIMUM 1
  116. #define USB_HID_GLOBAL_ITEM_TAG_LOGICAL_MAXIMUM 2
  117. #define USB_HID_GLOBAL_ITEM_TAG_PHYSICAL_MINIMUM 3
  118. #define USB_HID_GLOBAL_ITEM_TAG_PHYSICAL_MAXIMUM 4
  119. #define USB_HID_GLOBAL_ITEM_TAG_UNIT_EXPONENT 5
  120. #define USB_HID_GLOBAL_ITEM_TAG_UNIT 6
  121. #define USB_HID_GLOBAL_ITEM_TAG_REPORT_SIZE 7
  122. #define USB_HID_GLOBAL_ITEM_TAG_REPORT_ID 8
  123. #define USB_HID_GLOBAL_ITEM_TAG_REPORT_COUNT 9
  124. #define USB_HID_GLOBAL_ITEM_TAG_PUSH 10
  125. #define USB_HID_GLOBAL_ITEM_TAG_POP 11
  126. /* HID report descriptor local item tags */
  127. #define USB_HID_LOCAL_ITEM_TAG_USAGE 0
  128. #define USB_HID_LOCAL_ITEM_TAG_USAGE_MINIMUM 1
  129. #define USB_HID_LOCAL_ITEM_TAG_USAGE_MAXIMUM 2
  130. #define USB_HID_LOCAL_ITEM_TAG_DESIGNATOR_INDEX 3
  131. #define USB_HID_LOCAL_ITEM_TAG_DESIGNATOR_MINIMUM 4
  132. #define USB_HID_LOCAL_ITEM_TAG_DESIGNATOR_MAXIMUM 5
  133. #define USB_HID_LOCAL_ITEM_TAG_STRING_INDEX 7
  134. #define USB_HID_LOCAL_ITEM_TAG_STRING_MINIMUM 8
  135. #define USB_HID_LOCAL_ITEM_TAG_STRING_MAXIMUM 9
  136. #define USB_HID_LOCAL_ITEM_TAG_DELIMITER 10
  137. /*
  138. * We parse each description item into this structure. Short items data
  139. * values are expanded to 32-bit signed int, long items contain a pointer
  140. * into the data area.
  141. */
  142. typedef struct _usbHidItem{
  143. unsigned int format; /* Short items or long items */
  144. unsigned char size; /* Numeric expression specifying size of data */
  145. unsigned char type; /* Numeric expression identifying type of item */
  146. unsigned char tag; /* Numeric expression specifying the function of the item */
  147. union {
  148. unsigned char Data_u8; /* 无符号8位数 */
  149. char Data_s8; /* 有符号8位数 */
  150. unsigned short Data_u16;
  151. short Data_s16;
  152. unsigned int Data_u32;
  153. int Data_s32;
  154. unsigned char *longdata;
  155. } data;
  156. }usbHidItem_t;
  157. /* Usage Page. <<usb hid usage tables>> page14, table1 */
  158. #define USB_HID_USAGE_PAGE_UNDEFINED 0x00
  159. #define USB_HID_USAGE_PAGE_GENERIC_DESKTOP_CONTROLS 0x01
  160. #define USB_HID_USAGE_PAGE_SIMULATION_CONTROLS 0x02
  161. #define USB_HID_USAGE_PAGE_VR_CONTROLS 0x03
  162. #define USB_HID_USAGE_PAGE_SPORT_CONTROLS 0x04
  163. #define USB_HID_USAGE_PAGE_GAME_CONTROLS 0x05
  164. #define USB_HID_USAGE_PAGE_GENERIC_DEVICE_CONTROLS 0x06
  165. #define USB_HID_USAGE_PAGE_KEYBOARD_KEYPAD 0x07
  166. #define USB_HID_USAGE_PAGE_LEDS 0x08
  167. #define USB_HID_USAGE_PAGE_BUTTON 0x09
  168. #define USB_HID_USAGE_PAGE_ORDINAL 0x0A
  169. #define USB_HID_USAGE_PAGE_TELEPHONE 0x0B
  170. #define USB_HID_USAGE_PAGE_CONSUMER 0x0C
  171. #define USB_HID_USAGE_PAGE_DIGITIZER 0x0D
  172. #define USB_HID_USAGE_PAGE_PID_PAGE 0x0F
  173. #define USB_HID_USAGE_PAGE_UNICODE 0x10
  174. #define USB_HID_USAGE_PAGE_ALPHANUMERIC_DISPLAY 0x14
  175. #define USB_HID_USAGE_PAGE_MEDICAL_INSTRUMENTS 0x40
  176. #define USB_HID_USAGE_PAGE_MONITOR_PAGES 0x80 //???????
  177. #define USB_HID_USAGE_PAGE_POWER_PAGES 0x84 //???????
  178. #define USB_HID_USAGE_PAGE_BAR_CODE_SCANNER_PAGE 0x8C
  179. #define USB_HID_USAGE_PAGE_SCALE_PAGE 0x8D
  180. #define USB_HID_USAGE_PAGE_MEGNETIC_STRIPE_READING_DEVICE 0x8E
  181. #define USB_HID_USAGE_PAGE_RESEVERED_POINT_OF_SALE_PAGES 0x8F
  182. #define USB_HID_USAGE_PAGE_CAMERA_CONTROL_PAGE 0x90
  183. #define USB_HID_USAGE_PAGE_ARCADE_PAGE 0x91
  184. #define USB_HID_USAGE_PAGE_VENDOR_DEFINED 0xFF00
  185. /* Usage Types. <<usb hid usage tables>> page17~21 */
  186. #define USB_HID_USAGE_TYPES_UNDEFINED 0x00
  187. #define USB_HID_USAGE_TYPES_CONTROL_UNDEFINED 0x01
  188. #define USB_HID_USAGE_TYPES_CONTROL_LINER 0x02
  189. #define USB_HID_USAGE_TYPES_CONTROL_ON_OFF 0x03
  190. #define USB_HID_USAGE_TYPES_CONTROL_MOMENTARY 0x04
  191. #define USB_HID_USAGE_TYPES_CONTROL_ONE_SHOT 0x05
  192. #define USB_HID_USAGE_TYPES_DATA_UNDEFINED 0x06
  193. #define USB_HID_USAGE_TYPES_DATA_SELECTOR 0x07
  194. #define USB_HID_USAGE_TYPES_DATA_STATIC_VALUE 0x08
  195. #define USB_HID_USAGE_TYPES_DATA_STATIC_FLAG 0x09
  196. #define USB_HID_USAGE_TYPES_DATA_DYNAMIC_VALUE 0x0A
  197. #define USB_HID_USAGE_TYPES_DATA_DYNAMIC_FLAG 0x0B
  198. #define USB_HID_USAGE_TYPES_COLLECTION_UNDEFINED 0x0C
  199. #define USB_HID_USAGE_TYPES_COLLECTION_NAMED_ARRAY 0x0D
  200. #define USB_HID_USAGE_TYPES_COLLECTION_APPLICATION 0x0E
  201. #define USB_HID_USAGE_TYPES_COLLECTION_LOGICAL 0x0F
  202. #define USB_HID_USAGE_TYPES_COLLECTION_PHYSICAL 0x10
  203. #define USB_HID_USAGE_TYPES_COLLECTION_USAGE_SWITCH 0x11
  204. #define USB_HID_USAGE_TYPES_COLLECTION_USAGE_MODIFIER 0x12
  205. /* Generic DeskTop Page. <<usb hid usage tables>> page126 */
  206. #define USB_HID_GENERIC_DESKTOP_PAGE_UNDEFINED 0x00
  207. #define USB_HID_GENERIC_DESKTOP_PAGE_PONITER 0x01
  208. #define USB_HID_GENERIC_DESKTOP_PAGE_MOUSE 0x02
  209. #define USB_HID_GENERIC_DESKTOP_PAGE_JOYSTICK 0x04
  210. #define USB_HID_GENERIC_DESKTOP_PAGE_GAMEPAD 0x05
  211. #define USB_HID_GENERIC_DESKTOP_PAGE_KEYBOARD 0x06
  212. #define USB_HID_GENERIC_DESKTOP_PAGE_KEYPAD 0x07
  213. #define USB_HID_GENERIC_DESKTOP_PAGE_MULTIAXIS_CONTROLLER 0x08
  214. #define USB_HID_GENERIC_DESKTOP_PAGE_TABLET_PC_SYSTEM_CONTROLS 0x09
  215. #define USB_HID_GENERIC_DESKTOP_PAGE_X 0x30
  216. #define USB_HID_GENERIC_DESKTOP_PAGE_Y 0x31
  217. #define USB_HID_GENERIC_DESKTOP_PAGE_Z 0x32
  218. #define USB_HID_GENERIC_DESKTOP_PAGE_RX 0x33
  219. #define USB_HID_GENERIC_DESKTOP_PAGE_RY 0x34
  220. #define USB_HID_GENERIC_DESKTOP_PAGE_RZ 0x35
  221. #define USB_HID_GENERIC_DESKTOP_PAGE_SLIDER 0x36
  222. #define USB_HID_GENERIC_DESKTOP_PAGE_DIAL 0x37
  223. #define USB_HID_GENERIC_DESKTOP_PAGE_WHEEL 0x38
  224. #define USB_HID_GENERIC_DESKTOP_PAGE_HAT_SWITCH 0x39
  225. #define USB_HID_GENERIC_DESKTOP_PAGE_COUNTED_BUFFER 0x3A
  226. #define USB_HID_GENERIC_DESKTOP_PAGE_BYTE_COUNT 0x3B
  227. #define USB_HID_GENERIC_DESKTOP_PAGE_MOTION_WAKEUP 0x3C
  228. #define USB_HID_GENERIC_DESKTOP_PAGE_START 0x3D
  229. #define USB_HID_GENERIC_DESKTOP_PAGE_SELECT 0x3E
  230. #define USB_HID_GENERIC_DESKTOP_PAGE_VX 0x40
  231. #define USB_HID_GENERIC_DESKTOP_PAGE_VY 0x41
  232. #define USB_HID_GENERIC_DESKTOP_PAGE_VZ 0x42
  233. #define USB_HID_GENERIC_DESKTOP_PAGE_VBRX 0x43
  234. #define USB_HID_GENERIC_DESKTOP_PAGE_VBRY 0x44
  235. #define USB_HID_GENERIC_DESKTOP_PAGE_VBRZ 0x45
  236. #define USB_HID_GENERIC_DESKTOP_PAGE_VNO 0x46
  237. #define USB_HID_GENERIC_DESKTOP_PAGE_FEATURE_NOTIFICATION 0x47
  238. /* Global Items. <<Device Class Definition for Human Interface Devices (HID)>> page35 */
  239. typedef struct _usbHidGlobalItems{
  240. unsigned int UsagePage; /* 用途类页 */
  241. int LogicalMinimum; /* 最小逻辑值 */
  242. int LogicalMaximum; /* 最大逻辑值 */
  243. int PhysicalMinimum; /* 最小物理值 */
  244. int PhysicalMaximum; /* 最大物理值 */
  245. int UnitExponent; /* 单位指数 */
  246. unsigned int Unit; /* 单位 */
  247. unsigned int ReportSize; /* 报告大小 */
  248. unsigned int ReportId; /* 报告ID */
  249. unsigned int ReportCount; /* 报告的个数 */
  250. unsigned int Push; /* 项目状态表暂存到stack */
  251. unsigned int Pop; /* 取回stack最顶层的项目状态表 */
  252. unsigned int Reserved;
  253. }__packed usbHidGlobalItems_t;
  254. /* Local Items. <<Device Class Definition for Human Interface Devices (HID)>> page39 */
  255. typedef __packed struct _usbHidLocalItems{
  256. unsigned int usage[USB_HID_MAX_USAGES]; /* usage array */
  257. unsigned int collection_index[USB_HID_MAX_USAGES]; /* collection index array */
  258. unsigned int usage_index;
  259. unsigned int usage_minimum;
  260. unsigned int delimiter_depth;
  261. unsigned int delimiter_branch;
  262. }usbHidLocalItems_t;
  263. /* Collection Items */
  264. typedef struct _usbHidCollectionItems{
  265. unsigned int Type; /* type of collection */
  266. unsigned int Usage; /* 用途类页 */
  267. unsigned int Level; /* the level of collection items */
  268. }__packed usbHidCollectionItems_t;
  269. typedef struct _usbHidUsage{
  270. unsigned int hid; /* hid usage code, 高16为usage page, 低16位usage */
  271. unsigned int collection_index; /* index into collection array */
  272. /* hidinput data */
  273. unsigned short code; /* input driver code */
  274. unsigned char type; /* input driver type */
  275. char hat_min; /* hat switch fun */
  276. char hat_max; /* ditto */
  277. char hat_dir; /* ditto */
  278. }usbHidUsage_t;
  279. #endif //__HIDPUB_H__