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) { 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}; void Adafruit_ILI9341::setAddrWindow_(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1) {
uint8_t buffP[] = {(uint8_t)(y0 >> 8), (uint8_t)y0, (uint8_t)(y1 >> 8), (uint8_t)y1};
writeCmdData(ILI9341_CASET, &buffC[0], sizeof(buffC)); // Column addr set uint8_t buffC[] = { (uint8_t) (x0 >> 8), (uint8_t) x0, (uint8_t) (x1 >> 8), (uint8_t) x1 };
writeCmdData(ILI9341_PASET, &buffP[0], sizeof(buffP)); // Column addr set 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,71 +527,80 @@ void Adafruit_ILI9341::pushColor(uint16_t color) {
void Adafruit_ILI9341::drawPixel(int16_t x, int16_t y, 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) {
setAddrWindow(x,y,x+1,y+1); spi_begin();
spiDcHigh(); }
spiCsLow();
spiCsLow();
setAddrWindow_(x, y, x + 1, y + 1);
#ifdef ESP8266 #ifdef ESP8266
spiwrite16(color); spiwrite16(color);
#else #else
spiwrite(color >> 8); spiwrite(color >> 8);
spiwrite(color); spiwrite(color);
#endif #endif
spiCsHigh(); spiCsHigh();
if (hwSPI) spi_end(); if(hwSPI) {
spi_end();
}
} }
void Adafruit_ILI9341::drawFastVLine(int16_t x, int16_t y, int16_t h, void Adafruit_ILI9341::drawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color) {
uint16_t color) {
// Rudimentary clipping // Rudimentary clipping
if((x >= _width) || (y >= _height)) return; if((x >= _width) || (y >= _height)) return;
if((y + h - 1) >= _height) h = _height - y;
if((y+h-1) >= _height) if(hwSPI) {
h = _height-y; spi_begin();
}
if (hwSPI) spi_begin(); spiCsLow();
setAddrWindow(x, y, x, y+h-1);
#ifndef ESP8266
uint8_t hi = color >> 8, lo = color;
#endif
spiDcHigh(); setAddrWindow_(x, y, x, (y + h - 1));
spiCsLow();
uint8_t colorBin[] = { (uint8_t) (color >> 8), (uint8_t) color }; uint8_t colorBin[] = { (uint8_t) (color >> 8), (uint8_t) color };
spiwritePattern(&colorBin[0], 2, h); spiwritePattern(&colorBin[0], 2, h);
spiCsHigh(); 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, // Rudimentary clipping
uint16_t color) { if((x >= _width) || (y >= _height)) return;
if((x+w-1) >= _width) w = _width-x;
// Rudimentary clipping if(hwSPI) {
if((x >= _width) || (y >= _height)) return; spi_begin();
if((x+w-1) >= _width) w = _width-x; }
if (hwSPI) spi_begin();
setAddrWindow(x, y, x+w-1, y);
spiDcHigh(); spiDcHigh();
spiCsLow(); spiCsLow();
uint8_t colorBin[] = { (uint8_t) (color >> 8), (uint8_t) color }; setAddrWindow_(x, y, (x + w - 1), y);
spiwritePattern(&colorBin[0], 2, w);
spiCsHigh(); uint8_t colorBin[] = { (uint8_t) (color >> 8), (uint8_t) color };
spiwritePattern(&colorBin[0], 2, w);
if (hwSPI) spi_end(); spiCsHigh();
if(hwSPI) {
spi_end();
}
} }
void Adafruit_ILI9341::fillScreen(uint16_t color) { 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(); spi_begin();
} }
setAddrWindow(x, y, x + w - 1, y + h - 1);
spiDcHigh();
spiCsLow(); spiCsLow();
setAddrWindow_(x, y, x + w - 1, y + h - 1);
uint8_t colorBin[] = { (uint8_t) (color >> 8), (uint8_t) color }; uint8_t colorBin[] = { (uint8_t) (color >> 8), (uint8_t) color };
spiwritePattern(&colorBin[0], 2, (w * h)); spiwritePattern(&colorBin[0], 2, (w * h));

View File

@ -161,16 +161,20 @@ class Adafruit_ILI9341 : public Adafruit_GFX {
uint8_t spiread(void); uint8_t spiread(void);
#ifdef ESP8266 #ifdef ESP8266
inline void spiwrite(uint8_t data); inline void spiwrite(uint8_t data);
inline void spiwrite16(uint16_t data); inline void spiwrite16(uint16_t data);
inline void spiwriteBytes(uint8_t * data, uint8_t size); inline void spiwriteBytes(uint8_t * data, uint8_t size);
inline void spiwritePattern(uint8_t * data, uint8_t size, uint32_t repeat); 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 #else
void spiwrite(uint8_t); void spiwrite(uint8_t);
void spiwrite16(uint16_t data); void spiwrite16(uint16_t data);
void spiwriteBytes(uint8_t * data, uint8_t size); void spiwriteBytes(uint8_t * data, uint8_t size);
void spiwritePattern(uint8_t * data, uint8_t size, uint8_t repeat); 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 #endif
inline void spiCsHigh(void); inline void spiCsHigh(void);