Skip to content

Commit 04cc6a8

Browse files
committed
Adafruit_ILI9341 +7% speed now at 327,45% total
1 parent 2d37fb6 commit 04cc6a8

File tree

2 files changed

+76
-49
lines changed

2 files changed

+76
-49
lines changed

libraries/Adafruit_ILI9341/Adafruit_ILI9341.cpp

Lines changed: 72 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -479,16 +479,31 @@ void Adafruit_ILI9341::begin(void) {
479479

480480
}
481481

482-
483482
void Adafruit_ILI9341::setAddrWindow(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1) {
483+
spiCsLow();
484+
setAddrWindow_(x0, y0, x1, y1);
485+
spiCsHigh();
486+
}
484487

485-
uint8_t buffC[] = {(uint8_t)(x0 >> 8), (uint8_t)x0, (uint8_t)(x1 >> 8), (uint8_t)x1};
486-
uint8_t buffP[] = {(uint8_t)(y0 >> 8), (uint8_t)y0, (uint8_t)(y1 >> 8), (uint8_t)y1};
488+
void Adafruit_ILI9341::setAddrWindow_(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1) {
487489

488-
writeCmdData(ILI9341_CASET, &buffC[0], sizeof(buffC)); // Column addr set
489-
writeCmdData(ILI9341_PASET, &buffP[0], sizeof(buffP)); // Column addr set
490+
uint8_t buffC[] = { (uint8_t) (x0 >> 8), (uint8_t) x0, (uint8_t) (x1 >> 8), (uint8_t) x1 };
491+
uint8_t buffP[] = { (uint8_t) (y0 >> 8), (uint8_t) y0, (uint8_t) (y1 >> 8), (uint8_t) y1 };
492+
493+
spiDcLow();
494+
spiwrite(ILI9341_CASET);
495+
spiDcHigh();
496+
spiwriteBytes(&buffC[0], sizeof(buffC));
497+
498+
spiDcLow();
499+
spiwrite(ILI9341_PASET);
500+
spiDcHigh();
501+
spiwriteBytes(&buffP[0], sizeof(buffP));
502+
503+
spiDcLow();
504+
spiwrite(ILI9341_RAMWR);
505+
spiDcHigh();
490506

491-
writecommand(ILI9341_RAMWR); // write to RAM
492507
}
493508

494509

