mirror of
https://github.com/Bodmer/TFT_eSPI.git
synced 2025-08-06 14:14:44 +02:00
Weed out legacy variables, add readAddrWindow()
readAddrWindow is a private function to support pixel and block reads of the TFT screen. Tested on ILI9341.
This commit is contained in:
138
TFT_eSPI.cpp
138
TFT_eSPI.cpp
@@ -55,8 +55,6 @@ TFT_eSPI::TFT_eSPI(int16_t w, int16_t h)
|
|||||||
|
|
||||||
_SPI = &SPI; // Initialise class pointer
|
_SPI = &SPI; // Initialise class pointer
|
||||||
|
|
||||||
hwSPI = true;
|
|
||||||
|
|
||||||
// The control pins are deliberately set to the inactive state (CS high) as setup()
|
// The control pins are deliberately set to the inactive state (CS high) as setup()
|
||||||
// might call and initialise another SPI peripherals which would could cause conflicts
|
// might call and initialise another SPI peripherals which would could cause conflicts
|
||||||
// if CS is floating or undefined.
|
// if CS is floating or undefined.
|
||||||
@@ -364,11 +362,7 @@ uint16_t TFT_eSPI::readPixel(int32_t x0, int32_t y0)
|
|||||||
{
|
{
|
||||||
spi_begin();
|
spi_begin();
|
||||||
|
|
||||||
setAddrWindow(x0, y0, x0, y0); // Sets CS low, don't care it sent RAMWR
|
readAddrWindow(x0, y0, x0, y0); // Sets CS low
|
||||||
|
|
||||||
DC_C;
|
|
||||||
_SPI->transfer(TFT_RAMRD); // Read CGRAM command
|
|
||||||
DC_D;
|
|
||||||
|
|
||||||
// Dummy read to throw away don't care value
|
// Dummy read to throw away don't care value
|
||||||
_SPI->transfer(0);
|
_SPI->transfer(0);
|
||||||
@@ -396,11 +390,7 @@ uint16_t TFT_eSPI::readPixel(int32_t x0, int32_t y0)
|
|||||||
|
|
||||||
spi_begin();
|
spi_begin();
|
||||||
|
|
||||||
setAddrWindow(x, y, x + w - 1, y + h - 1); // Sets CS low, don't care it sent RAMWR
|
readAddrWindow(x, y, x + w - 1, y + h - 1); // Sets CS low
|
||||||
|
|
||||||
DC_C;
|
|
||||||
_SPI->transfer(TFT_RAMRD); // Read CGRAM command
|
|
||||||
DC_D;
|
|
||||||
|
|
||||||
// Dummy read to throw away don't care value
|
// Dummy read to throw away don't care value
|
||||||
_SPI->transfer(0);
|
_SPI->transfer(0);
|
||||||
@@ -460,11 +450,7 @@ uint16_t TFT_eSPI::readPixel(int32_t x0, int32_t y0)
|
|||||||
{
|
{
|
||||||
spi_begin();
|
spi_begin();
|
||||||
|
|
||||||
setAddrWindow(x0, y0, x0 + w - 1, y0 + h - 1); // Sets CS low,, don't care it sent RAMWR
|
readAddrWindow(x0, y0, x0 + w - 1, y0 + h - 1); // Sets CS low
|
||||||
|
|
||||||
DC_C;
|
|
||||||
_SPI->transfer(TFT_RAMRD); // Read CGRAM command
|
|
||||||
DC_D;
|
|
||||||
|
|
||||||
// Dummy read to throw away don't care value
|
// Dummy read to throw away don't care value
|
||||||
_SPI->transfer(0);
|
_SPI->transfer(0);
|
||||||
@@ -1521,6 +1507,7 @@ inline void TFT_eSPI::setAddrWindow(int32_t xs, int32_t ys, int32_t xe, int32_t
|
|||||||
|
|
||||||
spi_end();
|
spi_end();
|
||||||
}
|
}
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
inline void TFT_eSPI::setAddrWindow(int32_t x0, int32_t y0, int32_t x1, int32_t y1)
|
inline void TFT_eSPI::setAddrWindow(int32_t x0, int32_t y0, int32_t x1, int32_t y1)
|
||||||
@@ -1573,6 +1560,123 @@ inline void TFT_eSPI::setAddrWindow(int32_t x0, int32_t y0, int32_t x1, int32_t
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/***************************************************************************************
|
||||||
|
** Function name: readAddrWindow
|
||||||
|
** Description: define an area to read a stream of pixels
|
||||||
|
***************************************************************************************/
|
||||||
|
// Chip select stays low
|
||||||
|
#ifdef ESP8266
|
||||||
|
void TFT_eSPI::readAddrWindow(int32_t xs, int32_t ys, int32_t xe, int32_t ye)
|
||||||
|
{
|
||||||
|
//spi_begin();
|
||||||
|
|
||||||
|
addr_col = 0xFFFF;
|
||||||
|
addr_row = 0xFFFF;
|
||||||
|
|
||||||
|
#if defined (ST7735_DRIVER) && (defined (ST7735_GREENTAB) || defined (GREENTAB2))
|
||||||
|
xs+=colstart;
|
||||||
|
xe+=colstart;
|
||||||
|
ys+=rowstart;
|
||||||
|
ye+=rowstart;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Column addr set
|
||||||
|
DC_C;
|
||||||
|
CS_L;
|
||||||
|
|
||||||
|
uint32_t mask = ~((SPIMMOSI << SPILMOSI) | (SPIMMISO << SPILMISO));
|
||||||
|
mask = SPI1U1 & mask;
|
||||||
|
|
||||||
|
SPI1U1 = mask | (7 << SPILMOSI) | (7 << SPILMISO);
|
||||||
|
|
||||||
|
SPI1W0 = TFT_CASET;
|
||||||
|
SPI1CMD |= SPIBUSY;
|
||||||
|
while(SPI1CMD & SPIBUSY) {}
|
||||||
|
|
||||||
|
DC_D;
|
||||||
|
|
||||||
|
SPI1U1 = mask | (31 << SPILMOSI) | (31 << SPILMISO);
|
||||||
|
// Load the two coords as a 32 bit value and shift in one go
|
||||||
|
SPI1W0 = (xs >> 8) | (uint16_t)(xs << 8) | ((uint8_t)(xe >> 8)<<16 | (xe << 24));
|
||||||
|
SPI1CMD |= SPIBUSY;
|
||||||
|
while(SPI1CMD & SPIBUSY) {}
|
||||||
|
|
||||||
|
// Row addr set
|
||||||
|
DC_C;
|
||||||
|
|
||||||
|
SPI1U1 = mask | (7 << SPILMOSI) | (7 << SPILMISO);
|
||||||
|
|
||||||
|
SPI1W0 = TFT_PASET;
|
||||||
|
SPI1CMD |= SPIBUSY;
|
||||||
|
while(SPI1CMD & SPIBUSY) {}
|
||||||
|
|
||||||
|
DC_D;
|
||||||
|
|
||||||
|
SPI1U1 = mask | (31 << SPILMOSI) | (31 << SPILMISO);
|
||||||
|
// Load the two coords as a 32 bit value and shift in one go
|
||||||
|
SPI1W0 = (ys >> 8) | (uint16_t)(ys << 8) | ((uint8_t)(ye >> 8)<<16 | (ye << 24));
|
||||||
|
SPI1CMD |= SPIBUSY;
|
||||||
|
while(SPI1CMD & SPIBUSY) {}
|
||||||
|
|
||||||
|
// read from RAM
|
||||||
|
DC_C;
|
||||||
|
|
||||||
|
SPI1U1 = mask | (7 << SPILMOSI) | (7 << SPILMISO);
|
||||||
|
SPI1W0 = TFT_RAMRD;
|
||||||
|
SPI1CMD |= SPIBUSY;
|
||||||
|
while(SPI1CMD & SPIBUSY) {}
|
||||||
|
|
||||||
|
DC_D;
|
||||||
|
//spi_end();
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
|
||||||
|
void TFT_eSPI::readAddrWindow(int32_t x0, int32_t y0, int32_t x1, int32_t y1)
|
||||||
|
{
|
||||||
|
//spi_begin();
|
||||||
|
|
||||||
|
addr_col = 0xFFFF;
|
||||||
|
addr_row = 0xFFFF;
|
||||||
|
|
||||||
|
#if defined (ST7735_DRIVER) && (defined (ST7735_GREENTAB) || defined (GREENTAB2))
|
||||||
|
x0+=colstart;
|
||||||
|
x1+=colstart;
|
||||||
|
y0+=rowstart;
|
||||||
|
y1+=rowstart;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Column addr set
|
||||||
|
DC_C;
|
||||||
|
CS_L;
|
||||||
|
|
||||||
|
_SPI->write(TFT_CASET);
|
||||||
|
|
||||||
|
DC_D;
|
||||||
|
|
||||||
|
_SPI->write16((x0 >> 8) | (x0 << 8));
|
||||||
|
|
||||||
|
_SPI->write16((x1 >> 8) | (x1 << 8));
|
||||||
|
|
||||||
|
// Row addr set
|
||||||
|
DC_C;
|
||||||
|
|
||||||
|
_SPI->write(TFT_PASET);
|
||||||
|
|
||||||
|
DC_D;
|
||||||
|
|
||||||
|
_SPI->write16((y0 >> 8) | (y0 << 8));
|
||||||
|
|
||||||
|
_SPI->write16((y1 >> 8) | (y1 << 8));
|
||||||
|
|
||||||
|
DC_C;
|
||||||
|
_SPI->transfer(TFT_RAMRD); // Read CGRAM command
|
||||||
|
DC_D;
|
||||||
|
|
||||||
|
//spi_end();
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
/***************************************************************************************
|
/***************************************************************************************
|
||||||
** Function name: drawPixel
|
** Function name: drawPixel
|
||||||
** Description: push a single pixel at an arbitrary position
|
** Description: push a single pixel at an arbitrary position
|
||||||
|
13
TFT_eSPI.h
13
TFT_eSPI.h
@@ -399,22 +399,17 @@ class TFT_eSPI : public Print {
|
|||||||
inline void spi_begin() __attribute__((always_inline));
|
inline void spi_begin() __attribute__((always_inline));
|
||||||
inline void spi_end() __attribute__((always_inline));
|
inline void spi_end() __attribute__((always_inline));
|
||||||
|
|
||||||
void writeBytes_(uint8_t * data, uint8_t size);
|
void readAddrWindow(int32_t xs, int32_t ys, int32_t xe, int32_t ye);
|
||||||
inline void setDataBits(uint16_t bits);
|
|
||||||
|
|
||||||
uint8_t tabcolor,
|
uint8_t tabcolor,
|
||||||
colstart = 0, rowstart = 0; // some ST7735 displays need this changed
|
colstart = 0, rowstart = 0; // some ST7735 displays need this changed
|
||||||
|
|
||||||
boolean hwSPI;
|
|
||||||
|
|
||||||
volatile uint32_t *dcport, *csport;//, *mosiport, *clkport, *rsport;
|
volatile uint32_t *dcport, *csport;//, *mosiport, *clkport, *rsport;
|
||||||
//int32_t _cs, _dc, _rst, _mosi, _miso, _sclk;
|
|
||||||
uint32_t cspinmask, dcpinmask;//, mosipinmask, clkpinmask;
|
uint32_t cspinmask, dcpinmask;//, mosipinmask, clkpinmask;
|
||||||
|
|
||||||
uint8_t mySPCR, savedSPCR;
|
|
||||||
|
|
||||||
//uint8_t fifoBuffer[64]; // SPI graphics pipeline buffer - not used yet
|
//uint8_t fifoBuffer[64]; // SPI graphics pipeline buffer - not used yet
|
||||||
uint8_t colorBin[2];
|
|
||||||
uint32_t lastColor = 0xFFFF;
|
uint32_t lastColor = 0xFFFF;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
Reference in New Issue
Block a user