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