mirror of
https://github.com/esphome/esphome.git
synced 2024-11-10 01:07:45 +01:00
[ili9xxx] Implement st7735 support (#6838)
This commit is contained in:
parent
bc408ad08c
commit
f25c296303
5 changed files with 77 additions and 6 deletions
|
@ -69,6 +69,7 @@ MODELS = {
|
||||||
"ILI9486": ili9xxx_ns.class_("ILI9XXXILI9486", ILI9XXXDisplay),
|
"ILI9486": ili9xxx_ns.class_("ILI9XXXILI9486", ILI9XXXDisplay),
|
||||||
"ILI9488": ili9xxx_ns.class_("ILI9XXXILI9488", ILI9XXXDisplay),
|
"ILI9488": ili9xxx_ns.class_("ILI9XXXILI9488", ILI9XXXDisplay),
|
||||||
"ILI9488_A": ili9xxx_ns.class_("ILI9XXXILI9488A", ILI9XXXDisplay),
|
"ILI9488_A": ili9xxx_ns.class_("ILI9XXXILI9488A", ILI9XXXDisplay),
|
||||||
|
"ST7735": ili9xxx_ns.class_("ILI9XXXST7735", ILI9XXXDisplay),
|
||||||
"ST7796": ili9xxx_ns.class_("ILI9XXXST7796", ILI9XXXDisplay),
|
"ST7796": ili9xxx_ns.class_("ILI9XXXST7796", ILI9XXXDisplay),
|
||||||
"ST7789V": ili9xxx_ns.class_("ILI9XXXST7789V", ILI9XXXDisplay),
|
"ST7789V": ili9xxx_ns.class_("ILI9XXXST7789V", ILI9XXXDisplay),
|
||||||
"S3BOX": ili9xxx_ns.class_("ILI9XXXS3Box", ILI9XXXDisplay),
|
"S3BOX": ili9xxx_ns.class_("ILI9XXXS3Box", ILI9XXXDisplay),
|
||||||
|
@ -134,6 +135,7 @@ def _validate(config):
|
||||||
"ILI9341",
|
"ILI9341",
|
||||||
"ILI9342",
|
"ILI9342",
|
||||||
"ST7789V",
|
"ST7789V",
|
||||||
|
"ST7735",
|
||||||
]:
|
]:
|
||||||
raise cv.Invalid("Selected model can't run on ESP8266.")
|
raise cv.Invalid("Selected model can't run on ESP8266.")
|
||||||
|
|
||||||
|
|
|
@ -70,6 +70,7 @@ static const uint8_t ILI9XXX_PWCTR2 = 0xC1;
|
||||||
static const uint8_t ILI9XXX_PWCTR3 = 0xC2;
|
static const uint8_t ILI9XXX_PWCTR3 = 0xC2;
|
||||||
static const uint8_t ILI9XXX_PWCTR4 = 0xC3;
|
static const uint8_t ILI9XXX_PWCTR4 = 0xC3;
|
||||||
static const uint8_t ILI9XXX_PWCTR5 = 0xC4;
|
static const uint8_t ILI9XXX_PWCTR5 = 0xC4;
|
||||||
|
static const uint8_t ILI9XXX_PWCTR6 = 0xF6;
|
||||||
static const uint8_t ILI9XXX_VMCTR1 = 0xC5;
|
static const uint8_t ILI9XXX_VMCTR1 = 0xC5;
|
||||||
static const uint8_t ILI9XXX_IFCTR = 0xC6;
|
static const uint8_t ILI9XXX_IFCTR = 0xC6;
|
||||||
static const uint8_t ILI9XXX_VMCTR2 = 0xC7;
|
static const uint8_t ILI9XXX_VMCTR2 = 0xC7;
|
||||||
|
@ -91,6 +92,7 @@ static const uint8_t ILI9XXX_GMCTRN1 = 0xE1;
|
||||||
|
|
||||||
static const uint8_t ILI9XXX_CSCON = 0xF0;
|
static const uint8_t ILI9XXX_CSCON = 0xF0;
|
||||||
static const uint8_t ILI9XXX_ADJCTL3 = 0xF7;
|
static const uint8_t ILI9XXX_ADJCTL3 = 0xF7;
|
||||||
|
static const uint8_t ILI9XXX_DELAY = 0xFF; // followed by one byte of delay time in ms
|
||||||
|
|
||||||
} // namespace ili9xxx
|
} // namespace ili9xxx
|
||||||
} // namespace esphome
|
} // namespace esphome
|
||||||
|
|
|
@ -411,13 +411,21 @@ void ILI9XXXDisplay::init_lcd_(const uint8_t *addr) {
|
||||||
uint8_t cmd, x, num_args;
|
uint8_t cmd, x, num_args;
|
||||||
while ((cmd = *addr++) != 0) {
|
while ((cmd = *addr++) != 0) {
|
||||||
x = *addr++;
|
x = *addr++;
|
||||||
|
if (cmd == ILI9XXX_DELAY) {
|
||||||
|
ESP_LOGD(TAG, "Delay %dms", x);
|
||||||
|
delay(x);
|
||||||
|
} else {
|
||||||
num_args = x & 0x7F;
|
num_args = x & 0x7F;
|
||||||
|
ESP_LOGD(TAG, "Command %02X, length %d, bits %02X", cmd, num_args, *addr);
|
||||||
this->send_command(cmd, addr, num_args);
|
this->send_command(cmd, addr, num_args);
|
||||||
addr += num_args;
|
addr += num_args;
|
||||||
if (x & 0x80)
|
if (x & 0x80) {
|
||||||
|
ESP_LOGD(TAG, "Delay 150ms");
|
||||||
delay(150); // NOLINT
|
delay(150); // NOLINT
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Tell the display controller where we want to draw pixels.
|
// Tell the display controller where we want to draw pixels.
|
||||||
void ILI9XXXDisplay::set_addr_window_(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2) {
|
void ILI9XXXDisplay::set_addr_window_(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2) {
|
||||||
|
|
|
@ -35,7 +35,6 @@ class ILI9XXXDisplay : public display::DisplayBuffer,
|
||||||
while ((cmd = *addr++) != 0) {
|
while ((cmd = *addr++) != 0) {
|
||||||
num_args = *addr++ & 0x7F;
|
num_args = *addr++ & 0x7F;
|
||||||
bits = *addr;
|
bits = *addr;
|
||||||
esph_log_d(TAG, "Command %02X, length %d, bits %02X", cmd, num_args, bits);
|
|
||||||
switch (cmd) {
|
switch (cmd) {
|
||||||
case ILI9XXX_MADCTL: {
|
case ILI9XXX_MADCTL: {
|
||||||
this->swap_xy_ = (bits & MADCTL_MV) != 0;
|
this->swap_xy_ = (bits & MADCTL_MV) != 0;
|
||||||
|
@ -51,6 +50,9 @@ class ILI9XXXDisplay : public display::DisplayBuffer,
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case ILI9XXX_DELAY:
|
||||||
|
continue; // no args to skip
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -269,5 +271,11 @@ class ILI9XXXGC9A01A : public ILI9XXXDisplay {
|
||||||
ILI9XXXGC9A01A() : ILI9XXXDisplay(INITCMD_GC9A01A, 240, 240, true) {}
|
ILI9XXXGC9A01A() : ILI9XXXDisplay(INITCMD_GC9A01A, 240, 240, true) {}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//----------- ILI9XXX_24_TFT display --------------
|
||||||
|
class ILI9XXXST7735 : public ILI9XXXDisplay {
|
||||||
|
public:
|
||||||
|
ILI9XXXST7735() : ILI9XXXDisplay(INITCMD_ST7735, 128, 160, false) {}
|
||||||
|
};
|
||||||
|
|
||||||
} // namespace ili9xxx
|
} // namespace ili9xxx
|
||||||
} // namespace esphome
|
} // namespace esphome
|
||||||
|
|
|
@ -370,6 +370,57 @@ static const uint8_t PROGMEM INITCMD_GC9A01A[] = {
|
||||||
0x00 // End of list
|
0x00 // End of list
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const uint8_t PROGMEM INITCMD_ST7735[] = {
|
||||||
|
ILI9XXX_SWRESET, 0, // Soft reset, then delay 10ms
|
||||||
|
ILI9XXX_DELAY, 10,
|
||||||
|
ILI9XXX_SLPOUT , 0, // Exit Sleep, delay
|
||||||
|
ILI9XXX_DELAY, 10,
|
||||||
|
ILI9XXX_PIXFMT , 1, 0x05,
|
||||||
|
ILI9XXX_FRMCTR1, 3, // 4: Frame rate control, 3 args + delay:
|
||||||
|
0x01, 0x2C, 0x2D, // Rate = fosc/(1x2+40) * (LINE+2C+2D)
|
||||||
|
ILI9XXX_FRMCTR2, 3, // 4: Framerate ctrl - idle mode, 3 args:
|
||||||
|
0x01, 0x2C, 0x2D, // Rate = fosc/(1x2+40) * (LINE+2C+2D)
|
||||||
|
ILI9XXX_FRMCTR3, 6, // 5: Framerate - partial mode, 6 args:
|
||||||
|
0x01, 0x2C, 0x2D, // Dot inversion mode
|
||||||
|
0x01, 0x2C, 0x2D, // Line inversion mode
|
||||||
|
|
||||||
|
ILI9XXX_INVCTR, 1, // 7: Display inversion control, 1 arg:
|
||||||
|
0x7, // Line inversion
|
||||||
|
ILI9XXX_PWCTR1, 3, // 7: Power control, 3 args, no delay:
|
||||||
|
0xA2,
|
||||||
|
0x02, // -4.6V
|
||||||
|
0x84, // AUTO mode
|
||||||
|
ILI9XXX_PWCTR2, 1, // 8: Power control, 1 arg, no delay:
|
||||||
|
0xC5, // VGH25=2.4C VGSEL=-10 VGH=3 * AVDD
|
||||||
|
ILI9XXX_PWCTR3, 2, // 9: Power control, 2 args, no delay:
|
||||||
|
0x0A, // Opamp current small
|
||||||
|
0x00, // Boost frequency
|
||||||
|
ILI9XXX_PWCTR4, 2, // 10: Power control, 2 args, no delay:
|
||||||
|
0x8A, // BCLK/2,
|
||||||
|
0x2A, // opamp current small & medium low
|
||||||
|
ILI9XXX_PWCTR5, 2, // 11: Power control, 2 args, no delay:
|
||||||
|
0x8A, 0xEE,
|
||||||
|
|
||||||
|
ILI9XXX_VMCTR1, 1, // 11: Power control, 2 args + delay:
|
||||||
|
0x0E,
|
||||||
|
ILI9XXX_GMCTRP1, 16, // 13: Gamma Adjustments (pos. polarity), 16 args + delay:
|
||||||
|
0x02, 0x1c, 0x07, 0x12, // (Not entirely necessary, but provides
|
||||||
|
0x37, 0x32, 0x29, 0x2d, // accurate colors)
|
||||||
|
0x29, 0x25, 0x2B, 0x39,
|
||||||
|
0x00, 0x01, 0x03, 0x10,
|
||||||
|
ILI9XXX_GMCTRN1, 16, // 14: Gamma Adjustments (neg. polarity), 16 args + delay:
|
||||||
|
0x03, 0x1d, 0x07, 0x06, // (Not entirely necessary, but provides
|
||||||
|
0x2E, 0x2C, 0x29, 0x2D, // accurate colors)
|
||||||
|
0x2E, 0x2E, 0x37, 0x3F,
|
||||||
|
0x00, 0x00, 0x02, 0x10,
|
||||||
|
ILI9XXX_MADCTL , 1, 0x00, // Memory Access Control, BGR
|
||||||
|
ILI9XXX_NORON , 0,
|
||||||
|
ILI9XXX_DELAY, 10,
|
||||||
|
ILI9XXX_DISPON , 0, // Display on
|
||||||
|
ILI9XXX_DELAY, 10,
|
||||||
|
00, // endo of list
|
||||||
|
};
|
||||||
|
|
||||||
// clang-format on
|
// clang-format on
|
||||||
} // namespace ili9xxx
|
} // namespace ili9xxx
|
||||||
} // namespace esphome
|
} // namespace esphome
|
||||||
|
|
Loading…
Reference in a new issue