@@ -512,71 +527,80 @@ void Adafruit_ILI9341::pushColor(uint16_t color) {
512527

513528
void Adafruit_ILI9341::drawPixel(int16_t x, int16_t y, uint16_t color) {
514529

515-
if((x < 0) ||(x >= _width) || (y < 0) || (y >= _height)) return;
530+
if((x < 0) || (x >= _width) || (y < 0) || (y >= _height)) {
531+
return;
532+
}
516533

517-
if (hwSPI) spi_begin();
518-
setAddrWindow(x,y,x+1,y+1);
519-
spiDcHigh();
520-
spiCsLow();
534+
if(hwSPI) {
535+
spi_begin();
536+
}
537+
538+
spiCsLow();
539+
540+
setAddrWindow_(x, y, x + 1, y + 1);
521541

522542
#ifdef ESP8266
523-
spiwrite16(color);
543+
spiwrite16(color);
524544
#else
525-
spiwrite(color >> 8);
526-
spiwrite(color);
545+
spiwrite(color >> 8);
546+
spiwrite(color);
527547
#endif
528548

529-
spiCsHigh();
549+
spiCsHigh();
530550

531-
if (hwSPI) spi_end();
551+
if(hwSPI) {
552+
spi_end();
553+
}
532554
}
533555

534556

535-
void Adafruit_ILI9341::drawFastVLine(int16_t x, int16_t y, int16_t h,
536-
uint16_t color) {
557+
void Adafruit_ILI9341::drawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color) {
537558

538-
// Rudimentary clipping
539-
if((x >= _width) || (y >= _height)) return;
559+
// Rudimentary clipping
560+
if((x >= _width) || (y >= _height)) return;
561+
if((y + h - 1) >= _height) h = _height - y;
540562

541-
if((y+h-1) >= _height)
542-
h = _height-y;
563+
if(hwSPI) {
564+
spi_begin();
565+
}
543566

544-
if (hwSPI) spi_begin();
545-
setAddrWindow(x, y, x, y+h-1);
546-
#ifndef ESP8266
547-
uint8_t hi = color >> 8, lo = color;
548-
#endif
567+
spiCsLow();
549568

550-
spiDcHigh();
551-
spiCsLow();
569+
setAddrWindow_(x, y, x, (y + h - 1));
552570

553-
uint8_t colorBin[] = { (uint8_t) (color >> 8), (uint8_t) color };
554-
spiwritePattern(&colorBin[0], 2, h);
571+
uint8_t colorBin[] = { (uint8_t) (color >> 8), (uint8_t) color };
572+
spiwritePattern(&colorBin[0], 2, h);
555573

556-
spiCsHigh();
574+
spiCsHigh();
557575

558-
if (hwSPI) spi_end();
576+
if(hwSPI) {
577+
spi_end();
578+
}
559579
}
560580

581+
void Adafruit_ILI9341::drawFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color) {
561582

562-
void Adafruit_ILI9341::drawFastHLine(int16_t x, int16_t y, int16_t w,
563-
uint16_t color) {
583+
// Rudimentary clipping
584+
if((x >= _width) || (y >= _height)) return;
585+
if((x+w-1) >= _width) w = _width-x;
564586

565-
// Rudimentary clipping
566-
if((x >= _width) || (y >= _height)) return;
567-
if((x+w-1) >= _width) w = _width-x;
568-
if (hwSPI) spi_begin();
569-
setAddrWindow(x, y, x+w-1, y);
587+
if(hwSPI) {
588+
spi_begin();
589+
}
570590

571-
spiDcHigh();
572-
spiCsLow();
591+
spiDcHigh();
592+
spiCsLow();
573593

574-
uint8_t colorBin[] = { (uint8_t) (color >> 8), (uint8_t) color };
575-
spiwritePattern(&colorBin[0], 2, w);
594+
setAddrWindow_(x, y, (x + w - 1), y);
576595

577-
spiCsHigh();
596+
uint8_t colorBin[] = { (uint8_t) (color >> 8), (uint8_t) color };
597+
spiwritePattern(&colorBin[0], 2, w);
578598

579-
if (hwSPI) spi_end();
599+
spiCsHigh();
600+
601+
if(hwSPI) {
602+
spi_end();
603+
}
580604
}
581605

582606
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
598622
spi_begin();
599623
}
600624

601-
setAddrWindow(x, y, x + w - 1, y + h - 1);
602-
603-
spiDcHigh();
604625
spiCsLow();
605626

627+
setAddrWindow_(x, y, x + w - 1, y + h - 1);
628+
606629
uint8_t colorBin[] = { (uint8_t) (color >> 8), (uint8_t) color };
607630
spiwritePattern(&colorBin[0], 2, (w * h));
608631

libraries/Adafruit_ILI9341/Adafruit_ILI9341.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,16 +161,20 @@ class Adafruit_ILI9341 : public Adafruit_GFX {
161161

162162
uint8_t spiread(void);
163163

164+
164165
#ifdef ESP8266
165166
inline void spiwrite(uint8_t data);
166167
inline void spiwrite16(uint16_t data);
167168
inline void spiwriteBytes(uint8_t * data, uint8_t size);
168169
inline void spiwritePattern(uint8_t * data, uint8_t size, uint32_t repeat);
170+
171+
inline void setAddrWindow_(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1);
169172
#else
170173
void spiwrite(uint8_t);
171174
void spiwrite16(uint16_t data);
172175
void spiwriteBytes(uint8_t * data, uint8_t size);
173176
void spiwritePattern(uint8_t * data, uint8_t size, uint8_t repeat);
177+
void setAddrWindow_(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1);
174178
#endif
175179

176180
inline void spiCsHigh(void);

0 commit comments

Comments
 (0)