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
29 changes: 29 additions & 0 deletions boards/heltec_rcc6.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
{
"build": {
"arduino": {
"partitions": "default_16MB.csv"
},
"core": "esp32",
"f_cpu": "160000000L",
"f_flash": "80000000L",
"flash_mode": "qio",
"hwids": [["0x303A", "0x1001"]],
"mcu": "esp32c6",
"variant": "heltec_rcc6"
},
"connectivity": ["bluetooth", "wifi", "lora"],
"debug": {
"openocd_target": "esp32c6.cfg"
},
"frameworks": ["arduino", "espidf"],
"name": "heltec_rcc6",
"upload": {
"flash_size": "16MB",
"maximum_ram_size": 327680,
"maximum_size": 16777216,
"require_upload_port": true,
"speed": 921600
},
"url": "https://heltec.org/",
"vendor": "heltec"
}
2 changes: 2 additions & 0 deletions src/helpers/ESP32Board.h
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,10 @@ class ESP32Board : public mesh::MainBoard {
#ifdef PIN_VBAT_READ
// battery read support
pinMode(PIN_VBAT_READ, INPUT);
#if ESP_ARDUINO_VERSION_MAJOR < 3
adcAttachPin(PIN_VBAT_READ);
#endif
#endif

#ifdef P_LORA_TX_LED
pinMode(P_LORA_TX_LED, OUTPUT);
Expand Down
75 changes: 64 additions & 11 deletions src/helpers/ui/NV3001BDisplay.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,14 @@
#include <Arduino.h>
#include <string.h>

#if NV3001B_USE_FAST_GPIO
#if !defined(CONFIG_IDF_TARGET_ESP32C6)
#error "NV3001B_USE_FAST_GPIO is only supported on ESP32-C6"
#endif
#include <hal/gpio_ll.h>
#include <soc/gpio_struct.h>
#endif

#ifndef SPI_FREQUENCY
#define SPI_FREQUENCY 8000000
#endif
Expand Down Expand Up @@ -202,26 +210,71 @@ static void writeOptionalPin(int pin, int level) {
digitalWrite(pin, level);
}

void NV3001BDisplay::writeCommand(uint8_t cmd) {
void NV3001BDisplay::beginTransport() {
#if NV3001B_USE_SOFTWARE_SPI
pinMode(PIN_TFT_SCL, OUTPUT);
pinMode(PIN_TFT_SDA, OUTPUT);
digitalWrite(PIN_TFT_SCL, LOW);
digitalWrite(PIN_TFT_SDA, LOW);
#else
spi.begin(PIN_TFT_SCL, PIN_TFT_MISO, PIN_TFT_SDA, PIN_TFT_CS);
#endif
}

void NV3001BDisplay::beginTransfer() {
#if NV3001B_USE_SOFTWARE_SPI
digitalWrite(PIN_TFT_SCL, LOW);
#else
spi.beginTransaction(SPISettings(SPI_FREQUENCY, MSBFIRST, SPI_MODE0));
#endif
}

void NV3001BDisplay::transferByte(uint8_t value) {
#if NV3001B_USE_SOFTWARE_SPI
for (uint8_t mask = 0x80; mask != 0; mask >>= 1) {
#if NV3001B_USE_FAST_GPIO
gpio_ll_set_level(&GPIO, PIN_TFT_SDA, (value & mask) ? HIGH : LOW);
gpio_ll_set_level(&GPIO, PIN_TFT_SCL, HIGH);
gpio_ll_set_level(&GPIO, PIN_TFT_SCL, LOW);
#else
digitalWrite(PIN_TFT_SDA, (value & mask) ? HIGH : LOW);
digitalWrite(PIN_TFT_SCL, HIGH);
digitalWrite(PIN_TFT_SCL, LOW);
#endif
}
#else
spi.transfer(value);
#endif
}

void NV3001BDisplay::endTransfer() {
#if NV3001B_USE_SOFTWARE_SPI
digitalWrite(PIN_TFT_SCL, LOW);
#else
spi.endTransaction();
#endif
}

void NV3001BDisplay::writeCommand(uint8_t cmd) {
beginTransfer();
digitalWrite(PIN_TFT_DC, LOW);
digitalWrite(PIN_TFT_CS, LOW);
spi.transfer(cmd);
transferByte(cmd);
digitalWrite(PIN_TFT_CS, HIGH);
spi.endTransaction();
endTransfer();
}

void NV3001BDisplay::writeBytes(const uint8_t* data, size_t len) {
if (!data || len == 0) return;

spi.beginTransaction(SPISettings(SPI_FREQUENCY, MSBFIRST, SPI_MODE0));
beginTransfer();
digitalWrite(PIN_TFT_DC, HIGH);
digitalWrite(PIN_TFT_CS, LOW);
for (size_t i = 0; i < len; i++) {
spi.transfer(data[i]);
transferByte(data[i]);
}
digitalWrite(PIN_TFT_CS, HIGH);
spi.endTransaction();
endTransfer();
}

void NV3001BDisplay::writeCommandData(uint8_t cmd, const uint8_t* data, size_t len) {
Expand Down Expand Up @@ -253,15 +306,15 @@ void NV3001BDisplay::writeColor(uint16_t rgb, uint32_t count) {
uint8_t hi = rgb >> 8;
uint8_t lo = rgb & 0xff;

spi.beginTransaction(SPISettings(SPI_FREQUENCY, MSBFIRST, SPI_MODE0));
beginTransfer();
digitalWrite(PIN_TFT_DC, HIGH);
digitalWrite(PIN_TFT_CS, LOW);
while (count--) {
spi.transfer(hi);
spi.transfer(lo);
transferByte(hi);
transferByte(lo);
}
digitalWrite(PIN_TFT_CS, HIGH);
spi.endTransaction();
endTransfer();
}

void NV3001BDisplay::initPanel() {
Expand Down Expand Up @@ -427,7 +480,7 @@ bool NV3001BDisplay::begin() {
digitalWrite(PIN_TFT_DC, HIGH);
delay(20);

spi.begin(PIN_TFT_SCL, PIN_TFT_MISO, PIN_TFT_SDA, PIN_TFT_CS);
beginTransport();
if (PIN_TFT_RST >= 0) {
pinMode(PIN_TFT_RST, OUTPUT);
digitalWrite(PIN_TFT_RST, HIGH);
Expand Down
33 changes: 30 additions & 3 deletions src/helpers/ui/NV3001BDisplay.h
Original file line number Diff line number Diff line change
@@ -1,9 +1,24 @@
#pragma once

#include "DisplayDriver.h"
#include <SPI.h>
#include <helpers/RefCountedDigitalPin.h>

#ifndef NV3001B_USE_SOFTWARE_SPI
#define NV3001B_USE_SOFTWARE_SPI 0
#endif

#ifndef NV3001B_USE_FAST_GPIO
#define NV3001B_USE_FAST_GPIO 0
#endif

#if NV3001B_USE_FAST_GPIO && !NV3001B_USE_SOFTWARE_SPI
#error "NV3001B_USE_FAST_GPIO requires NV3001B_USE_SOFTWARE_SPI"
#endif

#if !NV3001B_USE_SOFTWARE_SPI
#include <SPI.h>
#endif

#ifndef NV3001B_LOGICAL_WIDTH
#define NV3001B_LOGICAL_WIDTH 128
#endif
Expand All @@ -20,19 +35,25 @@
#define NV3001B_PANEL_HEIGHT 220
#endif

#ifndef NV3001B_SPI_HOST
#if !NV3001B_USE_SOFTWARE_SPI && !defined(NV3001B_SPI_HOST)
#define NV3001B_SPI_HOST HSPI
#endif

class NV3001BDisplay : public DisplayDriver {
#if !NV3001B_USE_SOFTWARE_SPI
SPIClass spi;
#endif
RefCountedDigitalPin* periph_power;
bool is_on = false;
uint16_t color = 0xffff;
uint8_t text_size = 1;
int cursor_x = 0;
int cursor_y = 0;

void beginTransport();
void beginTransfer();
void transferByte(uint8_t value);
void endTransfer();
void writeCommand(uint8_t cmd);
void writeBytes(const uint8_t* data, size_t len);
void writeCommandData(uint8_t cmd, const uint8_t* data, size_t len);
Expand All @@ -44,7 +65,13 @@ class NV3001BDisplay : public DisplayDriver {

public:
NV3001BDisplay(RefCountedDigitalPin* power = nullptr) :
DisplayDriver(NV3001B_LOGICAL_WIDTH, NV3001B_LOGICAL_HEIGHT), spi(NV3001B_SPI_HOST), periph_power(power) { }
DisplayDriver(NV3001B_LOGICAL_WIDTH, NV3001B_LOGICAL_HEIGHT)
#if !NV3001B_USE_SOFTWARE_SPI
,
spi(NV3001B_SPI_HOST)
#endif
,
periph_power(power) { }

bool begin();
static const char* driverName() { return "NV3001B"; }
Expand Down
37 changes: 37 additions & 0 deletions variants/heltec_rcc6/heltec_rcc6.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
#include "heltec_rcc6.h"

void HeltecRCC6Board::begin() {
ESP32Board::begin();

pinMode(PIN_USER_BTN, INPUT_PULLUP);

pinMode(PIN_ADC_CTRL, OUTPUT);
digitalWrite(PIN_ADC_CTRL, LOW);

if (esp_reset_reason() == ESP_RST_DEEPSLEEP) {
gpio_hold_dis((gpio_num_t)P_LORA_NSS);
if (esp_sleep_get_wakeup_cause() == ESP_SLEEP_WAKEUP_GPIO &&
gpio_get_level((gpio_num_t)P_LORA_DIO_1) == HIGH) {
startup_reason = BD_STARTUP_RX_PACKET;
}
}
}

void HeltecRCC6Board::powerOff() {
enterDeepSleep(0);
}

uint16_t HeltecRCC6Board::getBattMilliVolts() {
analogReadResolution(12);
analogSetAttenuation(ADC_2_5db);
digitalWrite(PIN_ADC_CTRL, ADC_CTRL_ENABLED);
delay(10);
uint32_t raw = 0;
for (int i = 0; i < 8; i++) {
raw += analogReadMilliVolts(PIN_VBAT_READ);
}
raw = raw / 8;
digitalWrite(PIN_ADC_CTRL, !ADC_CTRL_ENABLED);

return (adcMultiplier * raw);
}
25 changes: 25 additions & 0 deletions variants/heltec_rcc6/heltec_rcc6.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
#pragma once

#include <Arduino.h>
#include <helpers/ESP32Board.h>

#ifndef ADC_MULTIPLIER
#define ADC_MULTIPLIER 4.95f
#endif

class HeltecRCC6Board : public ESP32Board {
float adcMultiplier = ADC_MULTIPLIER;

public:
void begin();
void powerOff() override;
uint16_t getBattMilliVolts() override;

bool setAdcMultiplier(float multiplier) override {
adcMultiplier = multiplier == 0.0f ? ADC_MULTIPLIER : multiplier;
return true;
}

float getAdcMultiplier() const override { return adcMultiplier; }
const char *getManufacturerName() const override { return "heltec_rcc6"; }
};
20 changes: 20 additions & 0 deletions variants/heltec_rcc6/pins_arduino.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
#ifndef PINS_ARDUINO_H
#define PINS_ARDUINO_H

#include <stdint.h>

#define USB_VID 0x303A
#define USB_PID 0x1001

static const uint8_t TX = 16;
static const uint8_t RX = 17;

static const int8_t SDA = -1;
static const int8_t SCL = -1;

static const uint8_t MISO = 20;
static const uint8_t SCK = 21;
static const uint8_t MOSI = 22;
static const uint8_t SS = 23;

#endif
Loading