29#include "../SensorBuildOpt.h"
30#if !SENSORLIB_EXCLUDE_TOUCH_CST92XX
40 uint8_t numPoints = 0;
42 uint8_t write_buffer[4] = {0};
68 if (buffer[4] & 0xF0) {
69 if ((buffer[4] >> 7) == 0x01) {
78 numPoints = (buffer[5] & 0x7F);
83 for (uint8_t
i = 0;
i < numPoints; ++
i) {
84 uint8_t *pdat = buffer + (
i * 5) + (
i == 0 ? 0 : 2);
85 const uint8_t
id = (pdat[0] >> 4);
86 const uint8_t
event = (pdat[0] & 0x0F);
87 const uint16_t
x = ((pdat[1] << 4) | (pdat[3] >> 4));
88 const uint16_t
y = ((pdat[2] << 4) | (pdat[3] & 0x0F));
121 uint8_t buffer[2] = {0};
127#ifdef ARDUINO_ARCH_ESP32
146uint32_t TouchDrvCST92xx::readWordFromMem(uint8_t type, uint16_t mem_addr)
149 uint8_t write_buffer[4] = {0};
150 uint8_t read_buffer[4] = {0};
157 write_buffer[0] = 0xA0;
158 write_buffer[1] = 0x10;
159 write_buffer[2] = type;
167 write_buffer[0] = 0xA0;
168 write_buffer[1] = 0x0C;
169 write_buffer[2] = mem_addr;
170 write_buffer[3] = mem_addr >> 8;
178 write_buffer[0] = 0xA0;
179 write_buffer[1] = 0x04;
180 write_buffer[2] = 0xE4;
188 for (uint8_t t = 0;; t++) {
192 write_buffer[0] = 0xA0;
193 write_buffer[1] = 0x04;
200 if (read_buffer[0] == 0x00) {
204 write_buffer[0] = 0xA0;
205 write_buffer[1] = 0x18;
215 return ((uint32_t)(read_buffer[0])) |
216 (((uint32_t)(read_buffer[1])) << 8) |
217 (((uint32_t)(read_buffer[2])) << 16) |
218 (((uint32_t)(read_buffer[3])) << 24);
226uint32_t TouchDrvCST92xx::getChipType()
234bool TouchDrvCST92xx::enterBootloader(
void)
237 uint8_t check_cnt = 0;
238 uint8_t write_buffer[4] = {0};
239 uint8_t read_buffer[4] = {0};
245 for (uint8_t
i = 10;;
i += 2) {
256 for (check_cnt = 0; check_cnt < 5; check_cnt++) {
257 write_buffer[0] = 0xA0;
258 write_buffer[1] = 0x01;
259 write_buffer[2] = 0xAA;
266 write_buffer[0] = 0xA0;
267 write_buffer[1] = 0x02;
273 if ((read_buffer[0] == 0x55) && (read_buffer[1] == 0xB0)) {
277 if ((read_buffer[0] == 0x55) && (read_buffer[1] == 0xB0)) {
282 write_buffer[0] = 0xA0;
283 write_buffer[1] = 0x01;
284 write_buffer[2] = 0x00;
304bool TouchDrvCST92xx::getAttribute()
315 uint8_t write_buffer[2] = {0xD1, 0xFC};
317 uint32_t checkcode = 0;
318 checkcode = buffer[3];
320 checkcode |= buffer[2];
322 checkcode |= buffer[1];
324 checkcode |= buffer[0];
328 write_buffer[0] = 0xD1;
329 write_buffer[1] = 0xF8;
335 write_buffer[0] = 0xD2;
336 write_buffer[1] = 0x04;
343 uint32_t ProjectID = buffer[1];
345 ProjectID |= buffer[0];
348 write_buffer[0] = 0xD2;
349 write_buffer[1] = 0x08;
352 uint32_t fwVersion = buffer[3];
354 fwVersion |= buffer[2];
356 fwVersion |= buffer[1];
358 fwVersion |= buffer[0];
360 uint32_t checksum = buffer[7];
362 checksum |= buffer[6];
364 checksum |= buffer[5];
366 checksum |= buffer[4];
369 fwVersion, checksum);
371 if (fwVersion == 0xA5A5A5A5) {
375 if ((checkcode & 0xffff0000) != 0xCACA0000) {
388bool TouchDrvCST92xx::setMode(uint8_t mode)
390 uint8_t read_buffer[4] = {0};
391 uint8_t write_buffer[4] = {0};
394 uint8_t mode_cmd = 0;
396 for (
i = 0;
i < 3;
i++) {
397 write_buffer[0] = 0xD1;
398 write_buffer[1] = 0x1E;
404 write_buffer[0] = 0xD1;
405 write_buffer[1] = 0x1E;
411 write_buffer[0] = 0x00;
412 write_buffer[1] = 0x02;
418 if (read_buffer[1] == 0x1E)
449 for (
i = 0;
i < 10;
i++) {
458 write_buffer[0] = 0x00;
459 write_buffer[1] = 0x09;
465 if (read_buffer[0] == 0x14)
468 write_buffer[0] = 0xD1;
469 write_buffer[1] = 0x19;
479 write_buffer[0] = 0xD1;
480 write_buffer[1] = 0x11;
485 write_buffer[0] = 0xD1;
486 write_buffer[1] = 0x10;
491 write_buffer[0] = 0xD1;
492 write_buffer[1] = 0x12;
497 write_buffer[0] = 0xD1;
498 write_buffer[1] = 0x1F;
506 mode_cmd = write_buffer[1];
509 SENSORLIB_LOG_E(
"set_work_mode 0x%x 0x%x error", write_buffer[0], write_buffer[1]);
512 write_buffer[0] = 0x00;
513 write_buffer[1] = 0x02;
516 SENSORLIB_LOG_E(
"set_work_mode read 0x0002 failed : 0x%X 0x%X", read_buffer[0], read_buffer[1]);
518 if (mode_cmd != read_buffer[1]) {
519 SENSORLIB_LOG_E(
"set work mode read 0x0002=0x%x failed", read_buffer[1]);
526bool TouchDrvCST92xx::initImpl(uint8_t)
528 if (!getAttribute()) {
#define SENSORLIB_LOG_I(...)
#define SENSORLIB_LOG_E(...)
#define SENSORLIB_LOG_D(...)
std::unique_ptr< SensorHal > hal
int writeBuff(uint8_t *buf, size_t len)
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)
void setAddress(uint8_t address)
void sleep() override
Puts the touch driver to sleep.
static constexpr uint16_t CST9217_CHIP_ID
static constexpr uint16_t REG_FACTORY_MODE
static constexpr uint16_t REG_DEBUG_MODE
void setCoverScreenCallback(HomeButtonCallback cb, void *user_data=NULL)
Set the cover screen callback.
static constexpr uint8_t MAX_FINGER_NUM
static constexpr uint16_t REG_SLEEP_MODE
const char * getModelName() override
Get the model name.
static constexpr uint16_t REG_RAW_MODE
static constexpr uint16_t REG_DIFF_MODE
static constexpr uint8_t CST92XX_BOOT_ADDRESS
const TouchPoints & getTouchPoints() override
Get the touch points.
static constexpr uint16_t REG_NORMAL_MODE
static constexpr uint16_t CST9220_CHIP_ID
static constexpr uint8_t CST92XX_ACK
static constexpr uint16_t REG_READ
TouchDrvCST92xx()
Constructor for the touch driver.
uint32_t _chipID
Chip identification value.
TouchConfig _touchConfig
Configuration for coordinate transformations.
void(*)(void *user_data) HomeButtonCallback
Callback type for home button events.
virtual void reset()
Reset the touch controller.
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.
TouchPoint & getPoint(uint8_t index)
Gets a reference to a touch point at the specified index.
constexpr uint8_t _lowByte(uint16_t w)
constexpr uint8_t _highByte(uint16_t w)
uint8_t event
Event type based on actual hardware feedback, most touch devices do not support.