1 /*
2 * Copyright (c) 2021 Bestechnic (Shanghai) Co., Ltd. All rights reserved.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15 #include "touch_ztw523.h"
16 #include "gpio_if.h"
17 #include "i2c_if.h"
18 #include "touch.h"
19 #include "platform.h"
20 #include "hdf_log.h"
21 #include "hdf_device_desc.h"
22 #ifdef LOSCFG_DRIVERS_HDF_CONFIG_MACRO
23 #include "hcs_macro.h"
24 #include "hdf_config_macro.h"
25 #else
26 #include "device_resource_if.h"
27 #endif
28
29 #define CONFIG_ROTATION
30 #define IIC_RETRY_NUM 2
31
32 struct ts_zinitix_coord {
33 uint16_t x;
34 uint16_t y;
35 uint8_t width;
36 uint8_t sub_status;
37 };
38
39 struct ts_zinitix_point_info {
40 uint16_t status;
41 #if TOUCH_POINT_MODE
42 uint16_t event_flag;
43 #else
44 uint8_t finger_cnt;
45 uint8_t time_stamp;
46 #endif
47 struct ts_zinitix_coord coord[MAX_SUPPORTED_FINGER_NUM];
48 };
49
50 struct ztw_priv {
51 struct touch_device *dev;
52 DevHandle i2c;
53 uint16_t i2c_id;
54 uint16_t i2c_addr;
55 uint16_t gpio_rst;
56 uint16_t gpio_int;
57 };
58
59 /**
60 * touch pins:
61 * TSP_RST - GPIO12 = 10
62 * TSP_INT - GPIO13 = 11
63 * TSP_SCL/SDA - I2C0 = GPIO04/GPIO05
64 */
65 static struct ztw_priv priv = {
66 .gpio_rst = 0,
67 .gpio_int = 1,
68 .i2c_id = 0,
69 .i2c_addr = 0x20,
70 };
71
ztw_read(struct ztw_priv * priv,uint16_t reg_addr,void * buffer,uint16_t length)72 static int ztw_read(struct ztw_priv *priv, uint16_t reg_addr, void *buffer, uint16_t length)
73 {
74 int ret = -1;
75 int retries = 0;
76
77 struct I2cMsg msgs[] = {
78 {
79 .addr = priv->i2c_addr,
80 .flags = 0,
81 .len = sizeof(reg_addr),
82 .buf = (uint8_t *)®_addr,
83 },
84 {
85 .addr = priv->i2c_addr,
86 .flags = I2C_FLAG_READ,
87 .len = length,
88 .buf = (uint8_t *)buffer,
89 },
90 };
91
92 while (retries < IIC_RETRY_NUM) {
93 ret = I2cTransfer(priv->i2c, msgs, 2);
94 if (ret == 2)
95 break;
96 retries++;
97 DelayMs(1);
98 }
99
100 if (retries >= IIC_RETRY_NUM) {
101 LOG_E("i2c transfer failed ret %d", ret);
102 return -1;
103 }
104 return (ret == 2) ? 0 : -1;
105 }
106
ztw_write(struct ztw_priv * priv,uint16_t reg_addr,const void * buffer,uint16_t length)107 static int ztw_write(struct ztw_priv *priv, uint16_t reg_addr, const void *buffer, uint16_t length)
108 {
109 uint8_t send_buffer[length + 2];
110 send_buffer[0] = reg_addr & 0xff;
111 send_buffer[1] = (reg_addr >> 8) & 0xff;
112 memcpy(&send_buffer[2], buffer, length);
113
114 struct I2cMsg msg = {
115 .addr = priv->i2c_addr,
116 .flags = 0,
117 .len = length + 2,
118 .buf = send_buffer,
119 };
120
121 int ret = I2cTransfer(priv->i2c, &msg, 1);
122 return (ret == 1) ? 0 : -1;
123 }
124
ztw_write_reg(struct ztw_priv * priv,uint16_t reg_addr,uint16_t data)125 static int ztw_write_reg(struct ztw_priv *priv, uint16_t reg_addr, uint16_t data)
126 {
127 return ztw_write(priv, reg_addr, (uint8_t *)&data, 2);
128 }
129
ztw_read_reg(struct ztw_priv * priv,uint16_t reg_addr,uint16_t * data)130 static int ztw_read_reg(struct ztw_priv *priv, uint16_t reg_addr, uint16_t *data)
131 {
132 return ztw_read(priv, reg_addr, (uint8_t *)data, 2);
133 }
134
ztw_write_cmd(struct ztw_priv * priv,uint16_t cmd)135 static int ztw_write_cmd(struct ztw_priv *priv, uint16_t cmd)
136 {
137 uint16_t data = 1;
138 return ztw_write_reg(priv, cmd, data);
139 }
140
ztw_get_point(struct touch_device * dev,struct touch_msg * msg)141 static int ztw_get_point(struct touch_device *dev, struct touch_msg *msg)
142 {
143 struct ts_zinitix_point_info touch_info;
144 if (ztw_read(&priv, ZINITIX_POINT_STATUS_REG, (uint8_t *)&touch_info, sizeof(touch_info)) < 0) {
145 LOG_E("failed to read ZINITIX_POINT_STATUS_REG");
146 return -1;
147 }
148 ztw_write_cmd(&priv, ZINITIX_CLEAR_INT_STATUS_CMD);
149 if (touch_info.status == 0) {
150 LOG_E("invalid touch_info");
151 return -1;
152 }
153 for (uint8_t i = 0; i < MAX_SUPPORTED_FINGER_NUM; i++) {
154 uint8_t sub_status = touch_info.coord[i].sub_status;
155 if (zinitix_bit_test(sub_status, SUB_BIT_EXIST)) {
156 msg->event = TOUCH_EVENT_EXIST;
157 #ifdef CONFIG_ROTATION
158 msg->x = TPD_RES_MAX_X - touch_info.coord[i].x;
159 msg->y = TPD_RES_MAX_Y - touch_info.coord[i].y;
160 #else
161 msg->x = touch_info.coord[i].x;
162 msg->y = touch_info.coord[i].y;
163 #endif
164 if (zinitix_bit_test(sub_status, SUB_BIT_DOWN)) {
165 msg->event = TOUCH_EVENT_DOWN;
166 } else if zinitix_bit_test (sub_status, SUB_BIT_MOVE) {
167 msg->event = TOUCH_EVENT_MOVE;
168 }
169 } else if (zinitix_bit_test(sub_status, SUB_BIT_UP)) {
170 msg->event = TOUCH_EVENT_UP;
171 #ifdef CONFIG_ROTATION
172 msg->x = TPD_RES_MAX_X - touch_info.coord[i].x;
173 msg->y = TPD_RES_MAX_Y - touch_info.coord[i].y;
174 #else
175 msg->x = touch_info.coord[i].x;
176 msg->y = touch_info.coord[i].y;
177 #endif
178 } else {
179 msg->event = TOUCH_EVENT_NONE;
180 }
181 LOG_D("EVENT:%d X:%d Y:%d", msg->event, msg->x, msg->y);
182 }
183 return 0;
184 }
185
ztw_reset(struct ztw_priv * priv,bool enable)186 static void ztw_reset(struct ztw_priv *priv, bool enable)
187 {
188 if (enable) {
189 DelayMs(1);
190 GpioWrite(priv->gpio_rst, 1);
191 DelayMs(10);
192 GpioWrite(priv->gpio_rst, 0);
193 DelayMs(100);
194 GpioWrite(priv->gpio_rst, 1);
195 DelayMs(CHIP_ON_DELAY);
196 } else {
197 GpioWrite(priv->gpio_rst, 0);
198 DelayMs(CHIP_OFF_DELAY);
199 }
200 }
201
ztw_power_sequence(struct ztw_priv * priv)202 static int ztw_power_sequence(struct ztw_priv *priv)
203 {
204 uint16_t chip_code;
205 if (ztw_write_reg(priv, ZINITIX_VENDOR_REG, 0x0001) != 0) {
206 LOG_E("power sequence error (vendor cmd enable)");
207 return -1;
208 }
209 DelayUs(10);
210
211 if (ztw_read_reg(priv, ZINITIX_CHIP_ID_REG, &chip_code) != 0) {
212 LOG_E("fail to read chip code");
213 return -1;
214 }
215 LOG_I("chip code = 0x%x", chip_code);
216 DelayUs(10);
217
218 if (ztw_write_cmd(priv, ZINITIX_INTN_CLEAR_CMD) != 0) {
219 LOG_E("power sequence error (int clear)");
220 return -1;
221 }
222 DelayUs(10);
223
224 if (ztw_write_reg(priv, ZINITIX_NVM_REG, 0x0001) != 0) {
225 LOG_E("power sequence error (nvm init)");
226 return -1;
227 }
228 DelayMs(2);
229
230 if (ztw_write_reg(priv, ZINITIX_PROGRAM_START_CMD, 0x0001) != 0) {
231 LOG_E("power sequence error (program start)");
232 return -1;
233 }
234 DelayMs(FIRMWARE_ON_DELAY);
235 LOG_D("ztw_power_sequence PASS.");
236 return 0;
237 }
238
ztw_irq_enable(bool enable)239 static void ztw_irq_enable(bool enable)
240 {
241 if (enable) {
242 GpioEnableIrq(priv.gpio_int);
243 } else {
244 GpioDisableIrq(priv.gpio_int);
245 }
246 }
247
ztw_isr(uint16_t gpio,void * arg)248 static void ztw_isr(uint16_t gpio, void *arg)
249 {
250 (void)arg;
251 if (gpio != priv.gpio_int)
252 return;
253
254 if (priv.dev && priv.dev->sem)
255 osSemaphoreRelease(priv.dev->sem);
256 }
257
ztw_init(struct touch_device * dev)258 static int ztw_init(struct touch_device *dev)
259 {
260 priv.dev = dev;
261
262 GpioSetDir(priv.gpio_rst, GPIO_DIR_OUT);
263 GpioSetDir(priv.gpio_int, GPIO_DIR_IN);
264 GpioSetIrq(priv.gpio_int, GPIO_IRQ_TRIGGER_FALLING, (GpioIrqFunc)ztw_isr, NULL);
265 GpioDisableIrq(priv.gpio_int);
266 priv.i2c = I2cOpen(priv.i2c_id);
267 DBG_ASSERT(priv.i2c != NULL);
268
269 ztw_reset(&priv, true);
270 if (ztw_power_sequence(&priv) != 0) {
271 LOG_E("failed to power on");
272 return -1;
273 }
274
275 uint8_t i;
276 for (i = 0; i < 10; i++) {
277 if (ztw_write_cmd(&priv, ZINITIX_SWRESET_CMD) == 0)
278 break;
279 DelayMs(10);
280 }
281 uint16_t reg_val = 0;
282 zinitix_bit_set(reg_val, BIT_PT_CNT_CHANGE);
283 zinitix_bit_set(reg_val, BIT_DOWN);
284 zinitix_bit_set(reg_val, BIT_MOVE);
285 zinitix_bit_set(reg_val, BIT_UP);
286 // zinitix_bit_set(reg_val, BIT_PALM);
287 // zinitix_bit_set(reg_val, BIT_PT_EXIST);
288
289 uint16_t eeprom_info;
290 if (ztw_read_reg(&priv, ZINITIX_EEPROM_INFO, &eeprom_info) != 0) {
291 LOG_E("fail to read eeprom info");
292 return -1;
293 }
294 LOG_I("eeprom_info = 0x%x", eeprom_info);
295
296 ztw_write_reg(&priv, ZINITIX_SUPPORTED_FINGER_NUM, MAX_SUPPORTED_FINGER_NUM);
297 ztw_write_reg(&priv, ZINITIX_X_RESOLUTION, (TPD_RES_MAX_X));
298 ztw_write_reg(&priv, ZINITIX_Y_RESOLUTION, (TPD_RES_MAX_Y));
299
300 ztw_write_reg(&priv, ZINITIX_INITIAL_TOUCH_MODE, TOUCH_POINT_MODE);
301 ztw_write_reg(&priv, ZINITIX_TOUCH_MODE, TOUCH_POINT_MODE);
302 ztw_write_reg(&priv, ZINITIX_INT_ENABLE_FLAG, reg_val);
303
304 for (i = 0; i < 10; i++) {
305 ztw_write_cmd(&priv, ZINITIX_CLEAR_INT_STATUS_CMD);
306 DelayUs(10);
307 }
308 return 0;
309 }
310
ztw_deinit(void)311 static void ztw_deinit(void)
312 {
313 GpioDisableIrq(priv.gpio_int);
314 I2cClose(priv.i2c);
315 }
316 #ifdef LOSCFG_DRIVERS_HDF_CONFIG_MACRO
317 #define DISPLAY_INPUT_TOUCH HCS_NODE(HCS_NODE(HCS_NODE(HCS_ROOT, input), touch_config), touch_fts)
TouchDeviceGetResource(struct ztw_priv * priv)318 static uint32_t TouchDeviceGetResource(struct ztw_priv *priv)
319 {
320 priv->gpio_rst = HCS_PROP(DISPLAY_INPUT_TOUCH, gpio_rst);
321 priv->gpio_int = HCS_PROP(DISPLAY_INPUT_TOUCH, gpio_int);
322 priv->i2c_id = HCS_PROP(DISPLAY_INPUT_TOUCH, i2c_id);
323 priv->i2c_addr = HCS_PROP(DISPLAY_INPUT_TOUCH, i2c_addr);
324
325 HDF_LOGD("%s: gpio_rst=%d, gpio_int=%d, i2c_id=%d, i2c_addr=%d", __func__,
326 priv->gpio_rst, priv->gpio_int, priv->i2c_id, priv->i2c_addr);
327 return HDF_SUCCESS;
328 }
329 #else
TouchDeviceGetResource(struct ztw_priv * priv,const struct DeviceResourceNode * resourceNode)330 static uint32_t TouchDeviceGetResource(struct ztw_priv *priv, const struct DeviceResourceNode *resourceNode)
331 {
332 struct DeviceResourceIface *res = DeviceResourceGetIfaceInstance(HDF_CONFIG_SOURCE);
333 if (res == NULL || res->GetUint32 == NULL) {
334 HDF_LOGE("DeviceResourceIface is invalid");
335 return HDF_FAILURE;
336 }
337 if (res->GetUint16(resourceNode, "gpio_rst", &priv->gpio_rst, 0) != HDF_SUCCESS) {
338 HDF_LOGE("%s: failed to get gpio_rst", __func__);
339 return HDF_FAILURE;
340 }
341 if (res->GetUint16(resourceNode, "gpio_int", &priv->gpio_int, 0) != HDF_SUCCESS) {
342 HDF_LOGE("%s: failed to get gpio_int", __func__);
343 return HDF_FAILURE;
344 }
345 if (res->GetUint16(resourceNode, "i2c_id", &priv->i2c_id, 0) != HDF_SUCCESS) {
346 HDF_LOGE("%s: failed to get i2c_id", __func__);
347 return HDF_FAILURE;
348 }
349 if (res->GetUint16(resourceNode, "i2c_addr", &priv->i2c_addr, 0) != HDF_SUCCESS) {
350 HDF_LOGE("%s: failed to get i2c_addr", __func__);
351 return HDF_FAILURE;
352 }
353 HDF_LOGD("%s: gpio_rst=%d, gpio_int=%d, i2c_id=%d, i2c_addr=%d", __func__,
354 priv->gpio_rst, priv->gpio_int, priv->i2c_id, priv->i2c_addr);
355 return HDF_SUCCESS;
356 }
357 #endif
TouchDriverInit(struct HdfDeviceObject * object)358 static int32_t TouchDriverInit(struct HdfDeviceObject *object)
359 {
360 static struct touch_device touch_ztw523 = {
361 .name = "ztw523",
362 .init = ztw_init,
363 .deinit = ztw_deinit,
364 .read = ztw_get_point,
365 .irq_enable = ztw_irq_enable,
366 };
367 if (object == NULL) {
368 HDF_LOGE("%s: object is null", __func__);
369 return HDF_FAILURE;
370 }
371 #ifdef LOSCFG_DRIVERS_HDF_CONFIG_MACRO
372 if (TouchDeviceGetResource(&priv) != HDF_SUCCESS) {
373 HDF_LOGE("%s: TouchDeviceGetResource failed", __func__);
374 return HDF_FAILURE;
375 }
376 #else
377 if (object->property) {
378 if (TouchDeviceGetResource(&priv, object->property) != HDF_SUCCESS) {
379 HDF_LOGE("%s: TouchDeviceGetResource failed", __func__);
380 return HDF_FAILURE;
381 }
382 }
383 #endif
384
385 if (RegisterTouchDevice(&touch_ztw523) != HDF_SUCCESS) {
386 HDF_LOGE("%s: RegisterTouchDevice failed", __func__);
387 return HDF_FAILURE;
388 }
389 return HDF_SUCCESS;
390 }
391
TouchDriverBind(struct HdfDeviceObject * device)392 static int32_t TouchDriverBind(struct HdfDeviceObject *device)
393 {
394 (void)device;
395 return HDF_SUCCESS;
396 }
397
TouchDriverRelease(struct HdfDeviceObject * device)398 static void TouchDriverRelease(struct HdfDeviceObject *device)
399 {
400 (void)device;
401 }
402
403 static struct HdfDriverEntry g_ZTW523TouchDriverEntry = {
404 .moduleVersion = 1,
405 .moduleName = "HDF_TOUCH_ZTW523",
406 .Bind = TouchDriverBind,
407 .Init = TouchDriverInit,
408 .Release = TouchDriverRelease,
409 };
410
411 HDF_INIT(g_ZTW523TouchDriverEntry);
412