xref: /illumos-gate/usr/src/uts/common/io/usb/clients/hidparser/README (revision 533affcbc7fc4d0c8132976ea454aaa715fe2307)
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
27
28
29
30                  Hidparser: Solaris implementation
31		  _________________________________
32
33
34Report descriptors  are  basically  made of  items.   Items  can  be  'Main'
35items,  'Local' Items  and  'Global' Items. Local and  Global items  differ
36in their  scope. Local  items  hold their value only   within the main item
37in which  they are  defined  while global items retain their values through
38out all main items  unless *redefined*.
39
40Main Items  are  collection,  input, output and  feature and end collection
41items. Each  of  the  main  items are represented by an 'entity_item' struc-
42ture.  Solaris    maintains   global and  local items  as a  linked list of
43entity_attribute   structures  in the 'entity_item' structure.  Since local
44items are specific  to a main  item it   makes  sense to  keep  local items
45with in the main item.  List   of   global  items can't be kept as a single
46global list because they  can   get redefined in any  subsequent main  item
47and Solaris won't be able  to   know what  will  be the value for each main
48item. Hence they also  figure   in the list  maintained  by the entity_item
49structure.
50
51So how do we construct the tree ?
52
53Each main item forms a sibling or child of another main item except for the
54root  main  item which will  always be a Collection main item. Each collect-
55ion item  should be closed  by  an end  collection.  So  root  collection's
56sibling  will be an end  collection. Whatever  input,  output  and  feature
57items  which fall inside  a collection (please  see a collection as '{' and
58end  collection as '}' in  'C' language) will  form a child  of  the parent
59collection  with each of  them  forming  a sibling  of  each  other. i.e if
60an Input  main item comes  first within a  collection  then  it'll form the
61child of  the collection  with the subsequent  main  items  being linked as
62siblings  of each other.  When we reach an end collection, it must form the
63sibling of  the collection.  This applies for nested collections  also. i.e
64if a  collection falls within  another collection, it'll form  a  child  of
65the  parent collection with  the 'input','output' and 'feature' main  items
66falling within  the child collection forming a child  of child  collection.
67Whatever falls  outside the child collection,but inside a parent collection
68will form a sibling of the child collection.
69
70When  hidparser starts, it'll get the raw  descriptor in a structure called
71'hidparser_tok'  structure. Solaris  will  proceed by taking one byte first
72(which sort of forms a header and  indicates  how many  to  follow for each
73item for the 'item data') and then proceeds to take the  value for the item
74(which is the item data). This  'hidparser_tok'  structure  contains a list
75of global and local items. As  and when the parser encounters a global item
76it'll add it to the global item list. The same applies for local items also.
77The only difference is that if  a global item is getting redefined (i.e the
78global item is already present  in the gitem list),  then "the global item"
79(i.e one of the global item) is freed and the new one is put instead. Local
80items can get redefined without  disturbing the earlier  values.  This goes
81on till a main item is encountered. When a  main  item  is encountered  the
82global item list  is copied over to the entity_item structure and the local
83item list will start  where  the global item  list  stops ( in the 'entity_
84attribute' list). Before we start on the next item the local item list will
85be freed (in the hidparser_tok  structure) but the global item list will be
86maintained since their scope is through out the report descriptor.
87
88The two additions which has happened  in this  round  of  changes  are  the
89support for push|pop and delimiter items. 'push' basically asks the  parser
90to copy over the list of  global  items, while  'pop' takes the last pushed
91list as the current one. The entity_attribute_stack forms a stack of global
92item list pointers from which they can be pop-ed on the gitem list.'delimit-
93er'items basically allows you to interpret the data that is  being received
94differently depending on the way you use it and requires the parser to reco-
95gnize only the first 'usage' (which is what Solaris does with my changes).
96
97
98___________________________________________________________________________
99
100Example:
101
102
103Following is the report descriptor dump for Labtec Spaceball (you can  call
104it a mouse).
105
106hid1:   Index = 0       value =0x5
107hid1:   Index = 1       value =0x1
108hid1:   Index = 2       value =0x9
109hid1:   Index = 3       value =0x8
110hid1:   Index = 4       value =0xa1
111hid1:   Index = 5       value =0x1
112hid1:   Index = 6       value =0xa1
113hid1:   Index = 7       value =0x0
114hid1:   Index = 8       value =0x85
115hid1:   Index = 9       value =0x1
116hid1:   Index = 10      value =0x16
117hid1:   Index = 11      value =0x0
118hid1:   Index = 12      value =0x80
119hid1:   Index = 13      value =0x26
120hid1:   Index = 14      value =0xff
121hid1:   Index = 15      value =0x7f
122hid1:   Index = 16      value =0x9
123hid1:   Index = 17      value =0x30
124hid1:   Index = 18      value =0x9
125hid1:   Index = 19      value =0x31
126hid1:   Index = 20      value =0x9
127hid1:   Index = 21      value =0x32
128hid1:   Index = 22      value =0x75
129hid1:   Index = 23      value =0x10
130hid1:   Index = 24      value =0x95
131hid1:   Index = 25      value =0x3
132hid1:   Index = 26      value =0x81
133hid1:   Index = 27      value =0x2
134hid1:   Index = 28      value =0xc0
135hid1:   Index = 29      value =0xa1
136hid1:   Index = 30      value =0x0
137hid1:   Index = 31      value =0x85
138hid1:   Index = 32      value =0x2
139hid1:   Index = 33      value =0x9
140hid1:   Index = 34      value =0x33
141hid1:   Index = 35      value =0x9
142hid1:   Index = 36      value =0x34
143hid1:   Index = 37      value =0x9
144hid1:   Index = 38      value =0x35
145hid1:   Index = 39      value =0x75
146hid1:   Index = 40      value =0x10
147hid1:   Index = 41      value =0x95
148hid1:   Index = 42      value =0x3
149hid1:   Index = 43      value =0x81
150hid1:   Index = 44      value =0x2
151hid1:   Index = 45      value =0xc0
152hid1:   Index = 46      value =0xa1
153hid1:   Index = 47      value =0x2
154hid1:   Index = 48      value =0x85
155hid1:   Index = 49      value =0x3
156hid1:   Index = 50      value =0x5
157hid1:   Index = 51      value =0x1
158hid1:   Index = 52      value =0x9
159hid1:   Index = 53      value =0x3a
160hid1:   Index = 54      value =0x75
161hid1:   Index = 55      value =0x10
162hid1:   Index = 56      value =0x95
163hid1:   Index = 57      value =0x1
164hid1:   Index = 58      value =0x81
165hid1:   Index = 59      value =0x2
166hid1:   Index = 60      value =0x5
167hid1:   Index = 61      value =0x9
168hid1:   Index = 62      value =0x19
169hid1:   Index = 63      value =0x1
170hid1:   Index = 64      value =0x29
171hid1:   Index = 65      value =0xd
172hid1:   Index = 66      value =0x15
173hid1:   Index = 67      value =0x0
174hid1:   Index = 68      value =0x25
175hid1:   Index = 69      value =0x1
176hid1:   Index = 70      value =0x35
177hid1:   Index = 71      value =0x0
178hid1:   Index = 72      value =0x45
179hid1:   Index = 73      value =0x1
180hid1:   Index = 74      value =0x75
181hid1:   Index = 75      value =0x1
182hid1:   Index = 76      value =0x95
183hid1:   Index = 77      value =0xd
184hid1:   Index = 78      value =0x81
185hid1:   Index = 79      value =0x2
186hid1:   Index = 80      value =0x95
187hid1:   Index = 81      value =0x3
188hid1:   Index = 82      value =0x81
189hid1:   Index = 83      value =0x1
190hid1:   Index = 84      value =0xc0
191hid1:   Index = 85      value =0x5
192hid1:   Index = 86      value =0x1
193hid1:   Index = 87      value =0x9
194hid1:   Index = 88      value =0x3a
195hid1:   Index = 89      value =0xa1
196hid1:   Index = 90      value =0x2
197hid1:   Index = 91      value =0x15
198hid1:   Index = 92      value =0x80
199hid1:   Index = 93      value =0x25
200hid1:   Index = 94      value =0x7f
201hid1:   Index = 95      value =0x75
202hid1:   Index = 96      value =0x8
203hid1:   Index = 97      value =0x9
204hid1:   Index = 98      value =0x3a
205hid1:   Index = 99      value =0xa1
206hid1:   Index = 100     value =0x2
207hid1:   Index = 101     value =0x85
208hid1:   Index = 102     value =0x4
209hid1:   Index = 103     value =0x9
210hid1:   Index = 104     value =0x3a
211hid1:   Index = 105     value =0x95
212hid1:   Index = 106     value =0x4
213hid1:   Index = 107     value =0xb1
214hid1:   Index = 108     value =0x2
215hid1:   Index = 109     value =0xc0
216hid1:   Index = 110     value =0xa1
217hid1:   Index = 111     value =0x2
218hid1:   Index = 112     value =0x85
219hid1:   Index = 113     value =0x5
220hid1:   Index = 114     value =0x9
221hid1:   Index = 115     value =0x3a
222hid1:   Index = 116     value =0x95
223hid1:   Index = 117     value =0x1
224hid1:   Index = 118     value =0xb1
225hid1:   Index = 119     value =0x2
226hid1:   Index = 120     value =0xc0
227hid1:   Index = 121     value =0xa1
228hid1:   Index = 122     value =0x2
229hid1:   Index = 123     value =0x85
230hid1:   Index = 124     value =0x6
231hid1:   Index = 125     value =0x9
232hid1:   Index = 126     value =0x3a
233hid1:   Index = 127     value =0x95
234hid1:   Index = 128     value =0x1
235hid1:   Index = 129     value =0xb1
236hid1:   Index = 130     value =0x2
237hid1:   Index = 131     value =0xc0
238hid1:   Index = 132     value =0xa1
239hid1:   Index = 133     value =0x2
240hid1:   Index = 134     value =0x85
241hid1:   Index = 135     value =0x7
242hid1:   Index = 136     value =0x9
243hid1:   Index = 137     value =0x3a
244hid1:   Index = 138     value =0x95
245hid1:   Index = 139     value =0x10
246hid1:   Index = 140     value =0xb1
247hid1:   Index = 141     value =0x2
248hid1:   Index = 142     value =0xc0
249hid1:   Index = 143     value =0xa1
250hid1:   Index = 144     value =0x2
251hid1:   Index = 145     value =0x85
252hid1:   Index = 146     value =0x8
253hid1:   Index = 147     value =0x9
254hid1:   Index = 148     value =0x3a
255hid1:   Index = 149     value =0x95
256hid1:   Index = 150     value =0x10
257hid1:   Index = 151     value =0xb1
258hid1:   Index = 152     value =0x2
259hid1:   Index = 153     value =0xc0
260hid1:   Index = 154     value =0xa1
261hid1:   Index = 155     value =0x2
262hid1:   Index = 156     value =0x85
263hid1:   Index = 157     value =0x9
264hid1:   Index = 158     value =0x9
265hid1:   Index = 159     value =0x3a
266hid1:   Index = 160     value =0x95
267hid1:   Index = 161     value =0xc
268hid1:   Index = 162     value =0xb1
269hid1:   Index = 163     value =0x2
270hid1:   Index = 164     value =0xc0
271hid1:   Index = 165     value =0xa1
272hid1:   Index = 166     value =0x2
273hid1:   Index = 167     value =0x85
274hid1:   Index = 168     value =0xa
275hid1:   Index = 169     value =0x9
276hid1:   Index = 170     value =0x3a
277hid1:   Index = 171     value =0x95
278hid1:   Index = 172     value =0x1
279hid1:   Index = 173     value =0xb1
280hid1:   Index = 174     value =0x2
281hid1:   Index = 175     value =0xc0
282hid1:   Index = 176     value =0xa1
283hid1:   Index = 177     value =0x2
284hid1:   Index = 178     value =0x85
285hid1:   Index = 179     value =0xb
286hid1:   Index = 180     value =0x9
287hid1:   Index = 181     value =0x3a
288hid1:   Index = 182     value =0x95
289hid1:   Index = 183     value =0x1
290hid1:   Index = 184     value =0xb1
291hid1:   Index = 185     value =0x2
292hid1:   Index = 186     value =0xc0
293hid1:   Index = 187     value =0xa1
294hid1:   Index = 188     value =0x2
295hid1:   Index = 189     value =0x85
296hid1:   Index = 190     value =0xc
297hid1:   Index = 191     value =0x9
298hid1:   Index = 192     value =0x3a
299hid1:   Index = 193     value =0x95
300hid1:   Index = 194     value =0x1
301hid1:   Index = 195     value =0xb1
302hid1:   Index = 196     value =0x2
303hid1:   Index = 197     value =0xc0
304hid1:   Index = 198     value =0xa1
305hid1:   Index = 199     value =0x2
306hid1:   Index = 200     value =0x85
307hid1:   Index = 201     value =0xd
308hid1:   Index = 202     value =0x9
309hid1:   Index = 203     value =0x3a
310hid1:   Index = 204     value =0x95
311hid1:   Index = 205     value =0x2
312hid1:   Index = 206     value =0xb1
313hid1:   Index = 207     value =0x2
314hid1:   Index = 208     value =0xc0
315hid1:   Index = 209     value =0xc0
316hid1:   Index = 210     value =0xc0
317
318___________________________________________________________________________
319
320Item format:
321
322	------------------------------------
323	|data|data(8)|tag(4),type(2),size(2)|
324	------------------------------------
325                            |<------'ch'---------->|
326
327___________________________________________________________________________
328
329'hidparser_ReportDescriptor()' will call  'hidparser_scan()'  first.  Hence
330you will see the  'scanner'  output first.  The scanner will go through the
331first byte and set hidparser_tok_token to the tag|type value. hidparser_tok
332_leng  will be set to size and the 'data' part will be copied to tok_ text.
333'hidparser_ReportDescriptor'  will   call  'hidparser_ItemList()'  to  take
334charge of the rest of the parsing.
335
336___________________________________________________________________________
337
338hidparser:      scanner: index  = 0x0 ch = 0x5 [ = 0x00000101 = tag[0],
339                                               type[1], size[1] ]
340
341hidparser:      scanner: parsed_length = 1 <========size[1] [Type 1 = Global
342			Tag[0] = Usage Page ]
343
344___________________________________________________________________________
345
346Here the length of 1 indicates that the parameter or value associated  with
347the usage page is contained in the next character/byte.
348
349___________________________________________________________________________
350
351hidparser:      scanner: parsed_text[0] = 0x1,index = 0x1
352___________________________________________________________________________
353
354The next byte contains a value of 0x1. If you look at the usage table spec
355you can see that value of 1 stands for Generic Desktop.
356___________________________________________________________________________
357
358hidparser:      scanner: lexical analyzer found 0x5 before translation
359hidparser:      scanner: aindex  = 0x2
360___________________________________________________________________________
361
362Here  'hidparser_ItemList()'  would have  been called,   which  again calls
363'hidparser_Items()'. The purpose of 'hidparser_Items()'  is to  get through
364all the Items and break when it encounters a main item.  'hidparser_Items()
365will  again  call  'hidparser_GlobalItem()'  and 'hidparser_LocalItem()' to
366make a list of entity attributes in the hidparser_tok structure.
367___________________________________________________________________________
368
369hidparser:      hidparser_GlobalItem:index = 0x0 token = 0x4
370
371___________________________________________________________________________
372
373The above goes to gitem list.
374___________________________________________________________________________
375
376
377hidparser:      scanner: index  = 0x2 ch = 0x9 [ = 0x00001001 = tag[0],
378			type[2], size[1]]
379hidparser:      scanner: parsed_length = 1
380hidparser:      scanner: parsed_text[0] = 0x8,index = 0x3
381hidparser:      scanner: lexical analyzer found 0x9 before translation
382hidparser:      scanner: aindex  = 0x4
383hidparser:      hidparser_LocalItem:index = 0x2 token = 0x8
384___________________________________________________________________________
385
386The above goes to local item list in hidparser_tok_structure.
387___________________________________________________________________________
388
389hidparser:      scanner: index  = 0x4 ch = 0xa1 [= 0x10100001 = tag[a],
390			type[0], size[1]]
391hidparser:      scanner: parsed_length = 1	[ This is a main item ]
392hidparser:      scanner: parsed_text[0] = 0x1,index = 0x5
393hidparser:      scanner: lexical analyzer found 0xa1 before translation
394hidparser:      scanner: aindex  = 0x6
395
396____________________________________________________________________________
397
398Here 'hidparser_Items()' will break and pass the control back to 'hidparser_
399ItemList()' which will call 'hidparser_MainItem()'  to do things specific to
400a main item (like allocating  an entity_item  structure  and returning it in
401curr_ei).  'hidparser_MainItem()' will allocate an entity_item structure and
402copy the gitem list from hidparser tok structure and add the local item list
403to the end of global item list  (in  the  entity_item_attributes  member  of
404entity_item structure).
405
406____________________________________________________________________________
407
408hidparser:      hidparser_MainItem:index = 0x4 token = 0xa0
409hidparser:      scanner: index  = 0x6 ch = 0xa1
410hidparser:      scanner: parsed_length = 1
411hidparser:      scanner: parsed_text[0] = 0x0,index = 0x7
412hidparser:      scanner: lexical analyzer found 0xa1 before translation
413hidparser:      scanner: aindex  = 0x8
414hidparser:      Start Collection:cache_ei = 0xcab8d220, curr_ei = 0xcab8d220
415
416____________________________________________________________________________
417
418This forms the root collection.  'cache_ei'  or the cached  entity_item will
419always point to the last collection encountered.  Each entity_item structure
420will have a pointer to the previous collection.  This is basically to remove
421recursion when we support nested collections.  So if I have something like
422
423Collection
424	....
425	Collection
426		....
427		Collection
428		....
429		End Collection
430		....
431	End collection
432	....
433End Collection
434
435and if we assume  that  the parser is currently @ the third Collection item,
436then cache_ei will point to the third collection, it's prev_ei will point to
437the second collection and it's prev_ei will point to the root collection. As
438we move down the first end collection, cache_ei would have changed to second
439collection and so on.
440____________________________________________________________________________
441
442hidparser:      hidparser_MainItem:index = 0x6 token = 0xa0
443
444____________________________________________________________________________
445
446We encounter  another collection here [ so a nested collection ].  This   'ei'
447will have a  global  item  list (only,  as there are no local items. Remember
448that  we  preserve  global  item list  in  the  hidparser_tok_structure while
449blanking out the local item list as we encounter a main item).
450____________________________________________________________________________
451
452hidparser:      scanner: index  = 0x8 ch = 0x85
453hidparser:      scanner: parsed_length = 1
454hidparser:      scanner: parsed_text[0] = 0x1,index = 0x9
455hidparser:      scanner: lexical analyzer found 0x85 before translation
456hidparser:      scanner: aindex  = 0xa
457hidparser:      Start Collection:cache_ei = 0xcab84db0, curr_ei = 0xcab84db0
458
459
460hidparser:      hidparser_GlobalItem:index = 0x8 token = 0x84
461_____________________________________________________________________________
462
463This is a global item. Will get added to already existent Usage page GI in the
464'hidparser_tok' structure.
465
466hidparser:      scanner: index  = 0xa ch = 0x16
467hidparser:      scanner: parsed_length = 2
468hidparser:      scanner: parsed_text[0] = 0x0,index = 0xb
469hidparser:      scanner: parsed_text[1] = 0x80,index = 0xc
470hidparser:      scanner: lexical analyzer found 0x16 before translation
471hidparser:      scanner: aindex  = 0xd
472hidparser:      hidparser_GlobalItem:index = 0xa token = 0x14
473hidparser:      scanner: index  = 0xd ch = 0x26
474hidparser:      scanner: parsed_length = 2
475hidparser:      scanner: parsed_text[0] = 0xff,index = 0xe
476hidparser:      scanner: parsed_text[1] = 0x7f,index = 0xf
477hidparser:      scanner: lexical analyzer found 0x26 before translation
478hidparser:      scanner: aindex  = 0x10
479hidparser:      hidparser_GlobalItem:index = 0xd token = 0x24
480hidparser:      scanner: index  = 0x10 ch = 0x9
481hidparser:      scanner: parsed_length = 1
482hidparser:      scanner: parsed_text[0] = 0x30,index = 0x11
483hidparser:      scanner: lexical analyzer found 0x9 before translation
484hidparser:      scanner: aindex  = 0x12
485hidparser:      hidparser_LocalItem:index = 0x10 token = 0x8
486hidparser:      scanner: index  = 0x12 ch = 0x9
487hidparser:      scanner: parsed_length = 1
488hidparser:      scanner: parsed_text[0] = 0x31,index = 0x13
489hidparser:      scanner: lexical analyzer found 0x9 before translation
490hidparser:      scanner: aindex  = 0x14
491hidparser:      hidparser_LocalItem:index = 0x12 token = 0x8
492hidparser:      scanner: index  = 0x14 ch = 0x9
493hidparser:      scanner: parsed_length = 1
494hidparser:      scanner: parsed_text[0] = 0x32,index = 0x15
495hidparser:      scanner: lexical analyzer found 0x9 before translation
496hidparser:      scanner: aindex  = 0x16
497hidparser:      hidparser_LocalItem:index = 0x14 token = 0x8
498hidparser:      scanner: index  = 0x16 ch = 0x75
499hidparser:      scanner: parsed_length = 1
500hidparser:      scanner: parsed_text[0] = 0x10,index = 0x17
501hidparser:      scanner: lexical analyzer found 0x75 before translation
502hidparser:      scanner: aindex  = 0x18
503hidparser:      hidparser_GlobalItem:index = 0x16 token = 0x74
504hidparser:      scanner: index  = 0x18 ch = 0x95
505hidparser:      scanner: parsed_length = 1
506hidparser:      scanner: parsed_text[0] = 0x3,index = 0x19
507hidparser:      scanner: lexical analyzer found 0x95 before translation
508hidparser:      scanner: aindex  = 0x1a
509hidparser:      hidparser_GlobalItem:index = 0x18 token = 0x94
510hidparser:      scanner: index  = 0x1a ch = 0x81
511hidparser:      scanner: parsed_length = 1
512hidparser:      scanner: parsed_text[0] = 0x2,index = 0x1b
513hidparser:      scanner: lexical analyzer found 0x81 before translation
514hidparser:      scanner: aindex  = 0x1c
515hidparser:      hidparser_MainItem:index = 0x1a token = 0x80
516hidparser:      scanner: index  = 0x1c ch = 0xc0
517hidparser:      scanner: parsed_length = 0
518hidparser:      scanner: lexical analyzer found 0xc0 before translation
519hidparser:      scanner: aindex  = 0x1d
520hidparser:      Main Item: token = 0x80, curr_ei = 0xcab7ecf8  will be  the
521	child of prev_ei = 0xcab84db0, cache_ei being 0xcab84db0
522
523___________________________________________________________________________
524
525This is the Input main item and will form the child of collection @ 0xcab84-
526db0.
527___________________________________________________________________________
528
529hidparser:      hidparser_MainItem:index = 0x1c token = 0xc0
530hidparser:      scanner: index  = 0x1d ch = 0xa1
531hidparser:      scanner: parsed_length = 1
532hidparser:      scanner: parsed_text[0] = 0x0,index = 0x1e
533hidparser:      scanner: lexical analyzer found 0xa1 before translation
534hidparser:      scanner: aindex  = 0x1f
535hidparser:      End Collection: cache_ei = 0xcab84db0, curr_ei = 0xcab84630
536____________________________________________________________________________
537
538This  End collection and will for the right sibling of 0xcab84db0 which will
539make cache_ei point to root collection.
540____________________________________________________________________________
541
542hidparser:      hidparser_MainItem:index = 0x1d token = 0xa0
543hidparser:      scanner: index  = 0x1f ch = 0x85
544hidparser:      scanner: parsed_length = 1
545hidparser:      scanner: parsed_text[0] = 0x2,index = 0x20
546hidparser:      scanner: lexical analyzer found 0x85 before translation
547hidparser:      scanner: aindex  = 0x21
548hidparser:      Start Collection:cache_ei = 0xcab84750, curr_ei = 0xcab84750
549____________________________________________________________________________
550
551Again a Collection Item.
552
553The tree corresponding to the above list will be
554
555hidparser:      Usage Page(0x1) <---------------------- GI
556hidparser:      Usage(0x8) <--------------------------- LI
557hidparser:      Collection(0x1)<----------------------- MI
558hidparser:           Usage Page(0x1)<------------------ Carried over GI
559hidparser:           Collection(0x0)<------------------ MI
560hidparser:                Usage Page(0x1)<------------- Carried over GI
561hidparser:                Report Id(0x1)<-------------- GI [ New ]
562hidparser:                Logical Minimum(0x8000)<----- GI
563hidparser:                Logical Maximum(0x7FFF)<----- GI
564hidparser:                Report Size(0x10)<----------- GI
565hidparser:                Report Count(0x3)<----------- GI
566hidparser:                Usage(0x30)<----------------- LI
567hidparser:                Usage(0x31)<----------------- LI
568hidparser:                Usage(0x32)<----------------- LI
569hidparser:                Input(0x2)<------------------ MI
570hidparser:           End Collection(0x0)<-------------- MI
571hidparser:           Usage Page(0x1)<------------------ Carried over GI
572hidparser:           Report Id(0x1)<------------------- Carried over GI
573hidparser:           Logical Minimum(0x8000)<----------   " "
574hidparser:           Logical Maximum(0x7FFF)<----------   " "
575hidparser:           Report Size(0x10)<----------------   " "
576hidparser:           Report Count(0x3)<----------------   " "
577hidparser:           Collection(0x0)<------------------ MI
578
579The actual tree corresponding to a descriptor dump will be
580
581
582      0x5, 0x1,              /* Usage Page (Generic Desktop)             */
583      0x9, 0x8,              /* Usage (0x8:Multi-axis controller)        */
584      0xa1, 0x1,             /* Collection (Application)                 */
585      0xa1, 0,               /*     Collection (Physical)                */
586      0x85, 0x1,             /*         Report ID (0x1)                  */
587      0x16, 0, 0x80,         /*         Logical Minimum (0x8000)         */
588      0x26, 0xff, 0x7f,      /*         Logical Maximum (0x7fff)         */
589      0x9, 0x30,             /*         Usage (0x30:X)                   */
590      0x9, 0x31,             /*         Usage (0x31:Y)                   */
591      0x9, 0x32,             /*         Usage (0x32:Z)                   */
592      0x75, 0x10,            /*         Report Size (0x10)               */
593      0x95, 0x3,             /*         Report Count (0x3)               */
594      0x81, 0x2,             /*         Input (Data, Variable, Absolute) */
595      0xc0,                  /*     End Collection                       */
596      0xa1, 0,               /*     Collection (Physical)                */
597
598As can be seen, the tree that Solaris constructs have carried over GI extra
599which is the only difference. But that doesn't make a difference in the way
600we handle data.
601
602There are somethings to be noted at this point. If subsequently we encount-
603er another  global item  which has already been defined (say report size),
604then we  will go to the  global list  maintained in the 'hidparser_tok' st-
605ructure and replace the already existant one  (i.e report size(0x10)  with
606the new one ).
607
608For end collection  main item, we don't attach the global item list to the
609entity item structure.
610
611The rest of the document is a continuation of where we left off the parsing.
612The theory of operation is the same.
613
614___________________________________________________________________________
615
616
617hidparser:      hidparser_GlobalItem:index = 0x1f token = 0x84
618hidparser:      scanner: index  = 0x21 ch = 0x9
619hidparser:      scanner: parsed_length = 1
620hidparser:      scanner: parsed_text[0] = 0x33,index = 0x22
621hidparser:      scanner: lexical analyzer found 0x9 before translation
622hidparser:      scanner: aindex  = 0x23
623hidparser:      hidparser_LocalItem:index = 0x21 token = 0x8
624hidparser:      scanner: index  = 0x23 ch = 0x9
625hidparser:      scanner: parsed_length = 1
626hidparser:      scanner: parsed_text[0] = 0x34,index = 0x24
627hidparser:      scanner: lexical analyzer found 0x9 before translation
628hidparser:      scanner: aindex  = 0x25
629hidparser:      hidparser_LocalItem:index = 0x23 token = 0x8
630hidparser:      scanner: index  = 0x25 ch = 0x9
631hidparser:      scanner: parsed_length = 1
632hidparser:      scanner: parsed_text[0] = 0x35,index = 0x26
633hidparser:      scanner: lexical analyzer found 0x9 before translation
634hidparser:      scanner: aindex  = 0x27
635hidparser:      hidparser_LocalItem:index = 0x25 token = 0x8
636hidparser:      scanner: index  = 0x27 ch = 0x75
637hidparser:      scanner: parsed_length = 1
638hidparser:      scanner: parsed_text[0] = 0x10,index = 0x28
639hidparser:      scanner: lexical analyzer found 0x75 before translation
640hidparser:      scanner: aindex  = 0x29
641hidparser:      hidparser_GlobalItem:index = 0x27 token = 0x74
642hidparser:      scanner: index  = 0x29 ch = 0x95
643hidparser:      scanner: parsed_length = 1
644hidparser:      scanner: parsed_text[0] = 0x3,index = 0x2a
645hidparser:      scanner: lexical analyzer found 0x95 before translation
646hidparser:      scanner: aindex  = 0x2b
647hidparser:      hidparser_GlobalItem:index = 0x29 token = 0x94
648hidparser:      scanner: index  = 0x2b ch = 0x81
649hidparser:      scanner: parsed_length = 1
650hidparser:      scanner: parsed_text[0] = 0x2,index = 0x2c
651hidparser:      scanner: lexical analyzer found 0x81 before translation
652hidparser:      scanner: aindex  = 0x2d
653hidparser:      hidparser_MainItem:index = 0x2b token = 0x80
654hidparser:      scanner: index  = 0x2d ch = 0xc0
655hidparser:      scanner: parsed_length = 0
656hidparser:      scanner: lexical analyzer found 0xc0 before translation
657hidparser:      scanner: aindex  = 0x2e
658hidparser:      Main Item: token = 0x80, curr_ei = 0xcab7e098 will be the
659	 child of prev_ei = 0xcab84750, cache_ei being 0xcab84750
660hidparser:      hidparser_MainItem:index = 0x2d token = 0xc0
661hidparser:      scanner: index  = 0x2e ch = 0xa1
662hidparser:      scanner: parsed_length = 1
663hidparser:      scanner: parsed_text[0] = 0x2,index = 0x2f
664hidparser:      scanner: lexical analyzer found 0xa1 before translation
665hidparser:      scanner: aindex  = 0x30
666hidparser:      End Collection: cache_ei = 0xcab84750, curr_ei = 0xcab7af40
667hidparser:      hidparser_MainItem:index = 0x2e token = 0xa0
668hidparser:      scanner: index  = 0x30 ch = 0x85
669hidparser:      scanner: parsed_length = 1
670hidparser:      scanner: parsed_text[0] = 0x3,index = 0x31
671hidparser:      scanner: lexical analyzer found 0x85 before translation
672hidparser:      scanner: aindex  = 0x32
673hidparser:      Start Collection:cache_ei = 0xcab7ad30, curr_ei = 0xcab7ad30
674hidparser:      hidparser_GlobalItem:index = 0x30 token = 0x84
675hidparser:      scanner: index  = 0x32 ch = 0x5
676hidparser:      scanner: parsed_length = 1
677hidparser:      scanner: parsed_text[0] = 0x1,index = 0x33
678hidparser:      scanner: lexical analyzer found 0x5 before translation
679hidparser:      scanner: aindex  = 0x34
680hidparser:      hidparser_GlobalItem:index = 0x32 token = 0x4
681hidparser:      scanner: index  = 0x34 ch = 0x9
682hidparser:      scanner: parsed_length = 1
683hidparser:      scanner: parsed_text[0] = 0x3a,index = 0x35
684hidparser:      scanner: lexical analyzer found 0x9 before translation
685hidparser:      scanner: aindex  = 0x36
686hidparser:      hidparser_LocalItem:index = 0x34 token = 0x8
687hidparser:      scanner: index  = 0x36 ch = 0x75
688hidparser:      scanner: parsed_length = 1
689hidparser:      scanner: parsed_text[0] = 0x10,index = 0x37
690hidparser:      scanner: lexical analyzer found 0x75 before translation
691hidparser:      scanner: aindex  = 0x38
692hidparser:      hidparser_GlobalItem:index = 0x36 token = 0x74
693hidparser:      scanner: index  = 0x38 ch = 0x95
694hidparser:      scanner: parsed_length = 1
695hidparser:      scanner: parsed_text[0] = 0x1,index = 0x39
696hidparser:      scanner: lexical analyzer found 0x95 before translation
697hidparser:      scanner: aindex  = 0x3a
698hidparser:      hidparser_GlobalItem:index = 0x38 token = 0x94
699hidparser:      scanner: index  = 0x3a ch = 0x81
700hidparser:      scanner: parsed_length = 1
701hidparser:      scanner: parsed_text[0] = 0x2,index = 0x3b
702hidparser:      scanner: lexical analyzer found 0x81 before translation
703hidparser:      scanner: aindex  = 0x3c
704hidparser:      hidparser_MainItem:index = 0x3a token = 0x80
705hidparser:      scanner: index  = 0x3c ch = 0x5
706hidparser:      scanner: parsed_length = 1
707hidparser:      scanner: parsed_text[0] = 0x9,index = 0x3d
708hidparser:      scanner: lexical analyzer found 0x5 before translation
709hidparser:      scanner: aindex  = 0x3e
710hidparser:      Main Item: token = 0x80, curr_ei = 0xcab7ad60 will be the
711	 child of prev_ei = 0xcab7ad30, cache_ei being 0xcab7ad30
712hidparser:      hidparser_GlobalItem:index = 0x3c token = 0x4
713hidparser:      scanner: index  = 0x3e ch = 0x19
714hidparser:      scanner: parsed_length = 1
715hidparser:      scanner: parsed_text[0] = 0x1,index = 0x3f
716hidparser:      scanner: lexical analyzer found 0x19 before translation
717hidparser:      scanner: aindex  = 0x40
718hidparser:      hidparser_LocalItem:index = 0x3e token = 0x18
719hidparser:      scanner: index  = 0x40 ch = 0x29
720hidparser:      scanner: parsed_length = 1
721hidparser:      scanner: parsed_text[0] = 0xd,index = 0x41
722hidparser:      scanner: lexical analyzer found 0x29 before translation
723hidparser:      scanner: aindex  = 0x42
724hidparser:      hidparser_LocalItem:index = 0x40 token = 0x28
725hidparser:      scanner: index  = 0x42 ch = 0x15
726hidparser:      scanner: parsed_length = 1
727hidparser:      scanner: parsed_text[0] = 0x0,index = 0x43
728hidparser:      scanner: lexical analyzer found 0x15 before translation
729hidparser:      scanner: aindex  = 0x44
730hidparser:      hidparser_GlobalItem:index = 0x42 token = 0x14
731hidparser:      scanner: index  = 0x44 ch = 0x25
732hidparser:      scanner: parsed_length = 1
733hidparser:      scanner: parsed_text[0] = 0x1,index = 0x45
734hidparser:      scanner: lexical analyzer found 0x25 before translation
735hidparser:      scanner: aindex  = 0x46
736hidparser:      hidparser_GlobalItem:index = 0x44 token = 0x24
737hidparser:      scanner: index  = 0x46 ch = 0x35
738hidparser:      scanner: parsed_length = 1
739hidparser:      scanner: parsed_text[0] = 0x0,index = 0x47
740hidparser:      scanner: lexical analyzer found 0x35 before translation
741hidparser:      scanner: aindex  = 0x48
742hidparser:      hidparser_GlobalItem:index = 0x46 token = 0x34
743hidparser:      scanner: index  = 0x48 ch = 0x45
744hidparser:      scanner: parsed_length = 1
745hidparser:      scanner: parsed_text[0] = 0x1,index = 0x49
746hidparser:      scanner: lexical analyzer found 0x45 before translation
747hidparser:      scanner: aindex  = 0x4a
748hidparser:      hidparser_GlobalItem:index = 0x48 token = 0x44
749hidparser:      scanner: index  = 0x4a ch = 0x75
750hidparser:      scanner: parsed_length = 1
751hidparser:      scanner: parsed_text[0] = 0x1,index = 0x4b
752hidparser:      scanner: lexical analyzer found 0x75 before translation
753hidparser:      scanner: aindex  = 0x4c
754hidparser:      hidparser_GlobalItem:index = 0x4a token = 0x74
755hidparser:      scanner: index  = 0x4c ch = 0x95
756hidparser:      scanner: parsed_length = 1
757hidparser:      scanner: parsed_text[0] = 0xd,index = 0x4d
758hidparser:      scanner: lexical analyzer found 0x95 before translation
759hidparser:      scanner: aindex  = 0x4e
760hidparser:      hidparser_GlobalItem:index = 0x4c token = 0x94
761hidparser:      scanner: index  = 0x4e ch = 0x81
762hidparser:      scanner: parsed_length = 1
763hidparser:      scanner: parsed_text[0] = 0x2,index = 0x4f
764hidparser:      scanner: lexical analyzer found 0x81 before translation
765hidparser:      scanner: aindex  = 0x50
766hidparser:      hidparser_MainItem:index = 0x4e token = 0x80
767hidparser:      scanner: index  = 0x50 ch = 0x95
768hidparser:      scanner: parsed_length = 1
769hidparser:      scanner: parsed_text[0] = 0x3,index = 0x51
770hidparser:      scanner: lexical analyzer found 0x95 before translation
771hidparser:      scanner: aindex  = 0x52
772hidparser:      Main Item: token = 0x80, curr_ei = 0xcab7ecc8 will be the
773	 right sibling of prev_ei = 0xcab7ad60, cache_ei being 0xc
774ab7ad30
775hidparser:      hidparser_GlobalItem:index = 0x50 token = 0x94
776hidparser:      scanner: index  = 0x52 ch = 0x81
777hidparser:      scanner: parsed_length = 1
778hidparser:      scanner: parsed_text[0] = 0x1,index = 0x53
779hidparser:      scanner: lexical analyzer found 0x81 before translation
780hidparser:      scanner: aindex  = 0x54
781hidparser:      hidparser_MainItem:index = 0x52 token = 0x80
782hidparser:      scanner: index  = 0x54 ch = 0xc0
783hidparser:      scanner: parsed_length = 0
784hidparser:      scanner: lexical analyzer found 0xc0 before translation
785hidparser:      scanner: aindex  = 0x55
786hidparser:      Main Item: token = 0x80, curr_ei = 0xcab7ec98 will be the
787	 right sibling of prev_ei = 0xcab7ecc8, cache_ei being 0xc
788ab7ad30
789hidparser:      hidparser_MainItem:index = 0x54 token = 0xc0
790hidparser:      scanner: index  = 0x55 ch = 0x5
791hidparser:      scanner: parsed_length = 1
792hidparser:      scanner: parsed_text[0] = 0x1,index = 0x56
793hidparser:      scanner: lexical analyzer found 0x5 before translation
794hidparser:      scanner: aindex  = 0x57
795hidparser:      End Collection: cache_ei = 0xcab7ad30, curr_ei = 0xcab7ad00
796hidparser:      hidparser_GlobalItem:index = 0x55 token = 0x4
797hidparser:      scanner: index  = 0x57 ch = 0x9
798hidparser:      scanner: parsed_length = 1
799hidparser:      scanner: parsed_text[0] = 0x3a,index = 0x58
800hidparser:      scanner: lexical analyzer found 0x9 before translation
801hidparser:      scanner: aindex  = 0x59
802hidparser:      hidparser_LocalItem:index = 0x57 token = 0x8
803hidparser:      scanner: index  = 0x59 ch = 0xa1
804hidparser:      scanner: parsed_length = 1
805hidparser:      scanner: parsed_text[0] = 0x2,index = 0x5a
806hidparser:      scanner: lexical analyzer found 0xa1 before translation
807hidparser:      scanner: aindex  = 0x5b
808hidparser:      hidparser_MainItem:index = 0x59 token = 0xa0
809hidparser:      scanner: index  = 0x5b ch = 0x15
810hidparser:      scanner: parsed_length = 1
811hidparser:      scanner: parsed_text[0] = 0x80,index = 0x5c
812hidparser:      scanner: lexical analyzer found 0x15 before translation
813hidparser:      scanner: aindex  = 0x5d
814hidparser:      Start Collection:cache_ei = 0xcab7ea58, curr_ei = 0xcab7ea58
815hidparser:      hidparser_GlobalItem:index = 0x5b token = 0x14
816hidparser:      scanner: index  = 0x5d ch = 0x25
817hidparser:      scanner: parsed_length = 1
818hidparser:      scanner: parsed_text[0] = 0x7f,index = 0x5e
819hidparser:      scanner: lexical analyzer found 0x25 before translation
820hidparser:      scanner: aindex  = 0x5f
821hidparser:      hidparser_GlobalItem:index = 0x5d token = 0x24
822hidparser:      scanner: index  = 0x5f ch = 0x75
823hidparser:      scanner: parsed_length = 1
824hidparser:      scanner: parsed_text[0] = 0x8,index = 0x60
825hidparser:      scanner: lexical analyzer found 0x75 before translation
826hidparser:      scanner: aindex  = 0x61
827hidparser:      hidparser_GlobalItem:index = 0x5f token = 0x74
828hidparser:      scanner: index  = 0x61 ch = 0x9
829hidparser:      scanner: parsed_length = 1
830hidparser:      scanner: parsed_text[0] = 0x3a,index = 0x62
831hidparser:      scanner: lexical analyzer found 0x9 before translation
832hidparser:      scanner: aindex  = 0x63
833hidparser:      hidparser_LocalItem:index = 0x61 token = 0x8
834hidparser:      scanner: index  = 0x63 ch = 0xa1
835hidparser:      scanner: parsed_length = 1
836hidparser:      scanner: parsed_text[0] = 0x2,index = 0x64
837hidparser:      scanner: lexical analyzer found 0xa1 before translation
838hidparser:      scanner: aindex  = 0x65
839hidparser:      hidparser_MainItem:index = 0x63 token = 0xa0
840hidparser:      scanner: index  = 0x65 ch = 0x85
841hidparser:      scanner: parsed_length = 1
842hidparser:      scanner: parsed_text[0] = 0x4,index = 0x66
843hidparser:      scanner: lexical analyzer found 0x85 before translation
844hidparser:      scanner: aindex  = 0x67
845hidparser:      Start Collection:cache_ei = 0xcab7ea88, curr_ei = 0xcab7ea88
846hidparser:      hidparser_GlobalItem:index = 0x65 token = 0x84
847hidparser:      scanner: index  = 0x67 ch = 0x9
848hidparser:      scanner: parsed_length = 1
849hidparser:      scanner: parsed_text[0] = 0x3a,index = 0x68
850hidparser:      scanner: lexical analyzer found 0x9 before translation
851hidparser:      scanner: aindex  = 0x69
852hidparser:      hidparser_LocalItem:index = 0x67 token = 0x8
853hidparser:      scanner: index  = 0x69 ch = 0x95
854hidparser:      scanner: parsed_length = 1
855hidparser:      scanner: parsed_text[0] = 0x4,index = 0x6a
856hidparser:      scanner: lexical analyzer found 0x95 before translation
857hidparser:      scanner: aindex  = 0x6b
858hidparser:      hidparser_GlobalItem:index = 0x69 token = 0x94
859hidparser:      scanner: index  = 0x6b ch = 0xb1
860hidparser:      scanner: parsed_length = 1
861hidparser:      scanner: parsed_text[0] = 0x2,index = 0x6c
862hidparser:      scanner: lexical analyzer found 0xb1 before translation
863hidparser:      scanner: aindex  = 0x6d
864hidparser:      hidparser_MainItem:index = 0x6b token = 0xb0
865hidparser:      scanner: index  = 0x6d ch = 0xc0
866hidparser:      scanner: parsed_length = 0
867hidparser:      scanner: lexical analyzer found 0xc0 before translation
868hidparser:      scanner: aindex  = 0x6e
869hidparser:      Main Item: token = 0xb0, curr_ei = 0xcab7acd0 will be the
870		child of prev_ei = 0xcab7ea88, cache_ei being 0xcab7ea88
871hidparser:      hidparser_MainItem:index = 0x6d token = 0xc0
872hidparser:      scanner: index  = 0x6e ch = 0xa1
873hidparser:      scanner: parsed_length = 1
874hidparser:      scanner: parsed_text[0] = 0x2,index = 0x6f
875hidparser:      scanner: lexical analyzer found 0xa1 before translation
876hidparser:      scanner: aindex  = 0x70
877hidparser:      End Collection: cache_ei = 0xcab7ea88, curr_ei = 0xcab7ab20
878hidparser:      hidparser_MainItem:index = 0x6e token = 0xa0
879hidparser:      scanner: index  = 0x70 ch = 0x85
880hidparser:      scanner: parsed_length = 1
881hidparser:      scanner: parsed_text[0] = 0x5,index = 0x71
882hidparser:      scanner: lexical analyzer found 0x85 before translation
883hidparser:      scanner: aindex  = 0x72
884hidparser:      Start Collection:cache_ei = 0xcab7aaf0, curr_ei = 0xcab7aaf0
885hidparser:      hidparser_GlobalItem:index = 0x70 token = 0x84
886hidparser:      scanner: index  = 0x72 ch = 0x9
887hidparser:      scanner: parsed_length = 1
888hidparser:      scanner: parsed_text[0] = 0x3a,index = 0x73
889hidparser:      scanner: lexical analyzer found 0x9 before translation
890hidparser:      scanner: aindex  = 0x74
891hidparser:      hidparser_LocalItem:index = 0x72 token = 0x8
892hidparser:      scanner: index  = 0x74 ch = 0x95
893hidparser:      scanner: parsed_length = 1
894hidparser:      scanner: parsed_text[0] = 0x1,index = 0x75
895hidparser:      scanner: lexical analyzer found 0x95 before translation
896hidparser:      scanner: aindex  = 0x76
897hidparser:      hidparser_GlobalItem:index = 0x74 token = 0x94
898hidparser:      scanner: index  = 0x76 ch = 0xb1
899hidparser:      scanner: parsed_length = 1
900hidparser:      scanner: parsed_text[0] = 0x2,index = 0x77
901hidparser:      scanner: lexical analyzer found 0xb1 before translation
902hidparser:      scanner: aindex  = 0x78
903hidparser:      hidparser_MainItem:index = 0x76 token = 0xb0
904hidparser:      scanner: index  = 0x78 ch = 0xc0
905hidparser:      scanner: parsed_length = 0
906hidparser:      scanner: lexical analyzer found 0xc0 before translation
907hidparser:      scanner: aindex  = 0x79
908hidparser:      Main Item: token = 0xb0, curr_ei = 0xcab7aac0 will be the
909		child of prev_ei = 0xcab7aaf0, cache_ei being 0xcab7aaf0
910hidparser:      hidparser_MainItem:index = 0x78 token = 0xc0
911hidparser:      scanner: index  = 0x79 ch = 0xa1
912hidparser:      scanner: parsed_length = 1
913hidparser:      scanner: parsed_text[0] = 0x2,index = 0x7a
914hidparser:      scanner: lexical analyzer found 0xa1 before translation
915hidparser:      scanner: aindex  = 0x7b
916hidparser:      End Collection: cache_ei = 0xcab7aaf0, curr_ei = 0xcab7e548
917hidparser:      hidparser_MainItem:index = 0x79 token = 0xa0
918hidparser:      scanner: index  = 0x7b ch = 0x85
919hidparser:      scanner: parsed_length = 1
920hidparser:      scanner: parsed_text[0] = 0x6,index = 0x7c
921hidparser:      scanner: lexical analyzer found 0x85 before translation
922hidparser:      scanner: aindex  = 0x7d
923hidparser:      Start Collection:cache_ei = 0xcab7ea28, curr_ei = 0xcab7ea28
924hidparser:      hidparser_GlobalItem:index = 0x7b token = 0x84
925hidparser:      scanner: index  = 0x7d ch = 0x9
926hidparser:      scanner: parsed_length = 1
927hidparser:      scanner: parsed_text[0] = 0x3a,index = 0x7e
928hidparser:      scanner: lexical analyzer found 0x9 before translation
929hidparser:      scanner: aindex  = 0x7f
930hidparser:      hidparser_LocalItem:index = 0x7d token = 0x8
931hidparser:      scanner: index  = 0x7f ch = 0x95
932hidparser:      scanner: parsed_length = 1
933hidparser:      scanner: parsed_text[0] = 0x1,index = 0x80
934hidparser:      scanner: lexical analyzer found 0x95 before translation
935hidparser:      scanner: aindex  = 0x81
936hidparser:      hidparser_GlobalItem:index = 0x7f token = 0x94
937hidparser:      scanner: index  = 0x81 ch = 0xb1
938hidparser:      scanner: parsed_length = 1
939hidparser:      scanner: parsed_text[0] = 0x2,index = 0x82
940hidparser:      scanner: lexical analyzer found 0xb1 before translation
941hidparser:      scanner: aindex  = 0x83
942hidparser:      hidparser_MainItem:index = 0x81 token = 0xb0
943hidparser:      scanner: index  = 0x83 ch = 0xc0
944hidparser:      scanner: parsed_length = 0
945hidparser:      scanner: lexical analyzer found 0xc0 before translation
946hidparser:      scanner: aindex  = 0x84
947hidparser:      Main Item: token = 0xb0, curr_ei = 0xcab7e608 will be the
948		child of prev_ei = 0xcab7ea28, cache_ei being 0xcab7ea28
949hidparser:      hidparser_MainItem:index = 0x83 token = 0xc0
950hidparser:      scanner: index  = 0x84 ch = 0xa1
951hidparser:      scanner: parsed_length = 1
952hidparser:      scanner: parsed_text[0] = 0x2,index = 0x85
953hidparser:      scanner: lexical analyzer found 0xa1 before translation
954hidparser:      scanner: aindex  = 0x86
955hidparser:      End Collection: cache_ei = 0xcab7ea28, curr_ei = 0xcab7e5d8
956hidparser:      hidparser_MainItem:index = 0x84 token = 0xa0
957hidparser:      scanner: index  = 0x86 ch = 0x85
958hidparser:      scanner: parsed_length = 1
959hidparser:      scanner: parsed_text[0] = 0x7,index = 0x87
960hidparser:      scanner: lexical analyzer found 0x85 before translation
961hidparser:      scanner: aindex  = 0x88
962hidparser:      Start Collection:cache_ei = 0xcab7e5a8, curr_ei = 0xcab7e5a8
963hidparser:      hidparser_GlobalItem:index = 0x86 token = 0x84
964hidparser:      scanner: index  = 0x88 ch = 0x9
965hidparser:      scanner: parsed_length = 1
966hidparser:      scanner: parsed_text[0] = 0x3a,index = 0x89
967hidparser:      scanner: lexical analyzer found 0x9 before translation
968hidparser:      scanner: aindex  = 0x8a
969hidparser:      hidparser_LocalItem:index = 0x88 token = 0x8
970hidparser:      scanner: index  = 0x8a ch = 0x95
971hidparser:      scanner: parsed_length = 1
972hidparser:      scanner: parsed_text[0] = 0x10,index = 0x8b
973hidparser:      scanner: lexical analyzer found 0x95 before translation
974hidparser:      scanner: aindex  = 0x8c
975hidparser:      hidparser_GlobalItem:index = 0x8a token = 0x94
976hidparser:      scanner: index  = 0x8c ch = 0xb1
977hidparser:      scanner: parsed_length = 1
978hidparser:      scanner: parsed_text[0] = 0x2,index = 0x8d
979hidparser:      scanner: lexical analyzer found 0xb1 before translation
980hidparser:      scanner: aindex  = 0x8e
981hidparser:      hidparser_MainItem:index = 0x8c token = 0xb0
982hidparser:      scanner: index  = 0x8e ch = 0xc0
983hidparser:      scanner: parsed_length = 0
984hidparser:      scanner: lexical analyzer found 0xc0 before translation
985hidparser:      scanner: aindex  = 0x8f
986hidparser:      Main Item: token = 0xb0, curr_ei = 0xcab7e578 will be the
987		child of prev_ei = 0xcab7e5a8, cache_ei being 0xcab7e5a8
988hidparser:      hidparser_MainItem:index = 0x8e token = 0xc0
989hidparser:      scanner: index  = 0x8f ch = 0xa1
990hidparser:      scanner: parsed_length = 1
991hidparser:      scanner: parsed_text[0] = 0x2,index = 0x90
992hidparser:      scanner: lexical analyzer found 0xa1 before translation
993hidparser:      scanner: aindex  = 0x91
994hidparser:      End Collection: cache_ei = 0xcab7e5a8, curr_ei = 0xcab7af10
995hidparser:      hidparser_MainItem:index = 0x8f token = 0xa0
996hidparser:      scanner: index  = 0x91 ch = 0x85
997hidparser:      scanner: parsed_length = 1
998hidparser:      scanner: parsed_text[0] = 0x8,index = 0x92
999hidparser:      scanner: lexical analyzer found 0x85 before translation
1000hidparser:      scanner: aindex  = 0x93
1001hidparser:      Start Collection:cache_ei = 0xcab7aa60, curr_ei = 0xcab7aa60
1002hidparser:      hidparser_GlobalItem:index = 0x91 token = 0x84
1003hidparser:      scanner: index  = 0x93 ch = 0x9
1004hidparser:      scanner: parsed_length = 1
1005hidparser:      scanner: parsed_text[0] = 0x3a,index = 0x94
1006hidparser:      scanner: lexical analyzer found 0x9 before translation
1007hidparser:      scanner: aindex  = 0x95
1008hidparser:      hidparser_LocalItem:index = 0x93 token = 0x8
1009hidparser:      scanner: index  = 0x95 ch = 0x95
1010hidparser:      scanner: parsed_length = 1
1011hidparser:      scanner: parsed_text[0] = 0x10,index = 0x96
1012hidparser:      scanner: lexical analyzer found 0x95 before translation
1013hidparser:      scanner: aindex  = 0x97
1014hidparser:      hidparser_GlobalItem:index = 0x95 token = 0x94
1015hidparser:      scanner: index  = 0x97 ch = 0xb1
1016hidparser:      scanner: parsed_length = 1
1017hidparser:      scanner: parsed_text[0] = 0x2,index = 0x98
1018hidparser:      scanner: lexical analyzer found 0xb1 before translation
1019hidparser:      scanner: aindex  = 0x99
1020hidparser:      hidparser_MainItem:index = 0x97 token = 0xb0
1021hidparser:      scanner: index  = 0x99 ch = 0xc0
1022hidparser:      scanner: parsed_length = 0
1023hidparser:      scanner: lexical analyzer found 0xc0 before translation
1024hidparser:      scanner: aindex  = 0x9a
1025hidparser:      Main Item: token = 0xb0, curr_ei = 0xcab7aa30 will be the
1026		child of prev_ei = 0xcab7aa60, cache_ei being 0xcab7aa60
1027hidparser:      hidparser_MainItem:index = 0x99 token = 0xc0
1028hidparser:      scanner: index  = 0x9a ch = 0xa1
1029hidparser:      scanner: parsed_length = 1
1030hidparser:      scanner: parsed_text[0] = 0x2,index = 0x9b
1031hidparser:      scanner: lexical analyzer found 0xa1 before translation
1032hidparser:      scanner: aindex  = 0x9c
1033hidparser:      End Collection: cache_ei = 0xcab7aa60, curr_ei = 0xcab7aa00
1034hidparser:      hidparser_MainItem:index = 0x9a token = 0xa0
1035hidparser:      scanner: index  = 0x9c ch = 0x85
1036hidparser:      scanner: parsed_length = 1
1037hidparser:      scanner: parsed_text[0] = 0x9,index = 0x9d
1038hidparser:      scanner: lexical analyzer found 0x85 before translation
1039hidparser:      scanner: aindex  = 0x9e
1040hidparser:      Start Collection:cache_ei = 0xcab7a9d0, curr_ei = 0xcab7a9d0
1041hidparser:      hidparser_GlobalItem:index = 0x9c token = 0x84
1042hidparser:      scanner: index  = 0x9e ch = 0x9
1043hidparser:      scanner: parsed_length = 1
1044hidparser:      scanner: parsed_text[0] = 0x3a,index = 0x9f
1045hidparser:      scanner: lexical analyzer found 0x9 before translation
1046hidparser:      scanner: aindex  = 0xa0
1047hidparser:      hidparser_LocalItem:index = 0x9e token = 0x8
1048hidparser:      scanner: index  = 0xa0 ch = 0x95
1049hidparser:      scanner: parsed_length = 1
1050hidparser:      scanner: parsed_text[0] = 0xc,index = 0xa1
1051hidparser:      scanner: lexical analyzer found 0x95 before translation
1052hidparser:      scanner: aindex  = 0xa2
1053hidparser:      hidparser_GlobalItem:index = 0xa0 token = 0x94
1054hidparser:      scanner: index  = 0xa2 ch = 0xb1
1055hidparser:      scanner: parsed_length = 1
1056hidparser:      scanner: parsed_text[0] = 0x2,index = 0xa3
1057hidparser:      scanner: lexical analyzer found 0xb1 before translation
1058hidparser:      scanner: aindex  = 0xa4
1059hidparser:      hidparser_MainItem:index = 0xa2 token = 0xb0
1060hidparser:      scanner: index  = 0xa4 ch = 0xc0
1061hidparser:      scanner: parsed_length = 0
1062hidparser:      scanner: lexical analyzer found 0xc0 before translation
1063hidparser:      scanner: aindex  = 0xa5
1064hidparser:      Main Item: token = 0xb0, curr_ei = 0xcab7a9a0 will be the
1065		child of prev_ei = 0xcab7a9d0, cache_ei being 0xcab7a9d0
1066hidparser:      hidparser_MainItem:index = 0xa4 token = 0xc0
1067hidparser:      scanner: index  = 0xa5 ch = 0xa1
1068hidparser:      scanner: parsed_length = 1
1069hidparser:      scanner: parsed_text[0] = 0x2,index = 0xa6
1070hidparser:      scanner: lexical analyzer found 0xa1 before translation
1071hidparser:      scanner: aindex  = 0xa7
1072hidparser:      End Collection: cache_ei = 0xcab7a9d0, curr_ei = 0xcab7a970
1073hidparser:      hidparser_MainItem:index = 0xa5 token = 0xa0
1074hidparser:      scanner: index  = 0xa7 ch = 0x85
1075hidparser:      scanner: parsed_length = 1
1076hidparser:      scanner: parsed_text[0] = 0xa,index = 0xa8
1077hidparser:      scanner: lexical analyzer found 0x85 before translation
1078hidparser:      scanner: aindex  = 0xa9
1079hidparser:      Start Collection:cache_ei = 0xcab7a940, curr_ei = 0xcab7a940
1080hidparser:      hidparser_GlobalItem:index = 0xa7 token = 0x84
1081hidparser:      scanner: index  = 0xa9 ch = 0x9
1082hidparser:      scanner: parsed_length = 1
1083hidparser:      scanner: parsed_text[0] = 0x3a,index = 0xaa
1084hidparser:      scanner: lexical analyzer found 0x9 before translation
1085hidparser:      scanner: aindex  = 0xab
1086hidparser:      hidparser_LocalItem:index = 0xa9 token = 0x8
1087hidparser:      scanner: index  = 0xab ch = 0x95
1088hidparser:      scanner: parsed_length = 1
1089hidparser:      scanner: parsed_text[0] = 0x1,index = 0xac
1090hidparser:      scanner: lexical analyzer found 0x95 before translation
1091hidparser:      scanner: aindex  = 0xad
1092hidparser:      hidparser_GlobalItem:index = 0xab token = 0x94
1093hidparser:      scanner: index  = 0xad ch = 0xb1
1094hidparser:      scanner: parsed_length = 1
1095hidparser:      scanner: parsed_text[0] = 0x2,index = 0xae
1096hidparser:      scanner: lexical analyzer found 0xb1 before translation
1097hidparser:      scanner: aindex  = 0xaf
1098hidparser:      hidparser_MainItem:index = 0xad token = 0xb0
1099hidparser:      scanner: index  = 0xaf ch = 0xc0
1100hidparser:      scanner: parsed_length = 0
1101hidparser:      scanner: lexical analyzer found 0xc0 before translation
1102hidparser:      scanner: aindex  = 0xb0
1103hidparser:      Main Item: token = 0xb0, curr_ei = 0xcab7a910 will be the
1104	 	child of prev_ei = 0xcab7a940, cache_ei being 0xcab7a940
1105hidparser:      hidparser_MainItem:index = 0xaf token = 0xc0
1106hidparser:      scanner: index  = 0xb0 ch = 0xa1
1107hidparser:      scanner: parsed_length = 1
1108hidparser:      scanner: parsed_text[0] = 0x2,index = 0xb1
1109hidparser:      scanner: lexical analyzer found 0xa1 before translation
1110hidparser:      scanner: aindex  = 0xb2
1111hidparser:      End Collection: cache_ei = 0xcab7a940, curr_ei = 0xcab7a8e0
1112hidparser:      hidparser_MainItem:index = 0xb0 token = 0xa0
1113hidparser:      scanner: index  = 0xb2 ch = 0x85
1114hidparser:      scanner: parsed_length = 1
1115hidparser:      scanner: parsed_text[0] = 0xb,index = 0xb3
1116hidparser:      scanner: lexical analyzer found 0x85 before translation
1117hidparser:      scanner: aindex  = 0xb4
1118hidparser:      Start Collection:cache_ei = 0xcab7a8b0, curr_ei = 0xcab7a8b0
1119hidparser:      hidparser_GlobalItem:index = 0xb2 token = 0x84
1120hidparser:      scanner: index  = 0xb4 ch = 0x9
1121hidparser:      scanner: parsed_length = 1
1122hidparser:      scanner: parsed_text[0] = 0x3a,index = 0xb5
1123hidparser:      scanner: lexical analyzer found 0x9 before translation
1124hidparser:      scanner: aindex  = 0xb6
1125hidparser:      hidparser_LocalItem:index = 0xb4 token = 0x8
1126hidparser:      scanner: index  = 0xb6 ch = 0x95
1127hidparser:      scanner: parsed_length = 1
1128hidparser:      scanner: parsed_text[0] = 0x1,index = 0xb7
1129hidparser:      scanner: lexical analyzer found 0x95 before translation
1130hidparser:      scanner: aindex  = 0xb8
1131hidparser:      hidparser_GlobalItem:index = 0xb6 token = 0x94
1132hidparser:      scanner: index  = 0xb8 ch = 0xb1
1133hidparser:      scanner: parsed_length = 1
1134hidparser:      scanner: parsed_text[0] = 0x2,index = 0xb9
1135hidparser:      scanner: lexical analyzer found 0xb1 before translation
1136hidparser:      scanner: aindex  = 0xba
1137hidparser:      hidparser_MainItem:index = 0xb8 token = 0xb0
1138hidparser:      scanner: index  = 0xba ch = 0xc0
1139hidparser:      scanner: parsed_length = 0
1140hidparser:      scanner: lexical analyzer found 0xc0 before translation
1141hidparser:      scanner: aindex  = 0xbb
1142hidparser:      Main Item: token = 0xb0, curr_ei = 0xcab7a880 will be the
1143	 	child of prev_ei = 0xcab7a8b0, cache_ei being 0xcab7a8b0
1144hidparser:      hidparser_MainItem:index = 0xba token = 0xc0
1145hidparser:      scanner: index  = 0xbb ch = 0xa1
1146hidparser:      scanner: parsed_length = 1
1147hidparser:      scanner: parsed_text[0] = 0x2,index = 0xbc
1148hidparser:      scanner: lexical analyzer found 0xa1 before translation
1149hidparser:      scanner: aindex  = 0xbd
1150hidparser:      End Collection: cache_ei = 0xcab7a8b0, curr_ei = 0xcab7a850
1151hidparser:      hidparser_MainItem:index = 0xbb token = 0xa0
1152hidparser:      scanner: index  = 0xbd ch = 0x85
1153hidparser:      scanner: parsed_length = 1
1154hidparser:      scanner: parsed_text[0] = 0xc,index = 0xbe
1155hidparser:      scanner: lexical analyzer found 0x85 before translation
1156hidparser:      scanner: aindex  = 0xbf
1157hidparser:      Start Collection:cache_ei = 0xcab7a820, curr_ei = 0xcab7a820
1158hidparser:      hidparser_GlobalItem:index = 0xbd token = 0x84
1159hidparser:      scanner: index  = 0xbf ch = 0x9
1160hidparser:      scanner: parsed_length = 1
1161hidparser:      scanner: parsed_text[0] = 0x3a,index = 0xc0
1162hidparser:      scanner: lexical analyzer found 0x9 before translation
1163hidparser:      scanner: aindex  = 0xc1
1164hidparser:      hidparser_LocalItem:index = 0xbf token = 0x8
1165hidparser:      scanner: index  = 0xc1 ch = 0x95
1166hidparser:      scanner: parsed_length = 1
1167hidparser:      scanner: parsed_text[0] = 0x1,index = 0xc2
1168hidparser:      scanner: lexical analyzer found 0x95 before translation
1169hidparser:      scanner: aindex  = 0xc3
1170hidparser:      hidparser_GlobalItem:index = 0xc1 token = 0x94
1171hidparser:      scanner: index  = 0xc3 ch = 0xb1
1172hidparser:      scanner: parsed_length = 1
1173hidparser:      scanner: parsed_text[0] = 0x2,index = 0xc4
1174hidparser:      scanner: lexical analyzer found 0xb1 before translation
1175hidparser:      scanner: aindex  = 0xc5
1176hidparser:      hidparser_MainItem:index = 0xc3 token = 0xb0
1177hidparser:      scanner: index  = 0xc5 ch = 0xc0
1178hidparser:      scanner: parsed_length = 0
1179hidparser:      scanner: lexical analyzer found 0xc0 before translation
1180hidparser:      scanner: aindex  = 0xc6
1181hidparser:      Main Item: token = 0xb0, curr_ei = 0xcab7a7f0 will be the
1182	 	child of prev_ei = 0xcab7a820, cache_ei being 0xcab7a820
1183hidparser:      hidparser_MainItem:index = 0xc5 token = 0xc0
1184hidparser:      scanner: index  = 0xc6 ch = 0xa1
1185hidparser:      scanner: parsed_length = 1
1186hidparser:      scanner: parsed_text[0] = 0x2,index = 0xc7
1187hidparser:      scanner: lexical analyzer found 0xa1 before translation
1188hidparser:      scanner: aindex  = 0xc8
1189hidparser:      End Collection: cache_ei = 0xcab7a820, curr_ei = 0xcab7a7c0
1190hidparser:      hidparser_MainItem:index = 0xc6 token = 0xa0
1191hidparser:      scanner: index  = 0xc8 ch = 0x85
1192hidparser:      scanner: parsed_length = 1
1193hidparser:      scanner: parsed_text[0] = 0xd,index = 0xc9
1194hidparser:      scanner: lexical analyzer found 0x85 before translation
1195hidparser:      scanner: aindex  = 0xca
1196hidparser:      Start Collection:cache_ei = 0xcab7a790, curr_ei = 0xcab7a790
1197hidparser:      hidparser_GlobalItem:index = 0xc8 token = 0x84
1198hidparser:      scanner: index  = 0xca ch = 0x9
1199hidparser:      scanner: parsed_length = 1
1200hidparser:      scanner: parsed_text[0] = 0x3a,index = 0xcb
1201hidparser:      scanner: lexical analyzer found 0x9 before translation
1202hidparser:      scanner: aindex  = 0xcc
1203hidparser:      hidparser_LocalItem:index = 0xca token = 0x8
1204hidparser:      scanner: index  = 0xcc ch = 0x95
1205hidparser:      scanner: parsed_length = 1
1206hidparser:      scanner: parsed_text[0] = 0x2,index = 0xcd
1207hidparser:      scanner: lexical analyzer found 0x95 before translation
1208hidparser:      scanner: aindex  = 0xce
1209hidparser:      hidparser_GlobalItem:index = 0xcc token = 0x94
1210hidparser:      scanner: index  = 0xce ch = 0xb1
1211hidparser:      scanner: parsed_length = 1
1212hidparser:      scanner: parsed_text[0] = 0x2,index = 0xcf
1213hidparser:      scanner: lexical analyzer found 0xb1 before translation
1214hidparser:      scanner: aindex  = 0xd0
1215hidparser:      hidparser_MainItem:index = 0xce token = 0xb0
1216hidparser:      scanner: index  = 0xd0 ch = 0xc0
1217hidparser:      scanner: parsed_length = 0
1218hidparser:      scanner: lexical analyzer found 0xc0 before translation
1219hidparser:      scanner: aindex  = 0xd1
1220hidparser:      Main Item: token = 0xb0, curr_ei = 0xcab7a760 will be the
1221	 	child of prev_ei = 0xcab7a790, cache_ei being 0xcab7a790
1222hidparser:      hidparser_MainItem:index = 0xd0 token = 0xc0
1223hidparser:      scanner: index  = 0xd1 ch = 0xc0
1224hidparser:      scanner: parsed_length = 0
1225hidparser:      scanner: lexical analyzer found 0xc0 before translation
1226hidparser:      scanner: aindex  = 0xd2
1227hidparser:      End Collection: cache_ei = 0xcab7a790, curr_ei = 0xcab7a730
1228hidparser:      hidparser_MainItem:index = 0xd1 token = 0xc0
1229hidparser:      scanner: index  = 0xd2 ch = 0xc0
1230hidparser:      scanner: parsed_length = 0
1231hidparser:      scanner: lexical analyzer found 0xc0 before translation
1232hidparser:      scanner: aindex  = 0xd3
1233hidparser:      End Collection: cache_ei = 0xcab7ea58, curr_ei = 0xcab7a700
1234hidparser:      hidparser_MainItem:index = 0xd2 token = 0xc0
1235hidparser:      scanner: eindex  = 0xd3
1236hidparser:      End Collection: cache_ei = 0xcab8d220, curr_ei = 0xcab7a6d0
1237hidparser:      Usage Page(0x1)
1238hidparser:      Usage(0x8)
1239hidparser:      Collection(0x1)
1240hidparser:           Usage Page(0x1)
1241hidparser:           Collection(0x0)
1242hidparser:                Usage Page(0x1)
1243hidparser:                Report Id(0x1)
1244hidparser:                Logical Minimum(0x8000)
1245hidparser:                Logical Maximum(0x7FFF)
1246hidparser:                Report Size(0x10)
1247hidparser:                Report Count(0x3)
1248hidparser:                Usage(0x30)
1249hidparser:                Usage(0x31)
1250hidparser:                Usage(0x32)
1251hidparser:                Input(0x2)
1252hidparser:           End Collection(0x0)
1253hidparser:           Usage Page(0x1)
1254hidparser:           Report Id(0x1)
1255hidparser:           Logical Minimum(0x8000)
1256hidparser:           Logical Maximum(0x7FFF)
1257hidparser:           Report Size(0x10)
1258hidparser:           Report Count(0x3)
1259hidparser:           Collection(0x0)
1260hidparser:                Usage Page(0x1)
1261hidparser:                Logical Minimum(0x8000)
1262hidparser:                Logical Maximum(0x7FFF)
1263hidparser:                Report Id(0x2)
1264hidparser:                Report Size(0x10)
1265hidparser:                Report Count(0x3)
1266hidparser:                Usage(0x33)
1267hidparser:                Usage(0x34)
1268hidparser:                Usage(0x35)
1269hidparser:                Input(0x2)
1270hidparser:           End Collection(0x0)
1271hidparser:           Usage Page(0x1)
1272hidparser:           Logical Minimum(0x8000)
1273hidparser:           Logical Maximum(0x7FFF)
1274hidparser:           Report Id(0x2)
1275hidparser:           Report Size(0x10)
1276hidparser:           Report Count(0x3)
1277hidparser:           Collection(0x2)
1278hidparser:                Logical Minimum(0x8000)
1279hidparser:                Logical Maximum(0x7FFF)
1280hidparser:                Report Id(0x3)
1281hidparser:                Usage Page(0x1)
1282hidparser:                Report Size(0x10)
1283hidparser:                Report Count(0x1)
1284hidparser:                Usage(0x3A)
1285hidparser:                Input(0x2)
1286hidparser:                Report Id(0x3)
1287hidparser:                Usage Page(0x9)
1288hidparser:                Logical Minimum(0x0)
1289hidparser:                Logical Maximum(0x1)
1290hidparser:                Physical Minimum(0x0)
1291hidparser:                Physical Maximum(0x1)
1292hidparser:                Report Size(0x1)
1293hidparser:                Report Count(0xD)
1294hidparser:                Usage Minimum(0x1)
1295hidparser:                Usage Maximum(0xD)
1296hidparser:                Input(0x2)
1297hidparser:                Report Id(0x3)
1298hidparser:                Usage Page(0x9)
1299hidparser:                Logical Minimum(0x0)
1300hidparser:                Logical Maximum(0x1)
1301hidparser:                Physical Minimum(0x0)
1302hidparser:                Physical Maximum(0x1)
1303hidparser:                Report Size(0x1)
1304hidparser:                Report Count(0x3)
1305hidparser:                Input(0x1)
1306hidparser:           End Collection(0x0)
1307hidparser:           Report Id(0x3)
1308hidparser:           Logical Minimum(0x0)
1309hidparser:           Logical Maximum(0x1)
1310hidparser:           Physical Minimum(0x0)
1311hidparser:           Physical Maximum(0x1)
1312hidparser:           Report Size(0x1)
1313hidparser:           Report Count(0x3)
1314hidparser:           Usage Page(0x1)
1315hidparser:           Usage(0x3A)
1316hidparser:           Collection(0x2)
1317hidparser:                Report Id(0x3)
1318hidparser:                Physical Minimum(0x0)
1319hidparser:                Physical Maximum(0x1)
1320hidparser:                Report Count(0x3)
1321hidparser:                Usage Page(0x1)
1322hidparser:                Logical Minimum(0x80)
1323hidparser:                Logical Maximum(0x7F)
1324hidparser:                Report Size(0x8)
1325hidparser:                Usage(0x3A)
1326hidparser:                Collection(0x2)
1327hidparser:                     Physical Minimum(0x0)
1328hidparser:                     Physical Maximum(0x1)
1329hidparser:                     Usage Page(0x1)
1330hidparser:                     Logical Minimum(0x80)
1331hidparser:                     Logical Maximum(0x7F)
1332hidparser:                     Report Size(0x8)
1333hidparser:                     Report Id(0x4)
1334hidparser:                     Report Count(0x4)
1335hidparser:                     Usage(0x3A)
1336hidparser:                     Feature(0x2)
1337hidparser:                End Collection(0x0)
1338hidparser:                Physical Minimum(0x0)
1339hidparser:                Physical Maximum(0x1)
1340hidparser:                Usage Page(0x1)
1341hidparser:                Logical Minimum(0x80)
1342hidparser:                Logical Maximum(0x7F)
1343hidparser:                Report Size(0x8)
1344hidparser:                Report Id(0x4)
1345hidparser:                Report Count(0x4)
1346hidparser:                Collection(0x2)
1347hidparser:                     Physical Minimum(0x0)
1348hidparser:                     Physical Maximum(0x1)
1349hidparser:                     Usage Page(0x1)
1350hidparser:                     Logical Minimum(0x80)
1351hidparser:                     Logical Maximum(0x7F)
1352hidparser:                     Report Size(0x8)
1353hidparser:                     Report Id(0x5)
1354hidparser:                     Report Count(0x1)
1355hidparser:                     Usage(0x3A)
1356hidparser:                     Feature(0x2)
1357hidparser:                End Collection(0x0)
1358hidparser:                Physical Minimum(0x0)
1359hidparser:                Physical Maximum(0x1)
1360hidparser:                Usage Page(0x1)
1361hidparser:                Logical Minimum(0x80)
1362hidparser:                Logical Maximum(0x7F)
1363hidparser:                Report Size(0x8)
1364hidparser:                Report Id(0x5)
1365hidparser:                Report Count(0x1)
1366hidparser:                Collection(0x2)
1367hidparser:                     Physical Minimum(0x0)
1368hidparser:                     Physical Maximum(0x1)
1369hidparser:                     Usage Page(0x1)
1370hidparser:                     Logical Minimum(0x80)
1371hidparser:                     Logical Maximum(0x7F)
1372hidparser:                     Report Size(0x8)
1373hidparser:                     Report Id(0x6)
1374hidparser:                     Report Count(0x1)
1375hidparser:                     Usage(0x3A)
1376hidparser:                     Feature(0x2)
1377hidparser:                End Collection(0x0)
1378hidparser:                Physical Minimum(0x0)
1379hidparser:                Physical Maximum(0x1)
1380hidparser:                Usage Page(0x1)
1381hidparser:                Logical Minimum(0x80)
1382hidparser:                Logical Maximum(0x7F)
1383hidparser:                Report Size(0x8)
1384hidparser:                Report Id(0x6)
1385hidparser:                Report Count(0x1)
1386hidparser:                Collection(0x2)
1387hidparser:                     Physical Minimum(0x0)
1388hidparser:                     Physical Maximum(0x1)
1389hidparser:                     Usage Page(0x1)
1390hidparser:                     Logical Minimum(0x80)
1391hidparser:                     Logical Maximum(0x7F)
1392hidparser:                     Report Size(0x8)
1393hidparser:                     Report Id(0x7)
1394hidparser:                     Report Count(0x10)
1395hidparser:                     Usage(0x3A)
1396hidparser:                     Feature(0x2)
1397hidparser:                End Collection(0x0)
1398hidparser:                Physical Minimum(0x0)
1399hidparser:                Physical Maximum(0x1)
1400hidparser:                Usage Page(0x1)
1401hidparser:                Logical Minimum(0x80)
1402hidparser:                Logical Maximum(0x7F)
1403hidparser:                Report Size(0x8)
1404hidparser:                Report Id(0x7)
1405hidparser:                Report Count(0x10)
1406hidparser:                Collection(0x2)
1407hidparser:                     Physical Minimum(0x0)
1408hidparser:                     Physical Maximum(0x1)
1409hidparser:                     Usage Page(0x1)
1410hidparser:                     Logical Minimum(0x80)
1411hidparser:                     Logical Maximum(0x7F)
1412hidparser:                     Report Size(0x8)
1413hidparser:                     Report Id(0x8)
1414hidparser:                     Report Count(0x10)
1415hidparser:                     Usage(0x3A)
1416hidparser:                     Feature(0x2)
1417hidparser:                End Collection(0x0)
1418hidparser:                Physical Minimum(0x0)
1419hidparser:                Physical Maximum(0x1)
1420hidparser:                Usage Page(0x1)
1421hidparser:                Logical Minimum(0x80)
1422hidparser:                Logical Maximum(0x7F)
1423hidparser:                Report Size(0x8)
1424hidparser:                Report Id(0x8)
1425hidparser:                Report Count(0x10)
1426hidparser:                Collection(0x2)
1427hidparser:                     Physical Minimum(0x0)
1428hidparser:                     Physical Maximum(0x1)
1429hidparser:                     Usage Page(0x1)
1430hidparser:                     Logical Minimum(0x80)
1431hidparser:                     Logical Maximum(0x7F)
1432hidparser:                     Report Size(0x8)
1433hidparser:                     Report Id(0x9)
1434hidparser:                     Report Count(0xC)
1435hidparser:                     Usage(0x3A)
1436hidparser:                     Feature(0x2)
1437hidparser:                End Collection(0x0)
1438hidparser:                Physical Minimum(0x0)
1439hidparser:                Physical Maximum(0x1)
1440hidparser:                Usage Page(0x1)
1441hidparser:                Logical Minimum(0x80)
1442hidparser:                Logical Maximum(0x7F)
1443hidparser:                Report Size(0x8)
1444hidparser:                Report Id(0x9)
1445hidparser:                Report Count(0xC)
1446hidparser:                Collection(0x2)
1447hidparser:                     Physical Minimum(0x0)
1448hidparser:                     Physical Maximum(0x1)
1449hidparser:                     Usage Page(0x1)
1450hidparser:                     Logical Minimum(0x80)
1451hidparser:                     Logical Maximum(0x7F)
1452hidparser:                     Report Size(0x8)
1453hidparser:                     Report Id(0xA)
1454hidparser:                     Report Count(0x1)
1455hidparser:                     Usage(0x3A)
1456hidparser:                     Feature(0x2)
1457hidparser:                End Collection(0x0)
1458hidparser:                Physical Minimum(0x0)
1459hidparser:                Physical Maximum(0x1)
1460hidparser:                Usage Page(0x1)
1461hidparser:                Logical Minimum(0x80)
1462hidparser:                Logical Maximum(0x7F)
1463hidparser:                Report Size(0x8)
1464hidparser:                Report Id(0xA)
1465hidparser:                Report Count(0x1)
1466hidparser:                Collection(0x2)
1467hidparser:                     Physical Minimum(0x0)
1468hidparser:                     Physical Maximum(0x1)
1469hidparser:                     Usage Page(0x1)
1470hidparser:                     Logical Minimum(0x80)
1471hidparser:                     Logical Maximum(0x7F)
1472hidparser:                     Report Size(0x8)
1473hidparser:                     Report Id(0xB)
1474hidparser:                     Report Count(0x1)
1475hidparser:                     Usage(0x3A)
1476hidparser:                     Feature(0x2)
1477hidparser:                End Collection(0x0)
1478hidparser:                Physical Minimum(0x0)
1479hidparser:                Physical Maximum(0x1)
1480hidparser:                Usage Page(0x1)
1481hidparser:                Logical Minimum(0x80)
1482hidparser:                Logical Maximum(0x7F)
1483hidparser:                Report Size(0x8)
1484hidparser:                Report Id(0xB)
1485hidparser:                Report Count(0x1)
1486hidparser:                Collection(0x2)
1487hidparser:                     Physical Minimum(0x0)
1488hidparser:                     Physical Maximum(0x1)
1489hidparser:                     Usage Page(0x1)
1490hidparser:                     Logical Minimum(0x80)
1491hidparser:                     Logical Maximum(0x7F)
1492hidparser:                     Report Size(0x8)
1493hidparser:                     Report Id(0xC)
1494hidparser:                     Report Count(0x1)
1495hidparser:                     Usage(0x3A)
1496hidparser:                     Feature(0x2)
1497hidparser:                End Collection(0x0)
1498hidparser:                Physical Minimum(0x0)
1499hidparser:                Physical Maximum(0x1)
1500hidparser:                Usage Page(0x1)
1501hidparser:                Logical Minimum(0x80)
1502hidparser:                Logical Maximum(0x7F)
1503hidparser:                Report Size(0x8)
1504hidparser:                Report Id(0xC)
1505hidparser:                Report Count(0x1)
1506hidparser:                Collection(0x2)
1507hidparser:                     Physical Minimum(0x0)
1508hidparser:                     Physical Maximum(0x1)
1509hidparser:                     Usage Page(0x1)
1510hidparser:                     Logical Minimum(0x80)
1511hidparser:                     Logical Maximum(0x7F)
1512hidparser:                     Report Size(0x8)
1513hidparser:                     Report Id(0xD)
1514hidparser:                     Report Count(0x2)
1515hidparser:                     Usage(0x3A)
1516hidparser:                     Feature(0x2)
1517hidparser:                End Collection(0x0)
1518hidparser:           End Collection(0x0)
1519hidparser:      End Collection(0x0)
1520
1521The actual tree is
1522
1523
1524unsigned char hid_report_desc[] = {
1525	0x5, 0x1,              /* Usage Page (Generic Desktop)             */
1526	0x9, 0x8,              /* Usage (0x8:Multi-axis controller)        */
1527	0xa1, 0x1,             /* Collection (Application)                 */
1528	0xa1, 0,               /*     Collection (Physical)                */
1529	0x85, 0x1,             /*         Report ID (0x1)                  */
1530	0x16, 0, 0x80,         /*         Logical Minimum (0x8000)         */
1531	0x26, 0xff, 0x7f,      /*         Logical Maximum (0x7fff)         */
1532	0x9, 0x30,             /*         Usage (0x30:X)                   */
1533	0x9, 0x31,             /*         Usage (0x31:Y)                   */
1534	0x9, 0x32,             /*         Usage (0x32:Z)                   */
1535	0x75, 0x10,            /*         Report Size (0x10)               */
1536	0x95, 0x3,             /*         Report Count (0x3)               */
1537	0x81, 0x2,             /*         Input (Data, Variable, Absolute) */
1538	0xc0,                  /*     End Collection                       */
1539	0xa1, 0,               /*     Collection (Physical)                */
1540	0x85, 0x2,             /*         Report ID (0x2)                  */
1541	0x9, 0x33,             /*         Usage (0x33:Rx)                  */
1542	0x9, 0x34,             /*         Usage (0x34:Ry)                  */
1543	0x9, 0x35,             /*         Usage (0x35:Rz)                  */
1544	0x75, 0x10,            /*         Report Size (0x10)               */
1545	0x95, 0x3,             /*         Report Count (0x3)               */
1546	0x81, 0x2,             /*         Input (Data, Variable, Absolute) */
1547	0xc0,                  /*     End Collection                       */
1548	0xa1, 0x2,             /*     Collection (Logical)                 */
1549	0x85, 0x3,             /*         Report ID (0x3)                  */
1550	0x5, 0x1,              /*         Usage Page (Generic Desktop)     */
1551	0x9, 0x3a,             /*         Usage (0x3a: Counted Buffer)     */
1552	0x75, 0x10,            /*         Report Size (0x10)               */
1553	0x95, 0x1,             /*         Report Count (0x1)               */
1554	0x81, 0x2,             /*         Input (Data, Variable, Absolute) */
1555	0x5, 0x9,              /*         Usage Page (Button)              */
1556	0x19, 0x1,             /*         Usage Minimum (0x1)              */
1557	0x29, 0xd,             /*         Usage Maximum (0xd)              */
1558	0x15, 0,               /*         Logical Minimum (0)              */
1559	0x25, 0x1,             /*         Logical Maximum (0x1)            */
1560	0x35, 0,               /*         Physical Minimum (0)             */
1561	0x45, 0x1,             /*         Physical Maximum (0x1)           */
1562	0x75, 0x1,             /*         Report Size (0x1)                */
1563	0x95, 0xd,             /*         Report Count (0xd)               */
1564	0x81, 0x2,             /*         Input (Data, Variable, Absolute) */
1565	0x95, 0x3,             /*         Report Count (0x3)               */
1566	0x81, 0x1,             /*         Input (Constant, Array, Absolute) */
1567	0xc0,                  /*     End Collection                       */
1568	0x5, 0x1,              /*     Usage Page (Generic Desktop)         */
1569	0x9, 0x3a,             /*     Usage (0x3a: Counted Buffer)         */
1570	0xa1, 0x2,             /*     Collection (Logical)                 */
1571	0x15, 0x80,            /*         Logical Minimum (0x80)           */
1572	0x25, 0x7f,            /*         Logical Maximum (0x7f)           */
1573	0x75, 0x8,             /*         Report Size (0x8)                */
1574	0x9, 0x3a,             /*         Usage (0x3a: Counted Buffer)     */
1575	0xa1, 0x2,             /*         Collection (Logical)             */
1576	0x85, 0x4,             /*             Report ID (0x4)              */
1577	0x9, 0x3a,             /*             Usage (0x3a: Counted Buffer) */
1578	0x95, 0x4,             /*             Report Count (0x4)           */
1579	0xb1, 0x2,             /*             Feature (Data, Variable, Absolute) */
1580	0xc0,                  /*         End Collection                   */
1581	0xa1, 0x2,             /*         Collection (Logical)             */
1582	0x85, 0x5,             /*             Report ID (0x5)              */
1583	0x9, 0x3a,             /*             Usage (0x3a:Counted Buffer)  */
1584	0x95, 0x1,             /*             Report Count (0x1)           */
1585	0xb1, 0x2,             /*             Feature (Data, Variable, Absolute) */
1586	0xc0,                  /*         End Collection                   */
1587	0xa1, 0x2,             /*         Collection (Logical)             */
1588	0x85, 0x6,             /*             Report ID (0x6)              */
1589	0x9, 0x3a,             /*             Usage (0x3a: Counted Buffer) */
1590	0x95, 0x1,             /*             Report Count (0x1)           */
1591	0xb1, 0x2,             /*             Feature (Data, Variable, Absolute) */
1592	0xc0,                  /*         End Collection                   */
1593	0xa1, 0x2,             /*         Collection (Logical)             */
1594	0x85, 0x7,             /*             Report ID (0x7)              */
1595	0x9, 0x3a,             /*             Usage (0x3a: Counted Buffer) */
1596	0x95, 0x10,            /*             Report Count (0x10)          */
1597	0xb1, 0x2,             /*             Feature (Data, Variable, Absolute) */
1598	0xc0,                  /*         End Collection                   */
1599	0xa1, 0x2,             /*         Collection (Logical)             */
1600	0x85, 0x8,             /*             Report ID (0x8)              */
1601	0x9, 0x3a,             /*             Usage (0x3a: Counted Buffer) */
1602	0x95, 0x10,            /*             Report Count (0x10)          */
1603	0xb1, 0x2,             /*             Feature (Data, Variable, Absolute) */
1604	0xc0,                  /*         End Collection                   */
1605	0xa1, 0x2,             /*         Collection (Logical)             */
1606	0x85, 0x9,             /*             Report ID (0x9)              */
1607	0x9, 0x3a,             /*             Usage (0x3a: Counted Buffer) */
1608	0x95, 0xc,             /*             Report Count (0xc)           */
1609	0xb1, 0x2,             /*             Feature (Data, Variable, Absolute) */
1610	0xc0,                  /*         End Collection                   */
1611	0xa1, 0x2,             /*         Collection (Logical)             */
1612	0x85, 0xa,             /*             Report ID (0xa)              */
1613	0x9, 0x3a,             /*             Usage (0x3a: Counted Buffer) */
1614	0x95, 0x1,             /*             Report Count (0x1)           */
1615	0xb1, 0x2,             /*             Feature (Data, Variable, Absolute) */
1616	0xc0,                  /*         End Collection                   */
1617	0xa1, 0x2,             /*         Collection (Logical)             */
1618	0x85, 0xb,             /*             Report ID (0xb)              */
1619	0x9, 0x3a,             /*             Usage (0x3a: Counted Buffer) */
1620	0x95, 0x1,             /*             Report Count (0x1)           */
1621	0xb1, 0x2,             /*             Feature (Data, Variable, Absolute) */
1622	0xc0,                  /*         End Collection                   */
1623	0xa1, 0x2,             /*         Collection (Logical)             */
1624	0x85, 0xc,             /*             Report ID (0xc)              */
1625	0x9, 0x3a,             /*             Usage (0x3a: Counted Buffer) */
1626	0x95, 0x1,             /*             Report Count (0x1)           */
1627	0xb1, 0x2,             /*             Feature (Data, Variable, Absolute) */
1628	0xc0,                  /*         End Collection                   */
1629	0xa1, 0x2,             /*         Collection (Logical)             */
1630	0x85, 0xd,             /*             Report ID (0xd)              */
1631	0x9, 0x3a,             /*             Usage (0x3a: Counted Buffer) */
1632	0x95, 0x2,             /*             Report Count (0x2)           */
1633	0xb1, 0x2,             /*             Feature (Data, Variable, Absolute) */
1634	0xc0,                  /*         End Collection                   */
1635	0xc0,                  /*     End Collection                       */
1636	0xc0,                  /* End Collection                           */
1637};
1638
1639______________________________________________________________________________
1640