from esphome.components.mipi import ( MADCTL, MADCTL_ML, MADCTL_XFLIP, MODE_BGR, DriverChip, ) from esphome.config_validation import UNDEFINED from esphome.const import CONF_COLOR_ORDER, CONF_HEIGHT, CONF_MIRROR_X, CONF_MIRROR_Y SDIR_CMD = 0xC7 class ST7701S(DriverChip): # The ST7701s does not use the standard MADCTL bits for x/y mirroring def add_madctl(self, sequence: list, config: dict): transform = self.get_transform(config) madctl = 0x00 if config[CONF_COLOR_ORDER] == MODE_BGR: madctl |= 0x08 if transform.get(CONF_MIRROR_Y): madctl |= MADCTL_ML sequence.append((MADCTL, madctl)) sdir = 0 if transform.get(CONF_MIRROR_X): sdir |= 0x04 # XFLIP doesn't do anything in the ST7701S, # it's set in the madctl byte just so it can be reported at runtime by logconfig madctl |= MADCTL_XFLIP sequence.append((SDIR_CMD, sdir)) return madctl @property def transforms(self) -> set[str]: """ The ST7701 never supports axis swapping, and mirroring the y-axis only works for full height. """ if self.get_default(CONF_HEIGHT) != 864: return {CONF_MIRROR_X} return {CONF_MIRROR_X, CONF_MIRROR_Y} # fmt: off st7701s = ST7701S( "ST7701S", width=480, height=864, swap_xy=UNDEFINED, hsync_front_porch=20, hsync_back_porch=10, hsync_pulse_width=10, vsync_front_porch=10, vsync_back_porch=10, vsync_pulse_width=10, pclk_frequency="16MHz", pclk_inverted=True, initsequence=( (0x01,), # Software Reset (0xFF, 0x77, 0x01, 0x00, 0x00, 0x10), # Page 0 (0xC0, 0x3B, 0x00), (0xC1, 0x0D, 0x02), (0xC2, 0x31, 0x05), (0xB0, 0x00, 0x11, 0x18, 0x0E, 0x11, 0x06, 0x07, 0x08, 0x07, 0x22, 0x04, 0x12, 0x0F, 0xAA, 0x31, 0x18,), (0xB1, 0x00, 0x11, 0x19, 0x0E, 0x12, 0x07, 0x08, 0x08, 0x08, 0x22, 0x04, 0x11, 0x11, 0xA9, 0x32, 0x18,), (0xFF, 0x77, 0x01, 0x00, 0x00, 0x11), # page 1 (0xB0, 0x60), (0xB1, 0x32), (0xB2, 0x07), (0xB3, 0x80), (0xB5, 0x49), (0xB7, 0x85), (0xB8, 0x21), (0xC1, 0x78), (0xC2, 0x78), (0xE0, 0x00, 0x1B, 0x02), (0xE1, 0x08, 0xA0, 0x00, 0x00, 0x07, 0xA0, 0x00, 0x00, 0x00, 0x44, 0x44), (0xE2, 0x11, 0x11, 0x44, 0x44, 0xED, 0xA0, 0x00, 0x00, 0xEC, 0xA0, 0x00, 0x00), (0xE3, 0x00, 0x00, 0x11, 0x11), (0xE4, 0x44, 0x44), (0xE5, 0x0A, 0xE9, 0xD8, 0xA0, 0x0C, 0xEB, 0xD8, 0xA0, 0x0E, 0xED, 0xD8, 0xA0, 0x10, 0xEF, 0xD8, 0xA0,), (0xE6, 0x00, 0x00, 0x11, 0x11), (0xE7, 0x44, 0x44), (0xE8, 0x09, 0xE8, 0xD8, 0xA0, 0x0B, 0xEA, 0xD8, 0xA0, 0x0D, 0xEC, 0xD8, 0xA0, 0x0F, 0xEE, 0xD8, 0xA0,), (0xEB, 0x02, 0x00, 0xE4, 0xE4, 0x88, 0x00, 0x40), (0xEC, 0x3C, 0x00), (0xED, 0xAB, 0x89, 0x76, 0x54, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x20, 0x45, 0x67, 0x98, 0xBA,), (0xFF, 0x77, 0x01, 0x00, 0x00, 0x13), # Page 3 (0xE5, 0xE4), (0xFF, 0x77, 0x01, 0x00, 0x00, 0x10), # Page 0 (0xCD, 0x08), ) ) st7701s.extend( "MAKERFABS-4", width=480, height=480, invert_colors=True, pixel_mode="18bit", cs_pin=1, de_pin={ "number": 45, "ignore_strapping_warning": True }, hsync_pin=5, vsync_pin=4, pclk_pin=21, data_pins={ "red": [39, 40, 41, 42, 2], "green": [0, 9, 14, 47, 48, 3], "blue": [6, 7, 15, 16, 8] } ) st7701s.extend( "SEEED-INDICATOR-D1", width=480, height=480, mirror_x=True, mirror_y=True, invert_colors=True, pixel_mode="18bit", spi_mode="MODE3", data_rate="2MHz", hsync_front_porch=10, hsync_pulse_width=8, hsync_back_porch=50, vsync_front_porch=10, vsync_pulse_width=8, vsync_back_porch=20, cs_pin={"pca9554": None, "number": 4}, de_pin=18, hsync_pin=16, vsync_pin=17, pclk_pin=21, pclk_inverted=False, data_pins={ "red": [4, 3, 2, 1, 0], "green": [10, 9, 8, 7, 6, 5], "blue": [15, 14, 13, 12, 11] }, ) st7701s.extend( "UEDX48480021-MD80ET", width=480, height=480, pixel_mode="18bit", cs_pin=18, reset_pin=8, de_pin=17, vsync_pin={"number": 3, "ignore_strapping_warning": True}, hsync_pin={"number": 46, "ignore_strapping_warning": True}, pclk_pin=9, data_pins={ "red": [40, 41, 42, 2, 1], "green": [21, 47, 48, 45, 38, 39], "blue": [10, 11, {"number": 12, "allow_other_uses": True}, {"number": 13, "allow_other_uses": True}, 14] }, initsequence=( (0xFF, 0x77, 0x01, 0x00, 0x00, 0x13), (0xEF, 0x08), (0xFF, 0x77, 0x01, 0x00, 0x00, 0x10), (0xC0, 0x3B, 0x00), (0xC1, 0x0B, 0x02), (0xC2, 0x07, 0x02), (0xC7, 0x00), (0xCC, 0x10), (0xCD, 0x08), (0xB0, 0x00, 0x11, 0x16, 0x0E, 0x11, 0x06, 0x05, 0x09, 0x08, 0x21, 0x06, 0x13, 0x10, 0x29, 0x31, 0x18), (0xB1, 0x00, 0x11, 0x16, 0x0E, 0x11, 0x07, 0x05, 0x09, 0x09, 0x21, 0x05, 0x13, 0x11, 0x2A, 0x31, 0x18), (0xFF, 0x77, 0x01, 0x00, 0x00, 0x11), (0xB0, 0x6D), (0xB1, 0x37), (0xB2, 0x8B), (0xB3, 0x80), (0xB5, 0x43), (0xB7, 0x85), (0xB8, 0x20), (0xC0, 0x09), (0xC1, 0x78), (0xC2, 0x78), (0xD0, 0x88), (0xE0, 0x00, 0x00, 0x02), (0xE1, 0x03, 0xA0, 0x00, 0x00, 0x04, 0xA0, 0x00, 0x00, 0x00, 0x20, 0x20), (0xE2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), (0xE3, 0x00, 0x00, 0x11, 0x00), (0xE4, 0x22, 0x00), (0xE5, 0x05, 0xEC, 0xF6, 0xCA, 0x07, 0xEE, 0xF6, 0xCA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), (0xE6, 0x00, 0x00, 0x11, 0x00), (0xE7, 0x22, 0x00), (0xE8, 0x06, 0xED, 0xF6, 0xCA, 0x08, 0xEF, 0xF6, 0xCA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), (0xE9, 0x36, 0x00), (0xEB, 0x00, 0x00, 0x40, 0x40, 0x00, 0x00, 0x00), (0xED, 0xFF, 0xFF, 0xFF, 0xBA, 0x0A, 0xFF, 0x45, 0xFF, 0xFF, 0x54, 0xFF, 0xA0, 0xAB, 0xFF, 0xFF, 0xFF), (0xEF, 0x08, 0x08, 0x08, 0x45, 0x3F, 0x54), (0xFF, 0x77, 0x01, 0x00, 0x00, 0x13), (0xE8, 0x00, 0x0E), (0xFF, 0x77, 0x01, 0x00, 0x00, 0x00), (0x11, 0x00), (0xFF, 0x77, 0x01, 0x00, 0x00, 0x13), (0xE8, 0x00, 0x0C), (0xE8, 0x00, 0x00), (0xFF, 0x77, 0x01, 0x00, 0x00, 0x00) ) ) st7701s.extend( "ZX2D10GE01R-V4848", width=480, height=480, pixel_mode="18bit", cs_pin=21, de_pin=39, vsync_pin=48, hsync_pin=40, pclk_pin={"number": 45, "ignore_strapping_warning": True}, pclk_frequency="15MHz", pclk_inverted=True, hsync_pulse_width=10, hsync_back_porch=10, hsync_front_porch=10, vsync_pulse_width=2, vsync_back_porch=12, vsync_front_porch=14, data_pins={ "red": [10, 16, 9, 15, 46], "green": [8, 13, 18, 12, 11, 17], "blue": [{"number": 47, "allow_other_uses": True}, {"number": 41, "allow_other_uses": True}, 0, 42, 14] }, initsequence=( (0xFF, 0x77, 0x01, 0x00, 0x00, 0x13), (0xEF, 0x08), (0xFF, 0x77, 0x01, 0x00, 0x00, 0x10), (0xC0, 0x3B, 0x00), (0xC1, 0x0B, 0x02), (0xC2, 0x07, 0x02), (0xCC, 0x10), (0xCD, 0x08), (0xB0, 0x00, 0x11, 0x16, 0x0e, 0x11, 0x06, 0x05, 0x09, 0x08, 0x21, 0x06, 0x13, 0x10, 0x29, 0x31, 0x18), (0xB1, 0x00, 0x11, 0x16, 0x0e, 0x11, 0x07, 0x05, 0x09, 0x09, 0x21, 0x05, 0x13, 0x11, 0x2a, 0x31, 0x18), (0xFF, 0x77, 0x01, 0x00, 0x00, 0x11), (0xB0, 0x6d), (0xB1, 0x37), (0xB2, 0x81), (0xB3, 0x80), (0xB5, 0x43), (0xB7, 0x85), (0xB8, 0x20), (0xC1, 0x78), (0xC2, 0x78), (0xD0, 0x88), (0xE0, 0x00, 0x00, 0x02), (0xE1, 0x03, 0xA0, 0x00, 0x00, 0x04, 0xA0, 0x00, 0x00, 0x00, 0x20, 0x20), (0xE2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), (0xE3, 0x00, 0x00, 0x11, 0x00), (0xE4, 0x22, 0x00), (0xE5, 0x05, 0xEC, 0xA0, 0xA0, 0x07, 0xEE, 0xA0, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), (0xE6, 0x00, 0x00, 0x11, 0x00), (0xE7, 0x22, 0x00), (0xE8, 0x06, 0xED, 0xA0, 0xA0, 0x08, 0xEF, 0xA0, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), (0xEB, 0x00, 0x00, 0x40, 0x40, 0x00, 0x00, 0x00), (0xED, 0xFF, 0xFF, 0xFF, 0xBA, 0x0A, 0xBF, 0x45, 0xFF, 0xFF, 0x54, 0xFB, 0xA0, 0xAB, 0xFF, 0xFF, 0xFF), (0xEF, 0x10, 0x0D, 0x04, 0x08, 0x3F, 0x1F), (0xFF, 0x77, 0x01, 0x00, 0x00, 0x13), (0xEF, 0x08), (0xFF, 0x77, 0x01, 0x00, 0x00, 0x00) ) )