• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 *)&reg_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