[st7701s] Add delay feature in init sequences (#7343)

This commit is contained in:
Clyde Stubbs 2024-08-30 06:27:35 +10:00 committed by GitHub
parent 725e50348b
commit d754bdde1b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 61 additions and 52 deletions

View File

@ -1,47 +1,39 @@
import esphome.codegen as cg
import esphome.config_validation as cv
from esphome import pins from esphome import pins
from esphome.components import ( import esphome.codegen as cg
spi, from esphome.components import display, spi
display, from esphome.components.esp32 import const, only_on_variant
)
from esphome.const import (
CONF_DC_PIN,
CONF_HSYNC_PIN,
CONF_RESET_PIN,
CONF_DATA_PINS,
CONF_ID,
CONF_DIMENSIONS,
CONF_VSYNC_PIN,
CONF_WIDTH,
CONF_HEIGHT,
CONF_LAMBDA,
CONF_MIRROR_X,
CONF_MIRROR_Y,
CONF_COLOR_ORDER,
CONF_TRANSFORM,
CONF_OFFSET_HEIGHT,
CONF_OFFSET_WIDTH,
CONF_INVERT_COLORS,
CONF_RED,
CONF_GREEN,
CONF_BLUE,
CONF_NUMBER,
CONF_IGNORE_STRAPPING_WARNING,
)
from esphome.components.esp32 import (
only_on_variant,
const,
)
from esphome.components.rpi_dpi_rgb.display import ( from esphome.components.rpi_dpi_rgb.display import (
CONF_PCLK_FREQUENCY, CONF_PCLK_FREQUENCY,
CONF_PCLK_INVERTED, CONF_PCLK_INVERTED,
) )
from .init_sequences import ( import esphome.config_validation as cv
ST7701S_INITS, from esphome.const import (
cmd, CONF_BLUE,
CONF_COLOR_ORDER,
CONF_DATA_PINS,
CONF_DC_PIN,
CONF_DIMENSIONS,
CONF_GREEN,
CONF_HEIGHT,
CONF_HSYNC_PIN,
CONF_ID,
CONF_IGNORE_STRAPPING_WARNING,
CONF_INVERT_COLORS,
CONF_LAMBDA,
CONF_MIRROR_X,
CONF_MIRROR_Y,
CONF_NUMBER,
CONF_OFFSET_HEIGHT,
CONF_OFFSET_WIDTH,
CONF_RED,
CONF_RESET_PIN,
CONF_TRANSFORM,
CONF_VSYNC_PIN,
CONF_WIDTH,
) )
from esphome.core import TimePeriod
from .init_sequences import ST7701S_INITS, cmd
CONF_INIT_SEQUENCE = "init_sequence" CONF_INIT_SEQUENCE = "init_sequence"
CONF_DE_PIN = "de_pin" CONF_DE_PIN = "de_pin"
@ -59,6 +51,7 @@ DEPENDENCIES = ["spi", "esp32"]
st7701s_ns = cg.esphome_ns.namespace("st7701s") st7701s_ns = cg.esphome_ns.namespace("st7701s")
ST7701S = st7701s_ns.class_("ST7701S", display.Display, cg.Component, spi.SPIDevice) ST7701S = st7701s_ns.class_("ST7701S", display.Display, cg.Component, spi.SPIDevice)
ColorOrder = display.display_ns.enum("ColorMode") ColorOrder = display.display_ns.enum("ColorMode")
ST7701S_DELAY_FLAG = 0xFF
COLOR_ORDERS = { COLOR_ORDERS = {
"RGB": ColorOrder.COLOR_ORDER_RGB, "RGB": ColorOrder.COLOR_ORDER_RGB,
@ -93,18 +86,23 @@ def map_sequence(value):
""" """
An initialisation sequence can be selected from one of the pre-defined sequences in init_sequences.py, An initialisation sequence can be selected from one of the pre-defined sequences in init_sequences.py,
or can be a literal array of data bytes. or can be a literal array of data bytes.
The format is a repeated sequence of [CMD, LEN, <data>] where <data> is LEN bytes. The format is a repeated sequence of [CMD, <data>] where <data> is s a sequence of bytes. The length is inferred
from the length of the sequence and should not be explicit.
A delay can be inserted by specifying "- delay N" where N is in ms
""" """
if isinstance(value, str) and value.lower().startswith("delay "):
value = value.lower()[6:]
delay = cv.All(
cv.positive_time_period_milliseconds,
cv.Range(TimePeriod(milliseconds=1), TimePeriod(milliseconds=255)),
)(value)
return [delay, ST7701S_DELAY_FLAG]
if not isinstance(value, list): if not isinstance(value, list):
value = cv.int_(value) value = cv.int_(value)
value = cv.one_of(*ST7701S_INITS)(value) value = cv.one_of(*ST7701S_INITS)(value)
return ST7701S_INITS[value] return ST7701S_INITS[value]
# value = cv.ensure_list(cv.uint8_t)(value) value = cv.Length(min=1, max=254)(value)
data_length = len(value) return cmd(*value)
if data_length == 0:
raise cv.Invalid("Empty sequence")
value = cmd(*value)
return value
CONFIG_SCHEMA = cv.All( CONFIG_SCHEMA = cv.All(

View File

@ -138,11 +138,16 @@ void ST7701S::write_init_sequence_() {
for (size_t i = 0; i != this->init_sequence_.size();) { for (size_t i = 0; i != this->init_sequence_.size();) {
uint8_t cmd = this->init_sequence_[i++]; uint8_t cmd = this->init_sequence_[i++];
size_t len = this->init_sequence_[i++]; size_t len = this->init_sequence_[i++];
this->write_sequence_(cmd, len, &this->init_sequence_[i]); if (len == ST7701S_DELAY_FLAG) {
i += len; ESP_LOGV(TAG, "Delay %dms", cmd);
esph_log_v(TAG, "Command %X, %d bytes", cmd, len); delay(cmd);
if (cmd == SW_RESET_CMD) } else {
delay(6); this->write_sequence_(cmd, len, &this->init_sequence_[i]);
i += len;
ESP_LOGV(TAG, "Command %X, %d bytes", cmd, len);
if (cmd == SW_RESET_CMD)
delay(6);
}
} }
// st7701 does not appear to support axis swapping // st7701 does not appear to support axis swapping
this->write_sequence_(CMD2_BKSEL, sizeof(CMD2_BK0), CMD2_BK0); this->write_sequence_(CMD2_BKSEL, sizeof(CMD2_BK0), CMD2_BK0);
@ -153,7 +158,7 @@ void ST7701S::write_init_sequence_() {
val |= 0x10; val |= 0x10;
this->write_command_(MADCTL_CMD); this->write_command_(MADCTL_CMD);
this->write_data_(val); this->write_data_(val);
esph_log_d(TAG, "write MADCTL %X", val); ESP_LOGD(TAG, "write MADCTL %X", val);
this->write_command_(this->invert_colors_ ? INVERT_ON : INVERT_OFF); this->write_command_(this->invert_colors_ ? INVERT_ON : INVERT_OFF);
this->set_timeout(120, [this] { this->set_timeout(120, [this] {
this->write_command_(SLEEP_OUT); this->write_command_(SLEEP_OUT);

View File

@ -25,6 +25,7 @@ const uint8_t INVERT_ON = 0x21;
const uint8_t DISPLAY_ON = 0x29; const uint8_t DISPLAY_ON = 0x29;
const uint8_t CMD2_BKSEL = 0xFF; const uint8_t CMD2_BKSEL = 0xFF;
const uint8_t CMD2_BK0[5] = {0x77, 0x01, 0x00, 0x00, 0x10}; const uint8_t CMD2_BK0[5] = {0x77, 0x01, 0x00, 0x00, 0x10};
const uint8_t ST7701S_DELAY_FLAG = 0xFF;
class ST7701S : public display::Display, class ST7701S : public display::Display,
public spi::SPIDevice<spi::BIT_ORDER_MSB_FIRST, spi::CLOCK_POLARITY_LOW, spi::CLOCK_PHASE_LEADING, public spi::SPIDevice<spi::BIT_ORDER_MSB_FIRST, spi::CLOCK_POLARITY_LOW, spi::CLOCK_PHASE_LEADING,

View File

@ -38,7 +38,12 @@ display:
hsync_pin: 16 hsync_pin: 16
vsync_pin: 17 vsync_pin: 17
pclk_pin: 21 pclk_pin: 21
init_sequence: 1 init_sequence:
- 1
- [0x23, 0xA, 0xB]
- delay 20ms
- [0x23, 0xA, 0xB]
- delay 0.2s
data_pins: data_pins:
- number: 0 - number: 0
ignore_strapping_warning: true ignore_strapping_warning: true