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/errors.h>
7#include <string.h>
8
9static const uint8_t acer12_touch_report_desc[] = {
10    0x05, 0x0D,        // Usage Page (Digitizer)
11    0x09, 0x04,        // Usage (Touch Screen)
12    0xA1, 0x01,        // Collection (Application)
13    0x85, 0x01,        //   Report ID (1)
14    0x09, 0x22,        //   Usage (Finger)
15    0xA1, 0x02,        //   Collection (Logical)
16    0x09, 0x42,        //     Usage (Tip Switch)
17    0x15, 0x00,        //     Logical Minimum (0)
18    0x25, 0x01,        //     Logical Maximum (1)
19    0x75, 0x01,        //     Report Size (1)
20    0x95, 0x01,        //     Report Count (1)
21    0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
22    0x75, 0x01,        //     Report Size (1)
23    0x81, 0x03,        //     Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
24    0x75, 0x06,        //     Report Size (6)
25    0x09, 0x51,        //     Usage (0x51)
26    0x25, 0x3F,        //     Logical Maximum (63)
27    0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
28    0x26, 0xFF, 0x00,  //     Logical Maximum (255)
29    0x75, 0x08,        //     Report Size (8)
30    0x09, 0x48,        //     Usage (0x48)
31    0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
32    0x09, 0x49,        //     Usage (0x49)
33    0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
34    0x95, 0x01,        //     Report Count (1)
35    0x05, 0x01,        //     Usage Page (Generic Desktop Ctrls)
36    0xA4,              //     Push
37    0x26, 0xD0, 0x0B,  //       Logical Maximum (3024)
38    0x75, 0x10,        //       Report Size (16)
39    0x55, 0x0F,        //       Unit Exponent (-1)
40    0x65, 0x11,        //       Unit (System: SI Linear, Length: Centimeter)
41    0x09, 0x30,        //       Usage (X)
42    0x35, 0x00,        //       Physical Minimum (0)
43    0x46, 0xFE, 0x00,  //       Physical Maximum (254)
44    0x95, 0x02,        //       Report Count (2)
45    0x81, 0x02,        //       Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
46    0x26, 0x10, 0x08,  //       Logical Maximum (2064)
47    0x46, 0xA9, 0x00,  //       Physical Maximum (169)
48    0x09, 0x31,        //       Usage (Y)
49    0x81, 0x02,        //       Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
50    0xB4,              //     Pop
51    0xC0,              //   End Collection
52    0x05, 0x0D,        //   Usage Page (Digitizer)
53    0x09, 0x22,        //   Usage (Finger)
54    0xA1, 0x02,        //   Collection (Logical)
55    0x05, 0x0D,        //     Usage Page (Digitizer)
56    0x09, 0x42,        //     Usage (Tip Switch)
57    0x15, 0x00,        //     Logical Minimum (0)
58    0x25, 0x01,        //     Logical Maximum (1)
59    0x75, 0x01,        //     Report Size (1)
60    0x95, 0x01,        //     Report Count (1)
61    0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
62    0x75, 0x01,        //     Report Size (1)
63    0x81, 0x03,        //     Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
64    0x75, 0x06,        //     Report Size (6)
65    0x09, 0x51,        //     Usage (0x51)
66    0x25, 0x3F,        //     Logical Maximum (63)
67    0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
68    0x26, 0xFF, 0x00,  //     Logical Maximum (255)
69    0x75, 0x08,        //     Report Size (8)
70    0x09, 0x48,        //     Usage (0x48)
71    0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
72    0x09, 0x49,        //     Usage (0x49)
73    0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
74    0x95, 0x01,        //     Report Count (1)
75    0x05, 0x01,        //     Usage Page (Generic Desktop Ctrls)
76    0xA4,              //     Push
77    0x26, 0xD0, 0x0B,  //       Logical Maximum (3024)
78    0x75, 0x10,        //       Report Size (16)
79    0x55, 0x0F,        //       Unit Exponent (-1)
80    0x65, 0x11,        //       Unit (System: SI Linear, Length: Centimeter)
81    0x09, 0x30,        //       Usage (X)
82    0x35, 0x00,        //       Physical Minimum (0)
83    0x46, 0xFE, 0x00,  //       Physical Maximum (254)
84    0x95, 0x02,        //       Report Count (2)
85    0x81, 0x02,        //       Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
86    0x26, 0x10, 0x08,  //       Logical Maximum (2064)
87    0x46, 0xA9, 0x00,  //       Physical Maximum (169)
88    0x09, 0x31,        //       Usage (Y)
89    0x81, 0x02,        //       Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
90    0xB4,              //     Pop
91    0xC0,              //   End Collection
92    0x05, 0x0D,        //   Usage Page (Digitizer)
93    0x09, 0x22,        //   Usage (Finger)
94    0xA1, 0x02,        //   Collection (Logical)
95    0x05, 0x0D,        //     Usage Page (Digitizer)
96    0x09, 0x42,        //     Usage (Tip Switch)
97    0x15, 0x00,        //     Logical Minimum (0)
98    0x25, 0x01,        //     Logical Maximum (1)
99    0x75, 0x01,        //     Report Size (1)
100    0x95, 0x01,        //     Report Count (1)
101    0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
102    0x75, 0x01,        //     Report Size (1)
103    0x81, 0x03,        //     Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
104    0x75, 0x06,        //     Report Size (6)
105    0x09, 0x51,        //     Usage (0x51)
106    0x25, 0x3F,        //     Logical Maximum (63)
107    0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
108    0x26, 0xFF, 0x00,  //     Logical Maximum (255)
109    0x75, 0x08,        //     Report Size (8)
110    0x09, 0x48,        //     Usage (0x48)
111    0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
112    0x09, 0x49,        //     Usage (0x49)
113    0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
114    0x95, 0x01,        //     Report Count (1)
115    0x05, 0x01,        //     Usage Page (Generic Desktop Ctrls)
116    0xA4,              //     Push
117    0x26, 0xD0, 0x0B,  //       Logical Maximum (3024)
118    0x75, 0x10,        //       Report Size (16)
119    0x55, 0x0F,        //       Unit Exponent (-1)
120    0x65, 0x11,        //       Unit (System: SI Linear, Length: Centimeter)
121    0x09, 0x30,        //       Usage (X)
122    0x35, 0x00,        //       Physical Minimum (0)
123    0x46, 0xFE, 0x00,  //       Physical Maximum (254)
124    0x95, 0x02,        //       Report Count (2)
125    0x81, 0x02,        //       Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
126    0x26, 0x10, 0x08,  //       Logical Maximum (2064)
127    0x46, 0xA9, 0x00,  //       Physical Maximum (169)
128    0x09, 0x31,        //       Usage (Y)
129    0x81, 0x02,        //       Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
130    0xB4,              //     Pop
131    0xC0,              //   End Collection
132    0x05, 0x0D,        //   Usage Page (Digitizer)
133    0x09, 0x22,        //   Usage (Finger)
134    0xA1, 0x02,        //   Collection (Logical)
135    0x05, 0x0D,        //     Usage Page (Digitizer)
136    0x09, 0x42,        //     Usage (Tip Switch)
137    0x15, 0x00,        //     Logical Minimum (0)
138    0x25, 0x01,        //     Logical Maximum (1)
139    0x75, 0x01,        //     Report Size (1)
140    0x95, 0x01,        //     Report Count (1)
141    0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
142    0x75, 0x01,        //     Report Size (1)
143    0x81, 0x03,        //     Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
144    0x75, 0x06,        //     Report Size (6)
145    0x09, 0x51,        //     Usage (0x51)
146    0x25, 0x3F,        //     Logical Maximum (63)
147    0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
148    0x26, 0xFF, 0x00,  //     Logical Maximum (255)
149    0x75, 0x08,        //     Report Size (8)
150    0x09, 0x48,        //     Usage (0x48)
151    0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
152    0x09, 0x49,        //     Usage (0x49)
153    0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
154    0x95, 0x01,        //     Report Count (1)
155    0x05, 0x01,        //     Usage Page (Generic Desktop Ctrls)
156    0xA4,              //     Push
157    0x26, 0xD0, 0x0B,  //       Logical Maximum (3024)
158    0x75, 0x10,        //       Report Size (16)
159    0x55, 0x0F,        //       Unit Exponent (-1)
160    0x65, 0x11,        //       Unit (System: SI Linear, Length: Centimeter)
161    0x09, 0x30,        //       Usage (X)
162    0x35, 0x00,        //       Physical Minimum (0)
163    0x46, 0xFE, 0x00,  //       Physical Maximum (254)
164    0x95, 0x02,        //       Report Count (2)
165    0x81, 0x02,        //       Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
166    0x26, 0x10, 0x08,  //       Logical Maximum (2064)
167    0x46, 0xA9, 0x00,  //       Physical Maximum (169)
168    0x09, 0x31,        //       Usage (Y)
169    0x81, 0x02,        //       Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
170    0xB4,              //     Pop
171    0xC0,              //   End Collection
172    0x05, 0x0D,        //   Usage Page (Digitizer)
173    0x09, 0x22,        //   Usage (Finger)
174    0xA1, 0x02,        //   Collection (Logical)
175    0x05, 0x0D,        //     Usage Page (Digitizer)
176    0x09, 0x42,        //     Usage (Tip Switch)
177    0x15, 0x00,        //     Logical Minimum (0)
178    0x25, 0x01,        //     Logical Maximum (1)
179    0x75, 0x01,        //     Report Size (1)
180    0x95, 0x01,        //     Report Count (1)
181    0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
182    0x75, 0x01,        //     Report Size (1)
183    0x81, 0x03,        //     Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
184    0x75, 0x06,        //     Report Size (6)
185    0x09, 0x51,        //     Usage (0x51)
186    0x25, 0x3F,        //     Logical Maximum (63)
187    0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
188    0x26, 0xFF, 0x00,  //     Logical Maximum (255)
189    0x75, 0x08,        //     Report Size (8)
190    0x09, 0x48,        //     Usage (0x48)
191    0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
192    0x09, 0x49,        //     Usage (0x49)
193    0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
194    0x95, 0x01,        //     Report Count (1)
195    0x05, 0x01,        //     Usage Page (Generic Desktop Ctrls)
196    0xA4,              //     Push
197    0x26, 0xD0, 0x0B,  //       Logical Maximum (3024)
198    0x75, 0x10,        //       Report Size (16)
199    0x55, 0x0F,        //       Unit Exponent (-1)
200    0x65, 0x11,        //       Unit (System: SI Linear, Length: Centimeter)
201    0x09, 0x30,        //       Usage (X)
202    0x35, 0x00,        //       Physical Minimum (0)
203    0x46, 0xFE, 0x00,  //       Physical Maximum (254)
204    0x95, 0x02,        //       Report Count (2)
205    0x81, 0x02,        //       Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
206    0x26, 0x10, 0x08,  //       Logical Maximum (2064)
207    0x46, 0xA9, 0x00,  //       Physical Maximum (169)
208    0x09, 0x31,        //       Usage (Y)
209    0x81, 0x02,        //       Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
210    0xB4,              //     Pop
211    0xC0,              //   End Collection
212    0x05, 0x0D,        //   Usage Page (Digitizer)
213    0x09, 0x56,        //   Usage (0x56)
214    0x55, 0x00,        //   Unit Exponent (0)
215    0x65, 0x00,        //   Unit (None)
216    0x27, 0xFF, 0xFF, 0xFF, 0x7F,  //   Logical Maximum (2147483647)
217    0x95, 0x01,        //   Report Count (1)
218    0x75, 0x20,        //   Report Size (32)
219    0x81, 0x02,        //   Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
220    0x09, 0x54,        //   Usage (0x54)
221    0x25, 0x7F,        //   Logical Maximum (127)
222    0x95, 0x01,        //   Report Count (1)
223    0x75, 0x08,        //   Report Size (8)
224    0x81, 0x02,        //   Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
225    0x85, 0x0A,        //   Report ID (10)
226    0x09, 0x55,        //   Usage (0x55)
227    0x25, 0x0A,        //   Logical Maximum (10)
228    0xB1, 0x02,        //   Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
229    0x85, 0x0E,        //   Report ID (14)
230    0x06, 0x00, 0xFF,  //   Usage Page (Vendor Defined 0xFF00)
231    0x09, 0xC5,        //   Usage (0xC5)
232    0x15, 0x00,        //   Logical Minimum (0)
233    0x26, 0xFF, 0x00,  //   Logical Maximum (255)
234    0x75, 0x08,        //   Report Size (8)
235    0x96, 0x00, 0x01,  //   Report Count (256)
236    0xB1, 0x02,        //   Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
237    0xC0,              // End Collection
238    0x06, 0xFF, 0x01,  // Usage Page (Reserved 0x01FF)
239    0x09, 0x01,        // Usage (0x01)
240    0xA1, 0x01,        // Collection (Application)
241    0x85, 0x02,        //   Report ID (2)
242    0x15, 0x00,        //   Logical Minimum (0)
243    0x26, 0xFF, 0x00,  //   Logical Maximum (255)
244    0x75, 0x08,        //   Report Size (8)
245    0x95, 0x40,        //   Report Count (64)
246    0x09, 0x00,        //   Usage (0x00)
247    0x81, 0x02,        //   Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
248    0xC0,              // End Collection
249    0x06, 0x00, 0xFF,  // Usage Page (Vendor Defined 0xFF00)
250    0x09, 0x01,        // Usage (0x01)
251    0xA1, 0x01,        // Collection (Application)
252    0x85, 0x03,        //   Report ID (3)
253    0x75, 0x08,        //   Report Size (8)
254    0x95, 0x20,        //   Report Count (32)
255    0x09, 0x01,        //   Usage (0x01)
256    0x91, 0x02,        //   Output (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
257    0xC0,              // End Collection
258    0x06, 0x00, 0xFF,  // Usage Page (Vendor Defined 0xFF00)
259    0x09, 0x01,        // Usage (0x01)
260    0xA1, 0x01,        // Collection (Application)
261    0x85, 0x06,        //   Report ID (6)
262    0x09, 0x03,        //   Usage (0x03)
263    0x75, 0x08,        //   Report Size (8)
264    0x95, 0x12,        //   Report Count (18)
265    0x91, 0x02,        //   Output (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
266    0x09, 0x04,        //   Usage (0x04)
267    0x75, 0x08,        //   Report Size (8)
268    0x95, 0x03,        //   Report Count (3)
269    0xB1, 0x02,        //   Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
270    0xC0,              // End Collection
271    0x06, 0x01, 0xFF,  // Usage Page (Vendor Defined 0xFF01)
272    0x09, 0x01,        // Usage (0x01)
273    0xA1, 0x01,        // Collection (Application)
274    0x85, 0x04,        //   Report ID (4)
275    0x15, 0x00,        //   Logical Minimum (0)
276    0x26, 0xFF, 0x00,  //   Logical Maximum (255)
277    0x75, 0x08,        //   Report Size (8)
278    0x95, 0x13,        //   Report Count (19)
279    0x09, 0x00,        //   Usage (0x00)
280    0x81, 0x02,        //   Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
281    0xC0,              // End Collection
282    0x05, 0x0D,        // Usage Page (Digitizer)
283    0x09, 0x02,        // Usage (Pen)
284    0xA1, 0x01,        // Collection (Application)
285    0x85, 0x07,        //   Report ID (7)
286    0x35, 0x00,        //   Physical Minimum (0)
287    0x09, 0x20,        //   Usage (Stylus)
288    0xA1, 0x00,        //   Collection (Physical)
289    0x09, 0x32,        //     Usage (In Range)
290    0x09, 0x42,        //     Usage (Tip Switch)
291    0x09, 0x44,        //     Usage (Barrel Switch)
292    0x09, 0x3C,        //     Usage (Invert)
293    0x09, 0x45,        //     Usage (Eraser)
294    0x15, 0x00,        //     Logical Minimum (0)
295    0x25, 0x01,        //     Logical Maximum (1)
296    0x75, 0x01,        //     Report Size (1)
297    0x95, 0x05,        //     Report Count (5)
298    0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
299    0x95, 0x03,        //     Report Count (3)
300    0x81, 0x03,        //     Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
301    0x05, 0x01,        //     Usage Page (Generic Desktop Ctrls)
302    0x09, 0x30,        //     Usage (X)
303    0x75, 0x10,        //     Report Size (16)
304    0x95, 0x01,        //     Report Count (1)
305    0xA4,              //     Push
306    0x55, 0x0F,        //       Unit Exponent (-1)
307    0x65, 0x11,        //       Unit (System: SI Linear, Length: Centimeter)
308    0x46, 0xFE, 0x00,  //       Physical Maximum (254)
309    0x26, 0xC0, 0x0F,  //       Logical Maximum (4032)
310    0x81, 0x42,        //       Input (Data,Var,Abs,No Wrap,Linear,Preferred State,Null State)
311    0x09, 0x31,        //       Usage (Y)
312    0x46, 0xA9, 0x00,  //       Physical Maximum (169)
313    0x26, 0xC0, 0x0A,  //       Logical Maximum (2752)
314    0x81, 0x42,        //       Input (Data,Var,Abs,No Wrap,Linear,Preferred State,Null State)
315    0xB4,              //     Pop
316    0x05, 0x0D,        //     Usage Page (Digitizer)
317    0x09, 0x30,        //     Usage (Tip Pressure)
318    0x26, 0x00, 0x01,  //     Logical Maximum (256)
319    0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
320    0xC0,              //   End Collection
321    0xC0,              // End Collection
322    0x06, 0x00, 0xFF,  // Usage Page (Vendor Defined 0xFF00)
323    0x09, 0x01,        // Usage (0x01)
324    0xA1, 0x01,        // Collection (Application)
325    0x85, 0x17,        //   Report ID (23)
326    0x75, 0x08,        //   Report Size (8)
327    0x95, 0x1F,        //   Report Count (31)
328    0x09, 0x05,        //   Usage (0x05)
329    0x81, 0x02,        //   Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
330    0xC0,              // End Collection
331
332    // 660 bytes
333};
334
335bool is_acer12_touch_report_desc(const uint8_t* data, size_t len) {
336    if (!data)
337        return false;
338
339    if (len != sizeof(acer12_touch_report_desc))
340        return false;
341
342    return (memcmp(data, acer12_touch_report_desc, len) == 0);
343}
344
345zx_status_t setup_acer12_touch(int fd) {
346    if (fd < 0)
347        return ZX_ERR_INVALID_ARGS;
348
349    return ZX_OK;
350}
351