Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion src/detect/ScanI2C.h
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,8 @@ class ScanI2C
BH1750,
DA217,
CHSC6X,
CST226SE
CST226SE,
CST3530,
} DeviceType;

// typedef uint8_t DeviceAddress;
Expand Down
27 changes: 26 additions & 1 deletion src/detect/ScanI2CTwoWire.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -508,8 +508,33 @@ void ScanI2CTwoWire::scanPort(I2CPort port, uint8_t *address, uint8_t asize)
SCAN_SIMPLE_CASE(DFROBOT_RAIN_ADDR, DFROBOT_RAIN, "DFRobot Rain Gauge", (uint8_t)addr.address);
SCAN_SIMPLE_CASE(LTR390UV_ADDR, LTR390UV, "LTR390UV", (uint8_t)addr.address);
SCAN_SIMPLE_CASE(PCT2075_ADDR, PCT2075, "PCT2075", (uint8_t)addr.address);

case CST328_ADDR:
// Do we have the CST328 or the CST226SE
// Do we have the CST328 or the CST226SE,CST3530
{
// T-Deck pro V1.1 new touch panel use CST3530
int retry = 5;
while(retry--) {
uint8_t buffer[7];
uint8_t r_cmd[] = {0x0d0,0x03,0x00,0x00};
i2cBus->beginTransmission(addr.address);
i2cBus->write(r_cmd, sizeof(r_cmd));
if(i2cBus->endTransmission() == 0){
i2cBus->requestFrom((int)addr.address,7);
i2cBus->readBytes(buffer,7);
if(buffer[2] == 0xCA && buffer[3] == 0xCA){
logFoundDevice("CST3530", (uint8_t)addr.address);
type = CST3530;
break;
}
}
uint8_t cmd1[] = {0xD0,0x00,0x04,0x00};
i2cBus->beginTransmission(addr.address);
i2cBus->write(cmd1, sizeof(cmd1));
i2cBus->endTransmission();
delay(50);
}
}
registerValue = getRegisterValue(ScanI2CTwoWire::RegisterLocation(addr, 0xAB), 1);
if (registerValue == 0xA9) {
type = CST226SE;
Expand Down
3 changes: 3 additions & 0 deletions src/graphics/EInkDisplay2.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -104,8 +104,11 @@ bool EInkDisplay::forceDisplay(uint32_t msecLimit)
// End the update process - virtual method, overriden in derived class
void EInkDisplay::endUpdate()
{
#ifndef EINK_NOT_HIBERNATE
// Power off display hardware, then deep-sleep (Except Wireless Paper V1.1, no deep-sleep)
adafruitDisplay->hibernate();
#endif

}

// Write the buffer to the display memory
Expand Down
4 changes: 4 additions & 0 deletions src/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -413,6 +413,10 @@ void setup()
digitalWrite(SDCARD_CS, HIGH);
pinMode(PIN_EINK_CS, OUTPUT);
digitalWrite(PIN_EINK_CS, HIGH);
pinMode(PIN_EINK_RES, OUTPUT);
digitalWrite(PIN_EINK_RES, HIGH);
pinMode(CST328_PIN_RST, OUTPUT);
digitalWrite(CST328_PIN_RST, HIGH);
#elif defined(T_LORA_PAGER)
pinMode(LORA_CS, OUTPUT);
digitalWrite(LORA_CS, HIGH);
Expand Down
116 changes: 111 additions & 5 deletions src/platform/extra_variants/t_deck_pro/variant.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,20 +8,126 @@

CSE_CST328 tsPanel = CSE_CST328(EINK_WIDTH, EINK_HEIGHT, &Wire, CST328_PIN_RST, CST328_PIN_INT);

static bool is_cst3530 = false;
volatile bool touch_isr = false;
#define CST3530_ADDR 0x1A

bool read_cst3530_touch(int16_t *x, int16_t *y) {
uint8_t buffer[9] = {0};
uint8_t r_cmd[] = {0xD0, 0x07, 0x00, 0x00};
uint8_t clear_cmd[] = {0xD0, 0x00, 0x02, 0xAB};

Wire.beginTransmission(CST3530_ADDR);
Wire.write(r_cmd, sizeof(r_cmd));
if (Wire.endTransmission() != 0) {
LOG_DEBUG("CST3530 I2C send addr failed");
return false;
}

int read_len = Wire.requestFrom((int)CST3530_ADDR, sizeof(buffer));
if (read_len != sizeof(buffer)) {
LOG_DEBUG("CST3530 read len error: %d (expect 9)", read_len);
return false;
}
int actual_read = Wire.readBytes(buffer, sizeof(buffer));
if (actual_read != sizeof(buffer)) {
LOG_DEBUG("CST3530 read bytes error: %d (expect 9)", actual_read);
return false;
}

uint8_t report_typ = buffer[2];
if (report_typ != 0xFF) {
return false;
}

uint8_t touch_points = buffer[3] & 0x0F;
if (touch_points == 0 || touch_points > 1) {
LOG_DEBUG("CST3530 touch points invalid: %d", touch_points);
return false;
}

*x = buffer[4] + ((uint16_t)(buffer[7] & 0x0F) << 8);
*y = buffer[5] + ((uint16_t)(buffer[7] & 0xF0) << 4);

// LOG_DEBUG("CST3530 touch: num:%d x=%d,y=%d", touch_points, *x, *y);

Wire.beginTransmission(CST3530_ADDR);
Wire.write(clear_cmd, sizeof(clear_cmd));
if (Wire.endTransmission() != 0) {
LOG_DEBUG("CST3530 clear cmd failed");
}

return true;
}

bool readTouch(int16_t *x, int16_t *y)
{
if (tsPanel.getTouches()) {
*x = tsPanel.getPoint(0).x;
*y = tsPanel.getPoint(0).y;
return true;

if(is_cst3530){
if(touch_isr){
touch_isr = false;
return read_cst3530_touch(x, y);
}
return false;
}else{
if (tsPanel.getTouches()) {
*x = tsPanel.getPoint(0).x;
*y = tsPanel.getPoint(0).y;
return true;
}
}
return false;
}


static void touchInterruptHandler(){
touch_isr = true;
}

// T-Deck Pro specific init
void lateInitVariant()
{
tsPanel.begin();
// Reset touch
pinMode(CST328_PIN_RST, OUTPUT);
digitalWrite(CST328_PIN_RST, HIGH);
delay(20);
digitalWrite(CST328_PIN_RST, LOW);
delay(80);
digitalWrite(CST328_PIN_RST, HIGH);
delay(20);

int retry = 5;
uint8_t buffer[7];
uint8_t r_cmd[] = {0x0d0,0x03,0x00,0x00};

// Probe touch chip
while(retry--) {
Wire.beginTransmission(CST3530_ADDR);
Wire.write(r_cmd, sizeof(r_cmd));
if(Wire.endTransmission() == 0){
Wire.requestFrom((int)CST3530_ADDR,7);
Wire.readBytes(buffer,7);
if(buffer[2] == 0xCA && buffer[3] == 0xCA){
LOG_DEBUG("CST3530 detected");
is_cst3530 = true;

// The CST3530 will automatically enter sleep mode;
// polling should not be used, but rather an interrupt method should be employed.
pinMode(CST328_PIN_INT, INPUT);
attachInterrupt(digitalPinToInterrupt(CST328_PIN_INT), touchInterruptHandler, FALLING);

break;
}else{
LOG_DEBUG("CST3530 not response ~!");
}
}
uint8_t cmd1[] = {0xD0,0x00,0x04,0x00};
Wire.beginTransmission(CST3530_ADDR);
Wire.write(cmd1, sizeof(cmd1));
Wire.endTransmission();
delay(50);
}

touchScreenImpl1 = new TouchScreenImpl1(EINK_WIDTH, EINK_HEIGHT, readTouch);
touchScreenImpl1->init();
}
Expand Down
19 changes: 19 additions & 0 deletions variants/esp32s3/t-deck-pro-v1_1/pins_arduino.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
#ifndef Pins_Arduino_h
#define Pins_Arduino_h

#include <stdint.h>

#define USB_VID 0x303a
#define USB_PID 0x1001

// used for keyboard, touch controller, beam sensor, and gyroscope
static const uint8_t SDA = 13;
static const uint8_t SCL = 14;

// Default SPI will be mapped to Radio
static const uint8_t SS = 3;
static const uint8_t MOSI = 33;
static const uint8_t MISO = 47;
static const uint8_t SCK = 36;

#endif /* Pins_Arduino_h */
41 changes: 41 additions & 0 deletions variants/esp32s3/t-deck-pro-v1_1/platformio.ini
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
[env:t-deck-pro-v1_1]
custom_meshtastic_hw_model = 102
custom_meshtastic_hw_model_slug = T_DECK_PRO
custom_meshtastic_architecture = esp32-s3
custom_meshtastic_actively_supported = true
custom_meshtastic_support_level = 1
custom_meshtastic_display_name = LILYGO T-Deck Pro
custom_meshtastic_images = tdeck_pro.svg
custom_meshtastic_tags = LilyGo
custom_meshtastic_requires_dfu = true
custom_meshtastic_partition_scheme = 16MB

extends = esp32s3_base
board = t-deck-pro
board_check = true
upload_protocol = esptool

build_flags =
${esp32s3_base.build_flags} -I variants/esp32s3/t-deck-pro-v1_1
-D T_DECK_PRO
-D USE_EINK
-D EINK_DISPLAY_MODEL=GxEPD2_310_GDEQ031T10
-D EINK_WIDTH=240
-D EINK_HEIGHT=320
;-D USE_EINK_DYNAMICDISPLAY ; Enable Dynamic EInk
-D EINK_LIMIT_FASTREFRESH=10 ; How many consecutive fast-refreshes are permitted
-D EINK_LIMIT_GHOSTING_PX=2000 ; (Optional) How much image ghosting is tolerated
-D EINK_NOT_HIBERNATE ; Disable hibernate to avoid issues with elink

lib_deps =
${esp32s3_base.lib_deps}
# renovate: datasource=custom.pio depName=GxEPD2 packageName=zinggjm/library/GxEPD2
zinggjm/GxEPD2@1.6.5
# renovate: datasource=git-refs depName=CSE_Touch packageName=https://github.com/CIRCUITSTATE/CSE_Touch gitBranch=main
https://github.com/CIRCUITSTATE/CSE_Touch/archive/b44f23b6f870b848f1fbe453c190879bc6cfaafa.zip
# renovate: datasource=github-tags depName=CSE_CST328 packageName=CIRCUITSTATE/CSE_CST328
https://github.com/CIRCUITSTATE/CSE_CST328/archive/refs/tags/v0.0.4.zip
# renovate: datasource=git-refs depName=BQ27220 packageName=https://github.com/mverch67/BQ27220 gitBranch=main
https://github.com/mverch67/BQ27220/archive/07d92be846abd8a0258a50c23198dac0858b22ed.zip
# renovate: datasource=custom.pio depName=Adafruit DRV2605 packageName=adafruit/library/Adafruit DRV2605 Library
adafruit/Adafruit DRV2605 Library@1.2.4
106 changes: 106 additions & 0 deletions variants/esp32s3/t-deck-pro-v1_1/variant.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
// Display (E-Ink)
#define PIN_EINK_CS 34
#define PIN_EINK_BUSY 37
#define PIN_EINK_DC 35
#define PIN_EINK_RES 16
#define PIN_EINK_SCLK 36
#define PIN_EINK_MOSI 47
#define TFT_BL 45 // option , default not backlight

#define I2C_SDA SDA
#define I2C_SCL SCL

// CST328 touch screen (implementation in src/platform/extra_variants/t_deck_pro/variant.cpp)
#define HAS_TOUCHSCREEN 1
#define CST328_PIN_INT 12
#define CST328_PIN_RST 38

#define USE_POWERSAVE
#define SLEEP_TIME 120

// GNNS
#define HAS_GPS 1
#define GPS_BAUDRATE 38400
#define PIN_GPS_EN 39
#define GPS_EN_ACTIVE 1
#define GPS_RX_PIN 44
#define GPS_TX_PIN 43
#define PIN_GPS_PPS 1

#define BUTTON_PIN 0

// vibration motor
#define HAS_DRV2605
#define PIN_DRV_EN 2

// Have SPI interface SD card slot
#define HAS_SDCARD
#define SDCARD_USE_SPI1
#define SPI_MOSI (33)
#define SPI_SCK (36)
#define SPI_MISO (47)
#define SPI_CS (48)
#define SDCARD_CS SPI_CS
#define SD_SPI_FREQUENCY 75000000U

// TCA8418 keyboard
#define KB_BL_PIN 42
#define CANNED_MESSAGE_MODULE_ENABLE 1

// microphone PCM5102A
#define PCM5102A_SCK 47
#define PCM5102A_DIN 17
#define PCM5102A_LRCK 18

// LTR_553ALS light sensor
#define HAS_LTR553ALS

// gyroscope BHI260AP
// #define BOARD_1V8_EN 38 //Deck-Pro remove 1.8v en pin
#define HAS_BHI260AP

// battery charger BQ25896
#define HAS_PPM 1
#define XPOWERS_CHIP_BQ25896

// battery quality management BQ27220
#define HAS_BQ27220 1
#define BQ27220_I2C_SDA SDA
#define BQ27220_I2C_SCL SCL
#define BQ27220_DESIGN_CAPACITY 1400

// LoRa
#define USE_SX1262
#define USE_SX1268

#define LORA_EN 46 // LoRa enable pin
#define LORA_SCK 36
#define LORA_MISO 47
#define LORA_MOSI 33
#define LORA_CS 3

#define LORA_DIO0 -1 // a No connect on the SX1262 module
#define LORA_RESET 4
#define LORA_DIO1 5 // SX1262 IRQ
#define LORA_DIO2 6 // SX1262 BUSY
#define LORA_DIO3 // Not connected on PCB, but internally on the TTGO SX1262, if DIO3 is high the TXCO is enabled

#define SX126X_CS LORA_CS // FIXME - we really should define LORA_CS instead
#define SX126X_DIO1 LORA_DIO1
#define SX126X_BUSY LORA_DIO2
#define SX126X_RESET LORA_RESET
// Not really an E22 but TTGO seems to be trying to clone that
#define SX126X_DIO2_AS_RF_SWITCH
#define SX126X_DIO3_TCXO_VOLTAGE 2.4
// Internally the TTGO module hooks the SX1262-DIO2 in to control the TX/RX switch (which is the default for the sx1262interface
// code)

#define MODEM_POWER_EN 41
#define MODEM_PWRKEY 40
#define MODEM_RST 9
#define MODEM_RI 7
#define MODEM_DTR 8
#define MODEM_RX 10
#define MODEM_TX 11

#define HAS_PHYSICAL_KEYBOARD 1