Reactos
at master 388 lines 8.4 kB view raw
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 79typedef struct 80{ 81 UCHAR Size:2; 82 UCHAR Type:2; 83 UCHAR Tag:4; 84}ITEM_PREFIX, *PITEM_PREFIX; 85 86#include <pshpack1.h> 87typedef 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 104typedef 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 115typedef 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 130typedef 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 146typedef 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 161typedef 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 186typedef 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 203struct _HID_REPORT; 204 205typedef 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 222typedef 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 232typedef 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 265ULONG 266HidParser_UsesReportId( 267 IN PVOID CollectionContext, 268 IN UCHAR ReportType); 269 270NTSTATUS 271HidParser_GetCollectionUsagePage( 272 IN PVOID CollectionContext, 273 OUT PUSHORT Usage, 274 OUT PUSHORT UsagePage); 275 276ULONG 277HidParser_GetReportLength( 278 IN PVOID CollectionContext, 279 IN UCHAR ReportType); 280 281ULONG 282HidParser_GetReportItemCountFromReportType( 283 IN PVOID CollectionContext, 284 IN UCHAR ReportType); 285 286ULONG 287HidParser_GetReportItemTypeCountFromReportType( 288 IN PVOID CollectionContext, 289 IN UCHAR ReportType, 290 IN ULONG bData); 291 292ULONG 293HidParser_GetMaxUsageListLengthWithReportAndPage( 294 IN PVOID CollectionContext, 295 IN UCHAR ReportType, 296 IN USAGE UsagePage OPTIONAL); 297 298NTSTATUS 299HidParser_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 308NTSTATUS 309HidParser_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 318NTSTATUS 319HidParser_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 328NTSTATUS 329HidParser_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 340NTSTATUS 341HidParser_BuildContext( 342 IN PVOID ParserContext, 343 IN ULONG CollectionIndex, 344 IN ULONG ContextSize, 345 OUT PVOID *CollectionContext); 346 347ULONG 348HidParser_CalculateContextSize( 349 IN PHID_COLLECTION Collection); 350 351NTSTATUS 352HidParser_ParseReportDescriptor( 353 PUCHAR Report, 354 ULONG ReportSize, 355 OUT PVOID *ParserContext); 356 357ULONG 358HidParser_NumberOfTopCollections( 359 IN PVOID ParserContext); 360 361ULONG 362HidParser_GetContextSize( 363 IN PVOID ParserContext, 364 IN ULONG CollectionNumber); 365 366 367/* context.c */ 368 369PHID_COLLECTION 370HidParser_GetCollectionFromContext( 371 IN PVOID Context); 372 373ULONG 374HidParser_GetTotalCollectionCount( 375 IN PVOID CollectionContext); 376 377NTSTATUS 378HidParser_BuildCollectionContext( 379 IN PHID_COLLECTION RootCollection, 380 IN PVOID Context, 381 IN ULONG ContextSize); 382 383PHID_REPORT 384HidParser_GetReportInCollection( 385 IN PVOID Context, 386 IN UCHAR ReportType); 387 388#endif /* _HIDPARSER_H_ */