SensorLib 0.5.0
Multi-platform sensor driver library for Arduino, PlatformIO, and ESP-IDF
Loading...
Searching...
No Matches
TouchDrvCST226.cpp
Go to the documentation of this file.
1
29#include "../SensorBuildOpt.h"
30#if !SENSORLIB_EXCLUDE_TOUCH_CST226
31
32#include "TouchDrvCST226.hpp"
33
35{
36 if (_pinsCfg.rstPin != -1) {
37 hal->pinMode(_pinsCfg.rstPin, OUTPUT);
38 hal->digitalWrite(_pinsCfg.rstPin, LOW);
39 hal->delay(100);
40 hal->digitalWrite(_pinsCfg.rstPin, HIGH);
41 hal->delay(100);
42 } else {
43 writeReg(0xD1, 0x0E);
44 hal->delay(20);
45 }
46}
47
49{
50 static constexpr uint8_t POINT_BUFFER_SIZE = 28;
51 static constexpr uint8_t STATUS_REG = 0x00;
52 uint8_t buffer[POINT_BUFFER_SIZE] = {0};
53 uint8_t index = 0;
54
55 // Clear cached touch points
57
58 if (readRegBuff(STATUS_REG, buffer, POINT_BUFFER_SIZE) == 0) {
59
60 if (buffer[0] == 0x83 && buffer[1] == 0x17 && buffer[5] == 0x80) {
61 if (_HButtonCallback) {
63 }
64 return _touchPoints;
65 }
66
67 if (buffer[6] != 0xAB)return _touchPoints; // Return zero points
68 if (buffer[0] == 0xAB)return _touchPoints; // Return zero points
69 if (buffer[0] == 0x00)return _touchPoints; // Return zero points
70 if (buffer[5] == 0x80)return _touchPoints; // Return zero points
71
72 uint8_t numPoints = buffer[5] & 0x7F; // Get number of touch points (lower 7 bits)
73
74 // Validate number of touch points
75 if (numPoints == 0 || numPoints > MAX_FINGER_NUM) {
76 writeReg(0x00, 0xAB);
77 return _touchPoints; // Return zero points
78 }
79
80 // If not center button, add point
81 for (int i = 0; i < numPoints; i++) {
82 const uint16_t x = (buffer[index + 1] << 4) | ((buffer[index + 3] >> 4) & 0x0F);
83 const uint16_t y = (buffer[index + 2] << 4) | (buffer[index + 3] & 0x0F);
84 const uint16_t pressure = buffer[index + 4];
85 const uint8_t id = (buffer[index] & 0xF0) >> 4;
86 const uint8_t event = buffer[index] & 0x0F;
87 _touchPoints.addPoint(x, y, pressure, id, event);
88 index = (i == 0) ? (index + 7) : (index + 5);
89 }
90 // Swap XY or mirroring coordinates,if set
92 }
93 return _touchPoints;
94}
95
97{
98 switch (_chipID) {
99 case CST226SE_CHIPTYPE:
100 return "CST226SE";
101 case CST328_CHIPTYPE:
102 return "CST328";
103 case CST3240_CHIPTYPE:
104 return "CST3240";
105 default:
106 break;
107 }
108 return "Unknown";
109}
110
112{
113 writeReg(0xD1, 0x05);
114#ifdef ARDUINO_ARCH_ESP32
115 if (_pinsCfg.irqPin != -1) {
116 hal->pinMode(_pinsCfg.irqPin, OPEN_DRAIN);
117 }
118 if (_pinsCfg.rstPin != -1) {
119 hal->pinMode(_pinsCfg.rstPin, OPEN_DRAIN);
120 }
121#endif
122}
123
124bool TouchDrvCST226::initImpl(uint8_t)
125{
126 uint8_t buffer[8];
127 // Enter Command mode
128 writeReg(0xD1, 0x01);
129 hal->delay(10);
130 uint8_t write_buffer[2] = {0xD1, 0xFC};
131 writeThenRead(write_buffer, 2, buffer, 4);
132
133 uint32_t checkcode = (buffer[3] << 24) | (buffer[2] << 16) | (buffer[1] << 8) | buffer[0];
134 SENSORLIB_LOG_I("Chip checkcode:0x%" PRIX32 ".", checkcode);
135
136 write_buffer[0] = 0xD1;
137 write_buffer[1] = 0xF8;
138 writeThenRead(write_buffer, 2, buffer, 4);
139 _touchConfig.resolutionX = ( buffer[1] << 8) | buffer[0];
140 _touchConfig.resolutionY = ( buffer[3] << 8) | buffer[2];
141 SENSORLIB_LOG_I("Chip resolution X:%u Y:%u", _touchConfig.resolutionX, _touchConfig.resolutionY);
142
143 write_buffer[0] = 0xD2;
144 write_buffer[1] = 0x04;
145 writeThenRead(write_buffer, 2, buffer, 4);
146 uint32_t chipType = buffer[3];
147 chipType <<= 8;
148 chipType |= buffer[2];
149
150
151 uint32_t ProjectID = buffer[1];
152 ProjectID <<= 8;
153 ProjectID |= buffer[0];
154 SENSORLIB_LOG_I("Chip type: 0x%04" PRIX32 ", ProjectID: 0x%04" PRIX32, chipType, ProjectID);
155
156
157 write_buffer[0] = 0xD2;
158 write_buffer[1] = 0x08;
159 writeThenRead(write_buffer, 2, buffer, 8);
160
161 uint32_t fwVersion = buffer[3];
162 fwVersion <<= 8;
163 fwVersion |= buffer[2];
164 fwVersion <<= 8;
165 fwVersion |= buffer[1];
166 fwVersion <<= 8;
167 fwVersion |= buffer[0];
168
169 uint32_t checksum = buffer[7];
170 checksum <<= 8;
171 checksum |= buffer[6];
172 checksum <<= 8;
173 checksum |= buffer[5];
174 checksum <<= 8;
175 checksum |= buffer[4];
176
177 SENSORLIB_LOG_I("Chip ic version:0x%" PRIx32 ", checksum:0x%" PRIx32,
178 fwVersion, checksum);
179
180 if (fwVersion == 0xA5A5A5A5) {
181 SENSORLIB_LOG_E("Chip ic don't have firmware.");
182 return false;
183 }
184 if ((checkcode & 0xffff0000) != 0xCACA0000) {
185 SENSORLIB_LOG_E("Firmware info read error.");
186 return false;
187 }
188
189 switch (chipType) {
190 case CST226SE_CHIPTYPE:
191 case CST3240_CHIPTYPE:
192 case CST328_CHIPTYPE:
193 break;
194 default:
195 SENSORLIB_LOG_E("Chip ID does not match, should be 0x%02" PRIX8 " ,but is 0x%02" PRIX32, CST226SE_CHIPTYPE, chipType);
196 return false;
197 }
198
199 _chipID = chipType;
200
201 // Exit Command mode
202 writeReg(0xD1, 0x09);
203
204 _maxTouchPoints = 5;
205
206 return true;
207}
208
209#endif
#define SENSORLIB_LOG_I(...)
#define SENSORLIB_LOG_E(...)
@license MIT License
SensorPressure pressure(bhy)
std::unique_ptr< SensorHal > hal
int writeReg(uint8_t reg, uint8_t val)
int writeThenRead(const uint8_t *write_buffer, size_t write_len, uint8_t *read_buffer, size_t read_len)
int readRegBuff(uint8_t reg, uint8_t *buf, size_t len) const
const char * getModelName() override
Get the model name.
void sleep() override
Puts the touch driver to sleep.
void reset() override
Reset the touch driver.
const TouchPoints & getTouchPoints() override
Get the touch points.
uint32_t _chipID
Chip identification value.
TouchConfig _touchConfig
Configuration for coordinate transformations.
void * _userData
User data for home button callback.
virtual void updateXY(TouchPoints &points) const
Apply coordinate transformations (swap, scale, mirror) to all touch points.
TouchPinsCfg _pinsCfg
Configuration for reset and interrupt pins.
TouchPoints _touchPoints
Touch points data.
uint8_t _maxTouchPoints
Maximum supported touch points.
HomeButtonCallback _HButtonCallback
Home button callback function.
Container for touch point data and optional gesture information.
bool addPoint(uint16_t x, uint16_t y, uint16_t pressure=0, uint8_t id=0, uint8_t event=0)
Adds a touch point to the container.
void clear()
Clears all stored touch points and gesture.
uint8_t i
int16_t x[5]
int16_t y[5]