30#include "../SensorBuildOpt.h"
31#if !SENSORLIB_EXCLUDE_TOUCH_GT9895
42 uint8_t sleep_cmd[10] = {0};
66 uint8_t write_buffer[4];
77 if (buffer[0] == 0x00) {
81 uint8_t numPoints = buffer[2] & 0x0F;
99 if (buffer[0] & 0x80) {
104 if (calculateChecksum(&buffer[
IRQ_EVENT_HEAD_LEN], checksum_size, CHECKSUM_MODE_U8_LE)) {
110 for (
int i = 0;
i < numPoints;
i++) {
112 uint16_t
x = buffer[offset + 2] | (buffer[offset + 3] << 8);
113 uint16_t
y = buffer[offset + 4] | (buffer[offset + 5] << 8);
114 uint16_t w = buffer[offset + 6] | (buffer[offset + 7] << 8);
115 uint8_t
id = (buffer[offset] >> 4) & 0x0F;
131int TouchDrvGT9895::calculateChecksum(
const uint8_t *data,
int size, CheckSumMode mode)
133 uint32_t cal_checksum = 0;
134 uint32_t r_checksum = 0;
135 if (mode == CHECKSUM_MODE_U8_LE) {
138 for (
int i = 0;
i < size - 2;
i++)
139 cal_checksum += data[
i];
140 r_checksum = data[size - 2] + (data[size - 1] << 8);
141 return (cal_checksum & 0xFFFF) == r_checksum ? 0 : 1;
146 for (
int i = 0;
i < size - 4;
i += 2)
147 cal_checksum += data[
i] + (data[
i + 1] << 8);
148 r_checksum = data[size - 4] + (data[size - 3] << 8) +
149 (data[size - 2] << 16) + (data[size - 1] << 24);
150 return cal_checksum == r_checksum ? 0 : 1;
153uint32_t TouchDrvGT9895::getChipPID()
158 uint8_t rom_vid_reserved;
159 uint8_t patch_pid[8];
160 uint8_t patch_vid[4];
161 uint8_t patch_vid_reserved;
168 uint8_t temp_pid[8] = {0};
169 uint8_t buffer[28] = {0};
171 for (
int i = 0;
i < 2;
i++) {
172 if (
writeThenRead(buffer, 4, buffer,
sizeof(buffer)) == -1) {
178 if (!calculateChecksum(buffer,
sizeof(buffer), CHECKSUM_MODE_U8_LE)) {
190 memcpy(&info, buffer,
sizeof(info));
191 memcpy(temp_pid, info.rom_pid,
sizeof(info.rom_pid));
193 SENSORLIB_LOG_D(
"ROM_VID:%*p", (
int)
sizeof(info.rom_vid), info.rom_vid);
195 SENSORLIB_LOG_D(
"VID:%*p", (
int)
sizeof(info.patch_vid), info.patch_vid);
197 if (info.patch_pid[0] ==
'9' && info.patch_pid[1] ==
'8'
198 && info.patch_pid[2] ==
'9' && info.patch_pid[3] ==
'5') {
204void TouchDrvGT9895::clearStatus()
206 uint8_t buffer[5] = { 0x00, 0x01, 0x03, 0x08, 0x00};
210bool TouchDrvGT9895::initImpl(uint8_t)
212 if (getChipPID() != 0x9895) {
#define SENSORLIB_LOG_E(...)
#define SENSORLIB_LOG_D(...)
std::unique_ptr< SensorHal > hal
int writeBuff(uint8_t *buf, size_t len)
int writeThenRead(const uint8_t *write_buffer, size_t write_len, uint8_t *read_buffer, size_t read_len)
static constexpr uint8_t IRQ_EVENT_HEAD_LEN
const char * getModelName() override
Get the model name.
void wakeup() override
Wake up the touch driver.
void sleep() override
Puts the touch driver to sleep.
static constexpr uint8_t MAX_FINGER_NUM
static constexpr uint32_t REG_CMD
static constexpr uint8_t BYTES_PER_POINT
const TouchPoints & getTouchPoints() override
Get the touch points.
static constexpr uint8_t POINT_TYPE_STYLUS
static constexpr uint32_t CHIP_PID
static constexpr uint32_t REG_FW_VERSION
static constexpr uint8_t COORDS_DATA_CHECKSUM_SIZE
static constexpr uint32_t REG_POINT
static constexpr uint8_t POINT_TYPE_STYLUS_HOVER
uint32_t _chipID
Chip identification value.
virtual void reset()
Reset the touch controller.
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.
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.