mirror of https://github.com/arendst/Tasmota.git
modify RA8876 display driver to use internal touch driver (#20562)
* integrate utouch driver * modify for utouch driver * touched is now int16
This commit is contained in:
parent
780940d5d0
commit
a915fdec52
|
@ -38,6 +38,9 @@ fast picture write
|
||||||
// Serial.printf(">%d,\n", stage);
|
// Serial.printf(">%d,\n", stage);
|
||||||
//
|
//
|
||||||
|
|
||||||
|
enum LoggingLevels {LOG_LEVEL_NONE, LOG_LEVEL_ERROR, LOG_LEVEL_INFO, LOG_LEVEL_DEBUG, LOG_LEVEL_DEBUG_MORE};
|
||||||
|
extern void AddLog(uint32_t loglevel, PGM_P formatP, ...);
|
||||||
|
|
||||||
const uint16_t RA8876_colors[]={RA8876_BLACK,RA8876_WHITE,RA8876_RED,RA8876_GREEN,RA8876_BLUE,RA8876_CYAN,RA8876_MAGENTA,\
|
const uint16_t RA8876_colors[]={RA8876_BLACK,RA8876_WHITE,RA8876_RED,RA8876_GREEN,RA8876_BLUE,RA8876_CYAN,RA8876_MAGENTA,\
|
||||||
RA8876_YELLOW,RA8876_NAVY,RA8876_DARKGREEN,RA8876_DARKCYAN,RA8876_MAROON,RA8876_PURPLE,RA8876_OLIVE,\
|
RA8876_YELLOW,RA8876_NAVY,RA8876_DARKGREEN,RA8876_DARKCYAN,RA8876_MAROON,RA8876_PURPLE,RA8876_OLIVE,\
|
||||||
RA8876_LIGHTGREY,RA8876_DARKGREY,RA8876_ORANGE,RA8876_GREENYELLOW,RA8876_PINK};
|
RA8876_LIGHTGREY,RA8876_DARKGREY,RA8876_ORANGE,RA8876_GREENYELLOW,RA8876_PINK};
|
||||||
|
@ -1298,6 +1301,102 @@ void RA8876::setDrawMode(uint8_t mode) {
|
||||||
setDrawMode_reg(mode);
|
setDrawMode_reg(mode);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//#define RA_FT5206_VENDID 0x11
|
||||||
|
#define RA_FT5206_VENDID 0x79
|
||||||
|
#define RA_FT5206U_CHIPID 0x64
|
||||||
|
#define RA_FT5316_CHIPID 0x0a
|
||||||
|
#define RA_FT5206_VENDID_REG (0xA8)
|
||||||
|
#define RA_FT5206_CHIPID_REG (0xA3)
|
||||||
|
#define RA_FT5206_TOUCHES_REG (0x02)
|
||||||
|
#define RA_FT5206_MODE_REG (0x00)
|
||||||
|
#define RA_FT5206_address 0x38
|
||||||
|
|
||||||
|
int RA8876::_readByte(uint8_t reg, uint8_t nbytes, uint8_t *data) {
|
||||||
|
_i2cPort->beginTransmission(RA_FT5206_address);
|
||||||
|
_i2cPort->write(reg);
|
||||||
|
_i2cPort->endTransmission();
|
||||||
|
_i2cPort->requestFrom(RA_FT5206_address, (size_t)nbytes);
|
||||||
|
uint8_t index = 0;
|
||||||
|
while (_i2cPort->available()) {
|
||||||
|
data[index++] = _i2cPort->read();
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int RA8876::_writeByte(uint8_t reg, uint8_t nbytes, uint8_t *data) {
|
||||||
|
_i2cPort->beginTransmission(RA_FT5206_address);
|
||||||
|
_i2cPort->write(reg);
|
||||||
|
for (uint8_t i = 0; i < nbytes; i++) {
|
||||||
|
_i2cPort->write(data[i]);
|
||||||
|
}
|
||||||
|
_i2cPort->endTransmission();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool RA8876::utouch_Init(char **name) {
|
||||||
|
strcpy(ut_name, "FT5316");
|
||||||
|
*name = ut_name;
|
||||||
|
|
||||||
|
_i2cPort = &Wire;
|
||||||
|
|
||||||
|
uint8_t val;
|
||||||
|
_readByte(RA_FT5206_VENDID_REG, 1, &val);
|
||||||
|
//AddLog(LOG_LEVEL_INFO, PSTR("UTDBG %02x"), val);
|
||||||
|
|
||||||
|
if (val != RA_FT5206_VENDID) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
_readByte(RA_FT5206_CHIPID_REG, 1, &val);
|
||||||
|
//AddLog(LOG_LEVEL_INFO, PSTR("UTDBG %02x"), val);
|
||||||
|
|
||||||
|
if (val != RA_FT5316_CHIPID) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t RA8876::touched(void) {
|
||||||
|
uint8_t data[16];
|
||||||
|
|
||||||
|
uint8_t val = 0;
|
||||||
|
_readByte(RA_FT5206_MODE_REG, 1, &val);
|
||||||
|
if (val) {
|
||||||
|
val = 0;
|
||||||
|
_writeByte(RA_FT5206_MODE_REG, 1, &val);
|
||||||
|
}
|
||||||
|
|
||||||
|
_readByte(RA_FT5206_MODE_REG, 16, data);
|
||||||
|
|
||||||
|
if (data[2]) {
|
||||||
|
ut_x = data[3] << 8;
|
||||||
|
ut_x |= data[4];
|
||||||
|
ut_y = data[5] << 8;
|
||||||
|
ut_y |= data[6];
|
||||||
|
ut_x &= 0xfff;
|
||||||
|
ut_y &= 0xfff;
|
||||||
|
}
|
||||||
|
return data[2];
|
||||||
|
}
|
||||||
|
|
||||||
|
int16_t RA8876::getPoint_x() {
|
||||||
|
return ut_x;
|
||||||
|
}
|
||||||
|
|
||||||
|
int16_t RA8876::getPoint_y() {
|
||||||
|
return ut_y;
|
||||||
|
}
|
||||||
|
|
||||||
|
void RA8876::TS_RotConvert(int16_t *x, int16_t *y) {
|
||||||
|
int16_t temp;
|
||||||
|
*x = *x * width() / 800;
|
||||||
|
*y = *y * height() / 480;
|
||||||
|
|
||||||
|
*x = width() - *x;
|
||||||
|
*y = height() - *y;
|
||||||
|
}
|
||||||
|
|
||||||
void RA8876::setDrawMode_reg(uint8_t mode) {
|
void RA8876::setDrawMode_reg(uint8_t mode) {
|
||||||
SPI.beginTransaction(m_spiSettings);
|
SPI.beginTransaction(m_spiSettings);
|
||||||
uint8_t ccr1 = readReg(RA8876_REG_CCR1);
|
uint8_t ccr1 = readReg(RA8876_REG_CCR1);
|
||||||
|
|
|
@ -26,6 +26,8 @@
|
||||||
#include "driver/spi_master.h"
|
#include "driver/spi_master.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include <Wire.h>
|
||||||
|
|
||||||
#include "tasmota_options.h"
|
#include "tasmota_options.h"
|
||||||
|
|
||||||
#undef SPRINT
|
#undef SPRINT
|
||||||
|
@ -467,7 +469,6 @@ class RA8876 : public Renderer {
|
||||||
void drawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color);
|
void drawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color);
|
||||||
void drawFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color);
|
void drawFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color);
|
||||||
|
|
||||||
|
|
||||||
void drawCircle(int16_t x, int16_t y, int16_t radius, uint16_t color);
|
void drawCircle(int16_t x, int16_t y, int16_t radius, uint16_t color);
|
||||||
void fillCircle(int16_t x, int16_t y, int16_t radius, uint16_t color);
|
void fillCircle(int16_t x, int16_t y, int16_t radius, uint16_t color);
|
||||||
void drawRoundRect(int16_t x0, int16_t y0, int16_t w, int16_t h, int16_t radius, uint16_t color);
|
void drawRoundRect(int16_t x0, int16_t y0, int16_t w, int16_t h, int16_t radius, uint16_t color);
|
||||||
|
@ -510,6 +511,11 @@ class RA8876 : public Renderer {
|
||||||
void dim10(uint8_t contrast, uint16_t contrast_gamma);
|
void dim10(uint8_t contrast, uint16_t contrast_gamma);
|
||||||
void FastString(uint16_t x,uint16_t y,uint16_t tcolor, const char* str);
|
void FastString(uint16_t x,uint16_t y,uint16_t tcolor, const char* str);
|
||||||
|
|
||||||
|
bool utouch_Init(char **name);
|
||||||
|
uint16_t touched(void);
|
||||||
|
int16_t getPoint_x();
|
||||||
|
int16_t getPoint_y();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
uint8_t tabcolor;
|
uint8_t tabcolor;
|
||||||
void PWM_init(void);
|
void PWM_init(void);
|
||||||
|
@ -533,6 +539,7 @@ class RA8876 : public Renderer {
|
||||||
bool initPLL(void);
|
bool initPLL(void);
|
||||||
bool initMemory(SdramInfo *info);
|
bool initMemory(SdramInfo *info);
|
||||||
bool initDisplay(void);
|
bool initDisplay(void);
|
||||||
|
char ut_name[8];
|
||||||
|
|
||||||
// Font utils
|
// Font utils
|
||||||
uint8_t internalFontEncoding(enum FontEncoding enc);
|
uint8_t internalFontEncoding(enum FontEncoding enc);
|
||||||
|
@ -547,6 +554,14 @@ class RA8876 : public Renderer {
|
||||||
void drawEllipseShape(int x, int y, int xrad, int yrad, uint16_t color, uint8_t cmd); // drawCircle, fillCircle
|
void drawEllipseShape(int x, int y, int xrad, int yrad, uint16_t color, uint8_t cmd); // drawCircle, fillCircle
|
||||||
void drawThreePointShape1(int x1, int y1, int x2, int y2, int x3, int y3, uint16_t color, uint8_t reg, uint8_t cmd);
|
void drawThreePointShape1(int x1, int y1, int x2, int y2, int x3, int y3, uint16_t color, uint8_t reg, uint8_t cmd);
|
||||||
|
|
||||||
|
void TS_RotConvert(int16_t *x, int16_t *y);
|
||||||
|
|
||||||
|
TwoWire *_i2cPort;
|
||||||
|
int _readByte(uint8_t reg, uint8_t nbytes, uint8_t *data);
|
||||||
|
int _writeByte(uint8_t reg, uint8_t nbytes, uint8_t *data);
|
||||||
|
uint16_t ut_x;
|
||||||
|
uint16_t ut_y;
|
||||||
|
|
||||||
int8_t m_csPin, _mosi, _miso, _sclk, dimmer, _hwspi;
|
int8_t m_csPin, _mosi, _miso, _sclk, dimmer, _hwspi;
|
||||||
uint16_t m_width;
|
uint16_t m_width;
|
||||||
uint16_t m_height;
|
uint16_t m_height;
|
||||||
|
|
|
@ -80,39 +80,16 @@ void RA8876_InitDriver(void) {
|
||||||
FT5206_Touch_Init(Wire);
|
FT5206_Touch_Init(Wire);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef USE_UNIVERSAL_TOUCH
|
||||||
|
utouch_Touch_Init();
|
||||||
|
#endif
|
||||||
|
|
||||||
ra8876_init_done = true;
|
ra8876_init_done = true;
|
||||||
AddLog(LOG_LEVEL_INFO, PSTR("DSP: RA8876"));
|
AddLog(LOG_LEVEL_INFO, PSTR("DSP: RA8876"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#ifdef USE_FT5206
|
|
||||||
#ifdef USE_TOUCH_BUTTONS
|
|
||||||
|
|
||||||
// no rotation support
|
|
||||||
void RA8876_RotConvert(int16_t *x, int16_t *y) {
|
|
||||||
int16_t temp;
|
|
||||||
if (renderer) {
|
|
||||||
*x=*x*renderer->width()/800;
|
|
||||||
*y=*y*renderer->height()/480;
|
|
||||||
|
|
||||||
*x = renderer->width() - *x;
|
|
||||||
*y = renderer->height() - *y;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// check digitizer hit
|
|
||||||
void RA8876_CheckTouch(void) {
|
|
||||||
ra8876_ctouch_counter++;
|
|
||||||
if (2 == ra8876_ctouch_counter) {
|
|
||||||
// every 100 ms should be enough
|
|
||||||
ra8876_ctouch_counter = 0;
|
|
||||||
Touch_Check(RA8876_RotConvert);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif // USE_TOUCH_BUTTONS
|
|
||||||
#endif // USE_FT5206
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
void testall() {
|
void testall() {
|
||||||
ra8876->clearScreen(0);
|
ra8876->clearScreen(0);
|
||||||
|
@ -309,11 +286,6 @@ bool Xdsp10(uint32_t function)
|
||||||
case FUNC_DISPLAY_MODEL:
|
case FUNC_DISPLAY_MODEL:
|
||||||
result = true;
|
result = true;
|
||||||
break;
|
break;
|
||||||
case FUNC_DISPLAY_EVERY_50_MSECOND:
|
|
||||||
#ifdef USE_FT5206
|
|
||||||
if (FT5206_found) RA8876_CheckTouch();
|
|
||||||
#endif
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
|
|
Loading…
Reference in New Issue