1// Copyright 2018 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/ft3x27.h>
6#include <zircon/errors.h>
7#include <string.h>
8
9static const uint8_t ft3x27_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    0x95, 0x01,        //     Report Count (1)
29    0x05, 0x01,        //     Usage Page (Generic Desktop Ctrls)
30    0xA4,              //     Push
31    0x26, 0x58, 0x02,  //       Logical Maximum (600)
32    0x75, 0x10,        //       Report Size (16)
33    0x09, 0x30,        //       Usage (X)
34    0x95, 0x01,        //       Report Count (1)
35    0x81, 0x02,        //       Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
36    0x26, 0x00, 0x04,  //       Logical Maximum (1024)
37    0x09, 0x31,        //       Usage (Y)
38    0x81, 0x02,        //       Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
39    0xB4,              //     Pop
40    0xC0,              //   End Collection
41    0x05, 0x0D,        //   Usage Page (Digitizer)
42    0x09, 0x22,        //   Usage (Finger)
43    0xA1, 0x02,        //   Collection (Logical)
44    0x09, 0x42,        //     Usage (Tip Switch)
45    0x15, 0x00,        //     Logical Minimum (0)
46    0x25, 0x01,        //     Logical Maximum (1)
47    0x75, 0x01,        //     Report Size (1)
48    0x95, 0x01,        //     Report Count (1)
49    0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
50    0x75, 0x01,        //     Report Size (1)
51    0x81, 0x03,        //     Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
52    0x75, 0x06,        //     Report Size (6)
53    0x09, 0x51,        //     Usage (0x51)
54    0x25, 0x3F,        //     Logical Maximum (63)
55    0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
56    0x95, 0x01,        //     Report Count (1)
57    0x05, 0x01,        //     Usage Page (Generic Desktop Ctrls)
58    0xA4,              //     Push
59    0x26, 0x58, 0x02,  //       Logical Maximum (600)
60    0x75, 0x10,        //       Report Size (16)
61    0x09, 0x30,        //       Usage (X)
62    0x95, 0x01,        //       Report Count (1)
63    0x81, 0x02,        //       Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
64    0x26, 0x00, 0x04,  //       Logical Maximum (1024)
65    0x09, 0x31,        //       Usage (Y)
66    0x81, 0x02,        //       Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
67    0xB4,              //     Pop
68    0xC0,              //   End Collection
69    0x05, 0x0D,        //   Usage Page (Digitizer)
70    0x09, 0x22,        //   Usage (Finger)
71    0xA1, 0x02,        //   Collection (Logical)
72    0x09, 0x42,        //     Usage (Tip Switch)
73    0x15, 0x00,        //     Logical Minimum (0)
74    0x25, 0x01,        //     Logical Maximum (1)
75    0x75, 0x01,        //     Report Size (1)
76    0x95, 0x01,        //     Report Count (1)
77    0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
78    0x75, 0x01,        //     Report Size (1)
79    0x81, 0x03,        //     Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
80    0x75, 0x06,        //     Report Size (6)
81    0x09, 0x51,        //     Usage (0x51)
82    0x25, 0x3F,        //     Logical Maximum (63)
83    0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
84    0x95, 0x01,        //     Report Count (1)
85    0x05, 0x01,        //     Usage Page (Generic Desktop Ctrls)
86    0xA4,              //     Push
87    0x26, 0x58, 0x02,  //       Logical Maximum (600)
88    0x75, 0x10,        //       Report Size (16)
89    0x09, 0x30,        //       Usage (X)
90    0x95, 0x01,        //       Report Count (1)
91    0x81, 0x02,        //       Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
92    0x26, 0x00, 0x04,  //       Logical Maximum (1024)
93    0x09, 0x31,        //       Usage (Y)
94    0x81, 0x02,        //       Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
95    0xB4,              //     Pop
96    0xC0,              //   End Collection
97    0x05, 0x0D,        //   Usage Page (Digitizer)
98    0x09, 0x22,        //   Usage (Finger)
99    0xA1, 0x02,        //   Collection (Logical)
100    0x09, 0x42,        //     Usage (Tip Switch)
101    0x15, 0x00,        //     Logical Minimum (0)
102    0x25, 0x01,        //     Logical Maximum (1)
103    0x75, 0x01,        //     Report Size (1)
104    0x95, 0x01,        //     Report Count (1)
105    0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
106    0x75, 0x01,        //     Report Size (1)
107    0x81, 0x03,        //     Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
108    0x75, 0x06,        //     Report Size (6)
109    0x09, 0x51,        //     Usage (0x51)
110    0x25, 0x3F,        //     Logical Maximum (63)
111    0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
112    0x95, 0x01,        //     Report Count (1)
113    0x05, 0x01,        //     Usage Page (Generic Desktop Ctrls)
114    0xA4,              //     Push
115    0x26, 0x58, 0x02,  //       Logical Maximum (600)
116    0x75, 0x10,        //       Report Size (16)
117    0x09, 0x30,        //       Usage (X)
118    0x95, 0x01,        //       Report Count (1)
119    0x81, 0x02,        //       Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
120    0x26, 0x00, 0x04,  //       Logical Maximum (1024)
121    0x09, 0x31,        //       Usage (Y)
122    0x81, 0x02,        //       Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
123    0xB4,              //     Pop
124    0xC0,              //   End Collection
125    0x05, 0x0D,        //   Usage Page (Digitizer)
126    0x09, 0x22,        //   Usage (Finger)
127    0xA1, 0x02,        //   Collection (Logical)
128    0x09, 0x42,        //     Usage (Tip Switch)
129    0x15, 0x00,        //     Logical Minimum (0)
130    0x25, 0x01,        //     Logical Maximum (1)
131    0x75, 0x01,        //     Report Size (1)
132    0x95, 0x01,        //     Report Count (1)
133    0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
134    0x75, 0x01,        //     Report Size (1)
135    0x81, 0x03,        //     Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
136    0x75, 0x06,        //     Report Size (6)
137    0x09, 0x51,        //     Usage (0x51)
138    0x25, 0x3F,        //     Logical Maximum (63)
139    0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
140    0x95, 0x01,        //     Report Count (1)
141    0x05, 0x01,        //     Usage Page (Generic Desktop Ctrls)
142    0xA4,              //     Push
143    0x26, 0x58, 0x02,  //       Logical Maximum (600)
144    0x75, 0x10,        //       Report Size (16)
145    0x09, 0x30,        //       Usage (X)
146    0x95, 0x01,        //       Report Count (1)
147    0x81, 0x02,        //       Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
148    0x26, 0x00, 0x04,  //       Logical Maximum (1024)
149    0x09, 0x31,        //       Usage (Y)
150    0x81, 0x02,        //       Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
151    0xB4,              //     Pop
152    0xC0,              //   End Collection
153    0x05, 0x0D,        //   Usage Page (Digitizer)
154    0x09, 0x54,        //   Usage (0x54)
155    0x25, 0x05,        //   Logical Maximum (5)
156    0x95, 0x01,        //   Report Count (1)
157    0x75, 0x08,        //   Report Size (8)
158    0x81, 0x02,        //   Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
159    0xC0,              // End Collection
160};
161
162bool is_ft3x27_touch_report_desc(const uint8_t* data, size_t len) {
163    if (!data)
164        return false;
165
166    if (len != sizeof(ft3x27_touch_report_desc))
167        return false;
168
169    return (memcmp(data, ft3x27_touch_report_desc, len) == 0);
170}
171
172zx_status_t setup_ft3x27_touch(int fd) {
173    if (fd < 0)
174        return ZX_ERR_INVALID_ARGS;
175
176    return ZX_OK;
177}
178
179size_t get_ft3x27_report_desc(const uint8_t** buf) {
180    *buf = ft3x27_touch_report_desc;
181    return sizeof(ft3x27_touch_report_desc);
182}