1
0
mirror of https://github.com/esp8266/Arduino.git synced 2025-06-16 11:21:18 +03:00

Adafruit_ILI9341 +7% speed now at 327,45% total

This commit is contained in:
Markus Sattler
2015-05-09 18:56:29 +02:00
parent 2d37fb67c5
commit 04cc6a858b
2 changed files with 76 additions and 49 deletions

View File

@ -479,16 +479,31 @@ void Adafruit_ILI9341::begin(void) {
}
void Adafruit_ILI9341::setAddrWindow(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1) {
spiCsLow();
setAddrWindow_(x0, y0, x1, y1);
spiCsHigh();
}
uint8_t buffC[] = {(uint8_t)(x0 >> 8), (uint8_t)x0, (uint8_t)(x1 >> 8), (uint8_t)x1};
uint8_t buffP[] = {(uint8_t)(y0 >> 8), (uint8_t)y0, (uint8_t)(y1 >> 8), (uint8_t)y1};
void Adafruit_ILI9341::setAddrWindow_(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1) {
writeCmdData(ILI9341_CASET, &buffC[0], sizeof(buffC)); // Column addr set
writeCmdData(ILI9341_PASET, &buffP[0], sizeof(buffP)); // Column addr set
uint8_t buffC[] = { (uint8_t) (x0 >> 8), (uint8_t) x0, (uint8_t) (x1 >> 8), (uint8_t) x1 };
uint8_t buffP[] = { (uint8_t) (y0 >> 8), (uint8_t) y0, (uint8_t) (y1 >> 8), (uint8_t) y1 };
spiDcLow();
spiwrite(ILI9341_CASET);
spiDcHigh();
spiwriteBytes(&buffC[0], sizeof(buffC));
spiDcLow();
spiwrite(ILI9341_PASET);
spiDcHigh();
spiwriteBytes(&buffP[0], sizeof(buffP));
spiDcLow();
spiwrite(ILI9341_RAMWR);
spiDcHigh();
writecommand(ILI9341_RAMWR); // write to RAM
}
@ -512,13 +527,18 @@ void Adafruit_ILI9341::pushColor(uint16_t color) {
void Adafruit_ILI9341::drawPixel(int16_t x, int16_t y, uint16_t color) {
if((x < 0) ||(x >= _width) || (y < 0) || (y >= _height)) return;
if((x < 0) || (x >= _width) || (y < 0) || (y >= _height)) {
return;
}
if(hwSPI) {
spi_begin();
}
if (hwSPI) spi_begin();
setAddrWindow(x,y,x+1,y+1);
spiDcHigh();
spiCsLow();
setAddrWindow_(x, y, x + 1, y + 1);
#ifdef ESP8266
spiwrite16(color);
#else
@ -528,55 +548,59 @@ void Adafruit_ILI9341::drawPixel(int16_t x, int16_t y, uint16_t color) {
spiCsHigh();
if (hwSPI) spi_end();
if(hwSPI) {
spi_end();
}
}
void Adafruit_ILI9341::drawFastVLine(int16_t x, int16_t y, int16_t h,
uint16_t color) {
void Adafruit_ILI9341::drawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color) {
// Rudimentary clipping
if((x >= _width) || (y >= _height)) return;
if((y + h - 1) >= _height) h = _height - y;
if((y+h-1) >= _height)
h = _height-y;
if(hwSPI) {
spi_begin();
}
if (hwSPI) spi_begin();
setAddrWindow(x, y, x, y+h-1);
#ifndef ESP8266
uint8_t hi = color >> 8, lo = color;
#endif
spiDcHigh();
spiCsLow();
setAddrWindow_(x, y, x, (y + h - 1));
uint8_t colorBin[] = { (uint8_t) (color >> 8), (uint8_t) color };
spiwritePattern(&colorBin[0], 2, h);
spiCsHigh();
if (hwSPI) spi_end();
if(hwSPI) {
spi_end();
}
}
void Adafruit_ILI9341::drawFastHLine(int16_t x, int16_t y, int16_t w,
uint16_t color) {
void Adafruit_ILI9341::drawFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color) {
// Rudimentary clipping
if((x >= _width) || (y >= _height)) return;
if((x+w-1) >= _width) w = _width-x;
if (hwSPI) spi_begin();
setAddrWindow(x, y, x+w-1, y);
if(hwSPI) {
spi_begin();
}
spiDcHigh();
spiCsLow();
setAddrWindow_(x, y, (x + w - 1), y);
uint8_t colorBin[] = { (uint8_t) (color >> 8), (uint8_t) color };
spiwritePattern(&colorBin[0], 2, w);
spiCsHigh();
if (hwSPI) spi_end();
if(hwSPI) {
spi_end();
}
}
void Adafruit_ILI9341::fillScreen(uint16_t color) {
@ -598,11 +622,10 @@ void Adafruit_ILI9341::fillRect(int16_t x, int16_t y, int16_t w, int16_t h, uint
spi_begin();
}
setAddrWindow(x, y, x + w - 1, y + h - 1);
spiDcHigh();
spiCsLow();
setAddrWindow_(x, y, x + w - 1, y + h - 1);
uint8_t colorBin[] = { (uint8_t) (color >> 8), (uint8_t) color };
spiwritePattern(&colorBin[0], 2, (w * h));

View File

@ -161,16 +161,20 @@ class Adafruit_ILI9341 : public Adafruit_GFX {
uint8_t spiread(void);
#ifdef ESP8266
inline void spiwrite(uint8_t data);
inline void spiwrite16(uint16_t data);
inline void spiwriteBytes(uint8_t * data, uint8_t size);
inline void spiwritePattern(uint8_t * data, uint8_t size, uint32_t repeat);
inline void setAddrWindow_(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1);
#else
void spiwrite(uint8_t);
void spiwrite16(uint16_t data);
void spiwriteBytes(uint8_t * data, uint8_t size);
void spiwritePattern(uint8_t * data, uint8_t size, uint8_t repeat);
void setAddrWindow_(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1);
#endif
inline void spiCsHigh(void);