3519530033b83937ff327bf860876c890bb0b123
[reactos.git] / lib / drivers / hidparser / parser.h
1
2 #pragma once
3 #include <ntddk.h>
4 #include <assert.h>
5 #include <pshpack1.h>
6 #include "hidparser.h"
7
8 /*
9 * Copyright 2007, Haiku, Inc. All Rights Reserved.
10 * Distributed under the terms of the MIT License.
11 */
12
13 #define HID_REPORT_TYPE_ANY 0x07
14
15
16 #define ITEM_TYPE_MAIN 0x0
17 #define ITEM_TYPE_GLOBAL 0x1
18 #define ITEM_TYPE_LOCAL 0x2
19 #define ITEM_TYPE_LONG 0x3
20
21 #define ITEM_TAG_MAIN_INPUT 0x8
22 #define ITEM_TAG_MAIN_OUTPUT 0x9
23 #define ITEM_TAG_MAIN_FEATURE 0xb
24 #define ITEM_TAG_MAIN_COLLECTION 0xa
25 #define ITEM_TAG_MAIN_END_COLLECTION 0xc
26
27 #define ITEM_TAG_GLOBAL_USAGE_PAGE 0x0
28 #define ITEM_TAG_GLOBAL_LOGICAL_MINIMUM 0x1
29 #define ITEM_TAG_GLOBAL_LOGICAL_MAXIMUM 0x2
30 #define ITEM_TAG_GLOBAL_PHYSICAL_MINIMUM 0x3
31 #define ITEM_TAG_GLOBAL_PHYSICAL_MAXIMUM 0x4
32 #define ITEM_TAG_GLOBAL_UNIT_EXPONENT 0x5
33 #define ITEM_TAG_GLOBAL_UNIT 0x6
34 #define ITEM_TAG_GLOBAL_REPORT_SIZE 0x7
35 #define ITEM_TAG_GLOBAL_REPORT_ID 0x8
36 #define ITEM_TAG_GLOBAL_REPORT_COUNT 0x9
37 #define ITEM_TAG_GLOBAL_PUSH 0xa
38 #define ITEM_TAG_GLOBAL_POP 0xb
39
40 #define ITEM_TAG_LOCAL_USAGE 0x0
41 #define ITEM_TAG_LOCAL_USAGE_MINIMUM 0x1
42 #define ITEM_TAG_LOCAL_USAGE_MAXIMUM 0x2
43 #define ITEM_TAG_LOCAL_DESIGNATOR_INDEX 0x3
44 #define ITEM_TAG_LOCAL_DESIGNATOR_MINIMUM 0x4
45 #define ITEM_TAG_LOCAL_DESIGNATOR_MAXIMUM 0x5
46 #define ITEM_TAG_LOCAL_STRING_INDEX 0x7
47 #define ITEM_TAG_LOCAL_STRING_MINIMUM 0x8
48 #define ITEM_TAG_LOCAL_STRING_MAXIMUM 0x9
49 #define ITEM_TAG_LOCAL_DELIMITER 0xa
50
51 #define ITEM_TAG_LONG 0xf
52
53 #define COLLECTION_PHYSICAL 0x00
54 #define COLLECTION_APPLICATION 0x01
55 #define COLLECTION_LOGICAL 0x02
56 #define COLLECTION_REPORT 0x03
57 #define COLLECTION_NAMED_ARRAY 0x04
58 #define COLLECTION_USAGE_SWITCH 0x05
59 #define COLLECTION_USAGE_MODIFIER 0x06
60 #define COLLECTION_ALL 0xff
61
62 #define UNIT_SYSTEM 0x0
63 #define UNIT_LENGTH 0x1
64 #define UNIT_MASS 0x2
65 #define UNIT_TIME 0x3
66 #define UNIT_TEMPERATURE 0x4
67 #define UNIT_CURRENT 0x5
68 #define UNIT_LUMINOUS_INTENSITY 0x6
69
70 #define USAGE_PAGE_SHIFT 16
71 #define USAGE_PAGE_MASK 0xffff
72 #define USAGE_ID_SHIFT 0
73 #define USAGE_ID_MASK 0xffff
74
75 typedef struct
76 {
77 UCHAR Size:2;
78 UCHAR Type:2;
79 UCHAR Tag:4;
80 }ITEM_PREFIX, *PITEM_PREFIX;
81
82 typedef struct
83 {
84 ITEM_PREFIX Prefix;
85
86 union
87 {
88 UCHAR UData8[4];
89 CHAR SData8[4];
90 USHORT UData16[2];
91 SHORT SData16[2];
92 ULONG UData32;
93 LONG SData32;
94 }Data;
95
96 }SHORT_ITEM, *PSHORT_ITEM;
97
98 typedef struct
99 {
100 ITEM_PREFIX Prefix;
101 UCHAR DataSize;
102 UCHAR LongItemTag;
103 UCHAR Data[0];
104
105 }LONG_ITEM,*PLONG_ITEM;
106
107
108 #define LBITFIELD9(b1,b2,b3,b4,b5,b6,b7,b8,b9) USHORT b9,b8,b7,b6,b5,b4,b3,b2,b1
109 typedef struct
110 {
111 USHORT DataConstant:1;
112 USHORT ArrayVariable:1;
113 USHORT Relative:1;
114 USHORT Wrap:1;
115 USHORT NonLinear:1;
116 USHORT NoPreferred:1;
117 USHORT NullState:1;
118 USHORT IsVolatile:1;
119 USHORT BitsBytes:1;
120 UCHAR reserved[2];
121
122 }MAIN_ITEM_DATA, *PMAIN_ITEM_DATA;
123
124 typedef struct __GLOBAL_ITEM_STATE_
125 {
126 USHORT UsagePage;
127 ULONG LogicalMinimum;
128 ULONG LogicialMaximum;
129 ULONG PhysicalMinimum;
130 ULONG PhysicalMaximum;
131 UCHAR UnitExponent;
132 UCHAR Unit;
133 ULONG ReportSize;
134 ULONG ReportCount;
135 UCHAR ReportId;
136 struct __GLOBAL_ITEM_STATE__ * Next;
137 }GLOBAL_ITEM_STATE, *PGLOBAL_ITEM_STATE;
138
139
140 typedef struct usage_value
141 {
142 union
143 {
144 struct {
145 USHORT UsageId;
146 USHORT UsagePage;
147 }s;
148 ULONG Extended;
149 }u;
150
151 UCHAR IsExtended;
152 }USAGE_VALUE, *PUSAGE_VALUE;
153
154
155 typedef struct
156 {
157 PUSAGE_VALUE UsageStack;
158 ULONG UsageStackUsed;
159 ULONG UsageStackAllocated;
160
161 USAGE_VALUE UsageMinimum;
162 USAGE_VALUE UsageMaximum;
163
164 UCHAR UsageMinimumSet;
165 UCHAR UsageMaximumSet;
166
167 ULONG DesignatorIndex;
168 UCHAR DesignatorIndexSet;
169
170 ULONG DesignatorMinimum;
171 ULONG DesignatorMaximum;
172
173 UCHAR StringIndex;
174 UCHAR StringIndexSet;
175 UCHAR StringMinimum;
176 UCHAR StringMaximum;
177
178 }LOCAL_ITEM_STATE, *PLOCAL_ITEM_STATE;
179
180 typedef struct
181 {
182 ULONG ByteOffset;
183 UCHAR Shift;
184 ULONG Mask;
185 UCHAR BitCount;
186 UCHAR HasData;
187 UCHAR Array;
188 UCHAR Relative;
189 ULONG Minimum;
190 ULONG Maximum;
191 ULONG UsageMinimum;
192 ULONG UsageMaximum;
193 ULONG Data;
194 UCHAR Valid;
195 }HID_REPORT_ITEM, *PHID_REPORT_ITEM;
196
197 struct HID_REPORT;
198
199 typedef struct __HID_COLLECTION__
200 {
201 struct __HID_COLLECTION__ * Root;
202
203 UCHAR Type;
204 ULONG Usage;
205 UCHAR StringID;
206 UCHAR PhysicalID;
207 ULONG NodeCount;
208 struct __HID_COLLECTION__ ** Nodes;
209
210 ULONG ItemCount;
211 ULONG ItemCountAllocated;
212 PHID_REPORT_ITEM * Items;
213
214 //ULONG ReportCount;
215 //struct HID_REPORT ** Reports;
216
217 }HID_COLLECTION, *PHID_COLLECTION;
218
219 typedef struct
220 {
221 UCHAR Type;
222 UCHAR ReportID;
223 ULONG ReportSize;
224
225 ULONG ItemCount;
226 ULONG ItemAllocated;
227 PHID_REPORT_ITEM *Items;
228
229 ULONG ReportStatus;
230 UCHAR * CurrentReport;
231 ULONG BusyCount;
232 }HID_REPORT, *PHID_REPORT;
233
234 typedef struct
235 {
236 //
237 // global item state
238 //
239 GLOBAL_ITEM_STATE GlobalItemState;
240
241 //
242 // local item state
243 //
244 LOCAL_ITEM_STATE LocalItemState;
245
246 //
247 // root collection
248 //
249 PHID_COLLECTION RootCollection;
250
251 //
252 // report count
253 //
254 ULONG ReportCount;
255
256 //
257 // reports
258 //
259 PHID_REPORT * Reports;
260
261 //
262 // uses report ids
263 //
264 UCHAR UseReportIDs;
265
266 }HID_PARSER_CONTEXT, *PHID_PARSER_CONTEXT;
267
268 HIDPARSER_STATUS
269 HidParser_ParseReportDescriptor(
270 PHID_PARSER Parser,
271 PUCHAR Report,
272 ULONG ReportSize);
273
274 ULONG
275 HidParser_NumberOfTopCollections(
276 IN PHID_PARSER Parser);
277
278 #define HID_REPORT_TYPE_INPUT 0x01
279 #define HID_REPORT_TYPE_OUTPUT 0x02
280 #define HID_REPORT_TYPE_FEATURE 0x04
281
282 ULONG
283 HidParser_NumberOfReports(
284 IN PHID_PARSER Parser,
285 IN ULONG ReportType);
286
287 HIDPARSER_STATUS
288 HidParser_GetCollectionUsagePage(
289 IN PHID_PARSER Parser,
290 IN ULONG CollectionNumber,
291 OUT PUSHORT Usage,
292 OUT PUSHORT UsagePage);
293
294 ULONG
295 HidParser_GetReportLength(
296 IN PHID_PARSER Parser,
297 IN ULONG ReportType);
298
299 UCHAR
300 HidParser_IsReportIDUsed(
301 IN PHID_PARSER Parser);
302
303 ULONG
304 HidParser_GetReportItemCountFromReportType(
305 IN PHID_PARSER Parser,
306 IN ULONG ReportType);
307
308 ULONG
309 HidParser_GetReportItemTypeCountFromReportType(
310 IN PHID_PARSER Parser,
311 IN ULONG ReportType,
312 IN ULONG bData);
313
314 ULONG
315 HidParser_GetContextSize(
316 IN PHID_PARSER Parser);
317
318 VOID
319 HidParser_FreeContext(
320 IN PHID_PARSER Parser,
321 IN PUCHAR Context,
322 IN ULONG ContextLength);
323
324 ULONG
325 HidParser_GetTotalCollectionCount(
326 IN PHID_PARSER Parser);
327
328 ULONG
329 HidParser_GetMaxUsageListLengthWithReportAndPage(
330 IN PHID_PARSER Parser,
331 IN ULONG ReportType,
332 IN USAGE UsagePage OPTIONAL);
333
334 HIDPARSER_STATUS
335 HidParser_GetSpecificValueCapsWithReport(
336 IN PHID_PARSER Parser,
337 IN ULONG ReportType,
338 IN USHORT UsagePage,
339 IN USHORT Usage,
340 OUT PHIDP_VALUE_CAPS ValueCaps,
341 IN OUT PULONG ValueCapsLength);
342
343
344 HIDPARSER_STATUS
345 HidParser_GetUsagesWithReport(
346 IN PHID_PARSER Parser,
347 IN ULONG ReportType,
348 IN USAGE UsagePage,
349 OUT USAGE *UsageList,
350 IN OUT PULONG UsageLength,
351 IN PCHAR ReportDescriptor,
352 IN ULONG ReportDescriptorLength);
353
354 HIDPARSER_STATUS
355 HidParser_GetScaledUsageValueWithReport(
356 IN PHID_PARSER Parser,
357 IN ULONG ReportType,
358 IN USAGE UsagePage,
359 IN USAGE Usage,
360 OUT PLONG UsageValue,
361 IN PCHAR ReportDescriptor,
362 IN ULONG ReportDescriptorLength);