Skip to content
Draft
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
12 changes: 12 additions & 0 deletions src/AudioThread.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,10 @@
extern ExtensionIOXL9555 io;
#endif

#ifdef T_DECK_MAX
void tDeckMaxSetAudioAmp(bool enable);
#endif

#define AUDIO_THREAD_INTERVAL_MS 100

class AudioThread : public concurrency::OSThread
Expand All @@ -28,6 +32,8 @@ class AudioThread : public concurrency::OSThread
{
#ifdef T_LORA_PAGER
io.digitalWrite(EXPANDS_AMP_EN, HIGH);
#elif defined(T_DECK_MAX)
tDeckMaxSetAudioAmp(true);
#endif
setCPUFast(true);
rtttlFile = std::unique_ptr<AudioFileSourcePROGMEM>(new AudioFileSourcePROGMEM(data, len));
Expand Down Expand Up @@ -56,6 +62,8 @@ class AudioThread : public concurrency::OSThread
setCPUFast(false);
#ifdef T_LORA_PAGER
io.digitalWrite(EXPANDS_AMP_EN, LOW);
#elif defined(T_DECK_MAX)
tDeckMaxSetAudioAmp(false);
#endif
}

Expand All @@ -68,12 +76,16 @@ class AudioThread : public concurrency::OSThread

#ifdef T_LORA_PAGER
io.digitalWrite(EXPANDS_AMP_EN, HIGH);
#elif defined(T_DECK_MAX)
tDeckMaxSetAudioAmp(true);
#endif
auto sam = std::unique_ptr<ESP8266SAM>(new ESP8266SAM);
sam->Say(audioOut.get(), text);
setCPUFast(false);
#ifdef T_LORA_PAGER
io.digitalWrite(EXPANDS_AMP_EN, LOW);
#elif defined(T_DECK_MAX)
tDeckMaxSetAudioAmp(false);
#endif
}

Expand Down
29 changes: 25 additions & 4 deletions src/Power.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1640,23 +1640,43 @@ bool Power::cw2015Init()
#endif

#if defined(HAS_PPM) && HAS_PPM
#if defined(XPOWERS_CHIP_SY6970) && !defined(SY6970_SLAVE_ADDRESS)
#define SY6970_SLAVE_ADDRESS 0x6A
#endif

