Completed support for SPI ILI9488

Setup20 added for ESP8266 and Setup21 addwd for ESP32
This commit is contained in:
Bodmer
2018-07-07 22:41:53 +01:00
parent a76d0d60dc
commit 5b0d96d64d
8 changed files with 646 additions and 60 deletions
+139 -8
View File
@@ -2881,11 +2881,15 @@ void TFT_eSPI::drawPixel(uint32_t x, uint32_t y, uint32_t color)
DC_D;
#if defined (ILI9488_DRIVER)
tft_Write_16(color);
#else
SPI1U1 = mask | (15 << SPILMOSI) | (15 << SPILMISO);
SPI1W0 = (color >> 8) | (color << 8);
SPI1CMD |= SPIBUSY;
while(SPI1CMD & SPIBUSY) {}
#endif
CS_H;
@@ -3086,7 +3090,7 @@ void TFT_eSPI::pushColor(uint16_t color, uint16_t len)
if(len) SPI.writePattern(&colorBin[0], 2, 1); len--;
while(len--) {WR_L; WR_H;}
#else
#ifdef ESP32_PARALLEL
#if defined (ESP32_PARALLEL)
while (len--) {tft_Write_16(color);}
#else
writeBlock(color, len);
@@ -3116,6 +3120,9 @@ void TFT_eSPI::pushColors(uint8_t *data, uint32_t len)
#else
#ifdef ESP32_PARALLEL
while (len--) {tft_Write_8(*data); data++;}
#elif defined (ILI9488_DRIVER)
uint16_t color;
while (len>1) {color = (*data++) | ((*data++)<<8); tft_Write_16(color); len-=2;}
#else
#if (SPI_FREQUENCY == 80000000)
while ( len >=64 ) {SPI.writePattern(data, 64, 1); data += 64; len -= 64; }
@@ -3142,8 +3149,8 @@ void TFT_eSPI::pushColors(uint16_t *data, uint32_t len, bool swap)
CS_L;
#if defined (ESP32)
#ifdef ESP32_PARALLEL
#if defined (ESP32) || defined (ILI9488_DRIVER)
#if defined (ESP32_PARALLEL) || defined (ILI9488_DRIVER)
if (swap) while ( len-- ) {tft_Write_16(*data); data++;}
else while ( len-- ) {tft_Write_16S(*data); data++;}
#else
@@ -3240,7 +3247,7 @@ void TFT_eSPI::pushColors(uint16_t *data, uint32_t len, bool swap)
// Bresenham's algorithm - thx wikipedia - speed enhanced by Bodmer to use
// an efficient FastH/V Line draw routine for line segments of 2 pixels or more
#if defined (RPI_ILI9486_DRIVER) || defined (ESP32) || defined (RPI_WRITE_STROBE) || defined (HX8357D_DRIVER)
#if defined (RPI_ILI9486_DRIVER) || defined (ESP32) || defined (RPI_WRITE_STROBE) || defined (HX8357D_DRIVER) || defined (ILI9488_DRIVER)
void TFT_eSPI::drawLine(int32_t x0, int32_t y0, int32_t x1, int32_t y1, uint32_t color)
{
@@ -4518,7 +4525,7 @@ void TFT_eSPI::setTextFont(uint8_t f)
// TFT_eSPI 98.06% 97.59% 94.24%
// Adafruit_GFX 19.62% 14.31% 7.94%
//
#if defined (ESP8266)
#if defined (ESP8266) && !defined (ILI9488_DRIVER)
void writeBlock(uint16_t color, uint32_t repeat)
{
uint16_t color16 = (color >> 8) | (color << 8);
@@ -4578,7 +4585,131 @@ void writeBlock(uint16_t color, uint32_t repeat)
SPI1U = SPIUMOSI | SPIUDUPLEX | SPIUSSE;
}
#else // Low level register based ESP32 code
#elif defined (ILI9488_DRIVER)
#ifdef ESP8266
void writeBlock(uint16_t color, uint32_t repeat)
{
uint32_t mask = ~(SPIMMOSI << SPILMOSI);
mask = SPI1U1 & mask;
SPI1U = SPIUMOSI | SPIUSSE;
// Split out the colours
uint8_t r = (color & 0xF800)>>8;
uint8_t g = (color & 0x07E0)>>3;
uint8_t b = (color & 0x001F)<<3;
// Concatenate 4 pixels into three 32 bit blocks
uint32_t r0 = r<<24 | b<<16 | g<<8 | r;
uint32_t r1 = g<<24 | r<<16 | b<<8 | g;
uint32_t r2 = b<<24 | g<<16 | r<<8 | b;
SPI1W0 = r0;
SPI1W1 = r1;
SPI1W2 = r2;
if (repeat > 4)
{
SPI1W3 = r0;
SPI1W4 = r1;
SPI1W5 = r2;
}
if (repeat > 8)
{
SPI1W6 = r0;
SPI1W7 = r1;
SPI1W8 = r2;
}
if (repeat > 12)
{
SPI1W9 = r0;
SPI1W10 = r1;
SPI1W11 = r2;
SPI1W12 = r0;
SPI1W13 = r1;
SPI1W14 = r2;
SPI1W15 = r0;
}
if (repeat > 20)
{
SPI1U1 = mask | (503 << SPILMOSI);
while(repeat>20)
{
while(SPI1CMD & SPIBUSY) {}
SPI1CMD |= SPIBUSY;
repeat -= 21;
}
while(SPI1CMD & SPIBUSY) {}
}
if (repeat)
{
repeat = (repeat * 24) - 1;
SPI1U1 = mask | (repeat << SPILMOSI);
SPI1CMD |= SPIBUSY;
while(SPI1CMD & SPIBUSY) {}
}
SPI1U = SPIUMOSI | SPIUDUPLEX | SPIUSSE;
}
#else // Now the code for ESP32 and ILI9488
#include "soc/spi_reg.h"
#define SPI_NUM 0x3
void writeBlock(uint16_t color, uint32_t repeat)
{
// Split out the colours
uint8_t r = (color & 0xF800)>>8;
uint8_t g = (color & 0x07E0)>>3;
uint8_t b = (color & 0x001F)<<3;
// Concatenate 4 pixels into three 32 bit blocks
uint32_t r0 = r<<24 | b<<16 | g<<8 | r;
uint32_t r1 = g<<24 | r<<16 | b<<8 | g;
uint32_t r2 = b<<24 | g<<16 | r<<8 | b;
if (repeat > 9)
{
SET_PERI_REG_BITS(SPI_MOSI_DLEN_REG(SPI_NUM), SPI_USR_MOSI_DBITLEN, 239, SPI_USR_MOSI_DBITLEN_S);
while(repeat>9)
{
while (READ_PERI_REG(SPI_CMD_REG(SPI_NUM))&SPI_USR);
WRITE_PERI_REG((SPI_W0_REG(SPI_NUM) + 0), r0);
WRITE_PERI_REG((SPI_W0_REG(SPI_NUM) + 4), r1);
WRITE_PERI_REG((SPI_W0_REG(SPI_NUM) + 8), r2);
WRITE_PERI_REG((SPI_W0_REG(SPI_NUM) + 12), r0);
WRITE_PERI_REG((SPI_W0_REG(SPI_NUM) + 16), r1);
WRITE_PERI_REG((SPI_W0_REG(SPI_NUM) + 20), r2);
WRITE_PERI_REG((SPI_W0_REG(SPI_NUM) + 24), r0);
WRITE_PERI_REG((SPI_W0_REG(SPI_NUM) + 28), r1);
SET_PERI_REG_MASK(SPI_CMD_REG(SPI_NUM), SPI_USR);
repeat -= 10;
}
while (READ_PERI_REG(SPI_CMD_REG(SPI_NUM))&SPI_USR);
}
if (repeat)
{
repeat = (repeat * 24) - 1;
SET_PERI_REG_BITS(SPI_MOSI_DLEN_REG(SPI_NUM), SPI_USR_MOSI_DBITLEN, repeat, SPI_USR_MOSI_DBITLEN_S);
WRITE_PERI_REG((SPI_W0_REG(SPI_NUM) + 0), r0);
WRITE_PERI_REG((SPI_W0_REG(SPI_NUM) + 4), r1);
WRITE_PERI_REG((SPI_W0_REG(SPI_NUM) + 8), r2);
WRITE_PERI_REG((SPI_W0_REG(SPI_NUM) + 12), r0);
WRITE_PERI_REG((SPI_W0_REG(SPI_NUM) + 16), r1);
WRITE_PERI_REG((SPI_W0_REG(SPI_NUM) + 20), r2);
WRITE_PERI_REG((SPI_W0_REG(SPI_NUM) + 24), r0);
WRITE_PERI_REG((SPI_W0_REG(SPI_NUM) + 28), r1);
SET_PERI_REG_MASK(SPI_CMD_REG(SPI_NUM), SPI_USR);
while (READ_PERI_REG(SPI_CMD_REG(SPI_NUM))&SPI_USR);
}
}
#endif
#else // Low level register based ESP32 code for 16 bit colour SPI TFTs
#include "soc/spi_reg.h"
#define SPI_NUM 0x3
@@ -4595,7 +4726,7 @@ void writeBlock(uint16_t color, uint32_t repeat)
while(repeat>15)
{
while (READ_PERI_REG(SPI_CMD_REG(SPI_NUM))&SPI_USR);
for (uint32_t i=0; i<16; i++) WRITE_PERI_REG((SPI_W0_REG(SPI_NUM) + (i << 2)), color32);
for (uint32_t i=0; i<8; i++) WRITE_PERI_REG((SPI_W0_REG(SPI_NUM) + (i << 2)), color32);
SET_PERI_REG_MASK(SPI_CMD_REG(SPI_NUM), SPI_USR);
repeat -= 16;
}
@@ -4606,7 +4737,7 @@ void writeBlock(uint16_t color, uint32_t repeat)
{
repeat = (repeat << 4) - 1;
SET_PERI_REG_BITS(SPI_MOSI_DLEN_REG(SPI_NUM), SPI_USR_MOSI_DBITLEN, repeat, SPI_USR_MOSI_DBITLEN_S);
for (uint32_t i=0; i<16; i++) WRITE_PERI_REG((SPI_W0_REG(SPI_NUM) + (i << 2)), color32);
for (uint32_t i=0; i<8; i++) WRITE_PERI_REG((SPI_W0_REG(SPI_NUM) + (i << 2)), color32);
SET_PERI_REG_MASK(SPI_CMD_REG(SPI_NUM), SPI_USR);
while (READ_PERI_REG(SPI_CMD_REG(SPI_NUM))&SPI_USR);
}