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