/**
* Adapter class for BQ25896/BQ27220 Lipo battery charger.
* Adapter class for XPowers charger/BQ27220 Lipo battery reporting.
*/
class LipoCharger : public HasBatteryLevel
{
private:
BQ27220 *bq = nullptr;

public:
/**
* Init the I2C BQ25896 Lipo battery charger
*/
bool runOnce()
{
if (PPM == nullptr) {
PPM = new XPowersPPM;
#if defined(XPOWERS_CHIP_SY6970)
bool result = PPM->init(Wire, I2C_SDA, I2C_SCL, SY6970_SLAVE_ADDRESS);
if (result) {
LOG_INFO("PPM SY6970 init succeeded");

PPM->setSysPowerDownVoltage(3300);
PPM->setInputCurrentLimit(3250);
PPM->disableCurrentLimitPin();
PPM->setChargeTargetVoltage(4208);
PPM->setPrechargeCurr(64);
PPM->setChargerConstantCurr(1024);
PPM->enableMeasure();
PPM->enableCharge();
} else {
LOG_WARN("PPM SY6970 init failed");
delete PPM;
PPM = nullptr;
return false;
}
#else
bool result = PPM->init(Wire, I2C_SDA, I2C_SCL, BQ25896_ADDR);
if (result) {
LOG_INFO("PPM BQ25896 init succeeded");
Expand Down Expand Up @@ -1693,6 +1713,7 @@ class LipoCharger : public HasBatteryLevel
PPM = nullptr;
return false;
}
#endif
}
if (bq == nullptr) {
bq = new BQ27220;
Expand Down
9 changes: 8 additions & 1 deletion src/detect/ScanI2CTwoWire.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -633,7 +633,14 @@ void ScanI2CTwoWire::scanPort(I2CPort port, uint8_t *address, uint8_t asize)

break;

SCAN_SIMPLE_CASE(LSM6DS3_ADDR, LSM6DS3, "LSM6DS3", (uint8_t)addr.address);
case LSM6DS3_ADDR:
#ifdef T_DECK_MAX
LOG_INFO("SY6970 charger found at address 0x%x", (uint8_t)addr.address);
#else
type = LSM6DS3;
logFoundDevice("LSM6DS3", (uint8_t)addr.address);
#endif
break;
SCAN_SIMPLE_CASE(VEML7700_ADDR, VEML7700, "VEML7700", (uint8_t)addr.address);
case TCA9555_ADDR:
registerValue = getRegisterValue(ScanI2CTwoWire::RegisterLocation(addr, 0x01), 1);
Expand Down
19 changes: 19 additions & 0 deletions src/graphics/EInkDisplay2.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -243,6 +243,25 @@ bool EInkDisplay::connect()
adafruitDisplay->setRotation(0);
adafruitDisplay->setPartialWindow(0, 0, EINK_WIDTH, EINK_HEIGHT);
}
#elif defined(T_DECK_MAX)
pinMode(PIN_EINK_CS, OUTPUT);
digitalWrite(PIN_EINK_CS, HIGH);
#ifdef SDCARD_CS
pinMode(SDCARD_CS, OUTPUT);
digitalWrite(SDCARD_CS, HIGH);
#endif
#ifdef LORA_CS
pinMode(LORA_CS, OUTPUT);
digitalWrite(LORA_CS, HIGH);
#endif

LOG_INFO("T-Deck Max EPD init cs=%d dc=%d rst=%d busy=%d sck=%d mosi=%d", PIN_EINK_CS, PIN_EINK_DC, PIN_EINK_RES,
PIN_EINK_BUSY, PIN_EINK_SCLK, PIN_EINK_MOSI);
auto lowLevel = new EINK_DISPLAY_MODEL(PIN_EINK_CS, PIN_EINK_DC, PIN_EINK_RES, PIN_EINK_BUSY);
adafruitDisplay = new GxEPD2_BW<EINK_DISPLAY_MODEL, EINK_DISPLAY_MODEL::HEIGHT>(*lowLevel);
adafruitDisplay->init(115200, true, 2, false, SPI, SPISettings(4000000, MSBFIRST, SPI_MODE0));
adafruitDisplay->setRotation(0);
adafruitDisplay->setPartialWindow(0, 0, EINK_WIDTH, EINK_HEIGHT);
#elif defined(M5_COREINK) || defined(T_DECK_PRO)
auto lowLevel = new EINK_DISPLAY_MODEL(PIN_EINK_CS, PIN_EINK_DC, PIN_EINK_RES, PIN_EINK_BUSY);
adafruitDisplay = new GxEPD2_BW<EINK_DISPLAY_MODEL, EINK_DISPLAY_MODEL::HEIGHT>(*lowLevel);
Expand Down
4 changes: 2 additions & 2 deletions src/graphics/EInkDisplay2.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,9 @@
#include "GxEPD2Multi.h"
#endif

// Limit how often we push a full E-Ink refresh. T-Deck Pro needs faster updates for typing.
// Limit how often we push a full E-Ink refresh. T-Deck Pro/Max need faster updates for typing.
#ifndef EINK_FORCE_DISPLAY_THROTTLE_MS
#if defined(T_DECK_PRO)
#if defined(T_DECK_PRO) || defined(T_DECK_MAX)
#define EINK_FORCE_DISPLAY_THROTTLE_MS 200
#else
#define EINK_FORCE_DISPLAY_THROTTLE_MS 1000
Expand Down
10 changes: 8 additions & 2 deletions src/graphics/Screen.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ extern MessageStore messageStore;
#include "platform/portduino/PortduinoGlue.h"
#endif

#if defined(T_LORA_PAGER)
#if defined(T_LORA_PAGER) || defined(T_DECK_MAX)
// KB backlight control
#include "input/cardKbI2cImpl.h"
#endif
Expand Down Expand Up @@ -541,6 +541,8 @@ void Screen::handleSetOn(bool on, FrameCallback einkScreensaver)
#ifdef PIN_EINK_EN
if (uiconfig.screen_brightness == 1)
digitalWrite(PIN_EINK_EN, HIGH);
#elif defined(HAS_EINK_FRONTLIGHT) && defined(PIN_EINK_BL)
analogWrite(PIN_EINK_BL, brightness);
#elif defined(PCA_PIN_EINK_EN)
if (uiconfig.screen_brightness > 0)
io.digitalWrite(PCA_PIN_EINK_EN, HIGH);
Expand Down Expand Up @@ -585,6 +587,8 @@ void Screen::handleSetOn(bool on, FrameCallback einkScreensaver)

#ifdef PIN_EINK_EN
digitalWrite(PIN_EINK_EN, LOW);
#elif defined(HAS_EINK_FRONTLIGHT) && defined(PIN_EINK_BL)
analogWrite(PIN_EINK_BL, 0);
#elif defined(PCA_PIN_EINK_EN)
io.digitalWrite(PCA_PIN_EINK_EN, LOW);
#endif
Expand Down Expand Up @@ -697,6 +701,8 @@ void Screen::setup()
// Apply loaded brightness
#if defined(ST7789_CS)
static_cast<TFTDisplay *>(dispdev)->setDisplayBrightness(brightness);
#elif defined(HAS_EINK_FRONTLIGHT) && defined(PIN_EINK_BL)
analogWrite(PIN_EINK_BL, brightness);
#elif defined(USE_OLED) || defined(USE_SSD1306) || defined(USE_SH1106) || defined(USE_SH1107) || defined(USE_SPISSD1306)
dispdev->setBrightness(brightness);
#endif
Expand Down Expand Up @@ -805,7 +811,7 @@ void Screen::setup()

void Screen::setOn(bool on, FrameCallback einkScreensaver)
{
#if defined(T_LORA_PAGER)
#if defined(T_LORA_PAGER) || defined(T_DECK_MAX)
if (cardKbI2cImpl)
cardKbI2cImpl->toggleBacklight(on);
#endif
Expand Down
2 changes: 2 additions & 0 deletions src/graphics/draw/MenuHandler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2131,6 +2131,8 @@ void menuHandler::BrightnessPickerMenu()
#if defined(HELTEC_MESH_NODE_T114) || defined(HELTEC_VISION_MASTER_T190)
// For HELTEC devices, use analogWrite to control backlight
analogWrite(VTFT_LEDA, uiconfig.screen_brightness);
#elif defined(HAS_EINK_FRONTLIGHT) && defined(PIN_EINK_BL)
analogWrite(PIN_EINK_BL, uiconfig.screen_brightness);
#elif defined(ST7789_CS) || defined(ST7796_CS)
static_cast<TFTDisplay *>(screen->getDisplayDevice())->setDisplayBrightness(uiconfig.screen_brightness);
#elif defined(USE_OLED) || defined(USE_SSD1306) || defined(USE_SH1106) || defined(USE_SH1107)
Expand Down
4 changes: 2 additions & 2 deletions src/input/TDeckProKeyboard.cpp
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
#if defined(T_DECK_PRO)
#if defined(T_DECK_PRO) || defined(T_DECK_MAX)

#include "TDeckProKeyboard.h"

Expand Down Expand Up @@ -192,4 +192,4 @@ bool TDeckProKeyboard::isModifierKey(uint8_t key)
return (key == modifierRightShiftKey || key == modifierLeftShiftKey || key == modifierAltKey || key == modifierSymKey);
}

#endif // T_DECK_PRO
#endif // T_DECK_PRO || T_DECK_MAX
2 changes: 1 addition & 1 deletion src/input/TouchScreenBase.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -186,7 +186,7 @@ int32_t TouchScreenBase::runOnce()

void TouchScreenBase::hapticFeedback()
{
#ifdef T_WATCH_S3
#if defined(T_WATCH_S3) || defined(T_DECK_MAX)
drv.setWaveform(0, 75);
drv.setWaveform(1, 0); // end waveform
drv.go();
Expand Down
6 changes: 3 additions & 3 deletions src/input/kbI2cBase.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
#include "detect/ScanI2C.h"
#include "detect/ScanI2CTwoWire.h"

#if defined(T_DECK_PRO)
#if defined(T_DECK_PRO) || defined(T_DECK_MAX)
#include "TDeckProKeyboard.h"
#elif defined(T_LORA_PAGER)
#include "TLoraPagerKeyboard.h"
Expand All @@ -20,7 +20,7 @@ extern uint8_t kb_model;

KbI2cBase::KbI2cBase(const char *name)
: concurrency::OSThread(name),
#if defined(T_DECK_PRO)
#if defined(T_DECK_PRO) || defined(T_DECK_MAX)
TCAKeyboard(*(new TDeckProKeyboard()))
#elif defined(T_LORA_PAGER)
TCAKeyboard(*(new TLoraPagerKeyboard()))
Expand Down Expand Up @@ -550,7 +550,7 @@ int32_t KbI2cBase::runOnce()

void KbI2cBase::toggleBacklight(bool on)
{
#if defined(T_LORA_PAGER)
#if defined(T_LORA_PAGER) || defined(T_DECK_MAX)
TCAKeyboard.setBacklight(on);
#endif
}
2 changes: 2 additions & 0 deletions src/mesh/generated/meshtastic/mesh.pb.h
Original file line number Diff line number Diff line change
Expand Up @@ -325,6 +325,8 @@ typedef enum _meshtastic_HardwareModel {
meshtastic_HardwareModel_T_IMPULSE_PLUS = 135,
/* Lilygo T-Echo Card */
meshtastic_HardwareModel_T_ECHO_CARD = 136,
/* Lilygo T-Deck Max */
meshtastic_HardwareModel_T_DECK_MAX = 139,
/* ------------------------------------------------------------------------------------------------------------------------------------------
Reserved ID For developing private Ports. These will show up in live traffic sparsely, so we can use a high number. Keep it within 8 bits.
------------------------------------------------------------------------------------------------------------------------------------------ */
Expand Down
4 changes: 3 additions & 1 deletion src/platform/esp32/architecture.h
Original file line number Diff line number Diff line change
Expand Up @@ -196,6 +196,8 @@
#define HW_VENDOR meshtastic_HardwareModel_LINK_32
#elif defined(T_DECK_PRO)
#define HW_VENDOR meshtastic_HardwareModel_T_DECK_PRO
#elif defined(T_DECK_MAX)
#define HW_VENDOR meshtastic_HardwareModel_T_DECK_MAX
#elif defined(T_BEAM_1W)
#define HW_VENDOR meshtastic_HardwareModel_TBEAM_1_WATT
#elif defined(T_LORA_PAGER)
Expand Down Expand Up @@ -242,4 +244,4 @@
// Setup flag, which indicates if our device supports dynamic light sleep
#if defined(HAS_ESP32_PM_SUPPORT) && defined(CONFIG_FREERTOS_USE_TICKLESS_IDLE)
#define HAS_ESP32_DYNAMIC_LIGHT_SLEEP 1
#endif
#endif
16 changes: 16 additions & 0 deletions src/platform/esp32/main-esp32.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -249,6 +249,22 @@ void cpuDeepSleep(uint32_t msecToWake)
#endif
#ifdef BUTTON_NEED_PULLUP
gpio_pullup_en((gpio_num_t)BUTTON_PIN);
#endif
#if defined(T_DECK_MAX) && SOC_RTCIO_HOLD_SUPPORTED && SOC_PM_SUPPORT_EXT_WAKEUP
#ifdef KB_INT
if (rtc_gpio_is_valid_gpio((gpio_num_t)KB_INT)) {
gpioMask |= (1ULL << KB_INT);
gpio_pullup_en((gpio_num_t)KB_INT);
LOG_INFO("setup KB_INT (GPIO%02d) for deep sleep wake", KB_INT);
}
#endif
#if defined(WAKE_ON_TOUCH) && defined(SCREEN_TOUCH_INT)
if (rtc_gpio_is_valid_gpio((gpio_num_t)SCREEN_TOUCH_INT)) {
gpioMask |= (1ULL << SCREEN_TOUCH_INT);
gpio_pullup_en((gpio_num_t)SCREEN_TOUCH_INT);
LOG_INFO("setup TOUCH_INT (GPIO%02d) for deep sleep wake", SCREEN_TOUCH_INT);
}
#endif
#endif

// Not needed because both of the current boards have external pullups
Expand Down
Loading