1// Copyright 2017 The Fuchsia Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include <assert.h>
6#include <hid/paradise.h>
7#include <zircon/errors.h>
8#include <stdio.h>
9#include <string.h>
10
11static const uint8_t paradise_touch_report_desc[] = {
12    0x05, 0x0D,        // Usage Page (Digitizer)
13    0x09, 0x04,        // Usage (Touch Screen)
14    0xA1, 0x01,        // Collection (Application)
15    0x85, 0x0C,        //   Report ID (12)
16    0x95, 0x01,        //   Report Count (1)
17    0x75, 0x08,        //   Report Size (8)
18    0x26, 0xFF, 0x00,  //   Logical Maximum (255)
19    0x15, 0x00,        //   Logical Minimum (0)
20    0x81, 0x03,        //   Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
21    0x09, 0x54,        //   Usage (0x54)
22    0x81, 0x02,        //   Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
23    0x05, 0x0D,        //   Usage Page (Digitizer)
24    0x09, 0x22,        //   Usage (Finger)
25    0xA1, 0x02,        //   Collection (Logical)
26    0x09, 0x42,        //     Usage (Tip Switch)
27    0x15, 0x00,        //     Logical Minimum (0)
28    0x25, 0x01,        //     Logical Maximum (1)
29    0x75, 0x01,        //     Report Size (1)
30    0x95, 0x01,        //     Report Count (1)
31    0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
32    0x81, 0x03,        //     Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
33    0x09, 0x47,        //     Usage (0x47)
34    0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
35    0x95, 0x05,        //     Report Count (5)
36    0x81, 0x03,        //     Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
37    0x75, 0x10,        //     Report Size (16)
38    0x09, 0x51,        //     Usage (0x51)
39    0x95, 0x01,        //     Report Count (1)
40    0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
41    0x05, 0x01,        //     Usage Page (Generic Desktop Ctrls)
42    0x75, 0x10,        //     Report Size (16)
43    0x95, 0x01,        //     Report Count (1)
44    0x55, 0x0E,        //     Unit Exponent (-2)
45    0x65, 0x11,        //     Unit (System: SI Linear, Length: Centimeter)
46    0x09, 0x30,        //     Usage (X)
47    0x26, 0x80, 0x28,  //     Logical Maximum (10368)
48    0x35, 0x00,        //     Physical Minimum (0)
49    0x46, 0x20, 0x0A,  //     Physical Maximum (2592)
50    0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
51    0x46, 0xC0, 0x06,  //     Physical Maximum (1728)
52    0x09, 0x31,        //     Usage (Y)
53    0x26, 0x00, 0x1B,  //     Logical Maximum (6912)
54    0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
55    0xC0,              //   End Collection
56    0x05, 0x0D,        //   Usage Page (Digitizer)
57    0x09, 0x22,        //   Usage (Finger)
58    0xA1, 0x02,        //   Collection (Logical)
59    0x09, 0x42,        //     Usage (Tip Switch)
60    0x15, 0x00,        //     Logical Minimum (0)
61    0x25, 0x01,        //     Logical Maximum (1)
62    0x75, 0x01,        //     Report Size (1)
63    0x95, 0x01,        //     Report Count (1)
64    0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
65    0x81, 0x03,        //     Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
66    0x09, 0x47,        //     Usage (0x47)
67    0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
68    0x95, 0x05,        //     Report Count (5)
69    0x81, 0x03,        //     Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
70    0x75, 0x10,        //     Report Size (16)
71    0x09, 0x51,        //     Usage (0x51)
72    0x95, 0x01,        //     Report Count (1)
73    0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
74    0x05, 0x01,        //     Usage Page (Generic Desktop Ctrls)
75    0x75, 0x10,        //     Report Size (16)
76    0x95, 0x01,        //     Report Count (1)
77    0x55, 0x0E,        //     Unit Exponent (-2)
78    0x65, 0x11,        //     Unit (System: SI Linear, Length: Centimeter)
79    0x09, 0x30,        //     Usage (X)
80    0x26, 0x80, 0x28,  //     Logical Maximum (10368)
81    0x35, 0x00,        //     Physical Minimum (0)
82    0x46, 0x20, 0x0A,  //     Physical Maximum (2592)
83    0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
84    0x46, 0xC0, 0x06,  //     Physical Maximum (1728)
85    0x09, 0x31,        //     Usage (Y)
86    0x26, 0x00, 0x1B,  //     Logical Maximum (6912)
87    0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
88    0xC0,              //   End Collection
89    0x05, 0x0D,        //   Usage Page (Digitizer)
90    0x09, 0x22,        //   Usage (Finger)
91    0xA1, 0x02,        //   Collection (Logical)
92    0x09, 0x42,        //     Usage (Tip Switch)
93    0x15, 0x00,        //     Logical Minimum (0)
94    0x25, 0x01,        //     Logical Maximum (1)
95    0x75, 0x01,        //     Report Size (1)
96    0x95, 0x01,        //     Report Count (1)
97    0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
98    0x81, 0x03,        //     Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
99    0x09, 0x47,        //     Usage (0x47)
100    0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
101    0x95, 0x05,        //     Report Count (5)
102    0x81, 0x03,        //     Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
103    0x75, 0x10,        //     Report Size (16)
104    0x09, 0x51,        //     Usage (0x51)
105    0x95, 0x01,        //     Report Count (1)
106    0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
107    0x05, 0x01,        //     Usage Page (Generic Desktop Ctrls)
108    0x75, 0x10,        //     Report Size (16)
109    0x95, 0x01,        //     Report Count (1)
110    0x55, 0x0E,        //     Unit Exponent (-2)
111    0x65, 0x11,        //     Unit (System: SI Linear, Length: Centimeter)
112    0x09, 0x30,        //     Usage (X)
113    0x26, 0x80, 0x28,  //     Logical Maximum (10368)
114    0x35, 0x00,        //     Physical Minimum (0)
115    0x46, 0x20, 0x0A,  //     Physical Maximum (2592)
116    0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
117    0x46, 0xC0, 0x06,  //     Physical Maximum (1728)
118    0x09, 0x31,        //     Usage (Y)
119    0x26, 0x00, 0x1B,  //     Logical Maximum (6912)
120    0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
121    0xC0,              //   End Collection
122    0x05, 0x0D,        //   Usage Page (Digitizer)
123    0x09, 0x22,        //   Usage (Finger)
124    0xA1, 0x02,        //   Collection (Logical)
125    0x09, 0x42,        //     Usage (Tip Switch)
126    0x15, 0x00,        //     Logical Minimum (0)
127    0x25, 0x01,        //     Logical Maximum (1)
128    0x75, 0x01,        //     Report Size (1)
129    0x95, 0x01,        //     Report Count (1)
130    0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
131    0x81, 0x03,        //     Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
132    0x09, 0x47,        //     Usage (0x47)
133    0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
134    0x95, 0x05,        //     Report Count (5)
135    0x81, 0x03,        //     Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
136    0x75, 0x10,        //     Report Size (16)
137    0x09, 0x51,        //     Usage (0x51)
138    0x95, 0x01,        //     Report Count (1)
139    0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
140    0x05, 0x01,        //     Usage Page (Generic Desktop Ctrls)
141    0x75, 0x10,        //     Report Size (16)
142    0x95, 0x01,        //     Report Count (1)
143    0x55, 0x0E,        //     Unit Exponent (-2)
144    0x65, 0x11,        //     Unit (System: SI Linear, Length: Centimeter)
145    0x09, 0x30,        //     Usage (X)
146    0x26, 0x80, 0x28,  //     Logical Maximum (10368)
147    0x35, 0x00,        //     Physical Minimum (0)
148    0x46, 0x20, 0x0A,  //     Physical Maximum (2592)
149    0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
150    0x46, 0xC0, 0x06,  //     Physical Maximum (1728)
151    0x09, 0x31,        //     Usage (Y)
152    0x26, 0x00, 0x1B,  //     Logical Maximum (6912)
153    0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
154    0xC0,              //   End Collection
155    0x05, 0x0D,        //   Usage Page (Digitizer)
156    0x09, 0x22,        //   Usage (Finger)
157    0xA1, 0x02,        //   Collection (Logical)
158    0x09, 0x42,        //     Usage (Tip Switch)
159    0x15, 0x00,        //     Logical Minimum (0)
160    0x25, 0x01,        //     Logical Maximum (1)
161    0x75, 0x01,        //     Report Size (1)
162    0x95, 0x01,        //     Report Count (1)
163    0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
164    0x81, 0x03,        //     Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
165    0x09, 0x47,        //     Usage (0x47)
166    0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
167    0x95, 0x05,        //     Report Count (5)
168    0x81, 0x03,        //     Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
169    0x75, 0x10,        //     Report Size (16)
170    0x09, 0x51,        //     Usage (0x51)
171    0x95, 0x01,        //     Report Count (1)
172    0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
173    0x05, 0x01,        //     Usage Page (Generic Desktop Ctrls)
174    0x75, 0x10,        //     Report Size (16)
175    0x95, 0x01,        //     Report Count (1)
176    0x55, 0x0E,        //     Unit Exponent (-2)
177    0x65, 0x11,        //     Unit (System: SI Linear, Length: Centimeter)
178    0x09, 0x30,        //     Usage (X)
179    0x26, 0x80, 0x28,  //     Logical Maximum (10368)
180    0x35, 0x00,        //     Physical Minimum (0)
181    0x46, 0x20, 0x0A,  //     Physical Maximum (2592)
182    0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
183    0x46, 0xC0, 0x06,  //     Physical Maximum (1728)
184    0x09, 0x31,        //     Usage (Y)
185    0x26, 0x00, 0x1B,  //     Logical Maximum (6912)
186    0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
187    0xC0,              //   End Collection
188    0x05, 0x0D,        //   Usage Page (Digitizer)
189    0x27, 0xFF, 0xFF, 0x00, 0x00,  //   Logical Maximum (65534)
190    0x75, 0x10,        //   Report Size (16)
191    0x95, 0x01,        //   Report Count (1)
192    0x09, 0x56,        //   Usage (0x56)
193    0x81, 0x02,        //   Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
194    0x85, 0x0C,        //   Report ID (12)
195    0x09, 0x55,        //   Usage (0x55)
196    0x75, 0x08,        //   Report Size (8)
197    0x95, 0x01,        //   Report Count (1)
198    0x26, 0xFF, 0x00,  //   Logical Maximum (255)
199    0xB1, 0x02,        //   Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
200    0x85, 0x0A,        //   Report ID (10)
201    0x06, 0x00, 0xFF,  //   Usage Page (Vendor Defined 0xFF00)
202    0x09, 0xC5,        //   Usage (0xC5)
203    0x96, 0x00, 0x01,  //   Report Count (256)
204    0xB1, 0x02,        //   Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
205    0xC0,              // End Collection
206    0x06, 0x11, 0xFF,  // Usage Page (Vendor Defined 0xFF11)
207    0x09, 0x11,        // Usage (0x11)
208    0xA1, 0x01,        // Collection (Application)
209    0x85, 0x03,        //   Report ID (3)
210    0xA1, 0x02,        //   Collection (Logical)
211    0x09, 0x00,        //     Usage (0x00)
212    0x75, 0x08,        //     Report Size (8)
213    0x15, 0x00,        //     Logical Minimum (0)
214    0x26, 0xFF, 0x00,  //     Logical Maximum (255)
215    0x95, 0x27,        //     Report Count (39)
216    0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
217    0xC0,              //   End Collection
218    0x85, 0x02,        //   Report ID (2)
219    0x09, 0x00,        //   Usage (0x00)
220    0x95, 0x01,        //   Report Count (1)
221    0xB1, 0x02,        //   Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
222    0x85, 0x03,        //   Report ID (3)
223    0x09, 0x00,        //   Usage (0x00)
224    0x95, 0x3F,        //   Report Count (63)
225    0xB1, 0x02,        //   Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
226    0x85, 0x04,        //   Report ID (4)
227    0x09, 0x00,        //   Usage (0x00)
228    0x95, 0x0F,        //   Report Count (15)
229    0xB1, 0x02,        //   Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
230    0x85, 0x07,        //   Report ID (7)
231    0x09, 0x00,        //   Usage (0x00)
232    0x96, 0x00, 0x01,  //   Report Count (256)
233    0xB1, 0x02,        //   Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
234    0x85, 0x08,        //   Report ID (8)
235    0x09, 0x00,        //   Usage (0x00)
236    0x96, 0x87, 0x00,  //   Report Count (135)
237    0xB1, 0x02,        //   Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
238    0x85, 0x09,        //   Report ID (9)
239    0x09, 0x00,        //   Usage (0x00)
240    0x96, 0x3F, 0x00,  //   Report Count (63)
241    0xB1, 0x02,        //   Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
242    0x85, 0x0D,        //   Report ID (13)
243    0x09, 0x00,        //   Usage (0x00)
244    0x95, 0x07,        //   Report Count (7)
245    0xB1, 0x02,        //   Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
246    0xC0,              // End Collection
247    0x05, 0x0D,        // Usage Page (Digitizer)
248    0x09, 0x0E,        // Usage (0x0E)
249    0xA1, 0x01,        // Collection (Application)
250    0x85, 0x0E,        //   Report ID (14)
251    0x09, 0x23,        //   Usage (0x23)
252    0xA1, 0x02,        //   Collection (Logical)
253    0x09, 0x52,        //     Usage (0x52)
254    0x09, 0x53,        //     Usage (0x53)
255    0x15, 0x00,        //     Logical Minimum (0)
256    0x25, 0x0A,        //     Logical Maximum (10)
257    0x75, 0x08,        //     Report Size (8)
258    0x95, 0x02,        //     Report Count (2)
259    0xB1, 0x02,        //     Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
260    0xC0,              //   End Collection
261    0xC0,              // End Collection
262    0x05, 0x0D,        // Usage Page (Digitizer)
263    0x09, 0x02,        // Usage (Pen)
264    0xA1, 0x01,        // Collection (Application)
265    0x85, 0x06,        //   Report ID (6)
266    0xA4,              //   Push
267    0x09, 0x20,        //     Usage (Stylus)
268    0xA1, 0x00,        //     Collection (Physical)
269    0x09, 0x42,        //       Usage (Tip Switch)
270    0x09, 0x44,        //       Usage (Barrel Switch)
271    0x09, 0x45,        //       Usage (Eraser)
272    0x09, 0x3C,        //       Usage (Invert)
273    0x09, 0x5A,        //       Usage (0x5A)
274    0x09, 0x32,        //       Usage (In Range)
275    0x15, 0x00,        //       Logical Minimum (0)
276    0x25, 0x01,        //       Logical Maximum (1)
277    0x75, 0x01,        //       Report Size (1)
278    0x95, 0x06,        //       Report Count (6)
279    0x81, 0x02,        //       Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
280    0x95, 0x02,        //       Report Count (2)
281    0x81, 0x03,        //       Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
282    0x05, 0x01,        //       Usage Page (Generic Desktop Ctrls)
283    0x09, 0x30,        //       Usage (X)
284    0x27, 0x40, 0x65, 0x00, 0x00,  //       Logical Maximum (25919)
285    0x47, 0x40, 0x65, 0x00, 0x00,  //       Physical Maximum (25919)
286    0x65, 0x11,        //       Unit (System: SI Linear, Length: Centimeter)
287    0x55, 0x0D,        //       Unit Exponent (-3)
288    0x75, 0x10,        //       Report Size (16)
289    0x95, 0x01,        //       Report Count (1)
290    0x81, 0x02,        //       Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
291    0x09, 0x31,        //       Usage (Y)
292    0x27, 0x80, 0x43, 0x00, 0x00,  //       Logical Maximum (17279)
293    0x47, 0x80, 0x43, 0x00, 0x00,  //       Physical Maximum (17279)
294    0x81, 0x02,        //       Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
295    0x45, 0x00,        //       Physical Maximum (0)
296    0x65, 0x00,        //       Unit (None)
297    0x55, 0x00,        //       Unit Exponent (0)
298    0x05, 0x0D,        //       Usage Page (Digitizer)
299    0x09, 0x30,        //       Usage (Tip Pressure)
300    0x26, 0xFF, 0x07,  //       Logical Maximum (2047)
301    0x75, 0x10,        //       Report Size (16)
302    0x81, 0x02,        //       Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
303    0x06, 0x00, 0xFF,  //       Usage Page (Vendor Defined 0xFF00)
304    0x09, 0x5B,        //       Usage (0x5B)
305    0x16, 0x00, 0x80,  //       Logical Minimum (-32768)
306    0x26, 0xFF, 0x7F,  //       Logical Maximum (32767)
307    0x75, 0x10,        //       Report Size (16)
308    0x81, 0x02,        //       Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
309    0x05, 0x0D,        //       Usage Page (Digitizer)
310    0x09, 0x5B,        //       Usage (0x5B)
311    0x17, 0x00, 0x00, 0x00, 0x80,  //       Logical Minimum (-2147483649)
312    0x27, 0xFF, 0xFF, 0xFF, 0x7F,  //       Logical Maximum (2147483646)
313    0x75, 0x20,        //       Report Size (32)
314    0x81, 0x02,        //       Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
315    0x06, 0x00, 0xFF,  //       Usage Page (Vendor Defined 0xFF00)
316    0x09, 0x00,        //       Usage (0x00)
317    0x75, 0x08,        //       Report Size (8)
318    0x26, 0xFF, 0x00,  //       Logical Maximum (255)
319    0x15, 0x00,        //       Logical Minimum (0)
320    0x81, 0x02,        //       Input (DVar,Abs,No Wrap,Linear,Preferred State,No Null Position)
321    0x05, 0x0D,        //       Usage Page (Digitizer)
322    0x09, 0x3B,        //       Usage (Battery Strength)
323    0x81, 0x02,        //       Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
324    0x65, 0x14,        //       Unit (System: English Rotation, Length: Centimeter)
325    0x55, 0x00,        //       Unit Exponent (0)
326    0x16, 0xA6, 0xFF,  //       Logical Minimum (-90)
327    0x26, 0x5A, 0x00,  //       Logical Maximum (90)
328    0x36, 0xA6, 0xFF,  //       Physical Minimum (-90)
329    0x46, 0x5A, 0x00,  //       Physical Maximum (90)
330    0x75, 0x08,        //       Report Size (8)
331    0x09, 0x3D,        //       Usage (X Tilt)
332    0x81, 0x02,        //       Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
333    0x09, 0x3E,        //       Usage (Y Tilt)
334    0x81, 0x02,        //       Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
335    0x15, 0x00,        //       Logical Minimum (0)
336    0x27, 0xFF, 0xFF, 0x00, 0x00,  //       Logical Maximum (65534)
337    0x35, 0x00,        //       Physical Minimum (0)
338    0x47, 0xFF, 0xFF, 0x00, 0x00,  //       Physical Maximum (65534)
339    0x66, 0x01, 0x10,  //       Unit (System: SI Linear, Time: Seconds)
340    0x55, 0x0C,        //       Unit Exponent (-4)
341    0x75, 0x10,        //       Report Size (16)
342    0x09, 0x56,        //       Usage (0x56)
343    0x81, 0x02,        //       Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
344    0xC0,              //     End Collection
345    0xB4,              //   Pop
346    0x85, 0x13,        //   Report ID (19)
347    0x06, 0x00, 0xFF,  //   Usage Page (Vendor Defined 0xFF00)
348    0x09, 0xC5,        //   Usage (0xC5)
349    0x96, 0x00, 0x01,  //   Report Count (256)
350    0xB1, 0x02,        //   Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
351    0xC0,              // End Collection
352    0x06, 0x11, 0xFF,  // Usage Page (Vendor Defined 0xFF11)
353    0x09, 0x02,        // Usage (0x02)
354    0xA1, 0x01,        // Collection (Application)
355    0x85, 0x0B,        //   Report ID (11)
356    0xA4,              //   Push
357    0x09, 0x20,        //     Usage (0x20)
358    0xA1, 0x00,        //     Collection (Physical)
359    0x09, 0x42,        //       Usage (0x42)
360    0x09, 0x44,        //       Usage (0x44)
361    0x09, 0x45,        //       Usage (0x45)
362    0x09, 0x3C,        //       Usage (0x3C)
363    0x09, 0x5A,        //       Usage (0x5A)
364    0x09, 0x32,        //       Usage (0x32)
365    0x15, 0x00,        //       Logical Minimum (0)
366    0x25, 0x01,        //       Logical Maximum (1)
367    0x75, 0x01,        //       Report Size (1)
368    0x95, 0x06,        //       Report Count (6)
369    0x81, 0x02,        //       Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
370    0x95, 0x02,        //       Report Count (2)
371    0x81, 0x03,        //       Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
372    0x05, 0x01,        //       Usage Page (Generic Desktop Ctrls)
373    0x09, 0x30,        //       Usage (X)
374    0x27, 0x40, 0x65, 0x00, 0x00,  //       Logical Maximum (25919)
375    0x47, 0x40, 0x65, 0x00, 0x00,  //       Physical Maximum (25919)
376    0x65, 0x11,        //       Unit (System: SI Linear, Length: Centimeter)
377    0x55, 0x0D,        //       Unit Exponent (-3)
378    0x75, 0x10,        //       Report Size (16)
379    0x95, 0x01,        //       Report Count (1)
380    0x81, 0x02,        //       Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
381    0x09, 0x31,        //       Usage (Y)
382    0x27, 0x80, 0x43, 0x00, 0x00,  //       Logical Maximum (17279)
383    0x47, 0x80, 0x43, 0x00, 0x00,  //       Physical Maximum (17279)
384    0x81, 0x02,        //       Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
385    0x45, 0x00,        //       Physical Maximum (0)
386    0x65, 0x00,        //       Unit (None)
387    0x55, 0x00,        //       Unit Exponent (0)
388    0x05, 0x0D,        //       Usage Page (Digitizer)
389    0x09, 0x30,        //       Usage (Tip Pressure)
390    0x26, 0xFF, 0x07,  //       Logical Maximum (2047)
391    0x75, 0x10,        //       Report Size (16)
392    0x81, 0x02,        //       Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
393    0x06, 0x00, 0xFF,  //       Usage Page (Vendor Defined 0xFF00)
394    0x09, 0x5B,        //       Usage (0x5B)
395    0x16, 0x00, 0x80,  //       Logical Minimum (-32768)
396    0x26, 0xFF, 0x7F,  //       Logical Maximum (32767)
397    0x75, 0x10,        //       Report Size (16)
398    0x81, 0x02,        //       Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
399    0x05, 0x0D,        //       Usage Page (Digitizer)
400    0x09, 0x5B,        //       Usage (0x5B)
401    0x17, 0x00, 0x00, 0x00, 0x80,  //       Logical Minimum (-2147483649)
402    0x27, 0xFF, 0xFF, 0xFF, 0x7F,  //       Logical Maximum (2147483646)
403    0x75, 0x20,        //       Report Size (32)
404    0x81, 0x02,        //       Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
405    0x06, 0x00, 0xFF,  //       Usage Page (Vendor Defined 0xFF00)
406    0x09, 0x00,        //       Usage (0x00)
407    0x75, 0x08,        //       Report Size (8)
408    0x26, 0xFF, 0x00,  //       Logical Maximum (255)
409    0x15, 0x00,        //       Logical Minimum (0)
410    0x81, 0x02,        //       Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
411    0x05, 0x0D,        //       Usage Page (Digitizer)
412    0x09, 0x3B,        //       Usage (Battery Strength)
413    0x81, 0x02,        //       Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
414    0x65, 0x14,        //       Unit (System: English Rotation, Length: Centimeter)
415    0x55, 0x00,        //       Unit Exponent (0)
416    0x16, 0xA6, 0xFF,  //       Logical Minimum (-90)
417    0x26, 0x5A, 0x00,  //       Logical Maximum (90)
418    0x36, 0xA6, 0xFF,  //       Physical Minimum (-90)
419    0x46, 0x5A, 0x00,  //       Physical Maximum (90)
420    0x75, 0x08,        //       Report Size (8)
421    0x09, 0x3D,        //       Usage (X Tilt)
422    0x81, 0x02,        //       Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
423    0x09, 0x3E,        //       Usage (Y Tilt)
424    0x81, 0x02,        //       Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
425    0x15, 0x00,        //       Logical Minimum (0)
426    0x27, 0xFF, 0xFF, 0x00, 0x00,  //       Logical Maximum (65534)
427    0x35, 0x00,        //       Physical Minimum (0)
428    0x47, 0xFF, 0xFF, 0x00, 0x00,  //       Physical Maximum (65534)
429    0x66, 0x01, 0x10,  //       Unit (System: SI Linear, Time: Seconds)
430    0x55, 0x0C,        //       Unit Exponent (-4)
431    0x75, 0x10,        //       Report Size (16)
432    0x09, 0x56,        //       Usage (0x56)
433    0x81, 0x02,        //       Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
434    0xC0,              //     End Collection
435    0xB4,              //   Pop
436    0x06, 0x00, 0xFF,  //   Usage Page (Vendor Defined 0xFF00)
437    0x75, 0x08,        //   Report Size (8)
438    0x15, 0x00,        //   Logical Minimum (0)
439    0x26, 0xFF, 0x00,  //   Logical Maximum (255)
440    0x85, 0x05,        //   Report ID (5)
441    0x09, 0x00,        //   Usage (0x00)
442    0x95, 0x3A,        //   Report Count (58)
443    0x81, 0x02,        //   Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
444    0x85, 0x10,        //   Report ID (16)
445    0x09, 0x00,        //   Usage (0x00)
446    0x95, 0x14,        //   Report Count (20)
447    0x81, 0x02,        //   Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
448    0x85, 0x0F,        //   Report ID (15)
449    0x09, 0x00,        //   Usage (0x00)
450    0x95, 0x27,        //   Report Count (39)
451    0x81, 0x02,        //   Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
452    0x85, 0x0F,        //   Report ID (15)
453    0x09, 0x00,        //   Usage (0x00)
454    0x95, 0x07,        //   Report Count (7)
455    0xB1, 0x02,        //   Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
456    0x85, 0x11,        //   Report ID (17)
457    0x09, 0x00,        //   Usage (0x00)
458    0x95, 0x09,        //   Report Count (9)
459    0xB1, 0x02,        //   Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
460    0x85, 0x05,        //   Report ID (5)
461    0x09, 0x00,        //   Usage (0x00)
462    0x95, 0x08,        //   Report Count (8)
463    0xB1, 0x02,        //   Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
464    0x85, 0x10,        //   Report ID (16)
465    0x09, 0x00,        //   Usage (0x00)
466    0x96, 0x3F, 0x00,  //   Report Count (63)
467    0xB1, 0x02,        //   Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
468    0x85, 0x0B,        //   Report ID (11)
469    0x09, 0x00,        //   Usage (0x00)
470    0x96, 0x3F, 0x00,  //   Report Count (63)
471    0xB1, 0x02,        //   Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
472    0xC0,              // End Collection
473    0x05, 0x01,        // Usage Page (Generic Desktop Ctrls)
474    0x09, 0x02,        // Usage (Mouse)
475    0xA1, 0x01,        // Collection (Application)
476    0x85, 0x01,        //   Report ID (1)
477    0x09, 0x01,        //   Usage (Pointer)
478    0xA1, 0x00,        //   Collection (Physical)
479    0x05, 0x09,        //     Usage Page (Button)
480    0x19, 0x01,        //     Usage Minimum (0x01)
481    0x29, 0x02,        //     Usage Maximum (0x02)
482    0x15, 0x00,        //     Logical Minimum (0)
483    0x25, 0x01,        //     Logical Maximum (1)
484    0x95, 0x02,        //     Report Count (2)
485    0x75, 0x01,        //     Report Size (1)
486    0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
487    0x95, 0x01,        //     Report Count (1)
488    0x75, 0x06,        //     Report Size (6)
489    0x81, 0x03,        //     Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
490    0x05, 0x01,        //     Usage Page (Generic Desktop Ctrls)
491    0x09, 0x30,        //     Usage (X)
492    0x09, 0x31,        //     Usage (Y)
493    0x26, 0xFF, 0x7F,  //     Logical Maximum (32767)
494    0x75, 0x10,        //     Report Size (16)
495    0x95, 0x02,        //     Report Count (2)
496    0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
497    0xC0,              //   End Collection
498    0xC0,              // End Collection
499
500    // 1064 bytes
501};
502
503bool is_paradise_touch_report_desc(const uint8_t* data, size_t len) {
504    if (!data)
505        return false;
506
507    if (len != sizeof(paradise_touch_report_desc)) {
508        return false;
509    }
510
511    return (memcmp(data, paradise_touch_report_desc, len) == 0);
512}
513
514static const uint8_t paradise_touch_v2_report_desc[] = {
5150x05, 0x0D,        // Usage Page (Digitizer)
5160x09, 0x04,        // Usage (Touch Screen)
5170xA1, 0x01,        // Collection (Application)
5180x85, 0x0C,        //   Report ID (12)
5190x95, 0x01,        //   Report Count (1)
5200x75, 0x08,        //   Report Size (8)
5210x26, 0xFF, 0x00,  //   Logical Maximum (255)
5220x15, 0x00,        //   Logical Minimum (0)
5230x81, 0x03,        //   Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
5240x09, 0x54,        //   Usage (0x54)
5250x81, 0x02,        //   Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
5260x05, 0x0D,        //   Usage Page (Digitizer)
5270x09, 0x22,        //   Usage (Finger)
5280xA1, 0x02,        //   Collection (Logical)
5290x09, 0x42,        //     Usage (Tip Switch)
5300x15, 0x00,        //     Logical Minimum (0)
5310x25, 0x01,        //     Logical Maximum (1)
5320x75, 0x01,        //     Report Size (1)
5330x95, 0x01,        //     Report Count (1)
5340x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
5350x81, 0x03,        //     Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
5360x09, 0x47,        //     Usage (0x47)
5370x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
5380x95, 0x05,        //     Report Count (5)
5390x81, 0x03,        //     Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
5400x75, 0x10,        //     Report Size (16)
5410x09, 0x51,        //     Usage (0x51)
5420x95, 0x01,        //     Report Count (1)
5430x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
5440x15, 0x00,        //     Logical Minimum (0)
5450x26, 0xFF, 0x00,  //     Logical Maximum (255)
5460x35, 0x00,        //     Physical Minimum (0)
5470x46, 0xFF, 0x00,  //     Physical Maximum (255)
5480x65, 0x11,        //     Unit (System: SI Linear, Length: Centimeter)
5490x55, 0x0F,        //     Unit Exponent (-1)
5500x75, 0x08,        //     Report Size (8)
5510x09, 0x48,        //     Usage (0x48)
5520x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
5530x09, 0x49,        //     Usage (0x49)
5540x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
5550x05, 0x01,        //     Usage Page (Generic Desktop Ctrls)
5560x75, 0x10,        //     Report Size (16)
5570x95, 0x01,        //     Report Count (1)
5580x55, 0x0E,        //     Unit Exponent (-2)
5590x65, 0x11,        //     Unit (System: SI Linear, Length: Centimeter)
5600x09, 0x30,        //     Usage (X)
5610x26, 0x80, 0x28,  //     Logical Maximum (10368)
5620x35, 0x00,        //     Physical Minimum (0)
5630x46, 0x20, 0x0A,  //     Physical Maximum (2592)
5640x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
5650x46, 0xC0, 0x06,  //     Physical Maximum (1728)
5660x09, 0x31,        //     Usage (Y)
5670x26, 0x00, 0x1B,  //     Logical Maximum (6912)
5680x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
5690x15, 0x00,        //     Logical Minimum (0)
5700x26, 0xFF, 0x00,  //     Logical Maximum (255)
5710x35, 0x00,        //     Physical Minimum (0)
5720x45, 0x00,        //     Physical Maximum (0)
5730x65, 0x00,        //     Unit (None)
5740x55, 0x00,        //     Unit Exponent (0)
5750x75, 0x08,        //     Report Size (8)
5760x05, 0x0D,        //     Usage Page (Digitizer)
5770x09, 0x30,        //     Usage (Tip Pressure)
5780x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
5790xC0,              //   End Collection
5800x05, 0x0D,        //   Usage Page (Digitizer)
5810x09, 0x22,        //   Usage (Finger)
5820xA1, 0x02,        //   Collection (Logical)
5830x09, 0x42,        //     Usage (Tip Switch)
5840x15, 0x00,        //     Logical Minimum (0)
5850x25, 0x01,        //     Logical Maximum (1)
5860x75, 0x01,        //     Report Size (1)
5870x95, 0x01,        //     Report Count (1)
5880x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
5890x81, 0x03,        //     Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
5900x09, 0x47,        //     Usage (0x47)
5910x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
5920x95, 0x05,        //     Report Count (5)
5930x81, 0x03,        //     Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
5940x75, 0x10,        //     Report Size (16)
5950x09, 0x51,        //     Usage (0x51)
5960x95, 0x01,        //     Report Count (1)
5970x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
5980x15, 0x00,        //     Logical Minimum (0)
5990x26, 0xFF, 0x00,  //     Logical Maximum (255)
6000x35, 0x00,        //     Physical Minimum (0)
6010x46, 0xFF, 0x00,  //     Physical Maximum (255)
6020x65, 0x11,        //     Unit (System: SI Linear, Length: Centimeter)
6030x55, 0x0F,        //     Unit Exponent (-1)
6040x75, 0x08,        //     Report Size (8)
6050x09, 0x48,        //     Usage (0x48)
6060x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
6070x09, 0x49,        //     Usage (0x49)
6080x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
6090x05, 0x01,        //     Usage Page (Generic Desktop Ctrls)
6100x75, 0x10,        //     Report Size (16)
6110x95, 0x01,        //     Report Count (1)
6120x55, 0x0E,        //     Unit Exponent (-2)
6130x65, 0x11,        //     Unit (System: SI Linear, Length: Centimeter)
6140x09, 0x30,        //     Usage (X)
6150x26, 0x80, 0x28,  //     Logical Maximum (10368)
6160x35, 0x00,        //     Physical Minimum (0)
6170x46, 0x20, 0x0A,  //     Physical Maximum (2592)
6180x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
6190x46, 0xC0, 0x06,  //     Physical Maximum (1728)
6200x09, 0x31,        //     Usage (Y)
6210x26, 0x00, 0x1B,  //     Logical Maximum (6912)
6220x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
6230x15, 0x00,        //     Logical Minimum (0)
6240x26, 0xFF, 0x00,  //     Logical Maximum (255)
6250x35, 0x00,        //     Physical Minimum (0)
6260x45, 0x00,        //     Physical Maximum (0)
6270x65, 0x00,        //     Unit (None)
6280x55, 0x00,        //     Unit Exponent (0)
6290x75, 0x08,        //     Report Size (8)
6300x05, 0x0D,        //     Usage Page (Digitizer)
6310x09, 0x30,        //     Usage (Tip Pressure)
6320x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
6330xC0,              //   End Collection
6340x05, 0x0D,        //   Usage Page (Digitizer)
6350x09, 0x22,        //   Usage (Finger)
6360xA1, 0x02,        //   Collection (Logical)
6370x09, 0x42,        //     Usage (Tip Switch)
6380x15, 0x00,        //     Logical Minimum (0)
6390x25, 0x01,        //     Logical Maximum (1)
6400x75, 0x01,        //     Report Size (1)
6410x95, 0x01,        //     Report Count (1)
6420x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
6430x81, 0x03,        //     Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
6440x09, 0x47,        //     Usage (0x47)
6450x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
6460x95, 0x05,        //     Report Count (5)
6470x81, 0x03,        //     Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
6480x75, 0x10,        //     Report Size (16)
6490x09, 0x51,        //     Usage (0x51)
6500x95, 0x01,        //     Report Count (1)
6510x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
6520x15, 0x00,        //     Logical Minimum (0)
6530x26, 0xFF, 0x00,  //     Logical Maximum (255)
6540x35, 0x00,        //     Physical Minimum (0)
6550x46, 0xFF, 0x00,  //     Physical Maximum (255)
6560x65, 0x11,        //     Unit (System: SI Linear, Length: Centimeter)
6570x55, 0x0F,        //     Unit Exponent (-1)
6580x75, 0x08,        //     Report Size (8)
6590x09, 0x48,        //     Usage (0x48)
6600x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
6610x09, 0x49,        //     Usage (0x49)
6620x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
6630x05, 0x01,        //     Usage Page (Generic Desktop Ctrls)
6640x75, 0x10,        //     Report Size (16)
6650x95, 0x01,        //     Report Count (1)
6660x55, 0x0E,        //     Unit Exponent (-2)
6670x65, 0x11,        //     Unit (System: SI Linear, Length: Centimeter)
6680x09, 0x30,        //     Usage (X)
6690x26, 0x80, 0x28,  //     Logical Maximum (10368)
6700x35, 0x00,        //     Physical Minimum (0)
6710x46, 0x20, 0x0A,  //     Physical Maximum (2592)
6720x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
6730x46, 0xC0, 0x06,  //     Physical Maximum (1728)
6740x09, 0x31,        //     Usage (Y)
6750x26, 0x00, 0x1B,  //     Logical Maximum (6912)
6760x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
6770x15, 0x00,        //     Logical Minimum (0)
6780x26, 0xFF, 0x00,  //     Logical Maximum (255)
6790x35, 0x00,        //     Physical Minimum (0)
6800x45, 0x00,        //     Physical Maximum (0)
6810x65, 0x00,        //     Unit (None)
6820x55, 0x00,        //     Unit Exponent (0)
6830x75, 0x08,        //     Report Size (8)
6840x05, 0x0D,        //     Usage Page (Digitizer)
6850x09, 0x30,        //     Usage (Tip Pressure)
6860x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
6870xC0,              //   End Collection
6880x05, 0x0D,        //   Usage Page (Digitizer)
6890x09, 0x22,        //   Usage (Finger)
6900xA1, 0x02,        //   Collection (Logical)
6910x09, 0x42,        //     Usage (Tip Switch)
6920x15, 0x00,        //     Logical Minimum (0)
6930x25, 0x01,        //     Logical Maximum (1)
6940x75, 0x01,        //     Report Size (1)
6950x95, 0x01,        //     Report Count (1)
6960x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
6970x81, 0x03,        //     Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
6980x09, 0x47,        //     Usage (0x47)
6990x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
7000x95, 0x05,        //     Report Count (5)
7010x81, 0x03,        //     Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
7020x75, 0x10,        //     Report Size (16)
7030x09, 0x51,        //     Usage (0x51)
7040x95, 0x01,        //     Report Count (1)
7050x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
7060x15, 0x00,        //     Logical Minimum (0)
7070x26, 0xFF, 0x00,  //     Logical Maximum (255)
7080x35, 0x00,        //     Physical Minimum (0)
7090x46, 0xFF, 0x00,  //     Physical Maximum (255)
7100x65, 0x11,        //     Unit (System: SI Linear, Length: Centimeter)
7110x55, 0x0F,        //     Unit Exponent (-1)
7120x75, 0x08,        //     Report Size (8)
7130x09, 0x48,        //     Usage (0x48)
7140x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
7150x09, 0x49,        //     Usage (0x49)
7160x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
7170x05, 0x01,        //     Usage Page (Generic Desktop Ctrls)
7180x75, 0x10,        //     Report Size (16)
7190x95, 0x01,        //     Report Count (1)
7200x55, 0x0E,        //     Unit Exponent (-2)
7210x65, 0x11,        //     Unit (System: SI Linear, Length: Centimeter)
7220x09, 0x30,        //     Usage (X)
7230x26, 0x80, 0x28,  //     Logical Maximum (10368)
7240x35, 0x00,        //     Physical Minimum (0)
7250x46, 0x20, 0x0A,  //     Physical Maximum (2592)
7260x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
7270x46, 0xC0, 0x06,  //     Physical Maximum (1728)
7280x09, 0x31,        //     Usage (Y)
7290x26, 0x00, 0x1B,  //     Logical Maximum (6912)
7300x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
7310x15, 0x00,        //     Logical Minimum (0)
7320x26, 0xFF, 0x00,  //     Logical Maximum (255)
7330x35, 0x00,        //     Physical Minimum (0)
7340x45, 0x00,        //     Physical Maximum (0)
7350x65, 0x00,        //     Unit (None)
7360x55, 0x00,        //     Unit Exponent (0)
7370x75, 0x08,        //     Report Size (8)
7380x05, 0x0D,        //     Usage Page (Digitizer)
7390x09, 0x30,        //     Usage (Tip Pressure)
7400x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
7410xC0,              //   End Collection
7420x05, 0x0D,        //   Usage Page (Digitizer)
7430x09, 0x22,        //   Usage (Finger)
7440xA1, 0x02,        //   Collection (Logical)
7450x09, 0x42,        //     Usage (Tip Switch)
7460x15, 0x00,        //     Logical Minimum (0)
7470x25, 0x01,        //     Logical Maximum (1)
7480x75, 0x01,        //     Report Size (1)
7490x95, 0x01,        //     Report Count (1)
7500x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
7510x81, 0x03,        //     Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
7520x09, 0x47,        //     Usage (0x47)
7530x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
7540x95, 0x05,        //     Report Count (5)
7550x81, 0x03,        //     Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
7560x75, 0x10,        //     Report Size (16)
7570x09, 0x51,        //     Usage (0x51)
7580x95, 0x01,        //     Report Count (1)
7590x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
7600x15, 0x00,        //     Logical Minimum (0)
7610x26, 0xFF, 0x00,  //     Logical Maximum (255)
7620x35, 0x00,        //     Physical Minimum (0)
7630x46, 0xFF, 0x00,  //     Physical Maximum (255)
7640x65, 0x11,        //     Unit (System: SI Linear, Length: Centimeter)
7650x55, 0x0F,        //     Unit Exponent (-1)
7660x75, 0x08,        //     Report Size (8)
7670x09, 0x48,        //     Usage (0x48)
7680x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
7690x09, 0x49,        //     Usage (0x49)
7700x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
7710x05, 0x01,        //     Usage Page (Generic Desktop Ctrls)
7720x75, 0x10,        //     Report Size (16)
7730x95, 0x01,        //     Report Count (1)
7740x55, 0x0E,        //     Unit Exponent (-2)
7750x65, 0x11,        //     Unit (System: SI Linear, Length: Centimeter)
7760x09, 0x30,        //     Usage (X)
7770x26, 0x80, 0x28,  //     Logical Maximum (10368)
7780x35, 0x00,        //     Physical Minimum (0)
7790x46, 0x20, 0x0A,  //     Physical Maximum (2592)
7800x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
7810x46, 0xC0, 0x06,  //     Physical Maximum (1728)
7820x09, 0x31,        //     Usage (Y)
7830x26, 0x00, 0x1B,  //     Logical Maximum (6912)
7840x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
7850x15, 0x00,        //     Logical Minimum (0)
7860x26, 0xFF, 0x00,  //     Logical Maximum (255)
7870x35, 0x00,        //     Physical Minimum (0)
7880x45, 0x00,        //     Physical Maximum (0)
7890x65, 0x00,        //     Unit (None)
7900x55, 0x00,        //     Unit Exponent (0)
7910x75, 0x08,        //     Report Size (8)
7920x05, 0x0D,        //     Usage Page (Digitizer)
7930x09, 0x30,        //     Usage (Tip Pressure)
7940x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
7950xC0,              //   End Collection
7960x05, 0x0D,        //   Usage Page (Digitizer)
7970x27, 0xFF, 0xFF, 0x00, 0x00,  //   Logical Maximum (65534)
7980x75, 0x10,        //   Report Size (16)
7990x95, 0x01,        //   Report Count (1)
8000x09, 0x56,        //   Usage (0x56)
8010x81, 0x02,        //   Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
8020x85, 0x0C,        //   Report ID (12)
8030x09, 0x55,        //   Usage (0x55)
8040x75, 0x08,        //   Report Size (8)
8050x95, 0x01,        //   Report Count (1)
8060x26, 0xFF, 0x00,  //   Logical Maximum (255)
8070xB1, 0x02,        //   Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
8080x85, 0x0A,        //   Report ID (10)
8090x06, 0x00, 0xFF,  //   Usage Page (Vendor Defined 0xFF00)
8100x09, 0xC5,        //   Usage (0xC5)
8110x96, 0x00, 0x01,  //   Report Count (256)
8120xB1, 0x02,        //   Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
8130xC0,              // End Collection
8140x06, 0x11, 0xFF,  // Usage Page (Vendor Defined 0xFF11)
8150x09, 0x11,        // Usage (0x11)
8160xA1, 0x01,        // Collection (Application)
8170x85, 0x03,        //   Report ID (3)
8180xA1, 0x02,        //   Collection (Logical)
8190x09, 0x00,        //     Usage (0x00)
8200x75, 0x08,        //     Report Size (8)
8210x15, 0x00,        //     Logical Minimum (0)
8220x26, 0xFF, 0x00,  //     Logical Maximum (255)
8230x95, 0x36,        //     Report Count (54)
8240x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
8250xC0,              //   End Collection
8260x85, 0x02,        //   Report ID (2)
8270x09, 0x00,        //   Usage (0x00)
8280x95, 0x01,        //   Report Count (1)
8290xB1, 0x02,        //   Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
8300x85, 0x03,        //   Report ID (3)
8310x09, 0x00,        //   Usage (0x00)
8320x95, 0x3F,        //   Report Count (63)
8330xB1, 0x02,        //   Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
8340x85, 0x04,        //   Report ID (4)
8350x09, 0x00,        //   Usage (0x00)
8360x95, 0x0F,        //   Report Count (15)
8370xB1, 0x02,        //   Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
8380x85, 0x07,        //   Report ID (7)
8390x09, 0x00,        //   Usage (0x00)
8400x96, 0x00, 0x01,  //   Report Count (256)
8410xB1, 0x02,        //   Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
8420x85, 0x08,        //   Report ID (8)
8430x09, 0x00,        //   Usage (0x00)
8440x96, 0x87, 0x00,  //   Report Count (135)
8450xB1, 0x02,        //   Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
8460x85, 0x09,        //   Report ID (9)
8470x09, 0x00,        //   Usage (0x00)
8480x96, 0x3F, 0x00,  //   Report Count (63)
8490xB1, 0x02,        //   Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
8500x85, 0x0D,        //   Report ID (13)
8510x09, 0x00,        //   Usage (0x00)
8520x95, 0x07,        //   Report Count (7)
8530xB1, 0x02,        //   Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
8540xC0,              // End Collection
8550x05, 0x0D,        // Usage Page (Digitizer)
8560x09, 0x0E,        // Usage (0x0E)
8570xA1, 0x01,        // Collection (Application)
8580x85, 0x0E,        //   Report ID (14)
8590x09, 0x23,        //   Usage (0x23)
8600xA1, 0x02,        //   Collection (Logical)
8610x09, 0x52,        //     Usage (0x52)
8620x09, 0x53,        //     Usage (0x53)
8630x15, 0x00,        //     Logical Minimum (0)
8640x25, 0x0A,        //     Logical Maximum (10)
8650x75, 0x08,        //     Report Size (8)
8660x95, 0x02,        //     Report Count (2)
8670xB1, 0x02,        //     Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
8680xC0,              //   End Collection
8690xC0,              // End Collection
8700x05, 0x0D,        // Usage Page (Digitizer)
8710x09, 0x02,        // Usage (Pen)
8720xA1, 0x01,        // Collection (Application)
8730x85, 0x06,        //   Report ID (6)
8740xA4,              //   Push
8750x09, 0x20,        //     Usage (Stylus)
8760xA1, 0x00,        //     Collection (Physical)
8770x09, 0x42,        //       Usage (Tip Switch)
8780x09, 0x44,        //       Usage (Barrel Switch)
8790x09, 0x45,        //       Usage (Eraser)
8800x09, 0x3C,        //       Usage (Invert)
8810x09, 0x5A,        //       Usage (0x5A)
8820x09, 0x32,        //       Usage (In Range)
8830x15, 0x00,        //       Logical Minimum (0)
8840x25, 0x01,        //       Logical Maximum (1)
8850x75, 0x01,        //       Report Size (1)
8860x95, 0x06,        //       Report Count (6)
8870x81, 0x02,        //       Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
8880x95, 0x02,        //       Report Count (2)
8890x81, 0x03,        //       Input (Const,Var,Abs,No Wap,Linear,Preferred State,No Null Position)
8900x05, 0x01,        //       Usage Page (Generic Desktop Ctrls)
8910x09, 0x30,        //       Usage (X)
8920x27, 0x40, 0x65, 0x00, 0x00,  //       Logical Maximum (25919)
8930x47, 0x40, 0x65, 0x00, 0x00,  //       Physical Maximum (25919)
8940x65, 0x11,        //       Unit (System: SI Linear, Length: Centimeter)
8950x55, 0x0D,        //       Unit Exponent (-3)
8960x75, 0x10,        //       Report Size (16)
8970x95, 0x01,        //       Report Count (1)
8980x81, 0x02,        //       Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
8990x09, 0x31,        //       Usage (Y)
9000x27, 0x80, 0x43, 0x00, 0x00,  //       Logical Maximum (17279)
9010x47, 0x80, 0x43, 0x00, 0x00,  //       Physical Maximum (17279)
9020x81, 0x02,        //       Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
9030x45, 0x00,        //       Physical Maximum (0)
9040x65, 0x00,        //       Unit (None)
9050x55, 0x00,        //       Unit Exponent (0)
9060x05, 0x0D,        //       Usage Page (Digitizer)
9070x09, 0x30,        //       Usage (Tip Pressure)
9080x26, 0xFF, 0x07,  //       Logical Maximum (2047)
9090x75, 0x10,        //       Report Size (16)
9100x81, 0x02,        //       Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
9110x06, 0x00, 0xFF,  //       Usage Page (Vendor Defined 0xFF00)
9120x09, 0x5B,        //       Usage (0x5B)
9130x16, 0x00, 0x80,  //       Logical Minimum (-32768)
9140x26, 0xFF, 0x7F,  //       Logical Maximum (32767)
9150x75, 0x10,        //       Report Size (16)
9160x81, 0x02,        //       Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
9170x05, 0x0D,        //       Usage Page (Digitizer)
9180x09, 0x5B,        //       Usage (0x5B)
9190x17, 0x00, 0x00, 0x00, 0x80,  //       Logical Minimum (-2147483649)
9200x27, 0xFF, 0xFF, 0xFF, 0x7F,  //       Logical Maximum (2147483646)
9210x75, 0x20,        //       Report Size (32)
9220x81, 0x02,        //       Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
9230x06, 0x00, 0xFF,  //       Usage Page (Vendor Defined 0xFF00)
9240x09, 0x00,        //       Usage (0x00)
9250x75, 0x08,        //       Report Size (8)
9260x26, 0xFF, 0x00,  //       Logical Maximum (255)
9270x15, 0x00,        //       Logical Minimum (0)
9280x81, 0x02,        //       Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
9290x05, 0x0D,        //       Usage Page (Digitizer)
9300x09, 0x3B,        //       Usage (Battery Strength)
9310x81, 0x02,        //       Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
9320x65, 0x14,        //       Unit (System: English Rotation, Length: Centimeter)
9330x55, 0x00,        //       Unit Exponent (0)
9340x16, 0xA6, 0xFF,  //       Logical Minimum (-90)
9350x26, 0x5A, 0x00,  //       Logical Maximum (90)
9360x36, 0xA6, 0xFF,  //       Physical Minimum (-90)
9370x46, 0x5A, 0x00,  //       Physical Maximum (90)
9380x75, 0x08,        //       Report Size (8)
9390x09, 0x3D,        //       Usage (X Tilt)
9400x81, 0x02,        //       Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
9410x09, 0x3E,        //       Usage (Y Tilt)
9420x81, 0x02,        //       Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
9430x15, 0x00,        //       Logical Minimum (0)
9440x27, 0xFF, 0xFF, 0x00, 0x00,  //       Logical Maximum (65534)
9450x35, 0x00,        //       Physical Minimum (0)
9460x47, 0xFF, 0xFF, 0x00, 0x00,  //       Physical Maximum (65534)
9470x66, 0x01, 0x10,  //       Unit (System: SI Linear, Time: Seconds)
9480x55, 0x0C,        //       Unit Exponent (-4)
9490x75, 0x10,        //       Report Size (16)
9500x09, 0x56,        //       Usage (0x56)
9510x81, 0x02,        //       Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
9520xC0,              //     End Collection
9530xB4,              //   Pop
9540x85, 0x13,        //   Report ID (19)
9550x06, 0x00, 0xFF,  //   Usage Page (Vendor Defined 0xFF00)
9560x09, 0xC5,        //   Usage (0xC5)
9570x96, 0x00, 0x01,  //   Report Count (256)
9580xB1, 0x02,        //   Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
9590xC0,              // End Collection
9600x06, 0x11, 0xFF,  // Usage Page (Vendor Defined 0xFF11)
9610x09, 0x02,        // Usage (0x02)
9620xA1, 0x01,        // Collection (Application)
9630x85, 0x0B,        //   Report ID (11)
9640xA4,              //   Push
9650x09, 0x20,        //     Usage (0x20)
9660xA1, 0x00,        //     Collection (Physical)
9670x09, 0x42,        //       Usage (0x42)
9680x09, 0x44,        //       Usage (0x44)
9690x09, 0x45,        //       Usage (0x45)
9700x09, 0x3C,        //       Usage (0x3C)
9710x09, 0x5A,        //       Usage (0x5A)
9720x09, 0x32,        //       Usage (0x32)
9730x15, 0x00,        //       Logical Minimum (0)
9740x25, 0x01,        //       Logical Maximum (1)
9750x75, 0x01,        //       Report Size (1)
9760x95, 0x06,        //       Report Count (6)
9770x81, 0x02,        //       Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
9780x95, 0x02,        //       Report Count (2)
9790x81, 0x03,        //       Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
9800x05, 0x01,        //       Usage Page (Generic Desktop Ctrls)
9810x09, 0x30,        //       Usage (X)
9820x27, 0x40, 0x65, 0x00, 0x00,  //       Logical Maximum (25919)
9830x47, 0x40, 0x65, 0x00, 0x00,  //       Physical Maximum (25919)
9840x65, 0x11,        //       Unit (System: SI Linear, Length: Centimeter)
9850x55, 0x0D,        //       Unit Exponent (-3)
9860x75, 0x10,        //       Report Size (16)
9870x95, 0x01,        //       Report Count (1)
9880x81, 0x02,        //       Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
9890x09, 0x31,        //       Usage (Y)
9900x27, 0x80, 0x43, 0x00, 0x00,  //       Logical Maximum (17279)
9910x47, 0x80, 0x43, 0x00, 0x00,  //       Physical Maximum (17279)
9920x81, 0x02,        //       Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
9930x45, 0x00,        //       Physical Maximum (0)
9940x65, 0x00,        //       Unit (None)
9950x55, 0x00,        //       Unit Exponent (0)
9960x05, 0x0D,        //       Usage Page (Digitizer)
9970x09, 0x30,        //       Usage (Tip Pressure)
9980x26, 0xFF, 0x07,  //       Logical Maximum (2047)
9990x75, 0x10,        //       Report Size (16)
10000x81, 0x02,        //       Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
10010x06, 0x00, 0xFF,  //       Usage Page (Vendor Defined 0xFF00)
10020x09, 0x5B,        //       Usage (0x5B)
10030x16, 0x00, 0x80,  //       Logical Minimum (-32768)
10040x26, 0xFF, 0x7F,  //       Logical Maximum (32767)
10050x75, 0x10,        //       Report Size (16)
10060x81, 0x02,        //       Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
10070x05, 0x0D,        //       Usage Page (Digitizer)
10080x09, 0x5B,        //       Usage (0x5B)
10090x17, 0x00, 0x00, 0x00, 0x80,  //       Logical Minimum (-2147483649)
10100x27, 0xFF, 0xFF, 0xFF, 0x7F,  //       Logical Maximum (2147483646)
10110x75, 0x20,        //       Report Size (32)
10120x81, 0x02,        //       Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
10130x06, 0x00, 0xFF,  //       Usage Page (Vendor Defined 0xFF00)
10140x09, 0x00,        //       Usage (0x00)
10150x75, 0x08,        //       Report Size (8)
10160x26, 0xFF, 0x00,  //       Logical Maximum (255)
10170x15, 0x00,        //       Logical Minimum (0)
10180x81, 0x02,        //       Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
10190x05, 0x0D,        //       Usage Page (Digitizer)
10200x09, 0x3B,        //       Usage (Battery Strength)
10210x81, 0x02,        //       Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
10220x65, 0x14,        //       Unit (System: English Rotation, Length: Centimeter)
10230x55, 0x00,        //       Unit Exponent (0)
10240x16, 0xA6, 0xFF,  //       Logical Minimum (-90)
10250x26, 0x5A, 0x00,  //       Logical Maximum (90)
10260x36, 0xA6, 0xFF,  //       Physical Minimum (-90)
10270x46, 0x5A, 0x00,  //       Physical Maximum (90)
10280x75, 0x08,        //       Report Size (8)
10290x09, 0x3D,        //       Usage (X Tilt)
10300x81, 0x02,        //       Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
10310x09, 0x3E,        //       Usage (Y Tilt)
10320x81, 0x02,        //       Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
10330x15, 0x00,        //       Logical Minimum (0)
10340x27, 0xFF, 0xFF, 0x00, 0x00,  //       Logical Maximum (65534)
10350x35, 0x00,        //       Physical Minimum (0)
10360x47, 0xFF, 0xFF, 0x00, 0x00,  //       Physical Maximum (65534)
10370x66, 0x01, 0x10,  //       Unit (System: SI Linear, Time: Seconds)
10380x55, 0x0C,        //       Unit Exponent (-4)
10390x75, 0x10,        //       Report Size (16)
10400x09, 0x56,        //       Usage (0x56)
10410x81, 0x02,        //       Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
10420xC0,              //     End Collection
10430xB4,              //   Pop
10440x06, 0x00, 0xFF,  //   Usage Page (Vendor Defined 0xFF00)
10450x75, 0x08,        //   Report Size (8)
10460x15, 0x00,        //   Logical Minimum (0)
10470x26, 0xFF, 0x00,  //   Logical Maximum (255)
10480x85, 0x05,        //   Report ID (5)
10490x09, 0x00,        //   Usage (0x00)
10500x95, 0x3A,        //   Report Count (58)
10510x81, 0x02,        //   Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
10520x85, 0x10,        //   Report ID (16)
10530x09, 0x00,        //   Usage (0x00)
10540x95, 0x14,        //   Report Count (20)
10550x81, 0x02,        //   Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
10560x85, 0x0F,        //   Report ID (15)
10570x09, 0x00,        //   Usage (0x00)
10580x95, 0x27,        //   Report Count (39)
10590x81, 0x02,        //   Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
10600x85, 0x0F,        //   Report ID (15)
10610x09, 0x00,        //   Usage (0x00)
10620x95, 0x07,        //   Report Count (7)
10630xB1, 0x02,        //   Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
10640x85, 0x11,        //   Report ID (17)
10650x09, 0x00,        //   Usage (0x00)
10660x95, 0x09,        //   Report Count (9)
10670xB1, 0x02,        //   Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
10680x85, 0x05,        //   Report ID (5)
10690x09, 0x00,        //   Usage (0x00)
10700x95, 0x08,        //   Report Count (8)
10710xB1, 0x02,        //   Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
10720x85, 0x10,        //   Report ID (16)
10730x09, 0x00,        //   Usage (0x00)
10740x96, 0x3F, 0x00,  //   Report Count (63)
10750xB1, 0x02,        //   Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
10760x85, 0x0B,        //   Report ID (11)
10770x09, 0x00,        //   Usage (0x00)
10780x96, 0x3F, 0x00,  //   Report Count (63)
10790xB1, 0x02,        //   Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
10800xC0,              // End Collection
10810x05, 0x01,        // Usage Page (Generic Desktop Ctrls)
10820x09, 0x02,        // Usage (Mouse)
10830xA1, 0x01,        // Collection (Application)
10840x85, 0x01,        //   Report ID (1)
10850x09, 0x01,        //   Usage (Pointer)
10860xA1, 0x00,        //   Collection (Physical)
10870x05, 0x09,        //     Usage Page (Button)
10880x19, 0x01,        //     Usage Minimum (0x01)
10890x29, 0x02,        //     Usage Maximum (0x02)
10900x15, 0x00,        //     Logical Minimum (0)
10910x25, 0x01,        //     Logical Maximum (1)
10920x95, 0x02,        //     Report Count (2)
10930x75, 0x01,        //     Report Size (1)
10940x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
10950x95, 0x01,        //     Report Count (1)
10960x75, 0x06,        //     Report Size (6)
10970x81, 0x03,        //     Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
10980x05, 0x01,        //     Usage Page (Generic Desktop Ctrls)
10990x09, 0x30,        //     Usage (X)
11000x09, 0x31,        //    Usage (Y)
11010x26, 0xFF, 0x7F,  //     Logical Maximum (32767)
11020x75, 0x10,        //     Report Size (16)
11030x95, 0x02,        //     Report Count (2)
11040x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
11050xC0,              //   End Collection
11060xC0,              // End Collection
1107
1108// 1289 bytes
1109};
1110
1111bool is_paradise_touch_v2_report_desc(const uint8_t* data, size_t len) {
1112    if (!data)
1113        return false;
1114
1115    if (len != sizeof(paradise_touch_v2_report_desc)) {
1116        return false;
1117    }
1118
1119    return (memcmp(data, paradise_touch_v2_report_desc, len) == 0);
1120}
1121
1122static const uint8_t paradise_touch_v3_report_desc[] = {
11230x05, 0x0D,        // Usage Page (Digitizer)
11240x09, 0x04,        // Usage (Touch Screen)
11250xA1, 0x01,        // Collection (Application)
11260x85, 0x0C,        //   Report ID (12)
11270x95, 0x01,        //   Report Count (1)
11280x75, 0x08,        //   Report Size (8)
11290x26, 0xFF, 0x00,  //   Logical Maximum (255)
11300x15, 0x00,        //   Logical Minimum (0)
11310x81, 0x03,        //   Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
11320x09, 0x54,        //   Usage (0x54)
11330x81, 0x02,        //   Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
11340x05, 0x0D,        //   Usage Page (Digitizer)
11350x09, 0x22,        //   Usage (Finger)
11360xA1, 0x02,        //   Collection (Logical)
11370x09, 0x42,        //     Usage (Tip Switch)
11380x15, 0x00,        //     Logical Minimum (0)
11390x25, 0x01,        //     Logical Maximum (1)
11400x75, 0x01,        //     Report Size (1)
11410x95, 0x01,        //     Report Count (1)
11420x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
11430x81, 0x03,        //     Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
11440x09, 0x47,        //     Usage (0x47)
11450x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
11460x95, 0x05,        //     Report Count (5)
11470x81, 0x03,        //     Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
11480x75, 0x10,        //     Report Size (16)
11490x09, 0x51,        //     Usage (0x51)
11500x95, 0x01,        //     Report Count (1)
11510x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
11520x05, 0x01,        //     Usage Page (Generic Desktop Ctrls)
11530x75, 0x10,        //     Report Size (16)
11540x95, 0x01,        //     Report Count (1)
11550x55, 0x0E,        //     Unit Exponent (-2)
11560x65, 0x11,        //     Unit (System: SI Linear, Length: Centimeter)
11570x09, 0x30,        //     Usage (X)
11580x26, 0x84, 0x28,  //     Logical Maximum (10372)
11590x35, 0x00,        //     Physical Minimum (0)
11600x46, 0x21, 0x0A,  //     Physical Maximum (2593)
11610x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
11620x46, 0xC1, 0x06,  //     Physical Maximum (1729)
11630x09, 0x31,        //     Usage (Y)
11640x26, 0x04, 0x1B,  //     Logical Maximum (6916)
11650x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
11660xC0,              //   End Collection
11670x05, 0x0D,        //   Usage Page (Digitizer)
11680x09, 0x22,        //   Usage (Finger)
11690xA1, 0x02,        //   Collection (Logical)
11700x09, 0x42,        //     Usage (Tip Switch)
11710x15, 0x00,        //     Logical Minimum (0)
11720x25, 0x01,        //     Logical Maximum (1)
11730x75, 0x01,        //     Report Size (1)
11740x95, 0x01,        //     Report Count (1)
11750x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
11760x81, 0x03,        //     Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
11770x09, 0x47,        //     Usage (0x47)
11780x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
11790x95, 0x05,        //     Report Count (5)
11800x81, 0x03,        //     Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
11810x75, 0x10,        //     Report Size (16)
11820x09, 0x51,        //     Usage (0x51)
11830x95, 0x01,        //     Report Count (1)
11840x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
11850x05, 0x01,        //     Usage Page (Generic Desktop Ctrls)
11860x75, 0x10,        //     Report Size (16)
11870x95, 0x01,        //     Report Count (1)
11880x55, 0x0E,        //     Unit Exponent (-2)
11890x65, 0x11,        //     Unit (System: SI Linear, Length: Centimeter)
11900x09, 0x30,        //     Usage (X)
11910x26, 0x84, 0x28,  //     Logical Maximum (10372)
11920x35, 0x00,        //     Physical Minimum (0)
11930x46, 0x21, 0x0A,  //     Physical Maximum (2593)
11940x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
11950x46, 0xC1, 0x06,  //     Physical Maximum (1729)
11960x09, 0x31,        //     Usage (Y)
11970x26, 0x04, 0x1B,  //     Logical Maximum (6916)
11980x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
11990xC0,              //   End Collection
12000x05, 0x0D,        //   Usage Page (Digitizer)
12010x09, 0x22,        //   Usage (Finger)
12020xA1, 0x02,        //   Collection (Logical)
12030x09, 0x42,        //     Usage (Tip Switch)
12040x15, 0x00,        //     Logical Minimum (0)
12050x25, 0x01,        //     Logical Maximum (1)
12060x75, 0x01,        //     Report Size (1)
12070x95, 0x01,        //     Report Count (1)
12080x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
12090x81, 0x03,        //     Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
12100x09, 0x47,        //     Usage (0x47)
12110x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
12120x95, 0x05,        //     Report Count (5)
12130x81, 0x03,        //     Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
12140x75, 0x10,        //     Report Size (16)
12150x09, 0x51,        //     Usage (0x51)
12160x95, 0x01,        //     Report Count (1)
12170x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
12180x05, 0x01,        //     Usage Page (Generic Desktop Ctrls)
12190x75, 0x10,        //     Report Size (16)
12200x95, 0x01,        //     Report Count (1)
12210x55, 0x0E,        //     Unit Exponent (-2)
12220x65, 0x11,        //     Unit (System: SI Linear, Length: Centimeter)
12230x09, 0x30,        //     Usage (X)
12240x26, 0x84, 0x28,  //     Logical Maximum (10372)
12250x35, 0x00,        //     Physical Minimum (0)
12260x46, 0x21, 0x0A,  //     Physical Maximum (2593)
12270x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
12280x46, 0xC1, 0x06,  //     Physical Maximum (1729)
12290x09, 0x31,        //     Usage (Y)
12300x26, 0x04, 0x1B,  //     Logical Maximum (6916)
12310x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
12320xC0,              //   End Collection
12330x05, 0x0D,        //   Usage Page (Digitizer)
12340x09, 0x22,        //   Usage (Finger)
12350xA1, 0x02,        //   Collection (Logical)
12360x09, 0x42,        //     Usage (Tip Switch)
12370x15, 0x00,        //     Logical Minimum (0)
12380x25, 0x01,        //     Logical Maximum (1)
12390x75, 0x01,        //     Report Size (1)
12400x95, 0x01,        //     Report Count (1)
12410x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
12420x81, 0x03,        //     Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
12430x09, 0x47,        //     Usage (0x47)
12440x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
12450x95, 0x05,        //     Report Count (5)
12460x81, 0x03,        //     Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
12470x75, 0x10,        //     Report Size (16)
12480x09, 0x51,        //     Usage (0x51)
12490x95, 0x01,        //     Report Count (1)
12500x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
12510x05, 0x01,        //     Usage Page (Generic Desktop Ctrls)
12520x75, 0x10,        //     Report Size (16)
12530x95, 0x01,        //     Report Count (1)
12540x55, 0x0E,        //     Unit Exponent (-2)
12550x65, 0x11,        //     Unit (System: SI Linear, Length: Centimeter)
12560x09, 0x30,        //     Usage (X)
12570x26, 0x84, 0x28,  //     Logical Maximum (10372)
12580x35, 0x00,        //     Physical Minimum (0)
12590x46, 0x21, 0x0A,  //     Physical Maximum (2593)
12600x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
12610x46, 0xC1, 0x06,  //     Physical Maximum (1729)
12620x09, 0x31,        //     Usage (Y)
12630x26, 0x04, 0x1B,  //     Logical Maximum (6916)
12640x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
12650xC0,              //   End Collection
12660x05, 0x0D,        //   Usage Page (Digitizer)
12670x09, 0x22,        //   Usage (Finger)
12680xA1, 0x02,        //   Collection (Logical)
12690x09, 0x42,        //     Usage (Tip Switch)
12700x15, 0x00,        //     Logical Minimum (0)
12710x25, 0x01,        //     Logical Maximum (1)
12720x75, 0x01,        //     Report Size (1)
12730x95, 0x01,        //     Report Count (1)
12740x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
12750x81, 0x03,        //     Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
12760x09, 0x47,        //     Usage (0x47)
12770x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
12780x95, 0x05,        //     Report Count (5)
12790x81, 0x03,        //     Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
12800x75, 0x10,        //     Report Size (16)
12810x09, 0x51,        //     Usage (0x51)
12820x95, 0x01,        //     Report Count (1)
12830x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
12840x05, 0x01,        //     Usage Page (Generic Desktop Ctrls)
12850x75, 0x10,        //     Report Size (16)
12860x95, 0x01,        //     Report Count (1)
12870x55, 0x0E,        //     Unit Exponent (-2)
12880x65, 0x11,        //     Unit (System: SI Linear, Length: Centimeter)
12890x09, 0x30,        //     Usage (X)
12900x26, 0x84, 0x28,  //     Logical Maximum (10372)
12910x35, 0x00,        //     Physical Minimum (0)
12920x46, 0x21, 0x0A,  //     Physical Maximum (2593)
12930x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
12940x46, 0xC1, 0x06,  //     Physical Maximum (1729)
12950x09, 0x31,        //     Usage (Y)
12960x26, 0x04, 0x1B,  //     Logical Maximum (6916)
12970x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
12980xC0,              //   End Collection
12990x05, 0x0D,        //   Usage Page (Digitizer)
13000x27, 0xFF, 0xFF, 0x00, 0x00,  //   Logical Maximum (65534)
13010x75, 0x10,        //   Report Size (16)
13020x95, 0x01,        //   Report Count (1)
13030x09, 0x56,        //   Usage (0x56)
13040x81, 0x02,        //   Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
13050x85, 0x0C,        //   Report ID (12)
13060x09, 0x55,        //   Usage (0x55)
13070x75, 0x08,        //   Report Size (8)
13080x95, 0x01,        //   Report Count (1)
13090x26, 0xFF, 0x00,  //   Logical Maximum (255)
13100xB1, 0x02,        //   Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
13110x85, 0x0A,        //   Report ID (10)
13120x06, 0x00, 0xFF,  //   Usage Page (Vendor Defined 0xFF00)
13130x09, 0xC5,        //   Usage (0xC5)
13140x96, 0x00, 0x01,  //   Report Count (256)
13150xB1, 0x02,        //   Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
13160xC0,              // End Collection
13170x06, 0x11, 0xFF,  // Usage Page (Vendor Defined 0xFF11)
13180x09, 0x11,        // Usage (0x11)
13190xA1, 0x01,        // Collection (Application)
13200x85, 0x03,        //   Report ID (3)
13210xA1, 0x02,        //   Collection (Logical)
13220x09, 0x00,        //     Usage (0x00)
13230x75, 0x08,        //     Report Size (8)
13240x15, 0x00,        //     Logical Minimum (0)
13250x26, 0xFF, 0x00,  //     Logical Maximum (255)
13260x95, 0x27,        //     Report Count (39)
13270x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
13280xC0,              //   End Collection
13290x85, 0x02,        //   Report ID (2)
13300x09, 0x00,        //   Usage (0x00)
13310x95, 0x01,        //   Report Count (1)
13320xB1, 0x02,        //   Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
13330x85, 0x03,        //   Report ID (3)
13340x09, 0x00,        //   Usage (0x00)
13350x95, 0x3F,        //   Report Count (63)
13360xB1, 0x02,        //   Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
13370x85, 0x04,        //   Report ID (4)
13380x09, 0x00,        //   Usage (0x00)
13390x95, 0x0F,        //   Report Count (15)
13400xB1, 0x02,        //   Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
13410x85, 0x07,        //   Report ID (7)
13420x09, 0x00,        //   Usage (0x00)
13430x96, 0x00, 0x01,  //   Report Count (256)
13440xB1, 0x02,        //   Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
13450x85, 0x08,        //   Report ID (8)
13460x09, 0x00,        //   Usage (0x00)
13470x96, 0x87, 0x00,  //   Report Count (135)
13480xB1, 0x02,        //   Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
13490x85, 0x09,        //   Report ID (9)
13500x09, 0x00,        //   Usage (0x00)
13510x96, 0x3F, 0x00,  //   Report Count (63)
13520xB1, 0x02,        //   Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
13530x85, 0x0D,        //   Report ID (13)
13540x09, 0x00,        //   Usage (0x00)
13550x95, 0x07,        //   Report Count (7)
13560xB1, 0x02,        //   Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
13570xC0,              // End Collection
13580x05, 0x0D,        // Usage Page (Digitizer)
13590x09, 0x0E,        // Usage (0x0E)
13600xA1, 0x01,        // Collection (Application)
13610x85, 0x0E,        //   Report ID (14)
13620x09, 0x23,        //   Usage (0x23)
13630xA1, 0x02,        //   Collection (Logical)
13640x09, 0x52,        //     Usage (0x52)
13650x09, 0x53,        //     Usage (0x53)
13660x15, 0x00,        //     Logical Minimum (0)
13670x25, 0x0A,        //     Logical Maximum (10)
13680x75, 0x08,        //     Report Size (8)
13690x95, 0x02,        //     Report Count (2)
13700xB1, 0x02,        //     Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
13710xC0,              //   End Collection
13720xC0,              // End Collection
13730x05, 0x0D,        // Usage Page (Digitizer)
13740x09, 0x02,        // Usage (Pen)
13750xA1, 0x01,        // Collection (Application)
13760x85, 0x06,        //   Report ID (6)
13770xA4,              //   Push
13780x09, 0x20,        //     Usage (Stylus)
13790xA1, 0x00,        //     Collection (Physical)
13800x09, 0x42,        //       Usage (Tip Switch)
13810x09, 0x44,        //       Usage (Barrel Switch)
13820x09, 0x45,        //       Usage (Eraser)
13830x09, 0x3C,        //       Usage (Invert)
13840x09, 0x5A,        //       Usage (0x5A)
13850x09, 0x32,        //       Usage (In Range)
13860x15, 0x00,        //       Logical Minimum (0)
13870x25, 0x01,        //       Logical Maximum (1)
13880x75, 0x01,        //       Report Size (1)
13890x95, 0x06,        //       Report Count (6)
13900x81, 0x02,        //       Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
13910x95, 0x02,        //       Report Count (2)
13920x81, 0x03,        //       Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
13930x05, 0x01,        //       Usage Page (Generic Desktop Ctrls)
13940x09, 0x30,        //       Usage (X)
13950x27, 0x40, 0x65, 0x00, 0x00,  //       Logical Maximum (25919)
13960x47, 0x40, 0x65, 0x00, 0x00,  //       Physical Maximum (25919)
13970x65, 0x11,        //       Unit (System: SI Linear, Length: Centimeter)
13980x55, 0x0D,        //       Unit Exponent (-3)
13990x75, 0x10,        //       Report Size (16)
14000x95, 0x01,        //       Report Count (1)
14010x81, 0x02,        //       Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
14020x09, 0x31,        //       Usage (Y)
14030x27, 0x80, 0x43, 0x00, 0x00,  //       Logical Maximum (17279)
14040x47, 0x80, 0x43, 0x00, 0x00,  //       Physical Maximum (17279)
14050x81, 0x02,        //       Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
14060x45, 0x00,        //       Physical Maximum (0)
14070x65, 0x00,        //       Unit (None)
14080x55, 0x00,        //       Unit Exponent (0)
14090x05, 0x0D,        //       Usage Page (Digitizer)
14100x09, 0x30,        //       Usage (Tip Pressure)
14110x26, 0xFF, 0x07,  //       Logical Maximum (2047)
14120x75, 0x10,        //       Report Size (16)
14130x81, 0x02,        //       Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
14140x06, 0x00, 0xFF,  //       Usage Page (Vendor Defined 0xFF00)
14150x09, 0x5B,        //       Usage (0x5B)
14160x16, 0x00, 0x80,  //       Logical Minimum (-32768)
14170x26, 0xFF, 0x7F,  //       Logical Maximum (32767)
14180x75, 0x10,        //       Report Size (16)
14190x81, 0x02,        //       Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
14200x05, 0x0D,        //       Usage Page (Digitizer)
14210x09, 0x5B,        //       Usage (0x5B)
14220x17, 0x00, 0x00, 0x00, 0x80,  //       Logical Minimum (-2147483649)
14230x27, 0xFF, 0xFF, 0xFF, 0x7F,  //       Logical Maximum (2147483646)
14240x75, 0x20,        //       Report Size (32)
14250x81, 0x02,        //       Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
14260x06, 0x00, 0xFF,  //       Usage Page (Vendor Defined 0xFF00)
14270x09, 0x00,        //       Usage (0x00)
14280x75, 0x08,        //       Report Size (8)
14290x26, 0xFF, 0x00,  //       Logical Maximum (255)
14300x15, 0x00,        //       Logical Minimum (0)
14310x81, 0x02,        //       Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
14320x05, 0x0D,        //       Usage Page (Digitizer)
14330x09, 0x3B,        //       Usage (Battery Strength)
14340x81, 0x02,        //       Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
14350x65, 0x14,        //       Unit (System: English Rotation, Length: Centimeter)
14360x55, 0x00,        //       Unit Exponent (0)
14370x16, 0xA6, 0xFF,  //       Logical Minimum (-90)
14380x26, 0x5A, 0x00,  //       Logical Maximum (90)
14390x36, 0xA6, 0xFF,  //       Physical Minimum (-90)
14400x46, 0x5A, 0x00,  //       Physical Maximum (90)
14410x75, 0x08,        //       Report Size (8)
14420x09, 0x3D,        //       Usage (X Tilt)
14430x81, 0x02,        //       Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
14440x09, 0x3E,        //       Usage (Y Tilt)
14450x81, 0x02,        //       Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
14460xC0,              //     End Collection
14470xB4,              //   Pop
14480x85, 0x13,        //   Report ID (19)
14490x06, 0x00, 0xFF,  //   Usage Page (Vendor Defined 0xFF00)
14500x09, 0xC5,        //   Usage (0xC5)
14510x96, 0x00, 0x01,  //   Report Count (256)
14520xB1, 0x02,        //   Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
14530xC0,              // End Collection
14540x06, 0x11, 0xFF,  // Usage Page (Vendor Defined 0xFF11)
14550x09, 0x02,        // Usage (0x02)
14560xA1, 0x01,        // Collection (Application)
14570x85, 0x0B,        //   Report ID (11)
14580xA4,              //   Push
14590x09, 0x20,        //     Usage (0x20)
14600xA1, 0x00,        //     Collection (Physical)
14610x09, 0x42,        //       Usage (0x42)
14620x09, 0x44,        //       Usage (0x44)
14630x09, 0x45,        //       Usage (0x45)
14640x09, 0x3C,        //       Usage (0x3C)
14650x09, 0x5A,        //       Usage (0x5A)
14660x09, 0x32,        //       Usage (0x32)
14670x15, 0x00,        //       Logical Minimum (0)
14680x25, 0x01,        //       Logical Maximum (1)
14690x75, 0x01,        //       Report Size (1)
14700x95, 0x06,        //       Report Count (6)
14710x81, 0x02,        //       Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
14720x95, 0x02,        //       Report Count (2)
14730x81, 0x03,        //       Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
14740x05, 0x01,        //       Usage Page (Generic Desktop Ctrls)
14750x09, 0x30,        //       Usage (X)
14760x27, 0x40, 0x65, 0x00, 0x00,  //       Logical Maximum (25919)
14770x47, 0x40, 0x65, 0x00, 0x00,  //       Physical Maximum (25919)
14780x65, 0x11,        //       Unit (System: SI Linear, Length: Centimeter)
14790x55, 0x0D,        //       Unit Exponent (-3)
14800x75, 0x10,        //       Report Size (16)
14810x95, 0x01,        //       Report Count (1)
14820x81, 0x02,        //       Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
14830x09, 0x31,        //       Usage (Y)
14840x27, 0x80, 0x43, 0x00, 0x00,  //       Logical Maximum (17279)
14850x47, 0x80, 0x43, 0x00, 0x00,  //       Physical Maximum (17279)
14860x81, 0x02,        //       Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
14870x45, 0x00,        //       Physical Maximum (0)
14880x65, 0x00,        //       Unit (None)
14890x55, 0x00,        //       Unit Exponent (0)
14900x05, 0x0D,        //       Usage Page (Digitizer)
14910x09, 0x30,        //       Usage (Tip Pressure)
14920x26, 0xFF, 0x07,  //       Logical Maximum (2047)
14930x75, 0x10,        //       Report Size (16)
14940x81, 0x02,        //       Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
14950x06, 0x00, 0xFF,  //       Usage Page (Vendor Defined 0xFF00)
14960x09, 0x5B,        //       Usage (0x5B)
14970x16, 0x00, 0x80,  //       Logical Minimum (-32768)
14980x26, 0xFF, 0x7F,  //       Logical Maximum (32767)
14990x75, 0x10,        //       Report Size (16)
15000x81, 0x02,        //       Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
15010x05, 0x0D,        //       Usage Page (Digitizer)
15020x09, 0x5B,        //       Usage (0x5B)
15030x17, 0x00, 0x00, 0x00, 0x80,  //       Logical Minimum (-2147483649)
15040x27, 0xFF, 0xFF, 0xFF, 0x7F,  //       Logical Maximum (2147483646)
15050x75, 0x20,        //       Report Size (32)
15060x81, 0x02,        //       Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
15070x06, 0x00, 0xFF,  //       Usage Page (Vendor Defined 0xFF00)
15080x09, 0x00,        //       Usage (0x00)
15090x75, 0x08,        //       Report Size (8)
15100x26, 0xFF, 0x00,  //       Logical Maximum (255)
15110x15, 0x00,        //       Logical Minimum (0)
15120x81, 0x02,        //       Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
15130x05, 0x0D,        //       Usage Page (Digitizer)
15140x09, 0x3B,        //       Usage (Battery Strength)
15150x81, 0x02,        //       Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
15160x65, 0x14,        //       Unit (System: English Rotation, Length: Centimeter)
15170x55, 0x00,        //       Unit Exponent (0)
15180x16, 0xA6, 0xFF,  //       Logical Minimum (-90)
15190x26, 0x5A, 0x00,  //       Logical Maximum (90)
15200x36, 0xA6, 0xFF,  //       Physical Minimum (-90)
15210x46, 0x5A, 0x00,  //       Physical Maximum (90)
15220x75, 0x08,        //       Report Size (8)
15230x09, 0x3D,        //       Usage (X Tilt)
15240x81, 0x02,        //       Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
15250x09, 0x3E,        //       Usage (Y Tilt)
15260x81, 0x02,        //       Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
15270xC0,              //     End Collection
15280xB4,              //   Pop
15290x06, 0x00, 0xFF,  //   Usage Page (Vendor Defined 0xFF00)
15300x75, 0x08,        //   Report Size (8)
15310x15, 0x00,        //   Logical Minimum (0)
15320x26, 0xFF, 0x00,  //   Logical Maximum (255)
15330x85, 0x05,        //   Report ID (5)
15340x09, 0x00,        //   Usage (0x00)
15350x95, 0x3A,        //   Report Count (58)
15360x81, 0x02,        //   Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
15370x85, 0x10,        //   Report ID (16)
15380x09, 0x00,        //   Usage (0x00)
15390x95, 0x14,        //   Report Count (20)
15400x81, 0x02,        //   Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
15410x85, 0x0F,        //   Report ID (15)
15420x09, 0x00,        //   Usage (0x00)
15430x95, 0x27,        //   Report Count (39)
15440x81, 0x02,        //   Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
15450x85, 0x0F,        //   Report ID (15)
15460x09, 0x00,        //   Usage (0x00)
15470x95, 0x07,        //   Report Count (7)
15480xB1, 0x02,        //   Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
15490x85, 0x11,        //   Report ID (17)
15500x09, 0x00,        //   Usage (0x00)
15510x95, 0x09,        //   Report Count (9)
15520xB1, 0x02,        //   Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
15530x85, 0x05,        //   Report ID (5)
15540x09, 0x00,        //   Usage (0x00)
15550x95, 0x08,        //   Report Count (8)
15560xB1, 0x02,        //   Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
15570x85, 0x10,        //   Report ID (16)
15580x09, 0x00,        //   Usage (0x00)
15590x96, 0x3F, 0x00,  //   Report Count (63)
15600xB1, 0x02,        //   Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
15610x85, 0x0B,        //   Report ID (11)
15620x09, 0x00,        //   Usage (0x00)
15630x96, 0x3F, 0x00,  //   Report Count (63)
15640xB1, 0x02,        //   Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
15650xC0,              // End Collection
15660x05, 0x01,        // Usage Page (Generic Desktop Ctrls)
15670x09, 0x02,        // Usage (Mouse)
15680xA1, 0x01,        // Collection (Application)
15690x85, 0x01,        //   Report ID (1)
15700x09, 0x01,        //   Usage (Pointer)
15710xA1, 0x00,        //   Collection (Physical)
15720x05, 0x09,        //     Usage Page (Button)
15730x19, 0x01,        //     Usage Minimum (0x01)
15740x29, 0x02,        //     Usage Maximum (0x02)
15750x15, 0x00,        //     Logical Minimum (0)
15760x25, 0x01,        //     Logical Maximum (1)
15770x95, 0x02,        //     Report Count (2)
15780x75, 0x01,        //     Report Size (1)
15790x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
15800x95, 0x01,        //     Report Count (1)
15810x75, 0x06,        //     Report Size (6)
15820x81, 0x03,        //     Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
15830x05, 0x01,        //     Usage Page (Generic Desktop Ctrls)
15840x09, 0x30,        //     Usage (X)
15850x09, 0x31,        //     Usage (Y)
15860x26, 0xFF, 0x7F,  //     Logical Maximum (32767)
15870x75, 0x10,        //     Report Size (16)
15880x95, 0x02,        //     Report Count (2)
15890x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
15900xC0,              //   End Collection
15910xC0,              // End Collection
1592
1593// 1014 bytes
1594};
1595
1596bool is_paradise_touch_v3_report_desc(const uint8_t* data, size_t len) {
1597    if (!data)
1598        return false;
1599
1600    if (len != sizeof(paradise_touch_v3_report_desc)) {
1601        return false;
1602    }
1603
1604    return (memcmp(data, paradise_touch_v3_report_desc, len) == 0);
1605}
1606
1607zx_status_t setup_paradise_touch(int fd) {
1608    if (fd < 0)
1609        return ZX_ERR_INVALID_ARGS;
1610
1611    return ZX_OK;
1612}
1613
1614static const uint8_t paradise_touchpad_v1_report_desc[] = {
16150x05, 0x0D,        // Usage Page (Digitizer)
16160x09, 0x05,        // Usage (Touch Pad)
16170xA1, 0x01,        // Collection (Application)
16180x85, 0x01,        //   Report ID (1)
16190x05, 0x09,        //   Usage Page (Button)
16200x19, 0x01,        //   Usage Minimum (0x01)
16210x29, 0x01,        //   Usage Maximum (0x01)
16220x15, 0x00,        //   Logical Minimum (0)
16230x25, 0x01,        //   Logical Maximum (1)
16240x75, 0x01,        //   Report Size (1)
16250x95, 0x01,        //   Report Count (1)
16260x81, 0x02,        //   Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
16270x05, 0x0D,        //   Usage Page (Digitizer)
16280x09, 0x54,        //   Usage (0x54)
16290x75, 0x07,        //   Report Size (7)
16300x95, 0x01,        //   Report Count (1)
16310x81, 0x02,        //   Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
16320x09, 0x22,        //   Usage (Finger)
16330xA1, 0x02,        //   Collection (Logical)
16340x09, 0x42,        //     Usage (Tip Switch)
16350x15, 0x00,        //     Logical Minimum (0)
16360x25, 0x01,        //     Logical Maximum (1)
16370x75, 0x01,        //     Report Size (1)
16380x95, 0x01,        //     Report Count (1)
16390x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
16400x09, 0x32,        //     Usage (In Range)
16410x75, 0x07,        //     Report Size (7)
16420x95, 0x01,        //     Report Count (1)
16430x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
16440x09, 0x51,        //     Usage (0x51)
16450x26, 0xFF, 0x7F,  //     Logical Maximum (32767)
16460x75, 0x10,        //     Report Size (16)
16470x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
16480x05, 0x01,        //     Usage Page (Generic Desktop Ctrls)
16490x09, 0x30,        //     Usage (X)
16500x55, 0x0E,        //     Unit Exponent (-2)
16510x65, 0x11,        //     Unit (System: SI Linear, Length: Centimeter)
16520x35, 0x00,        //     Physical Minimum (0)
16530x46, 0x06, 0x04,  //     Physical Maximum (1030)
16540x26, 0x80, 0x33,  //     Logical Maximum (13184)
16550x75, 0x10,        //     Report Size (16)
16560x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
16570x09, 0x31,        //     Usage (Y)
16580x46, 0xA8, 0x02,  //     Physical Maximum (680)
16590x26, 0x00, 0x22,  //     Logical Maximum (8704)
16600x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
16610x05, 0x0D,        //     Usage Page (Digitizer)
16620x26, 0x80, 0x33,  //     Logical Maximum (13184)
16630x09, 0x48,        //     Usage (0x48)
16640x75, 0x10,        //     Report Size (16)
16650x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
16660x26, 0x00, 0x22,  //     Logical Maximum (8704)
16670x09, 0x49,        //     Usage (0x49)
16680x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
16690x09, 0x30,        //     Usage (Tip Pressure)
16700x26, 0xFF, 0x00,  //     Logical Maximum (255)
16710x75, 0x08,        //     Report Size (8)
16720x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
16730xC0,              //   End Collection
16740x09, 0x22,        //   Usage (Finger)
16750xA1, 0x02,        //   Collection (Logical)
16760x09, 0x42,        //     Usage (Tip Switch)
16770x15, 0x00,        //     Logical Minimum (0)
16780x25, 0x01,        //     Logical Maximum (1)
16790x75, 0x01,        //     Report Size (1)
16800x95, 0x01,        //     Report Count (1)
16810x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
16820x09, 0x32,        //     Usage (In Range)
16830x75, 0x07,        //     Report Size (7)
16840x95, 0x01,        //     Report Count (1)
16850x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
16860x09, 0x51,        //     Usage (0x51)
16870x26, 0xFF, 0x7F,  //     Logical Maximum (32767)
16880x75, 0x10,        //     Report Size (16)
16890x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
16900x05, 0x01,        //     Usage Page (Generic Desktop Ctrls)
16910x09, 0x30,        //     Usage (X)
16920x55, 0x0E,        //     Unit Exponent (-2)
16930x65, 0x11,        //     Unit (System: SI Linear, Length: Centimeter)
16940x35, 0x00,        //     Physical Minimum (0)
16950x46, 0x06, 0x04,  //     Physical Maximum (1030)
16960x26, 0x80, 0x33,  //     Logical Maximum (13184)
16970x75, 0x10,        //     Report Size (16)
16980x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
16990x09, 0x31,        //     Usage (Y)
17000x46, 0xA8, 0x02,  //     Physical Maximum (680)
17010x26, 0x00, 0x22,  //     Logical Maximum (8704)
17020x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
17030x05, 0x0D,        //     Usage Page (Digitizer)
17040x26, 0x80, 0x33,  //     Logical Maximum (13184)
17050x09, 0x48,        //     Usage (0x48)
17060x75, 0x10,        //     Report Size (16)
17070x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
17080x26, 0x00, 0x22,  //     Logical Maximum (8704)
17090x09, 0x49,        //     Usage (0x49)
17100x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
17110x09, 0x30,        //     Usage (Tip Pressure)
17120x26, 0xFF, 0x00,  //     Logical Maximum (255)
17130x75, 0x08,        //     Report Size (8)
17140x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
17150xC0,              //   End Collection
17160x09, 0x22,        //   Usage (Finger)
17170xA1, 0x02,        //   Collection (Logical)
17180x09, 0x42,        //     Usage (Tip Switch)
17190x15, 0x00,        //     Logical Minimum (0)
17200x25, 0x01,        //     Logical Maximum (1)
17210x75, 0x01,        //     Report Size (1)
17220x95, 0x01,        //     Report Count (1)
17230x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
17240x09, 0x32,        //     Usage (In Range)
17250x75, 0x07,        //     Report Size (7)
17260x95, 0x01,        //     Report Count (1)
17270x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
17280x09, 0x51,        //     Usage (0x51)
17290x26, 0xFF, 0x7F,  //     Logical Maximum (32767)
17300x75, 0x10,        //     Report Size (16)
17310x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
17320x05, 0x01,        //     Usage Page (Generic Desktop Ctrls)
17330x09, 0x30,        //     Usage (X)
17340x55, 0x0E,        //     Unit Exponent (-2)
17350x65, 0x11,        //     Unit (System: SI Linear, Length: Centimeter)
17360x35, 0x00,        //     Physical Minimum (0)
17370x46, 0x06, 0x04,  //     Physical Maximum (1030)
17380x26, 0x80, 0x33,  //     Logical Maximum (13184)
17390x75, 0x10,        //     Report Size (16)
17400x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
17410x09, 0x31,        //     Usage (Y)
17420x46, 0xA8, 0x02,  //     Physical Maximum (680)
17430x26, 0x00, 0x22,  //     Logical Maximum (8704)
17440x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
17450x05, 0x0D,        //     Usage Page (Digitizer)
17460x26, 0x80, 0x33,  //     Logical Maximum (13184)
17470x09, 0x48,        //     Usage (0x48)
17480x75, 0x10,        //     Report Size (16)
17490x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
17500x26, 0x00, 0x22,  //     Logical Maximum (8704)
17510x09, 0x49,        //     Usage (0x49)
17520x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
17530x09, 0x30,        //     Usage (Tip Pressure)
17540x26, 0xFF, 0x00,  //     Logical Maximum (255)
17550x75, 0x08,        //     Report Size (8)
17560x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
17570xC0,              //   End Collection
17580x09, 0x22,        //   Usage (Finger)
17590xA1, 0x02,        //   Collection (Logical)
17600x09, 0x42,        //     Usage (Tip Switch)
17610x15, 0x00,        //     Logical Minimum (0)
17620x25, 0x01,        //     Logical Maximum (1)
17630x75, 0x01,        //     Report Size (1)
17640x95, 0x01,        //     Report Count (1)
17650x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
17660x09, 0x32,        //     Usage (In Range)
17670x75, 0x07,        //     Report Size (7)
17680x95, 0x01,        //     Report Count (1)
17690x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
17700x09, 0x51,        //     Usage (0x51)
17710x26, 0xFF, 0x7F,  //     Logical Maximum (32767)
17720x75, 0x10,        //     Report Size (16)
17730x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
17740x05, 0x01,        //     Usage Page (Generic Desktop Ctrls)
17750x09, 0x30,        //     Usage (X)
17760x55, 0x0E,        //     Unit Exponent (-2)
17770x65, 0x11,        //     Unit (System: SI Linear, Length: Centimeter)
17780x35, 0x00,        //     Physical Minimum (0)
17790x46, 0x06, 0x04,  //     Physical Maximum (1030)
17800x26, 0x80, 0x33,  //     Logical Maximum (13184)
17810x75, 0x10,        //     Report Size (16)
17820x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
17830x09, 0x31,        //     Usage (Y)
17840x46, 0xA8, 0x02,  //     Physical Maximum (680)
17850x26, 0x00, 0x22,  //     Logical Maximum (8704)
17860x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
17870x05, 0x0D,        //     Usage Page (Digitizer)
17880x26, 0x80, 0x33,  //     Logical Maximum (13184)
17890x09, 0x48,        //     Usage (0x48)
17900x75, 0x10,        //     Report Size (16)
17910x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
17920x26, 0x00, 0x22,  //     Logical Maximum (8704)
17930x09, 0x49,        //     Usage (0x49)
17940x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
17950x09, 0x30,        //     Usage (Tip Pressure)
17960x26, 0xFF, 0x00,  //     Logical Maximum (255)
17970x75, 0x08,        //     Report Size (8)
17980x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
17990xC0,              //   End Collection
18000x09, 0x22,        //   Usage (Finger)
18010xA1, 0x02,        //   Collection (Logical)
18020x09, 0x42,        //     Usage (Tip Switch)
18030x15, 0x00,        //     Logical Minimum (0)
18040x25, 0x01,        //     Logical Maximum (1)
18050x75, 0x01,        //     Report Size (1)
18060x95, 0x01,        //     Report Count (1)
18070x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
18080x09, 0x32,        //     Usage (In Range)
18090x75, 0x07,        //     Report Size (7)
18100x95, 0x01,        //     Report Count (1)
18110x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
18120x09, 0x51,        //     Usage (0x51)
18130x26, 0xFF, 0x7F,  //     Logical Maximum (32767)
18140x75, 0x10,        //     Report Size (16)
18150x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
18160x05, 0x01,        //     Usage Page (Generic Desktop Ctrls)
18170x09, 0x30,        //     Usage (X)
18180x55, 0x0E,        //     Unit Exponent (-2)
18190x65, 0x11,        //     Unit (System: SI Linear, Length: Centimeter)
18200x35, 0x00,        //     Physical Minimum (0)
18210x46, 0x06, 0x04,  //     Physical Maximum (1030)
18220x26, 0x80, 0x33,  //     Logical Maximum (13184)
18230x75, 0x10,        //     Report Size (16)
18240x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
18250x09, 0x31,        //     Usage (Y)
18260x46, 0xA8, 0x02,  //     Physical Maximum (680)
18270x26, 0x00, 0x22,  //     Logical Maximum (8704)
18280x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
18290x05, 0x0D,        //     Usage Page (Digitizer)
18300x26, 0x80, 0x33,  //     Logical Maximum (13184)
18310x09, 0x48,        //     Usage (0x48)
18320x75, 0x10,        //     Report Size (16)
18330x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
18340x26, 0x00, 0x22,  //     Logical Maximum (8704)
18350x09, 0x49,        //     Usage (0x49)
18360x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
18370x09, 0x30,        //     Usage (Tip Pressure)
18380x26, 0xFF, 0x00,  //     Logical Maximum (255)
18390x75, 0x08,        //     Report Size (8)
18400x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
18410xC0,              //   End Collection
18420xC0,              // End Collection
1843
1844// 490 bytes
1845};
1846
1847// The same as paradise_touchpad_v1_report_desc except for the extra 16 bits
1848// of Azimuth for each finger. Since we don't use that field we can reuse
1849// the same report struct.
1850
1851static const uint8_t paradise_touchpad_v2_report_desc[] = {
18520x05, 0x0D,        // Usage Page (Digitizer)
18530x09, 0x05,        // Usage (Touch Pad)
18540xA1, 0x01,        // Collection (Application)
18550x85, 0x01,        //   Report ID (1)
18560x05, 0x09,        //   Usage Page (Button)
18570x19, 0x01,        //   Usage Minimum (0x01)
18580x29, 0x01,        //   Usage Maximum (0x01)
18590x15, 0x00,        //   Logical Minimum (0)
18600x25, 0x01,        //   Logical Maximum (1)
18610x75, 0x01,        //   Report Size (1)
18620x95, 0x01,        //   Report Count (1)
18630x81, 0x02,        //   Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
18640x05, 0x0D,        //   Usage Page (Digitizer)
18650x09, 0x54,        //   Usage (0x54)
18660x75, 0x07,        //   Report Size (7)
18670x95, 0x01,        //   Report Count (1)
18680x81, 0x02,        //   Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
18690x05, 0x0D,        //   Usage Page (Digitizer)
18700x09, 0x22,        //   Usage (Finger)
18710xA1, 0x02,        //   Collection (Logical)
18720x09, 0x42,        //     Usage (Tip Switch)
18730x15, 0x00,        //     Logical Minimum (0)
18740x25, 0x01,        //     Logical Maximum (1)
18750x75, 0x01,        //     Report Size (1)
18760x95, 0x01,        //     Report Count (1)
18770x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
18780x09, 0x32,        //     Usage (In Range)
18790x75, 0x07,        //     Report Size (7)
18800x95, 0x01,        //     Report Count (1)
18810x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
18820x09, 0x51,        //     Usage (0x51)
18830x26, 0xFF, 0x7F,  //     Logical Maximum (32767)
18840x75, 0x10,        //     Report Size (16)
18850x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
18860x05, 0x01,        //     Usage Page (Generic Desktop Ctrls)
18870x09, 0x30,        //     Usage (X)
18880x55, 0x0E,        //     Unit Exponent (-2)
18890x65, 0x11,        //     Unit (System: SI Linear, Length: Centimeter)
18900x35, 0x00,        //     Physical Minimum (0)
18910x46, 0x06, 0x04,  //     Physical Maximum (1030)
18920x26, 0x80, 0x33,  //     Logical Maximum (13184)
18930x75, 0x10,        //     Report Size (16)
18940x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
18950x09, 0x31,        //     Usage (Y)
18960x46, 0xA8, 0x02,  //     Physical Maximum (680)
18970x26, 0x00, 0x22,  //     Logical Maximum (8704)
18980x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
18990x05, 0x0D,        //     Usage Page (Digitizer)
19000x26, 0x80, 0x33,  //     Logical Maximum (13184)
19010x09, 0x48,        //     Usage (0x48)
19020x75, 0x10,        //     Report Size (16)
19030x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
19040x26, 0x00, 0x22,  //     Logical Maximum (8704)
19050x09, 0x49,        //     Usage (0x49)
19060x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
19070x09, 0x30,        //     Usage (Tip Pressure)
19080x26, 0xFF, 0x00,  //     Logical Maximum (255)
19090x75, 0x08,        //     Report Size (8)
19100x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
19110x09, 0x3F,        //     Usage (Azimuth)
19120x16, 0x00, 0x00,  //     Logical Minimum (0)
19130x26, 0x68, 0x01,  //     Logical Maximum (360)
19140x75, 0x10,        //     Report Size (16)
19150x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
19160xC0,              //   End Collection
19170x05, 0x0D,        //   Usage Page (Digitizer)
19180x09, 0x22,        //   Usage (Finger)
19190xA1, 0x02,        //   Collection (Logical)
19200x09, 0x42,        //     Usage (Tip Switch)
19210x15, 0x00,        //     Logical Minimum (0)
19220x25, 0x01,        //     Logical Maximum (1)
19230x75, 0x01,        //     Report Size (1)
19240x95, 0x01,        //     Report Count (1)
19250x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
19260x09, 0x32,        //     Usage (In Range)
19270x75, 0x07,        //     Report Size (7)
19280x95, 0x01,        //     Report Count (1)
19290x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
19300x09, 0x51,        //     Usage (0x51)
19310x26, 0xFF, 0x7F,  //     Logical Maximum (32767)
19320x75, 0x10,        //     Report Size (16)
19330x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
19340x05, 0x01,        //     Usage Page (Generic Desktop Ctrls)
19350x09, 0x30,        //     Usage (X)
19360x55, 0x0E,        //     Unit Exponent (-2)
19370x65, 0x11,        //     Unit (System: SI Linear, Length: Centimeter)
19380x35, 0x00,        //     Physical Minimum (0)
19390x46, 0x06, 0x04,  //     Physical Maximum (1030)
19400x26, 0x80, 0x33,  //     Logical Maximum (13184)
19410x75, 0x10,        //     Report Size (16)
19420x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
19430x09, 0x31,        //     Usage (Y)
19440x46, 0xA8, 0x02,  //     Physical Maximum (680)
19450x26, 0x00, 0x22,  //     Logical Maximum (8704)
19460x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
19470x05, 0x0D,        //     Usage Page (Digitizer)
19480x26, 0x80, 0x33,  //     Logical Maximum (13184)
19490x09, 0x48,        //     Usage (0x48)
19500x75, 0x10,        //     Report Size (16)
19510x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
19520x26, 0x00, 0x22,  //     Logical Maximum (8704)
19530x09, 0x49,        //     Usage (0x49)
19540x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
19550x09, 0x30,        //     Usage (Tip Pressure)
19560x26, 0xFF, 0x00,  //     Logical Maximum (255)
19570x75, 0x08,        //     Report Size (8)
19580x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
19590x09, 0x3F,        //     Usage (Azimuth)
19600x16, 0x00, 0x00,  //     Logical Minimum (0)
19610x26, 0x68, 0x01,  //     Logical Maximum (360)
19620x75, 0x10,        //     Report Size (16)
19630x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
19640xC0,              //   End Collection
19650x05, 0x0D,        //   Usage Page (Digitizer)
19660x09, 0x22,        //   Usage (Finger)
19670xA1, 0x02,        //   Collection (Logical)
19680x09, 0x42,        //     Usage (Tip Switch)
19690x15, 0x00,        //     Logical Minimum (0)
19700x25, 0x01,        //     Logical Maximum (1)
19710x75, 0x01,        //     Report Size (1)
19720x95, 0x01,        //     Report Count (1)
19730x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
19740x09, 0x32,        //     Usage (In Range)
19750x75, 0x07,        //     Report Size (7)
19760x95, 0x01,        //     Report Count (1)
19770x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
19780x09, 0x51,        //     Usage (0x51)
19790x26, 0xFF, 0x7F,  //     Logical Maximum (32767)
19800x75, 0x10,        //     Report Size (16)
19810x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
19820x05, 0x01,        //     Usage Page (Generic Desktop Ctrls)
19830x09, 0x30,        //     Usage (X)
19840x55, 0x0E,        //     Unit Exponent (-2)
19850x65, 0x11,        //     Unit (System: SI Linear, Length: Centimeter)
19860x35, 0x00,        //     Physical Minimum (0)
19870x46, 0x06, 0x04,  //     Physical Maximum (1030)
19880x26, 0x80, 0x33,  //     Logical Maximum (13184)
19890x75, 0x10,        //     Report Size (16)
19900x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
19910x09, 0x31,        //     Usage (Y)
19920x46, 0xA8, 0x02,  //     Physical Maximum (680)
19930x26, 0x00, 0x22,  //     Logical Maximum (8704)
19940x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
19950x05, 0x0D,        //     Usage Page (Digitizer)
19960x26, 0x80, 0x33,  //     Logical Maximum (13184)
19970x09, 0x48,        //     Usage (0x48)
19980x75, 0x10,        //     Report Size (16)
19990x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
20000x26, 0x00, 0x22,  //     Logical Maximum (8704)
20010x09, 0x49,        //     Usage (0x49)
20020x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
20030x09, 0x30,        //     Usage (Tip Pressure)
20040x26, 0xFF, 0x00,  //     Logical Maximum (255)
20050x75, 0x08,        //     Report Size (8)
20060x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
20070x09, 0x3F,        //     Usage (Azimuth)
20080x16, 0x00, 0x00,  //     Logical Minimum (0)
20090x26, 0x68, 0x01,  //     Logical Maximum (360)
20100x75, 0x10,        //     Report Size (16)
20110x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
20120xC0,              //   End Collection
20130x05, 0x0D,        //   Usage Page (Digitizer)
20140x09, 0x22,        //   Usage (Finger)
20150xA1, 0x02,        //   Collection (Logical)
20160x09, 0x42,        //     Usage (Tip Switch)
20170x15, 0x00,        //     Logical Minimum (0)
20180x25, 0x01,        //     Logical Maximum (1)
20190x75, 0x01,        //     Report Size (1)
20200x95, 0x01,        //     Report Count (1)
20210x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
20220x09, 0x32,        //     Usage (In Range)
20230x75, 0x07,        //     Report Size (7)
20240x95, 0x01,        //     Report Count (1)
20250x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
20260x09, 0x51,        //     Usage (0x51)
20270x26, 0xFF, 0x7F,  //     Logical Maximum (32767)
20280x75, 0x10,        //     Report Size (16)
20290x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
20300x05, 0x01,        //     Usage Page (Generic Desktop Ctrls)
20310x09, 0x30,        //     Usage (X)
20320x55, 0x0E,        //     Unit Exponent (-2)
20330x65, 0x11,        //     Unit (System: SI Linear, Length: Centimeter)
20340x35, 0x00,        //     Physical Minimum (0)
20350x46, 0x06, 0x04,  //     Physical Maximum (1030)
20360x26, 0x80, 0x33,  //     Logical Maximum (13184)
20370x75, 0x10,        //     Report Size (16)
20380x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
20390x09, 0x31,        //     Usage (Y)
20400x46, 0xA8, 0x02,  //     Physical Maximum (680)
20410x26, 0x00, 0x22,  //     Logical Maximum (8704)
20420x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
20430x05, 0x0D,        //     Usage Page (Digitizer)
20440x26, 0x80, 0x33,  //     Logical Maximum (13184)
20450x09, 0x48,        //     Usage (0x48)
20460x75, 0x10,        //     Report Size (16)
20470x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
20480x26, 0x00, 0x22,  //     Logical Maximum (8704)
20490x09, 0x49,        //     Usage (0x49)
20500x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
20510x09, 0x30,        //     Usage (Tip Pressure)
20520x26, 0xFF, 0x00,  //     Logical Maximum (255)
20530x75, 0x08,        //     Report Size (8)
20540x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
20550x09, 0x3F,        //     Usage (Azimuth)
20560x16, 0x00, 0x00,  //     Logical Minimum (0)
20570x26, 0x68, 0x01,  //     Logical Maximum (360)
20580x75, 0x10,        //     Report Size (16)
20590x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
20600xC0,              //   End Collection
20610x05, 0x0D,        //   Usage Page (Digitizer)
20620x09, 0x22,        //   Usage (Finger)
20630xA1, 0x02,        //   Collection (Logical)
20640x09, 0x42,        //     Usage (Tip Switch)
20650x15, 0x00,        //     Logical Minimum (0)
20660x25, 0x01,        //     Logical Maximum (1)
20670x75, 0x01,        //     Report Size (1)
20680x95, 0x01,        //     Report Count (1)
20690x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
20700x09, 0x32,        //     Usage (In Range)
20710x75, 0x07,        //     Report Size (7)
20720x95, 0x01,        //     Report Count (1)
20730x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
20740x09, 0x51,        //     Usage (0x51)
20750x26, 0xFF, 0x7F,  //     Logical Maximum (32767)
20760x75, 0x10,        //     Report Size (16)
20770x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
20780x05, 0x01,        //     Usage Page (Generic Desktop Ctrls)
20790x09, 0x30,        //     Usage (X)
20800x55, 0x0E,        //     Unit Exponent (-2)
20810x65, 0x11,        //     Unit (System: SI Linear, Length: Centimeter)
20820x35, 0x00,        //     Physical Minimum (0)
20830x46, 0x06, 0x04,  //     Physical Maximum (1030)
20840x26, 0x80, 0x33,  //     Logical Maximum (13184)
20850x75, 0x10,        //     Report Size (16)
20860x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
20870x09, 0x31,        //     Usage (Y)
20880x46, 0xA8, 0x02,  //     Physical Maximum (680)
20890x26, 0x00, 0x22,  //     Logical Maximum (8704)
20900x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
20910x05, 0x0D,        //     Usage Page (Digitizer)
20920x26, 0x80, 0x33,  //     Logical Maximum (13184)
20930x09, 0x48,        //     Usage (0x48)
20940x75, 0x10,        //     Report Size (16)
20950x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
20960x26, 0x00, 0x22,  //     Logical Maximum (8704)
20970x09, 0x49,        //     Usage (0x49)
20980x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
20990x09, 0x30,        //     Usage (Tip Pressure)
21000x26, 0xFF, 0x00,  //     Logical Maximum (255)
21010x75, 0x08,        //     Report Size (8)
21020x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
21030x09, 0x3F,        //     Usage (Azimuth)
21040x16, 0x00, 0x00,  //     Logical Minimum (0)
21050x26, 0x68, 0x01,  //     Logical Maximum (360)
21060x75, 0x10,        //     Report Size (16)
21070x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
21080xC0,              //   End Collection
21090xC0,              // End Collection
2110
2111// 560 bytes
2112};
2113
2114bool is_paradise_touchpad_report_desc(const uint8_t* data, size_t len) {
2115    return is_paradise_touchpad_v2_report_desc(data, len);
2116}
2117
2118bool is_paradise_touchpad_v1_report_desc(const uint8_t* data, size_t len) {
2119    static_assert(sizeof(paradise_touchpad_v1_t) == 62, "hid struct not packed");
2120
2121    if (!data)
2122        return false;
2123
2124    if (len != sizeof(paradise_touchpad_v1_report_desc))
2125        return false;
2126
2127    return (memcmp(data, paradise_touchpad_v1_report_desc, len) == 0);
2128}
2129
2130bool is_paradise_touchpad_v2_report_desc(const uint8_t* data, size_t len) {
2131    static_assert(sizeof(paradise_touchpad_v2_t) == 72, "hid struct not packed");
2132
2133    if (!data)
2134        return false;
2135
2136    if (len != sizeof(paradise_touchpad_v2_report_desc))
2137        return false;
2138
2139    return (memcmp(data, paradise_touchpad_v2_report_desc, len) == 0);
2140}
2141
2142zx_status_t setup_paradise_touchpad(int fd) {
2143    if (fd < 0)
2144        return ZX_ERR_INVALID_ARGS;
2145
2146    return ZX_OK;
2147}
2148
2149// Sensors
2150
2151static const uint8_t paradise_sensor_report_desc[] = {
2152    // Base Sensor Set
2153    0x05, 0x20,                   // HID Usage Page (Sensors)
2154    0x09, 0x01,                   // HID Usage (Sensor)
2155    0xa1, 0x01,                   // Collection (Application)
2156
2157    // Base Accelerometer
2158    0x85, 0x01,                   // Report ID (1)
2159    0x37, 0xfe, 0xff, 0xff, 0xff, // Physical Minimum (-2)
2160    0x47, 0x02, 0x00, 0x00, 0x00, // Physical Maximum (2)
2161    0x05, 0x20,                   // HID Usage Page (Sensors)
2162    0x09, 0x73,                   // HID Usage (Accelerometer 3D)
2163    0xa1, 0x00,                   // Collection (Physical)
2164    0x05, 0x20,                   // HID Usage Page (Sensors)
2165    0x16, 0x00, 0x80,             // Logical Minimum (-32768)
2166    0x26, 0xff, 0x7f,             // Logical Maximum (32767)
2167    0x75, 0x10,                   // Report Size (16)
2168    0x95, 0x01,                   // Report Count (1)
2169    0x0a, 0x53, 0x04,             // Usage (Acceleration Axis X)
2170    0x81, 0x03,                   // Const Var Abs
2171    0x0a, 0x54, 0x04,             // Usage (Acceleration Axis Y)
2172    0x81, 0x03,                   // Const Var Abs
2173    0x0a, 0x55, 0x04,             // Usage (Acceleration Axis Z)
2174    0x81, 0x03,                   // Const Var Abs
2175    0xc0,                         // End Collection
2176
2177    // Base Gyroscope
2178    0x85, 0x02,                   // Report ID (2)
2179    0x37, 0x18, 0xfc, 0xff, 0xff, // Physical Minimum (-1000)
2180    0x47, 0xe8, 0x03, 0x00, 0x00, // Physical Maximum (1000)
2181    0x05, 0x20,                   // HID Usage Page (Sensors)
2182    0x09, 0x76,                   // HID Usage (Gyrometer 3D)
2183    0xa1, 0x00,                   // Collection (Physical)
2184    0x05, 0x20,                   // HID Usage Page (Sensors)
2185    0x16, 0x00, 0x80,             // Logical Minimum (-32768)
2186    0x26, 0xff, 0x7f,             // Logical Maximum (32767)
2187    0x75, 0x10,                   // Report Size (16)
2188    0x95, 0x01,                   // Report Count (1)
2189    0x0a, 0x57, 0x04,             // Usage (Angular Velocity X)
2190    0x81, 0x03,                   // Const Var Abs
2191    0x0a, 0x58, 0x04,             // Usage (Angular Velocity Y)
2192    0x81, 0x03,                   // Const Var Abs
2193    0x0a, 0x59, 0x04,             // Usage (Angular Velocity Z)
2194    0x81, 0x03,                   // Const Var Abs
2195    0xc0,                         // End Collection
2196
2197    // Base Magnetometer
2198    0x85, 0x03,                   // Report ID (3)
2199    0x37, 0x00, 0x78, 0xec, 0xff, // Physical Minimum (-1280000)
2200    0x47, 0x00, 0x88, 0x13, 0x00, // Physical Maximum (1280000)
2201    0x05, 0x20,                   // HID Usage Page (Sensors)
2202    0x09, 0x83,                   // HID Usage (Compass 3D)
2203    0xa1, 0x00,                   // Collection (Physical)
2204    0x05, 0x20,                   // HID Usage Page (Sensors)
2205    0x16, 0x00, 0x80,             // Logical Minimum (-32768)
2206    0x26, 0xff, 0x7f,             // Logical Maximum (32767)
2207    0x55, 0x0d,                   // Unit Exponent (-3)
2208    0x75, 0x10,                   // Report Size (16)
2209    0x95, 0x01,                   // Report Count (1)
2210    0x0a, 0x85, 0x04,             // Usage (Magnetic Flux X)
2211    0x81, 0x03,                   // Const Var Abs
2212    0x0a, 0x86, 0x04,             // Usage (Magnetic Flux Y)
2213    0x81, 0x03,                   // Const Var Abs
2214    0x0a, 0x87, 0x04,             // Usage (Magnetic Flux Z)
2215    0x81, 0x03,                   // Const Var Abs
2216    0xc0,                         // End Collection
2217    0xc0,                         // End Collection
2218
2219    // Lid Sensor Set
2220    0x05, 0x20,                   // HID Usage Page (Sensors)
2221    0x09, 0x01,                   // HID Usage (Sensor)
2222    0xa1, 0x01,                   // Collection (Application)
2223
2224    // Lid Accelerometer
2225    0x85, 0x00,                   // Report ID (0)
2226    0x37, 0xfe, 0xff, 0xff, 0xff, // Physical Minimum (-2)
2227    0x47, 0x02, 0x00, 0x00, 0x00, // Physical Maximum (2)
2228    0x05, 0x20,                   // HID Usage Page (Sensors)
2229    0x09, 0x73,                   // HID Usage (Accelerometer 3D)
2230    0xa1, 0x00,                   // Collection (Physical)
2231    0x05, 0x20,                   // HID Usage Page (Sensors)
2232    0x16, 0x00, 0x80,             // Logical Minimum (-32768)
2233    0x26, 0xff, 0x7f,             // Logical Maximum (32767)
2234    0x75, 0x10,                   // Report Size (16)
2235    0x95, 0x01,                   // Report Count (1)
2236    0x0a, 0x53, 0x04,             // Usage (Acceleration Axis X)
2237    0x81, 0x03,                   // Const Var Abs
2238    0x0a, 0x54, 0x04,             // Usage (Acceleration Axis Y)
2239    0x81, 0x03,                   // Const Var Abs
2240    0x0a, 0x55, 0x04,             // Usage (Acceleration Axis Z)
2241    0x81, 0x03,                   // Const Var Abs
2242    0xc0,                         // End Collection
2243
2244    // Lid Lightmeter
2245    0x85, 0x04,                   // Report ID (4)
2246    0x37, 0x00, 0x00, 0x00, 0x00, // Physical Minimum (0)
2247    0x47, 0x70, 0x17, 0x00, 0x00, // Physical Maximum (6000)
2248    0x05, 0x20,                   // HID Usage Page (Sensors)
2249    0x09, 0x41,                   // HID Usage (Ambient Light)
2250    0xa1, 0x00,                   // Collection (Physical)
2251    0x05, 0x20,                   // HID Usage Page (Sensors)
2252    0x15, 0x00,                   // Logical Minimum (0)
2253    0x26, 0xff, 0x7f,             // Logical Maximum (32767)
2254    0x75, 0x10,                   // Report Size (16)
2255    0x95, 0x01,                   // Report Count (1)
2256    0x0a, 0xd1, 0x04,             // Usage (Illuminance)
2257    0x81, 0x03,                   // Const Var Abs
2258    0xc0,                         // End Collection
2259    0xc0,                         // End Collection
2260
2261    // 235 bytes
2262};
2263
2264bool is_paradise_sensor_report_desc(const uint8_t* data, size_t len) {
2265    if (!data)
2266        return false;
2267
2268    if (len != sizeof(paradise_sensor_report_desc))
2269        return false;
2270
2271    return (memcmp(data, paradise_sensor_report_desc, len) == 0);
2272}
2273
2274zx_status_t setup_paradise_sensor(int fd) {
2275    if (fd < 0)
2276        return ZX_ERR_INVALID_ARGS;
2277
2278    return ZX_OK;
2279}
2280