1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 /*
22  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
23  * Use is subject to license terms.
24  */
25 
26 #ifndef _SYS_USB_HIDPARSER_IMPL_H
27 #define	_SYS_USB_HIDPARSER_IMPL_H
28 
29 
30 #ifdef __cplusplus
31 extern "C" {
32 #endif
33 
34 
35 /*
36  * This header file is only included by the hidparser.  It contains
37  * implementation specifc information for the hidparser.
38  */
39 
40 
41 /*
42  *  This is for Global and Local items like Usage Page,
43  *  Usage Min, Logical Min, Report Count, Report Size etc.
44  *  "value" was declared as char array to handle
45  *  the case of extended items which can be up to
46  *  255 bytes.
47  */
48 typedef struct entity_attribute {
49 	uint_t	entity_attribute_tag;		/* see tag codes below */
50 	char	*entity_attribute_value;	/* Data bytes */
51 	int	entity_attribute_length; 	/* No. of data bytes */
52 
53 	/* linked list of attributes */
54 	struct	entity_attribute	*entity_attribute_next;
55 } entity_attribute_t;
56 
57 
58 /*
59  *  This is for these entities: Collection, Input, Output,
60  *  Feature and End Collection.
61  */
62 typedef struct entity_item {
63 
64 	/* input, output, collection, feature or end collection */
65 	int		entity_item_type;
66 
67 	/* constant, variable, relative, etc... */
68 	char		*entity_item_params;
69 
70 	int		entity_item_params_leng; /* No. of bytes for params */
71 
72 	/*
73 	 *   linked list of entity and control attributes. Parser is
74 	 *   responsbile for handling entity attributes' inheritance,
75 	 *   therefore this is NULL for end collection. But not for
76 	 *   begin collection.
77 	 */
78 	entity_attribute_t	*entity_item_attributes;
79 
80 	/*
81 	 *  linked list of children if this is a collection
82 	 *  otherwise pointer to data for input/output
83 	 */
84 	union info  {
85 		struct entity_item	*child;
86 		void			*data;
87 	} info;
88 
89 	/* pointer to the right sibling */
90 	struct entity_item	*entity_item_right_sibling;
91 
92 	struct entity_item	*prev_coll;
93 
94 } entity_item_t;
95 
96 
97 
98 /* Use this typedef in defining the FIRSTs */
99 typedef int			hidparser_terminal_t;
100 
101 
102 /*
103  * Hid parser handle
104  */
105 typedef struct hidparser_handle_impl {
106 
107 	/* Pointer to the parser tree */
108 	entity_item_t		*hidparser_handle_parse_tree;
109 
110 	/* Pointer to the hid descriptor */
111 	usb_hid_descr_t		*hidparser_handle_hid_descr;
112 } hidparser_handle;
113 
114 
115 /*
116  * Additional items that are not defined in hid_parser.h because they should
117  * not be exposed to the hid streams modules.
118  */
119 
120 
121 /*
122  * Additional Local Items
123  *      See section 6.2.2.8 of the HID 1.0 specification for
124  *      more details.
125  */
126 
127 #define	HIDPARSER_ITEM_SET_DELIMITER 0xA8
128 
129 
130 /*
131  * Addtional Global Items
132  *      See section 6.2.2.7 of the HID 1.0 specifations for
133  *      more details.
134  */
135 #define	HIDPARSER_ITEM_USAGE_PAGE 0x04
136 #define	HIDPARSER_ITEM_PUSH 0xA4
137 #define	HIDPARSER_ITEM_POP 0xB4
138 
139 /*
140  * Main Items
141  *      See section 6.2.2.5 of the HID 1.0 specification for
142  *      more details.
143  */
144 #define	HIDPARSER_ITEM_COLLECTION 0xA0
145 #define	HIDPARSER_ITEM_END_COLLECTION 0xC0
146 
147 typedef struct entity_attribute_stack {
148 	struct entity_attribute_stack	*next;
149 	entity_attribute_t	*list;
150 } entity_attribute_stack_t;
151 
152 /*
153  * This structure is the interface between the parser
154  * and the scanner.
155  */
156 typedef struct hidparser_tok {
157 	unsigned char		*hidparser_tok_text;	/* Data bytes */
158 	int			hidparser_tok_leng;	/* No. of data bytes */
159 
160 	/* Maximum buffer size */
161 	size_t			hidparser_tok_max_bsize;
162 
163 	/* Raw descriptor */
164 	unsigned char		*hidparser_tok_entity_descriptor;
165 
166 	/* Index to token currently being processed */
167 	size_t			hidparser_tok_index;
168 
169 	/* Current token being processed */
170 	int			hidparser_tok_token;
171 
172 	/* Pointer to the Global Item list */
173 	entity_attribute_t	*hidparser_tok_gitem_head;
174 
175 	/* Pointer to the Local Item list */
176 	entity_attribute_t	*hidparser_tok_litem_head;
177 
178 	/* Stack for push|pop Items */
179 	entity_attribute_stack_t	*hidparser_head;
180 
181 } hidparser_tok_t;
182 
183 
184 /*  Entity Item Tags - HID 5.4.3  */
185 #define	R_ITEM_INPUT 0x80
186 #define	R_ITEM_OUTPUT 0x90
187 #define	R_ITEM_COLLECTION 0xA0
188 #define	R_ITEM_FEATURE 0xB0
189 #define	R_ITEM_END_COLLECTION 0xC0
190 
191 /*  Entity Attribute Item Tags HID 5.4.4 */
192 #define	R_ITEM_USAGE_PAGE 0x04
193 #define	R_ITEM_LOGICAL_MINIMUM 0x14
194 #define	R_ITEM_LOGICAL_MAXIMUM 0x24
195 #define	R_ITEM_PHYSICAL_MINIMUM 0x34
196 #define	R_ITEM_PHYSICAL_MAXIMUM 0x44
197 #define	R_ITEM_EXPONENT 0x54
198 #define	R_ITEM_UNIT 0x64
199 #define	R_ITEM_REPORT_SIZE 0x74
200 #define	R_ITEM_REPORT_ID 0x84
201 #define	R_ITEM_REPORT_COUNT 0x94
202 #define	R_ITEM_PUSH 0xA4
203 #define	R_ITEM_POP 0xB4
204 
205 /*  Control Attribute Item Tags  */
206 #define	R_ITEM_USAGE 0x08
207 #define	R_ITEM_USAGE_MIN 0x18
208 #define	R_ITEM_USAGE_MAX 0x28
209 #define	R_ITEM_DESIGNATOR_INDEX 0x38
210 #define	R_ITEM_DESIGNATOR_MIN 0x48
211 #define	R_ITEM_DESIGNATOR_MAX 0x58
212 #define	R_ITEM_STRING_INDEX 0x78
213 #define	R_ITEM_STRING_MIN 0x88
214 #define	R_ITEM_STRING_MAX 0x98
215 #define	R_ITEM_SET_DELIMITER 0xA8
216 
217 
218 /* Tags used to find the FIRST tokens corresponding to a nonterminal */
219 
220 #define	HIDPARSER_ITEMS		0
221 
222 /* Used for hidparser Error check */
223 #define	HIDPARSER_ERR_ERROR		0x8000
224 #define	HIDPARSER_ERR_WARN		0x0000
225 #define	HIDPARSER_ERR_STANDARD		0x0000
226 #define	HIDPARSER_ERR_VENDOR		0x4000
227 #define	HIDPARSER_ERR_TAG_MASK		0x3f00
228 #define	HIDPARSER_ERR_SUBCODE_MASK	0xff
229 #define	HIDPARSER_DELIM_ERR1		1
230 #define	HIDPARSER_DELIM_ERR2		2
231 #define	HIDPARSER_DELIM_ERR3		3
232 
233 
234 /* other */
235 #define	EXTENDED_ITEM			0xFE
236 #define	HIDPARSER_TEXT_LENGTH		500
237 #define	HIDPARSER_ISLOCAL_MASK		0x08
238 
239 /*
240  * Debug printing
241  */
242 #define	PRINT_MASK_ALL		0xFFFFFFFF
243 
244 
245 #ifdef __cplusplus
246 }
247 #endif
248 
249 #endif	/* _SYS_USB_HIDPARSER_IMPL_H */
250