10 * Copyright 2007, Haiku, Inc. All Rights Reserved.
11 * Distributed under the terms of the MIT License.
14 #define HID_REPORT_TYPE_ANY 0x07
17 #define ITEM_TYPE_MAIN 0x0
18 #define ITEM_TYPE_GLOBAL 0x1
19 #define ITEM_TYPE_LOCAL 0x2
20 #define ITEM_TYPE_LONG 0x3
22 #define ITEM_TAG_MAIN_INPUT 0x8
23 #define ITEM_TAG_MAIN_OUTPUT 0x9
24 #define ITEM_TAG_MAIN_FEATURE 0xb
25 #define ITEM_TAG_MAIN_COLLECTION 0xa
26 #define ITEM_TAG_MAIN_END_COLLECTION 0xc
28 #define ITEM_TAG_GLOBAL_USAGE_PAGE 0x0
29 #define ITEM_TAG_GLOBAL_LOGICAL_MINIMUM 0x1
30 #define ITEM_TAG_GLOBAL_LOGICAL_MAXIMUM 0x2
31 #define ITEM_TAG_GLOBAL_PHYSICAL_MINIMUM 0x3
32 #define ITEM_TAG_GLOBAL_PHYSICAL_MAXIMUM 0x4
33 #define ITEM_TAG_GLOBAL_UNIT_EXPONENT 0x5
34 #define ITEM_TAG_GLOBAL_UNIT 0x6
35 #define ITEM_TAG_GLOBAL_REPORT_SIZE 0x7
36 #define ITEM_TAG_GLOBAL_REPORT_ID 0x8
37 #define ITEM_TAG_GLOBAL_REPORT_COUNT 0x9
38 #define ITEM_TAG_GLOBAL_PUSH 0xa
39 #define ITEM_TAG_GLOBAL_POP 0xb
41 #define ITEM_TAG_LOCAL_USAGE 0x0
42 #define ITEM_TAG_LOCAL_USAGE_MINIMUM 0x1
43 #define ITEM_TAG_LOCAL_USAGE_MAXIMUM 0x2
44 #define ITEM_TAG_LOCAL_DESIGNATOR_INDEX 0x3
45 #define ITEM_TAG_LOCAL_DESIGNATOR_MINIMUM 0x4
46 #define ITEM_TAG_LOCAL_DESIGNATOR_MAXIMUM 0x5
47 #define ITEM_TAG_LOCAL_STRING_INDEX 0x7
48 #define ITEM_TAG_LOCAL_STRING_MINIMUM 0x8
49 #define ITEM_TAG_LOCAL_STRING_MAXIMUM 0x9
50 #define ITEM_TAG_LOCAL_DELIMITER 0xa
52 #define ITEM_TAG_LONG 0xf
54 #define COLLECTION_PHYSICAL 0x00
55 #define COLLECTION_APPLICATION 0x01
56 #define COLLECTION_LOGICAL 0x02
57 #define COLLECTION_REPORT 0x03
58 #define COLLECTION_NAMED_ARRAY 0x04
59 #define COLLECTION_USAGE_SWITCH 0x05
60 #define COLLECTION_USAGE_MODIFIER 0x06
61 #define COLLECTION_ALL 0xff
63 #define UNIT_SYSTEM 0x0
64 #define UNIT_LENGTH 0x1
67 #define UNIT_TEMPERATURE 0x4
68 #define UNIT_CURRENT 0x5
69 #define UNIT_LUMINOUS_INTENSITY 0x6
71 #define USAGE_PAGE_SHIFT 16
72 #define USAGE_PAGE_MASK 0xffff
73 #define USAGE_ID_SHIFT 0
74 #define USAGE_ID_MASK 0xffff
81 }ITEM_PREFIX
, *PITEM_PREFIX
;
97 }SHORT_ITEM
, *PSHORT_ITEM
;
106 }LONG_ITEM
,*PLONG_ITEM
;
109 #define LBITFIELD9(b1,b2,b3,b4,b5,b6,b7,b8,b9) USHORT b9,b8,b7,b6,b5,b4,b3,b2,b1
112 USHORT DataConstant
:1;
113 USHORT ArrayVariable
:1;
117 USHORT NoPreferred
:1;
123 }MAIN_ITEM_DATA
, *PMAIN_ITEM_DATA
;
125 typedef struct __GLOBAL_ITEM_STATE_
128 ULONG LogicalMinimum
;
129 ULONG LogicialMaximum
;
130 ULONG PhysicalMinimum
;
131 ULONG PhysicalMaximum
;
137 struct __GLOBAL_ITEM_STATE__
* Next
;
138 }GLOBAL_ITEM_STATE
, *PGLOBAL_ITEM_STATE
;
141 typedef struct usage_value
153 }USAGE_VALUE
, *PUSAGE_VALUE
;
158 PUSAGE_VALUE UsageStack
;
159 ULONG UsageStackUsed
;
160 ULONG UsageStackAllocated
;
162 USAGE_VALUE UsageMinimum
;
163 USAGE_VALUE UsageMaximum
;
165 UCHAR UsageMinimumSet
;
166 UCHAR UsageMaximumSet
;
168 ULONG DesignatorIndex
;
169 UCHAR DesignatorIndexSet
;
171 ULONG DesignatorMinimum
;
172 ULONG DesignatorMaximum
;
175 UCHAR StringIndexSet
;
179 }LOCAL_ITEM_STATE
, *PLOCAL_ITEM_STATE
;
196 }HID_REPORT_ITEM
, *PHID_REPORT_ITEM
;
200 typedef struct __HID_COLLECTION__
209 struct __HID_COLLECTION__
** Nodes
;
210 struct __HID_COLLECTION__
* Root
;
211 struct _HID_REPORT
** Reports
;
215 }HID_COLLECTION
, *PHID_COLLECTION
;
217 typedef struct _HID_REPORT
224 HID_REPORT_ITEM Items
[1];
225 }HID_REPORT
, *PHID_REPORT
;
232 GLOBAL_ITEM_STATE GlobalItemState
;
237 LOCAL_ITEM_STATE LocalItemState
;
242 PHID_COLLECTION RootCollection
;
252 ULONG CollectionIndex
;
254 }HID_PARSER_CONTEXT
, *PHID_PARSER_CONTEXT
;
256 #define HID_REPORT_TYPE_INPUT 0x01
257 #define HID_REPORT_TYPE_OUTPUT 0x02
258 #define HID_REPORT_TYPE_FEATURE 0x04
261 HidParser_UsesReportId(
262 IN PVOID CollectionContext
,
263 IN UCHAR ReportType
);
266 HidParser_GetCollectionUsagePage(
267 IN PVOID CollectionContext
,
269 OUT PUSHORT UsagePage
);
272 HidParser_GetReportLength(
273 IN PVOID CollectionContext
,
274 IN UCHAR ReportType
);
277 HidParser_IsReportIDUsed(
278 IN PHID_PARSER Parser
);
281 HidParser_GetReportItemCountFromReportType(
282 IN PVOID CollectionContext
,
283 IN UCHAR ReportType
);
286 HidParser_GetReportItemTypeCountFromReportType(
287 IN PVOID CollectionContext
,
292 HidParser_GetMaxUsageListLengthWithReportAndPage(
293 IN PVOID CollectionContext
,
295 IN USAGE UsagePage OPTIONAL
);
298 HidParser_GetSpecificValueCapsWithReport(
299 IN PHID_PARSER Parser
,
300 IN PVOID CollectionContext
,
304 OUT PHIDP_VALUE_CAPS ValueCaps
,
305 IN OUT PULONG ValueCapsLength
);
309 HidParser_GetUsagesWithReport(
310 IN PHID_PARSER Parser
,
311 IN PVOID CollectionContext
,
314 OUT USAGE
*UsageList
,
315 IN OUT PULONG UsageLength
,
316 IN PCHAR ReportDescriptor
,
317 IN ULONG ReportDescriptorLength
);
320 HidParser_GetScaledUsageValueWithReport(
321 IN PHID_PARSER Parser
,
322 IN PVOID CollectionContext
,
326 OUT PLONG UsageValue
,
327 IN PCHAR ReportDescriptor
,
328 IN ULONG ReportDescriptorLength
);
333 HidParser_BuildContext(
334 IN PHID_PARSER Parser
,
335 IN PVOID ParserContext
,
336 IN ULONG CollectionIndex
,
337 IN ULONG ContextSize
,
338 OUT PVOID
*CollectionContext
);
341 HidParser_CalculateContextSize(
342 IN PHID_COLLECTION Collection
);
345 HidParser_ParseReportDescriptor(
349 OUT PVOID
*ParserContext
);
352 HidParser_NumberOfTopCollections(
353 IN PVOID ParserContext
);
356 HidParser_GetContextSize(
357 IN PHID_PARSER Parser
,
358 IN PVOID ParserContext
,
359 IN ULONG CollectionNumber
);
365 HidParser_GetCollectionFromContext(
369 HidParser_GetTotalCollectionCount(
370 IN PVOID CollectionContext
);
373 HidParser_BuildCollectionContext(
374 IN PHID_PARSER Parser
,
375 IN PHID_COLLECTION RootCollection
,
377 IN ULONG ContextSize
);
380 HidParser_GetReportInCollection(
382 IN UCHAR ReportType
);