1// Copyright 2016 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 <hid/acer12.h>
6#include <zircon/device/input.h>
7#include <zircon/errors.h>
8#include <string.h>
9
10// Eyoyo 10 Inch IPS EDP 1920 x 1200 Touch Screen
11static const uint8_t eyoyo_touch_report_desc[] = {
12    0x05, 0x0D,        // Usage Page (Digitizer)
13    0x09, 0x04,        // Usage (Touch Screen)
14    0xA1, 0x01,        // Collection (Application)
15    0x85, 0x01,        //   Report ID (1)
16    0x09, 0x22,        //   Usage (Finger)
17    0xA1, 0x02,        //   Collection (Logical)
18    0x09, 0x42,        //     Usage (Tip Switch)
19    0x15, 0x00,        //     Logical Minimum (0)
20    0x25, 0x01,        //     Logical Maximum (1)
21    0x75, 0x01,        //     Report Size (1)
22    0x95, 0x01,        //     Report Count (1)
23    0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
24    0x95, 0x02,        //     Report Count (2)
25    0x81, 0x03,        //     Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
26    0x09, 0x51,        //     Usage (0x51)
27    0x25, 0x1F,        //     Logical Maximum (31)
28    0x75, 0x05,        //     Report Size (5)
29    0x95, 0x01,        //     Report Count (1)
30    0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
31    0x05, 0x01,        //     Usage Page (Generic Desktop Ctrls)
32    0x26, 0xFF, 0x7F,  //     Logical Maximum (32767)
33    0x75, 0x10,        //     Report Size (16)
34    0x55, 0x0E,        //     Unit Exponent (-2)
35    0x65, 0x11,        //     Unit (System: SI Linear, Length: Centimeter)
36    0x09, 0x30,        //     Usage (X)
37    0x35, 0x00,        //     Physical Minimum (0)
38    0x46, 0xD3, 0x0A,  //     Physical Maximum (2771)
39    0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
40    0x46, 0x19, 0x06,  //     Physical Maximum (1561)
41    0x09, 0x31,        //     Usage (Y)
42    0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
43    0x45, 0x00,        //     Physical Maximum (0)
44    0xC0,              //   End Collection
45    0x05, 0x0D,        //   Usage Page (Digitizer)
46    0x09, 0x22,        //   Usage (Finger)
47    0xA1, 0x02,        //   Collection (Logical)
48    0x09, 0x42,        //     Usage (Tip Switch)
49    0x15, 0x00,        //     Logical Minimum (0)
50    0x25, 0x01,        //     Logical Maximum (1)
51    0x75, 0x01,        //     Report Size (1)
52    0x95, 0x01,        //     Report Count (1)
53    0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
54    0x95, 0x02,        //     Report Count (2)
55    0x81, 0x03,        //     Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
56    0x09, 0x51,        //     Usage (0x51)
57    0x25, 0x1F,        //     Logical Maximum (31)
58    0x75, 0x05,        //     Report Size (5)
59    0x95, 0x01,        //     Report Count (1)
60    0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
61    0x05, 0x01,        //     Usage Page (Generic Desktop Ctrls)
62    0x26, 0xFF, 0x7F,  //     Logical Maximum (32767)
63    0x75, 0x10,        //     Report Size (16)
64    0x55, 0x0E,        //     Unit Exponent (-2)
65    0x65, 0x11,        //     Unit (System: SI Linear, Length: Centimeter)
66    0x09, 0x30,        //     Usage (X)
67    0x35, 0x00,        //     Physical Minimum (0)
68    0x46, 0xD3, 0x0A,  //     Physical Maximum (2771)
69    0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
70    0x46, 0x19, 0x06,  //     Physical Maximum (1561)
71    0x09, 0x31,        //     Usage (Y)
72    0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
73    0x45, 0x00,        //     Physical Maximum (0)
74    0xC0,              //   End Collection
75    0x05, 0x0D,        //   Usage Page (Digitizer)
76    0x09, 0x22,        //   Usage (Finger)
77    0xA1, 0x02,        //   Collection (Logical)
78    0x09, 0x42,        //     Usage (Tip Switch)
79    0x15, 0x00,        //     Logical Minimum (0)
80    0x25, 0x01,        //     Logical Maximum (1)
81    0x75, 0x01,        //     Report Size (1)
82    0x95, 0x01,        //     Report Count (1)
83    0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
84    0x95, 0x02,        //     Report Count (2)
85    0x81, 0x03,        //     Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
86    0x09, 0x51,        //     Usage (0x51)
87    0x25, 0x1F,        //     Logical Maximum (31)
88    0x75, 0x05,        //     Report Size (5)
89    0x95, 0x01,        //     Report Count (1)
90    0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
91    0x05, 0x01,        //     Usage Page (Generic Desktop Ctrls)
92    0x26, 0xFF, 0x7F,  //     Logical Maximum (32767)
93    0x75, 0x10,        //     Report Size (16)
94    0x55, 0x0E,        //     Unit Exponent (-2)
95    0x65, 0x11,        //     Unit (System: SI Linear, Length: Centimeter)
96    0x09, 0x30,        //     Usage (X)
97    0x35, 0x00,        //     Physical Minimum (0)
98    0x46, 0xD3, 0x0A,  //     Physical Maximum (2771)
99    0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
100    0x46, 0x19, 0x06,  //     Physical Maximum (1561)
101    0x09, 0x31,        //     Usage (Y)
102    0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
103    0x45, 0x00,        //     Physical Maximum (0)
104    0xC0,              //   End Collection
105    0x05, 0x0D,        //   Usage Page (Digitizer)
106    0x09, 0x22,        //   Usage (Finger)
107    0xA1, 0x02,        //   Collection (Logical)
108    0x09, 0x42,        //     Usage (Tip Switch)
109    0x15, 0x00,        //     Logical Minimum (0)
110    0x25, 0x01,        //     Logical Maximum (1)
111    0x75, 0x01,        //     Report Size (1)
112    0x95, 0x01,        //     Report Count (1)
113    0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
114    0x95, 0x02,        //     Report Count (2)
115    0x81, 0x03,        //     Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
116    0x09, 0x51,        //     Usage (0x51)
117    0x25, 0x1F,        //     Logical Maximum (31)
118    0x75, 0x05,        //     Report Size (5)
119    0x95, 0x01,        //     Report Count (1)
120    0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
121    0x05, 0x01,        //     Usage Page (Generic Desktop Ctrls)
122    0x26, 0xFF, 0x7F,  //     Logical Maximum (32767)
123    0x75, 0x10,        //     Report Size (16)
124    0x55, 0x0E,        //     Unit Exponent (-2)
125    0x65, 0x11,        //     Unit (System: SI Linear, Length: Centimeter)
126    0x09, 0x30,        //     Usage (X)
127    0x35, 0x00,        //     Physical Minimum (0)
128    0x46, 0xD3, 0x0A,  //     Physical Maximum (2771)
129    0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
130    0x46, 0x19, 0x06,  //     Physical Maximum (1561)
131    0x09, 0x31,        //     Usage (Y)
132    0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
133    0x45, 0x00,        //     Physical Maximum (0)
134    0xC0,              //   End Collection
135    0x05, 0x0D,        //   Usage Page (Digitizer)
136    0x09, 0x22,        //   Usage (Finger)
137    0xA1, 0x02,        //   Collection (Logical)
138    0x09, 0x42,        //     Usage (Tip Switch)
139    0x15, 0x00,        //     Logical Minimum (0)
140    0x25, 0x01,        //     Logical Maximum (1)
141    0x75, 0x01,        //     Report Size (1)
142    0x95, 0x01,        //     Report Count (1)
143    0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
144    0x95, 0x02,        //     Report Count (2)
145    0x81, 0x03,        //     Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
146    0x09, 0x51,        //     Usage (0x51)
147    0x25, 0x1F,        //     Logical Maximum (31)
148    0x75, 0x05,        //     Report Size (5)
149    0x95, 0x01,        //     Report Count (1)
150    0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
151    0x05, 0x01,        //     Usage Page (Generic Desktop Ctrls)
152    0x26, 0xFF, 0x7F,  //     Logical Maximum (32767)
153    0x75, 0x10,        //     Report Size (16)
154    0x55, 0x0E,        //     Unit Exponent (-2)
155    0x65, 0x11,        //     Unit (System: SI Linear, Length: Centimeter)
156    0x09, 0x30,        //     Usage (X)
157    0x35, 0x00,        //     Physical Minimum (0)
158    0x46, 0xD3, 0x0A,  //     Physical Maximum (2771)
159    0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
160    0x46, 0x19, 0x06,  //     Physical Maximum (1561)
161    0x09, 0x31,        //     Usage (Y)
162    0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
163    0x45, 0x00,        //     Physical Maximum (0)
164    0xC0,              //   End Collection
165    0x05, 0x0D,        //   Usage Page (Digitizer)
166    0x09, 0x22,        //   Usage (Finger)
167    0xA1, 0x02,        //   Collection (Logical)
168    0x09, 0x42,        //     Usage (Tip Switch)
169    0x15, 0x00,        //     Logical Minimum (0)
170    0x25, 0x01,        //     Logical Maximum (1)
171    0x75, 0x01,        //     Report Size (1)
172    0x95, 0x01,        //     Report Count (1)
173    0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
174    0x95, 0x02,        //     Report Count (2)
175    0x81, 0x03,        //     Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
176    0x09, 0x51,        //     Usage (0x51)
177    0x25, 0x1F,        //     Logical Maximum (31)
178    0x75, 0x05,        //     Report Size (5)
179    0x95, 0x01,        //     Report Count (1)
180    0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
181    0x05, 0x01,        //     Usage Page (Generic Desktop Ctrls)
182    0x26, 0xFF, 0x7F,  //     Logical Maximum (32767)
183    0x75, 0x10,        //     Report Size (16)
184    0x55, 0x0E,        //     Unit Exponent (-2)
185    0x65, 0x11,        //     Unit (System: SI Linear, Length: Centimeter)
186    0x09, 0x30,        //     Usage (X)
187    0x35, 0x00,        //     Physical Minimum (0)
188    0x46, 0xD3, 0x0A,  //     Physical Maximum (2771)
189    0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
190    0x46, 0x19, 0x06,  //     Physical Maximum (1561)
191    0x09, 0x31,        //     Usage (Y)
192    0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
193    0x45, 0x00,        //     Physical Maximum (0)
194    0xC0,              //   End Collection
195    0x05, 0x0D,        //   Usage Page (Digitizer)
196    0x09, 0x22,        //   Usage (Finger)
197    0xA1, 0x02,        //   Collection (Logical)
198    0x09, 0x42,        //     Usage (Tip Switch)
199    0x15, 0x00,        //     Logical Minimum (0)
200    0x25, 0x01,        //     Logical Maximum (1)
201    0x75, 0x01,        //     Report Size (1)
202    0x95, 0x01,        //     Report Count (1)
203    0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
204    0x95, 0x02,        //     Report Count (2)
205    0x81, 0x03,        //     Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
206    0x09, 0x51,        //     Usage (0x51)
207    0x25, 0x1F,        //     Logical Maximum (31)
208    0x75, 0x05,        //     Report Size (5)
209    0x95, 0x01,        //     Report Count (1)
210    0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
211    0x05, 0x01,        //     Usage Page (Generic Desktop Ctrls)
212    0x26, 0xFF, 0x7F,  //     Logical Maximum (32767)
213    0x75, 0x10,        //     Report Size (16)
214    0x55, 0x0E,        //     Unit Exponent (-2)
215    0x65, 0x11,        //     Unit (System: SI Linear, Length: Centimeter)
216    0x09, 0x30,        //     Usage (X)
217    0x35, 0x00,        //     Physical Minimum (0)
218    0x46, 0xD3, 0x0A,  //     Physical Maximum (2771)
219    0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
220    0x46, 0x19, 0x06,  //     Physical Maximum (1561)
221    0x09, 0x31,        //     Usage (Y)
222    0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
223    0x45, 0x00,        //     Physical Maximum (0)
224    0xC0,              //   End Collection
225    0x05, 0x0D,        //   Usage Page (Digitizer)
226    0x09, 0x22,        //   Usage (Finger)
227    0xA1, 0x02,        //   Collection (Logical)
228    0x09, 0x42,        //     Usage (Tip Switch)
229    0x15, 0x00,        //     Logical Minimum (0)
230    0x25, 0x01,        //     Logical Maximum (1)
231    0x75, 0x01,        //     Report Size (1)
232    0x95, 0x01,        //     Report Count (1)
233    0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
234    0x95, 0x02,        //     Report Count (2)
235    0x81, 0x03,        //     Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
236    0x09, 0x51,        //     Usage (0x51)
237    0x25, 0x1F,        //     Logical Maximum (31)
238    0x75, 0x05,        //     Report Size (5)
239    0x95, 0x01,        //     Report Count (1)
240    0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
241    0x05, 0x01,        //     Usage Page (Generic Desktop Ctrls)
242    0x26, 0xFF, 0x7F,  //     Logical Maximum (32767)
243    0x75, 0x10,        //     Report Size (16)
244    0x55, 0x0E,        //     Unit Exponent (-2)
245    0x65, 0x11,        //     Unit (System: SI Linear, Length: Centimeter)
246    0x09, 0x30,        //     Usage (X)
247    0x35, 0x00,        //     Physical Minimum (0)
248    0x46, 0xD3, 0x0A,  //     Physical Maximum (2771)
249    0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
250    0x46, 0x19, 0x06,  //     Physical Maximum (1561)
251    0x09, 0x31,        //     Usage (Y)
252    0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
253    0x45, 0x00,        //     Physical Maximum (0)
254    0xC0,              //   End Collection
255    0x05, 0x0D,        //   Usage Page (Digitizer)
256    0x09, 0x22,        //   Usage (Finger)
257    0xA1, 0x02,        //   Collection (Logical)
258    0x09, 0x42,        //     Usage (Tip Switch)
259    0x15, 0x00,        //     Logical Minimum (0)
260    0x25, 0x01,        //     Logical Maximum (1)
261    0x75, 0x01,        //     Report Size (1)
262    0x95, 0x01,        //     Report Count (1)
263    0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
264    0x95, 0x02,        //     Report Count (2)
265    0x81, 0x03,        //     Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
266    0x09, 0x51,        //     Usage (0x51)
267    0x25, 0x1F,        //     Logical Maximum (31)
268    0x75, 0x05,        //     Report Size (5)
269    0x95, 0x01,        //     Report Count (1)
270    0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
271    0x05, 0x01,        //     Usage Page (Generic Desktop Ctrls)
272    0x26, 0xFF, 0x7F,  //     Logical Maximum (32767)
273    0x75, 0x10,        //     Report Size (16)
274    0x55, 0x0E,        //     Unit Exponent (-2)
275    0x65, 0x11,        //     Unit (System: SI Linear, Length: Centimeter)
276    0x09, 0x30,        //     Usage (X)
277    0x35, 0x00,        //     Physical Minimum (0)
278    0x46, 0xD3, 0x0A,  //     Physical Maximum (2771)
279    0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
280    0x46, 0x19, 0x06,  //     Physical Maximum (1561)
281    0x09, 0x31,        //     Usage (Y)
282    0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
283    0x45, 0x00,        //     Physical Maximum (0)
284    0xC0,              //   End Collection
285    0x05, 0x0D,        //   Usage Page (Digitizer)
286    0x09, 0x22,        //   Usage (Finger)
287    0xA1, 0x02,        //   Collection (Logical)
288    0x09, 0x42,        //     Usage (Tip Switch)
289    0x15, 0x00,        //     Logical Minimum (0)
290    0x25, 0x01,        //     Logical Maximum (1)
291    0x75, 0x01,        //     Report Size (1)
292    0x95, 0x01,        //     Report Count (1)
293    0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
294    0x95, 0x02,        //     Report Count (2)
295    0x81, 0x03,        //     Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
296    0x09, 0x51,        //     Usage (0x51)
297    0x25, 0x1F,        //     Logical Maximum (31)
298    0x75, 0x05,        //     Report Size (5)
299    0x95, 0x01,        //     Report Count (1)
300    0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
301    0x05, 0x01,        //     Usage Page (Generic Desktop Ctrls)
302    0x26, 0xFF, 0x7F,  //     Logical Maximum (32767)
303    0x75, 0x10,        //     Report Size (16)
304    0x55, 0x0E,        //     Unit Exponent (-2)
305    0x65, 0x11,        //     Unit (System: SI Linear, Length: Centimeter)
306    0x09, 0x30,        //     Usage (X)
307    0x35, 0x00,        //     Physical Minimum (0)
308    0x46, 0xD3, 0x0A,  //     Physical Maximum (2771)
309    0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
310    0x46, 0x19, 0x06,  //     Physical Maximum (1561)
311    0x09, 0x31,        //     Usage (Y)
312    0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
313    0x45, 0x00,        //     Physical Maximum (0)
314    0xC0,              //   End Collection
315    0x05, 0x0D,        //   Usage Page (Digitizer)
316    0x15, 0x00,        //   Logical Minimum (0)
317    0x27, 0xFF, 0xFF, 0x00, 0x00,  //   Logical Maximum (65534)
318    0x75, 0x10,        //   Report Size (16)
319    0x95, 0x01,        //   Report Count (1)
320    0x09, 0x56,        //   Usage (0x56)
321    0x81, 0x02,        //   Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
322    0x25, 0x0A,        //   Logical Maximum (10)
323    0x75, 0x08,        //   Report Size (8)
324    0x09, 0x54,        //   Usage (0x54)
325    0x81, 0x02,        //   Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
326    0x85, 0x42,        //   Report ID (66)
327    0x09, 0x55,        //   Usage (0x55)
328    0x25, 0x0A,        //   Logical Maximum (10)
329    0xB1, 0x02,        //   Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
330    0x85, 0x44,        //   Report ID (68)
331    0x06, 0x00, 0xFF,  //   Usage Page (Vendor Defined 0xFF00)
332    0x09, 0xC5,        //   Usage (0xC5)
333    0x26, 0xFF, 0x00,  //   Logical Maximum (255)
334    0x96, 0x00, 0x01,  //   Report Count (256)
335    0xB1, 0x02,        //   Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
336    0x85, 0xF2,        //   Report ID (-14)
337    0x09, 0x03,        //   Usage (0x03)
338    0x75, 0x08,        //   Report Size (8)
339    0x95, 0x04,        //   Report Count (4)
340    0xB1, 0x02,        //   Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
341    0x09, 0x04,        //   Usage (0x04)
342    0xB1, 0x02,        //   Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
343    0x09, 0x05,        //   Usage (0x05)
344    0xB1, 0x02,        //   Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
345    0x95, 0x01,        //   Report Count (1)
346    0x09, 0x06,        //   Usage (0x06)
347    0xB1, 0x02,        //   Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
348    0x09, 0x07,        //   Usage (0x07)
349    0xB1, 0x02,        //   Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
350    0x85, 0x06,        //   Report ID (6)
351    0x09, 0x01,        //   Usage (0x01)
352    0x95, 0x07,        //   Report Count (7)
353    0xB1, 0x02,        //   Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
354    0x85, 0x08,        //   Report ID (8)
355    0x09, 0x01,        //   Usage (0x01)
356    0x95, 0x3F,        //   Report Count (63)
357    0xB1, 0x02,        //   Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
358    0x85, 0x07,        //   Report ID (7)
359    0x09, 0x01,        //   Usage (0x01)
360    0x95, 0x3F,        //   Report Count (63)
361    0xB1, 0x02,        //   Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
362    0x85, 0xF4,        //   Report ID (-12)
363    0x09, 0x01,        //   Usage (0x01)
364    0x95, 0x2F,        //   Report Count (47)
365    0xB1, 0x02,        //   Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
366    0xC0,              // End Collection
367    0x05, 0x0D,        // Usage Page (Digitizer)
368    0x09, 0x0E,        // Usage (0x0E)
369    0xA1, 0x01,        // Collection (Application)
370    0x85, 0x43,        //   Report ID (67)
371    0x09, 0x23,        //   Usage (0x23)
372    0xA1, 0x02,        //   Collection (Logical)
373    0x09, 0x52,        //     Usage (0x52)
374    0x09, 0x53,        //     Usage (0x53)
375    0x15, 0x00,        //     Logical Minimum (0)
376    0x25, 0x0A,        //     Logical Maximum (10)
377    0x75, 0x08,        //     Report Size (8)
378    0x95, 0x02,        //     Report Count (2)
379    0xB1, 0x02,        //     Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
380    0xC0,              //   End Collection
381    0xC0,              // End Collection
382    0x05, 0x01,        // Usage Page (Generic Desktop Ctrls)
383    0x09, 0x02,        // Usage (Mouse)
384    0xA1, 0x01,        // Collection (Application)
385    0x85, 0x03,        //   Report ID (3)
386    0x09, 0x01,        //   Usage (Pointer)
387    0xA1, 0x00,        //   Collection (Physical)
388    0x05, 0x09,        //     Usage Page (Button)
389    0x19, 0x01,        //     Usage Minimum (0x01)
390    0x29, 0x02,        //     Usage Maximum (0x02)
391    0x15, 0x00,        //     Logical Minimum (0)
392    0x25, 0x01,        //     Logical Maximum (1)
393    0x75, 0x01,        //     Report Size (1)
394    0x95, 0x02,        //     Report Count (2)
395    0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
396    0x95, 0x06,        //     Report Count (6)
397    0x81, 0x03,        //     Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
398    0x05, 0x01,        //     Usage Page (Generic Desktop Ctrls)
399    0x09, 0x30,        //     Usage (X)
400    0x09, 0x31,        //     Usage (Y)
401    0x75, 0x10,        //     Report Size (16)
402    0x95, 0x02,        //     Report Count (2)
403    0x15, 0x00,        //     Logical Minimum (0)
404    0x26, 0xFF, 0x7F,  //     Logical Maximum (32767)
405    0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
406    0xC0,              //   End Collection
407    0xC0,              // End Collection
408
409    // 814 bytes
410};
411
412bool is_eyoyo_touch_report_desc(const uint8_t* data, size_t len) {
413    if (!data)
414        return false;
415
416    if (len != sizeof(eyoyo_touch_report_desc))
417        return false;
418
419    return (memcmp(data, eyoyo_touch_report_desc, len) == 0);
420}
421
422zx_status_t setup_eyoyo_touch(int fd) {
423    if (fd < 0)
424        return ZX_ERR_INVALID_ARGS;
425
426    uint8_t buf[sizeof(input_set_report_t) + 3];
427    input_set_report_t* enable_multitouch = (input_set_report_t*)buf;
428
429    enable_multitouch->id      = 67;
430    enable_multitouch->type    = INPUT_REPORT_FEATURE;
431    enable_multitouch->data[0] = 67;
432    enable_multitouch->data[1] = 2;
433    enable_multitouch->data[2] = 0;
434
435    ssize_t res = ioctl_input_set_report(fd, enable_multitouch, sizeof(buf));
436    return (res >= 0) ? ZX_OK : (zx_status_t)res;
437}
438