1/* 2 * Copyright 2009-2011, Michael Lotz, mmlr@mlotz.ch. 3 * Distributed under the terms of the MIT License. 4 */ 5#ifndef HID_DATA_TYPES_H 6#define HID_DATA_TYPES_H 7 8 9#include <lendian_bitfield.h> 10 11 12#define ITEM_TYPE_MAIN 0x0 13#define ITEM_TYPE_GLOBAL 0x1 14#define ITEM_TYPE_LOCAL 0x2 15#define ITEM_TYPE_LONG 0x3 16 17#define ITEM_TAG_MAIN_INPUT 0x8 18#define ITEM_TAG_MAIN_OUTPUT 0x9 19#define ITEM_TAG_MAIN_FEATURE 0xb 20#define ITEM_TAG_MAIN_COLLECTION 0xa 21#define ITEM_TAG_MAIN_END_COLLECTION 0xc 22 23#define ITEM_TAG_GLOBAL_USAGE_PAGE 0x0 24#define ITEM_TAG_GLOBAL_LOGICAL_MINIMUM 0x1 25#define ITEM_TAG_GLOBAL_LOGICAL_MAXIMUM 0x2 26#define ITEM_TAG_GLOBAL_PHYSICAL_MINIMUM 0x3 27#define ITEM_TAG_GLOBAL_PHYSICAL_MAXIMUM 0x4 28#define ITEM_TAG_GLOBAL_UNIT_EXPONENT 0x5 29#define ITEM_TAG_GLOBAL_UNIT 0x6 30#define ITEM_TAG_GLOBAL_REPORT_SIZE 0x7 31#define ITEM_TAG_GLOBAL_REPORT_ID 0x8 32#define ITEM_TAG_GLOBAL_REPORT_COUNT 0x9 33#define ITEM_TAG_GLOBAL_PUSH 0xa 34#define ITEM_TAG_GLOBAL_POP 0xb 35 36#define ITEM_TAG_LOCAL_USAGE 0x0 37#define ITEM_TAG_LOCAL_USAGE_MINIMUM 0x1 38#define ITEM_TAG_LOCAL_USAGE_MAXIMUM 0x2 39#define ITEM_TAG_LOCAL_DESIGNATOR_INDEX 0x3 40#define ITEM_TAG_LOCAL_DESIGNATOR_MINIMUM 0x4 41#define ITEM_TAG_LOCAL_DESIGNATOR_MAXIMUM 0x5 42#define ITEM_TAG_LOCAL_STRING_INDEX 0x7 43#define ITEM_TAG_LOCAL_STRING_MINIMUM 0x8 44#define ITEM_TAG_LOCAL_STRING_MAXIMUM 0x9 45#define ITEM_TAG_LOCAL_DELIMITER 0xa 46 47#define ITEM_TAG_LONG 0xf 48 49#define COLLECTION_PHYSICAL 0x00 50#define COLLECTION_APPLICATION 0x01 51#define COLLECTION_LOGICAL 0x02 52#define COLLECTION_REPORT 0x03 53#define COLLECTION_NAMED_ARRAY 0x04 54#define COLLECTION_USAGE_SWITCH 0x05 55#define COLLECTION_USAGE_MODIFIER 0x06 56#define COLLECTION_ALL 0xff 57 58#define UNIT_SYSTEM 0x0 59#define UNIT_LENGTH 0x1 60#define UNIT_MASS 0x2 61#define UNIT_TIME 0x3 62#define UNIT_TEMPERATURE 0x4 63#define UNIT_CURRENT 0x5 64#define UNIT_LUMINOUS_INTENSITY 0x6 65 66#define USAGE_PAGE_SHIFT 16 67#define USAGE_PAGE_MASK 0xffff 68#define USAGE_ID_SHIFT 0 69#define USAGE_ID_MASK 0xffff 70 71 72typedef struct item_prefix { 73 B_LBITFIELD8_3( 74 size : 2, 75 type : 2, 76 tag : 4 77 ); 78} _PACKED item_prefix; 79 80 81typedef struct short_item { 82 item_prefix prefix; 83 84 union { 85 uint8 as_uint8[4]; 86 int8 as_int8[4]; 87 uint16 as_uint16[2]; 88 int16 as_int16[2]; 89 uint32 as_uint32; 90 int32 as_int32; 91 } data; 92} _PACKED short_item; 93 94 95typedef struct long_item { 96 item_prefix prefix; 97 uint8 data_size; 98 uint8 long_item_tag; 99 uint8 data[0]; 100} _PACKED long_item; 101 102 103typedef struct main_item_data { 104 B_LBITFIELD16_9( 105 data_constant : 1, 106 array_variable : 1, 107 relative : 1, 108 wrap : 1, 109 non_linear : 1, 110 no_preferred : 1, 111 null_state : 1, 112 is_volatile : 1, 113 bits_bytes : 1 114 ); 115 116 //uint8 reserved[2]; 117} _PACKED main_item_data; 118 119 120typedef union main_item_data_converter { 121 main_item_data main_data; 122 uint16 flat_data; 123} main_item_data_converter; 124 125 126typedef struct usage_value { 127 union { 128 struct { 129 uint16 usage_id; 130 uint16 usage_page; 131 } _PACKED s; 132 uint32 extended; 133 } u; 134 135 bool is_extended; 136 137 usage_value() 138 { 139 u.extended = 0; 140 is_extended = false; 141 } 142} usage_value; 143 144 145typedef struct global_item_state { 146 uint16 usage_page; 147 uint32 logical_minimum; 148 uint32 logical_maximum; 149 uint32 physical_minimum; 150 uint32 physical_maximum; 151 uint8 unit_exponent; 152 uint8 unit; 153 uint32 report_size; 154 uint32 report_count; 155 uint8 report_id; 156 global_item_state *link; 157} global_item_state; 158 159 160typedef struct local_item_state { 161 usage_value * usage_stack; 162 uint32 usage_stack_used; 163 usage_value usage_minimum; 164 usage_value usage_maximum; 165 bool usage_minimum_set; 166 bool usage_maximum_set; 167 uint32 designator_index; 168 bool designator_index_set; 169 uint32 designator_minimum; 170 uint32 designator_maximum; 171 uint8 string_index; 172 bool string_index_set; 173 uint8 string_minimum; 174 uint8 string_maximum; 175} local_item_state; 176 177#endif // HID_DATA_TYPES_H 178