• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021 HPMicro
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  *
6  */
7 
8 #include "hpm_gt911.h"
9 static uint8_t g_i2c_addr;
10 
gt911_read_data(gt911_context_t * context,uint16_t addr,uint8_t * buf,uint32_t size)11 hpm_stat_t gt911_read_data(gt911_context_t *context, uint16_t addr, uint8_t *buf, uint32_t size)
12 {
13     uint8_t r[2];
14     r[0] = addr >> 8;
15     r[1] = addr & 0xFF;
16     return i2c_master_address_read(context->ptr, g_i2c_addr, r, sizeof(r), buf, size);
17 }
18 
gt911_write_data(gt911_context_t * context,uint16_t addr,uint8_t * buf,uint32_t size)19 hpm_stat_t gt911_write_data(gt911_context_t *context, uint16_t addr, uint8_t *buf, uint32_t size)
20 {
21     uint8_t r[2];
22     r[0] = addr >> 8;
23     r[1] = addr & 0xFF;
24 
25     return i2c_master_address_write(context->ptr, g_i2c_addr, r, sizeof(r), buf, size);
26 }
27 
gt911_read_register(gt911_context_t * context,uint16_t reg,uint8_t * buf)28 hpm_stat_t gt911_read_register(gt911_context_t *context, uint16_t reg, uint8_t *buf)
29 {
30     return gt911_read_data(context, reg, buf, 1);
31 }
32 
gt911_write_register(gt911_context_t * context,uint16_t reg,uint8_t val)33 hpm_stat_t gt911_write_register(gt911_context_t *context, uint16_t reg, uint8_t val)
34 {
35     return gt911_write_data(context, reg, &val, 1);
36 }
37 
gt911_soft_reset(gt911_context_t * context)38 hpm_stat_t gt911_soft_reset(gt911_context_t *context)
39 {
40     return gt911_write_register(context, GT911_CMD, 0);
41 }
42 
gt911_calcualte_config_data_checksum(uint8_t * config)43 static uint8_t gt911_calcualte_config_data_checksum(uint8_t *config)
44 {
45     uint8_t checksum = 0;
46     for (uint32_t i = 0; i < GT911_CONFIG_DATA_SIZE - 2; i++) {
47         checksum += config[i];
48     }
49     return (~checksum + 1);
50 }
51 
gt911_read_config(gt911_context_t * context,uint8_t * buf,uint8_t size)52 hpm_stat_t gt911_read_config(gt911_context_t *context, uint8_t *buf, uint8_t size)
53 {
54     return gt911_read_data(context, GT911_CONFIG, buf, size);
55 }
56 
gt911_init(gt911_context_t * context,uint16_t width,uint16_t height)57 hpm_stat_t gt911_init(gt911_context_t *context, uint16_t width, uint16_t height)
58 {
59     hpm_stat_t stat = status_success;
60     uint8_t config[GT911_CONFIG_DATA_SIZE] = {0};
61 
62 #ifdef GT911_I2C_ADDR
63     g_i2c_addr = GT911_I2C_ADDR;
64     stat = gt911_read_data(context, GT911_CONFIG, config, sizeof(config));
65     if (stat != status_success) {
66         return stat;
67     }
68 #elif !GT911_NO_AUTO_PROBE
69     g_i2c_addr = GT911_I2C_ADDR0;
70     stat = gt911_read_data(context, GT911_CONFIG, config, sizeof(config));
71     if (stat != status_success) {
72         printf("0x%x failed to init GT911", g_i2c_addr);
73         g_i2c_addr = GT911_I2C_ADDR1;
74         printf(", try 0x%x\n", g_i2c_addr);
75         stat = gt911_read_data(context, GT911_CONFIG, config, sizeof(config));
76     }
77     if (stat != status_success) {
78         return stat;
79     }
80 #else
81     g_i2c_addr = GT911_I2C_ADDR0;
82     stat = gt911_read_data(context, GT911_CONFIG, config, sizeof(config));
83     if (stat != status_success) {
84         return stat;
85     }
86 #endif
87 
88     if (config[GT911_CONFIG_DATA_SIZE - 2] != gt911_calcualte_config_data_checksum(config)) {
89         return status_fail;
90     }
91 
92     /* stat = gt911_read_data(context, GT911_ID_B0, (uint8_t*)&val, sizeof(val)); */
93     /* if (stat != status_success) { */
94         /* return stat; */
95     /* } */
96 
97     /* if (val != GT911_PRODUCT_ID) { */
98         /* return status_fail; */
99     /* } */
100 
101     config[GT911_CONFIG_DATA_RESOLUTION_XL] = width & 0xFF;
102     config[GT911_CONFIG_DATA_RESOLUTION_XH] = width >> 8;
103     config[GT911_CONFIG_DATA_RESOLUTION_YL] = height & 0xFF;
104     config[GT911_CONFIG_DATA_RESOLUTION_YH] = height >> 8;
105     config[GT911_CONFIG_DATA_TOUCH_NUMBER] = 5;
106     config[GT911_CONFIG_DATA_MODULE_SWITCH1] = (config[GT911_CONFIG_DATA_MODULE_SWITCH1] & ~0x3);
107 
108     config[GT911_CONFIG_DATA_SIZE - 2] = gt911_calcualte_config_data_checksum(config);
109     config[GT911_CONFIG_DATA_SIZE - 1] = 1;
110     /*
111      * for (uint8_t i = 0; i < 5; i++) {
112      *     gt911_write_data(context, GT911_CONFIG, config, GT911_CONFIG_DATA_SIZE);
113      * }
114      */
115     gt911_write_register(context, GT911_CMD, GT911_CMD_SOFT_RESET);
116     return status_success;
117 }
118 
gt911_read_touch_data(gt911_context_t * context,gt911_touch_data_t * touch_data)119 hpm_stat_t gt911_read_touch_data(gt911_context_t *context,
120                                   gt911_touch_data_t *touch_data)
121 {
122     hpm_stat_t stat = status_success;
123 
124     stat = gt911_read_data(context, GT911_STATUS,
125             (uint8_t *)touch_data, sizeof(gt911_touch_data_t));
126     if (stat != status_success) {
127         return stat;
128     }
129 
130     gt911_write_register(context, GT911_STATUS, 0);
131 
132     return stat;
133 }
134