diff --git a/drivers/uc8159/uc8159.cpp b/drivers/uc8159/uc8159.cpp index f8572f93..257d6cdb 100644 --- a/drivers/uc8159/uc8159.cpp +++ b/drivers/uc8159/uc8159.cpp @@ -88,16 +88,27 @@ namespace pimoroni { reset(); busy_wait(); - command(0x00, {0xE3, 0x08}); - command(0x01, {0x37, 0x00, 0x23, 0x23}); - command(0x03, {0x00}); - command(0x06, {0xC7, 0xC7, 0x1D}); - command(0x30, {0x3C}); - command(0x40, {0x00}); - command(0x50, {0x37}); - command(0x60, {0x22}); - command(0x61, {0x02, 0x58, 0x01, 0xC0}); - command(0xE3, {0xAA}); + uint8_t dimensions[4] = { + uint8_t(width >> 8), + uint8_t(width), + uint8_t(height >> 8), + uint8_t(height) + }; + + if (width == 600) { + command(PSR, {0xE3, 0x08}); + } else { + command(PSR, {0xA3, 0x08}); + } + command(PWR, {0x37, 0x00, 0x23, 0x23}); + command(PFS, {0x00}); + command(BTST, {0xC7, 0xC7, 0x1D}); + command(PLL, {0x3C}); + command(TSC, {0x00}); + command(CDI, {0x37}); + command(TCON, {0x22}); + command(TRES, 4, dimensions); + command(PWS, {0xAA}); sleep_ms(100); @@ -154,6 +165,15 @@ namespace pimoroni { spi_write_blocking(spi, ®, 1); gpio_put(DC, 1); // data mode + + // HACK: Output 48 rows of data since our buffer is 400px tall + // but the display has no offset configuration and H/V scan + // are reversed. + // Any garbage data will do. + // 2px per byte, so we need width * 24 bytes + if(height == 400) { + spi_write_blocking(spi, (uint8_t *)graphics->frame_buffer, width * 24); + } graphics->frame_convert(PicoGraphics::PEN_P4, [this](void *buf, size_t length) { if (length > 0) { spi_write_blocking(spi, (const uint8_t*)buf, length); diff --git a/drivers/uc8159/uc8159.hpp b/drivers/uc8159/uc8159.hpp index 0ed608bf..5cf3d12a 100644 --- a/drivers/uc8159/uc8159.hpp +++ b/drivers/uc8159/uc8159.hpp @@ -16,6 +16,8 @@ namespace pimoroni { // Variables //-------------------------------------------------- private: + uint16_t width; + uint16_t height; spi_inst_t *spi = PIMORONI_SPI_DEFAULT_INSTANCE; // interface pins with our standard defaults where appropriate @@ -46,6 +48,8 @@ namespace pimoroni { UC8159(uint16_t width, uint16_t height, SPIPins pins, uint busy=PIN_UNUSED, uint reset=27) : DisplayDriver(width, height, ROTATE_0), + width(width), + height(height), spi(pins.spi), CS(pins.cs), DC(pins.dc), SCK(pins.sck), MOSI(pins.mosi), BUSY(busy), RESET(reset) { init(); diff --git a/micropython/modules/picographics/picographics.cpp b/micropython/modules/picographics/picographics.cpp index b14d1561..b3396409 100644 --- a/micropython/modules/picographics/picographics.cpp +++ b/micropython/modules/picographics/picographics.cpp @@ -109,7 +109,7 @@ bool get_display_settings(PicoGraphicsDisplay display, int &width, int &height, width = 640; height = 400; bus_type = BUS_SPI; - if(rotate == -1) rotate = (int)Rotation::ROTATE_0; + if(rotate == -1) rotate = (int)Rotation::ROTATE_180; if(pen_type == -1) pen_type = PEN_P4; break; default: