mirror of
				https://github.com/esphome/esphome.git
				synced 2025-11-04 00:51:49 +00:00 
			
		
		
		
	[st7701s] Add delay feature in init sequences (#7343)
This commit is contained in:
		@@ -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(
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user