1
0
mirror of https://github.com/arduino/Arduino.git synced 2024-12-01 12:24:14 +01:00

Merge pull request #3036 from damellis/tft-spi-transactions

Add SPI transactions to TFT library.
This commit is contained in:
Arturo Guadalupi 2015-05-29 12:45:27 +02:00
commit 394bab072c
2 changed files with 52 additions and 2 deletions

View File

@ -73,6 +73,9 @@ inline void Adafruit_ST7735::spiwrite(uint8_t c) {
void Adafruit_ST7735::writecommand(uint8_t c) {
#ifdef SPI_HAS_TRANSACTION
if (hwSPI) SPI.beginTransaction(spisettings);
#endif
*rsport &= ~rspinmask;
*csport &= ~cspinmask;
@ -80,10 +83,16 @@ void Adafruit_ST7735::writecommand(uint8_t c) {
spiwrite(c);
*csport |= cspinmask;
#ifdef SPI_HAS_TRANSACTION
if (hwSPI) SPI.endTransaction();
#endif
}
void Adafruit_ST7735::writedata(uint8_t c) {
#ifdef SPI_HAS_TRANSACTION
if (hwSPI) SPI.beginTransaction(spisettings);
#endif
*rsport |= rspinmask;
*csport &= ~cspinmask;
@ -91,7 +100,10 @@ void Adafruit_ST7735::writedata(uint8_t c) {
spiwrite(c);
*csport |= cspinmask;
}
#ifdef SPI_HAS_TRANSACTION
if (hwSPI) SPI.endTransaction();
#endif
}
// Rather than a bazillion writecommand() and writedata() calls, screen
@ -331,6 +343,9 @@ void Adafruit_ST7735::commonInit(const uint8_t *cmdList) {
if(hwSPI) { // Using hardware SPI
SPI.begin();
#ifdef SPI_HAS_TRANSACTION
spisettings = SPISettings(4000000L, MSBFIRST, SPI_MODE0);
#else
#if defined(ARDUINO_ARCH_SAM)
SPI.setClockDivider(24); // 4 MHz (half speed)
#else
@ -338,6 +353,7 @@ void Adafruit_ST7735::commonInit(const uint8_t *cmdList) {
#endif
SPI.setBitOrder(MSBFIRST);
SPI.setDataMode(SPI_MODE0);
#endif // SPI_HAS_TRANSACTION
} else {
pinMode(_sclk, OUTPUT);
pinMode(_sid , OUTPUT);
@ -413,6 +429,9 @@ void Adafruit_ST7735::setAddrWindow(uint8_t x0, uint8_t y0, uint8_t x1,
void Adafruit_ST7735::pushColor(uint16_t color) {
#ifdef SPI_HAS_TRANSACTION
if (hwSPI) SPI.beginTransaction(spisettings);
#endif
*rsport |= rspinmask;
*csport &= ~cspinmask;
@ -421,6 +440,9 @@ void Adafruit_ST7735::pushColor(uint16_t color) {
spiwrite(color);
*csport |= cspinmask;
#ifdef SPI_HAS_TRANSACTION
if (hwSPI) SPI.endTransaction();
#endif
}
void Adafruit_ST7735::drawPixel(int16_t x, int16_t y, uint16_t color) {
@ -429,6 +451,9 @@ void Adafruit_ST7735::drawPixel(int16_t x, int16_t y, uint16_t color) {
setAddrWindow(x,y,x+1,y+1);
#ifdef SPI_HAS_TRANSACTION
if (hwSPI) SPI.beginTransaction(spisettings);
#endif
*rsport |= rspinmask;
*csport &= ~cspinmask;
@ -438,6 +463,9 @@ void Adafruit_ST7735::drawPixel(int16_t x, int16_t y, uint16_t color) {
spiwrite(color);
*csport |= cspinmask;
#ifdef SPI_HAS_TRANSACTION
if (hwSPI) SPI.endTransaction();
#endif
}
@ -452,6 +480,9 @@ void Adafruit_ST7735::drawFastVLine(int16_t x, int16_t y, int16_t h,
if (tabcolor == INITR_BLACKTAB) color = swapcolor(color);
uint8_t hi = color >> 8, lo = color;
#ifdef SPI_HAS_TRANSACTION
if (hwSPI) SPI.beginTransaction(spisettings);
#endif
*rsport |= rspinmask;
*csport &= ~cspinmask;
while (h--) {
@ -459,6 +490,9 @@ void Adafruit_ST7735::drawFastVLine(int16_t x, int16_t y, int16_t h,
spiwrite(lo);
}
*csport |= cspinmask;
#ifdef SPI_HAS_TRANSACTION
if (hwSPI) SPI.endTransaction();
#endif
}
@ -473,6 +507,9 @@ void Adafruit_ST7735::drawFastHLine(int16_t x, int16_t y, int16_t w,
if (tabcolor == INITR_BLACKTAB) color = swapcolor(color);
uint8_t hi = color >> 8, lo = color;
#ifdef SPI_HAS_TRANSACTION
if (hwSPI) SPI.beginTransaction(spisettings);
#endif
*rsport |= rspinmask;
*csport &= ~cspinmask;
while (w--) {
@ -480,6 +517,9 @@ void Adafruit_ST7735::drawFastHLine(int16_t x, int16_t y, int16_t w,
spiwrite(lo);
}
*csport |= cspinmask;
#ifdef SPI_HAS_TRANSACTION
if (hwSPI) SPI.endTransaction();
#endif
}
@ -504,6 +544,9 @@ void Adafruit_ST7735::fillRect(int16_t x, int16_t y, int16_t w, int16_t h,
setAddrWindow(x, y, x+w-1, y+h-1);
uint8_t hi = color >> 8, lo = color;
#ifdef SPI_HAS_TRANSACTION
if (hwSPI) SPI.beginTransaction(spisettings);
#endif
*rsport |= rspinmask;
*csport &= ~cspinmask;
for(y=h; y>0; y--) {
@ -514,6 +557,9 @@ void Adafruit_ST7735::fillRect(int16_t x, int16_t y, int16_t w, int16_t h,
}
*csport |= cspinmask;
#ifdef SPI_HAS_TRANSACTION
if (hwSPI) SPI.endTransaction();
#endif
}

View File

@ -26,6 +26,7 @@
#include "WProgram.h"
#endif
#include "Adafruit_GFX.h"
#include <SPI.h>
#include <avr/pgmspace.h>
// some flags for initR() :(
@ -135,7 +136,10 @@ class Adafruit_ST7735 : public Adafruit_GFX {
//uint8_t spiread(void);
boolean hwSPI;
#if defined(ARDUINO_ARCH_SAM)
#ifdef SPI_HAS_TRANSACTION
SPISettings spisettings;
#endif
#if defined(ARDUINO_ARCH_SAM)
volatile uint32_t *dataport, *clkport, *csport, *rsport;
uint32_t _cs, _rs, _rst, _sid, _sclk,
datapinmask, clkpinmask, cspinmask, rspinmask,