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