#ifndef _HIDPARSER_H_ #define _HIDPARSER_H_ #include #include #define _HIDPI_ #define _HIDPI_NO_FUNCTION_MACROS_ #include #include "hidparser.h" /* * Copyright 2007, Haiku, Inc. All Rights Reserved. * Distributed under the terms of the MIT License. */ #define HID_REPORT_TYPE_ANY 0x07 #define ITEM_TYPE_MAIN 0x0 #define ITEM_TYPE_GLOBAL 0x1 #define ITEM_TYPE_LOCAL 0x2 #define ITEM_TYPE_LONG 0x3 #define ITEM_TAG_MAIN_INPUT 0x8 #define ITEM_TAG_MAIN_OUTPUT 0x9 #define ITEM_TAG_MAIN_FEATURE 0xb #define ITEM_TAG_MAIN_COLLECTION 0xa #define ITEM_TAG_MAIN_END_COLLECTION 0xc #define ITEM_TAG_GLOBAL_USAGE_PAGE 0x0 #define ITEM_TAG_GLOBAL_LOGICAL_MINIMUM 0x1 #define ITEM_TAG_GLOBAL_LOGICAL_MAXIMUM 0x2 #define ITEM_TAG_GLOBAL_PHYSICAL_MINIMUM 0x3 #define ITEM_TAG_GLOBAL_PHYSICAL_MAXIMUM 0x4 #define ITEM_TAG_GLOBAL_UNIT_EXPONENT 0x5 #define ITEM_TAG_GLOBAL_UNIT 0x6 #define ITEM_TAG_GLOBAL_REPORT_SIZE 0x7 #define ITEM_TAG_GLOBAL_REPORT_ID 0x8 #define ITEM_TAG_GLOBAL_REPORT_COUNT 0x9 #define ITEM_TAG_GLOBAL_PUSH 0xa #define ITEM_TAG_GLOBAL_POP 0xb #define ITEM_TAG_LOCAL_USAGE 0x0 #define ITEM_TAG_LOCAL_USAGE_MINIMUM 0x1 #define ITEM_TAG_LOCAL_USAGE_MAXIMUM 0x2 #define ITEM_TAG_LOCAL_DESIGNATOR_INDEX 0x3 #define ITEM_TAG_LOCAL_DESIGNATOR_MINIMUM 0x4 #define ITEM_TAG_LOCAL_DESIGNATOR_MAXIMUM 0x5 #define ITEM_TAG_LOCAL_STRING_INDEX 0x7 #define ITEM_TAG_LOCAL_STRING_MINIMUM 0x8 #define ITEM_TAG_LOCAL_STRING_MAXIMUM 0x9 #define ITEM_TAG_LOCAL_DELIMITER 0xa #define ITEM_TAG_LONG 0xf #define COLLECTION_PHYSICAL 0x00 #define COLLECTION_APPLICATION 0x01 #define COLLECTION_LOGICAL 0x02 #define COLLECTION_REPORT 0x03 #define COLLECTION_NAMED_ARRAY 0x04 #define COLLECTION_USAGE_SWITCH 0x05 #define COLLECTION_USAGE_MODIFIER 0x06 #define COLLECTION_ALL 0xff #define UNIT_SYSTEM 0x0 #define UNIT_LENGTH 0x1 #define UNIT_MASS 0x2 #define UNIT_TIME 0x3 #define UNIT_TEMPERATURE 0x4 #define UNIT_CURRENT 0x5 #define UNIT_LUMINOUS_INTENSITY 0x6 #define USAGE_PAGE_SHIFT 16 #define USAGE_PAGE_MASK 0xffff #define USAGE_ID_SHIFT 0 #define USAGE_ID_MASK 0xffff typedef struct { UCHAR Size:2; UCHAR Type:2; UCHAR Tag:4; }ITEM_PREFIX, *PITEM_PREFIX; typedef struct { ITEM_PREFIX Prefix; union { UCHAR UData8[4]; CHAR SData8[4]; USHORT UData16[2]; SHORT SData16[2]; ULONG UData32; LONG SData32; }Data; }SHORT_ITEM, *PSHORT_ITEM; typedef struct { ITEM_PREFIX Prefix; UCHAR DataSize; UCHAR LongItemTag; UCHAR Data[0]; }LONG_ITEM,*PLONG_ITEM; #define LBITFIELD9(b1,b2,b3,b4,b5,b6,b7,b8,b9) USHORT b9,b8,b7,b6,b5,b4,b3,b2,b1 typedef struct { USHORT DataConstant:1; USHORT ArrayVariable:1; USHORT Relative:1; USHORT Wrap:1; USHORT NonLinear:1; USHORT NoPreferred:1; USHORT NullState:1; USHORT IsVolatile:1; USHORT BitsBytes:1; UCHAR reserved[2]; }MAIN_ITEM_DATA, *PMAIN_ITEM_DATA; typedef struct __GLOBAL_ITEM_STATE_ { USHORT UsagePage; ULONG LogicalMinimum; ULONG LogicialMaximum; ULONG PhysicalMinimum; ULONG PhysicalMaximum; UCHAR UnitExponent; UCHAR Unit; ULONG ReportSize; ULONG ReportCount; UCHAR ReportId; struct __GLOBAL_ITEM_STATE__ * Next; }GLOBAL_ITEM_STATE, *PGLOBAL_ITEM_STATE; typedef struct usage_value { union { struct { USHORT UsageId; USHORT UsagePage; }s; ULONG Extended; }u; UCHAR IsExtended; }USAGE_VALUE, *PUSAGE_VALUE; typedef struct { PUSAGE_VALUE UsageStack; ULONG UsageStackUsed; ULONG UsageStackAllocated; USAGE_VALUE UsageMinimum; USAGE_VALUE UsageMaximum; UCHAR UsageMinimumSet; UCHAR UsageMaximumSet; ULONG DesignatorIndex; UCHAR DesignatorIndexSet; ULONG DesignatorMinimum; ULONG DesignatorMaximum; UCHAR StringIndex; UCHAR StringIndexSet; UCHAR StringMinimum; UCHAR StringMaximum; }LOCAL_ITEM_STATE, *PLOCAL_ITEM_STATE; typedef struct { ULONG ByteOffset; UCHAR Shift; ULONG Mask; UCHAR BitCount; UCHAR HasData; UCHAR Array; UCHAR Relative; ULONG Minimum; ULONG Maximum; ULONG UsageMinimum; ULONG UsageMaximum; ULONG Data; UCHAR Valid; }HID_REPORT_ITEM, *PHID_REPORT_ITEM; struct _HID_REPORT; typedef struct __HID_COLLECTION__ { UCHAR Type; ULONG Usage; UCHAR StringID; UCHAR PhysicalID; ULONG ReportCount; ULONG NodeCount; struct __HID_COLLECTION__ ** Nodes; struct __HID_COLLECTION__ * Root; struct _HID_REPORT ** Reports; ULONG Offsets[1]; }HID_COLLECTION, *PHID_COLLECTION; typedef struct _HID_REPORT { UCHAR Type; UCHAR ReportID; ULONG ReportSize; ULONG ItemCount; ULONG ItemAllocated; HID_REPORT_ITEM Items[1]; }HID_REPORT, *PHID_REPORT; typedef struct { // // global item state // GLOBAL_ITEM_STATE GlobalItemState; // // local item state // LOCAL_ITEM_STATE LocalItemState; // // root collection // PHID_COLLECTION RootCollection; // // uses report ids // UCHAR UseReportIDs; // // collection index // ULONG CollectionIndex; }HID_PARSER_CONTEXT, *PHID_PARSER_CONTEXT; #define HID_REPORT_TYPE_INPUT 0x01 #define HID_REPORT_TYPE_OUTPUT 0x02 #define HID_REPORT_TYPE_FEATURE 0x04 ULONG HidParser_UsesReportId( IN PVOID CollectionContext, IN UCHAR ReportType); HIDPARSER_STATUS HidParser_GetCollectionUsagePage( IN PVOID CollectionContext, OUT PUSHORT Usage, OUT PUSHORT UsagePage); ULONG HidParser_GetReportLength( IN PVOID CollectionContext, IN UCHAR ReportType); UCHAR HidParser_IsReportIDUsed( IN PHID_PARSER Parser); ULONG HidParser_GetReportItemCountFromReportType( IN PVOID CollectionContext, IN UCHAR ReportType); ULONG HidParser_GetReportItemTypeCountFromReportType( IN PVOID CollectionContext, IN UCHAR ReportType, IN ULONG bData); ULONG HidParser_GetMaxUsageListLengthWithReportAndPage( IN PVOID CollectionContext, IN UCHAR ReportType, IN USAGE UsagePage OPTIONAL); HIDPARSER_STATUS HidParser_GetSpecificValueCapsWithReport( IN PHID_PARSER Parser, IN PVOID CollectionContext, IN UCHAR ReportType, IN USHORT UsagePage, IN USHORT Usage, OUT PHIDP_VALUE_CAPS ValueCaps, IN OUT PUSHORT ValueCapsLength); HIDPARSER_STATUS HidParser_GetUsagesWithReport( IN PHID_PARSER Parser, IN PVOID CollectionContext, IN UCHAR ReportType, IN USAGE UsagePage, OUT USAGE *UsageList, IN OUT PULONG UsageLength, IN PCHAR ReportDescriptor, IN ULONG ReportDescriptorLength); HIDPARSER_STATUS HidParser_GetScaledUsageValueWithReport( IN PHID_PARSER Parser, IN PVOID CollectionContext, IN UCHAR ReportType, IN USAGE UsagePage, IN USAGE Usage, OUT PLONG UsageValue, IN PCHAR ReportDescriptor, IN ULONG ReportDescriptorLength); HIDPARSER_STATUS HidParser_GetUsageValueWithReport( IN PHID_PARSER Parser, IN PVOID CollectionContext, IN UCHAR ReportType, IN USAGE UsagePage, IN USAGE Usage, OUT PULONG UsageValue, IN PCHAR ReportDescriptor, IN ULONG ReportDescriptorLength); /* parser.c */ HIDPARSER_STATUS HidParser_BuildContext( IN PHID_PARSER Parser, IN PVOID ParserContext, IN ULONG CollectionIndex, IN ULONG ContextSize, OUT PVOID *CollectionContext); ULONG HidParser_CalculateContextSize( IN PHID_COLLECTION Collection); HIDPARSER_STATUS HidParser_ParseReportDescriptor( PHID_PARSER Parser, PUCHAR Report, ULONG ReportSize, OUT PVOID *ParserContext); ULONG HidParser_NumberOfTopCollections( IN PVOID ParserContext); ULONG HidParser_GetContextSize( IN PHID_PARSER Parser, IN PVOID ParserContext, IN ULONG CollectionNumber); /* context.c */ PHID_COLLECTION HidParser_GetCollectionFromContext( IN PVOID Context); ULONG HidParser_GetTotalCollectionCount( IN PVOID CollectionContext); HIDPARSER_STATUS HidParser_BuildCollectionContext( IN PHID_PARSER Parser, IN PHID_COLLECTION RootCollection, IN PVOID Context, IN ULONG ContextSize); PHID_REPORT HidParser_GetReportInCollection( IN PVOID Context, IN UCHAR ReportType); #endif /* _HIDPARSER_H_ */