acid-drop- Hacking the planet from a LilyGo T-Deck using custom firmware |
git clone git://git.acid.vegas/acid-drop.git |
Log | Files | Refs | Archive | README | LICENSE |
TFT_eSPI_Generic.c (10434B)
1 //////////////////////////////////////////////////// 2 // TFT_eSPI generic driver functions // 3 //////////////////////////////////////////////////// 4 5 //////////////////////////////////////////////////////////////////////////////////////// 6 // Global variables 7 //////////////////////////////////////////////////////////////////////////////////////// 8 9 // Select the SPI port to use 10 #ifdef TFT_SPI_PORT 11 SPIClass& spi = TFT_SPI_PORT; 12 #else 13 SPIClass& spi = SPI; 14 #endif 15 16 //////////////////////////////////////////////////////////////////////////////////////// 17 #if defined (TFT_SDA_READ) && !defined (TFT_PARALLEL_8_BIT) 18 //////////////////////////////////////////////////////////////////////////////////////// 19 20 /*************************************************************************************** 21 ** Function name: tft_Read_8 22 ** Description: Bit bashed SPI to read bidirectional SDA line 23 ***************************************************************************************/ 24 uint8_t TFT_eSPI::tft_Read_8(void) 25 { 26 uint8_t ret = 0; 27 28 for (uint8_t i = 0; i < 8; i++) { // read results 29 ret <<= 1; 30 SCLK_L; 31 if (digitalRead(TFT_MOSI)) ret |= 1; 32 SCLK_H; 33 } 34 35 return ret; 36 } 37 38 /*************************************************************************************** 39 ** Function name: beginSDA 40 ** Description: Detach SPI from pin to permit software SPI 41 ***************************************************************************************/ 42 void TFT_eSPI::begin_SDA_Read(void) 43 { 44 // Release configured SPI port for SDA read 45 spi.end(); 46 } 47 48 /*************************************************************************************** 49 ** Function name: endSDA 50 ** Description: Attach SPI pins after software SPI 51 ***************************************************************************************/ 52 void TFT_eSPI::end_SDA_Read(void) 53 { 54 // Configure SPI port ready for next TFT access 55 spi.begin(); 56 } 57 58 //////////////////////////////////////////////////////////////////////////////////////// 59 #endif // #if defined (TFT_SDA_READ) 60 //////////////////////////////////////////////////////////////////////////////////////// 61 62 63 //////////////////////////////////////////////////////////////////////////////////////// 64 #if defined (TFT_PARALLEL_8_BIT) // Code for generic (i.e. any) processor 65 //////////////////////////////////////////////////////////////////////////////////////// 66 67 /*************************************************************************************** 68 ** Function name: pushBlock - for generic processor and parallel display 69 ** Description: Write a block of pixels of the same colour 70 ***************************************************************************************/ 71 void TFT_eSPI::pushBlock(uint16_t color, uint32_t len){ 72 73 while (len>1) {tft_Write_32D(color); len-=2;} 74 if (len) {tft_Write_16(color);} 75 } 76 77 /*************************************************************************************** 78 ** Function name: pushPixels - for gereric processor and parallel display 79 ** Description: Write a sequence of pixels 80 ***************************************************************************************/ 81 void TFT_eSPI::pushPixels(const void* data_in, uint32_t len){ 82 83 uint16_t *data = (uint16_t*)data_in; 84 if(_swapBytes) { 85 while (len>1) {tft_Write_16(*data); data++; tft_Write_16(*data); data++; len -=2;} 86 if (len) {tft_Write_16(*data);} 87 return; 88 } 89 90 while (len>1) {tft_Write_16S(*data); data++; tft_Write_16S(*data); data++; len -=2;} 91 if (len) {tft_Write_16S(*data);} 92 } 93 94 /*************************************************************************************** 95 ** Function name: GPIO direction control - supports class functions 96 ** Description: Set parallel bus to INPUT or OUTPUT 97 ***************************************************************************************/ 98 void TFT_eSPI::busDir(uint32_t mask, uint8_t mode) 99 { 100 // mask is unused for generic processor 101 // Arduino native functions suited well to a generic driver 102 pinMode(TFT_D0, mode); 103 pinMode(TFT_D1, mode); 104 pinMode(TFT_D2, mode); 105 pinMode(TFT_D3, mode); 106 pinMode(TFT_D4, mode); 107 pinMode(TFT_D5, mode); 108 pinMode(TFT_D6, mode); 109 pinMode(TFT_D7, mode); 110 return; 111 } 112 113 /*************************************************************************************** 114 ** Function name: GPIO direction control - supports class functions 115 ** Description: Faster GPIO pin input/output switch 116 ***************************************************************************************/ 117 void TFT_eSPI::gpioMode(uint8_t gpio, uint8_t mode) 118 { 119 // No fast port based generic approach available 120 } 121 122 /*************************************************************************************** 123 ** Function name: read byte - supports class functions 124 ** Description: Read a byte - parallel bus only 125 ***************************************************************************************/ 126 uint8_t TFT_eSPI::readByte(void) 127 { 128 uint8_t b = 0; 129 130 busDir(0, INPUT); 131 digitalWrite(TFT_RD, LOW); 132 133 b |= digitalRead(TFT_D0) << 0; 134 b |= digitalRead(TFT_D1) << 1; 135 b |= digitalRead(TFT_D2) << 2; 136 b |= digitalRead(TFT_D3) << 3; 137 b |= digitalRead(TFT_D4) << 4; 138 b |= digitalRead(TFT_D5) << 5; 139 b |= digitalRead(TFT_D6) << 6; 140 b |= digitalRead(TFT_D7) << 7; 141 142 digitalWrite(TFT_RD, HIGH); 143 busDir(0, OUTPUT); 144 145 return b; 146 } 147 148 //////////////////////////////////////////////////////////////////////////////////////// 149 #elif defined (RPI_WRITE_STROBE) // For RPi TFT with write strobe 150 //////////////////////////////////////////////////////////////////////////////////////// 151 152 /*************************************************************************************** 153 ** Function name: pushBlock - for ESP32 or STM32 RPi TFT 154 ** Description: Write a block of pixels of the same colour 155 ***************************************************************************************/ 156 void TFT_eSPI::pushBlock(uint16_t color, uint32_t len){ 157 158 if(len) { tft_Write_16(color); len--; } 159 while(len--) {WR_L; WR_H;} 160 } 161 162 /*************************************************************************************** 163 ** Function name: pushPixels - for ESP32 or STM32 RPi TFT 164 ** Description: Write a sequence of pixels 165 ***************************************************************************************/ 166 void TFT_eSPI::pushPixels(const void* data_in, uint32_t len) 167 { 168 uint16_t *data = (uint16_t*)data_in; 169 170 if (_swapBytes) while ( len-- ) {tft_Write_16S(*data); data++;} 171 else while ( len-- ) {tft_Write_16(*data); data++;} 172 } 173 174 //////////////////////////////////////////////////////////////////////////////////////// 175 #elif defined (SPI_18BIT_DRIVER) // SPI 18 bit colour 176 //////////////////////////////////////////////////////////////////////////////////////// 177 178 /*************************************************************************************** 179 ** Function name: pushBlock - for STM32 and 3 byte RGB display 180 ** Description: Write a block of pixels of the same colour 181 ***************************************************************************************/ 182 void TFT_eSPI::pushBlock(uint16_t color, uint32_t len) 183 { 184 // Split out the colours 185 uint8_t r = (color & 0xF800)>>8; 186 uint8_t g = (color & 0x07E0)>>3; 187 uint8_t b = (color & 0x001F)<<3; 188 189 while ( len-- ) {tft_Write_8(r); tft_Write_8(g); tft_Write_8(b);} 190 } 191 192 /*************************************************************************************** 193 ** Function name: pushPixels - for STM32 and 3 byte RGB display 194 ** Description: Write a sequence of pixels 195 ***************************************************************************************/ 196 void TFT_eSPI::pushPixels(const void* data_in, uint32_t len){ 197 198 uint16_t *data = (uint16_t*)data_in; 199 if (_swapBytes) { 200 while ( len-- ) { 201 uint16_t color = *data >> 8 | *data << 8; 202 tft_Write_8((color & 0xF800)>>8); 203 tft_Write_8((color & 0x07E0)>>3); 204 tft_Write_8((color & 0x001F)<<3); 205 data++; 206 } 207 } 208 else { 209 while ( len-- ) { 210 tft_Write_8((*data & 0xF800)>>8); 211 tft_Write_8((*data & 0x07E0)>>3); 212 tft_Write_8((*data & 0x001F)<<3); 213 data++; 214 } 215 } 216 } 217 218 //////////////////////////////////////////////////////////////////////////////////////// 219 #else // Standard SPI 16 bit colour TFT 220 //////////////////////////////////////////////////////////////////////////////////////// 221 222 /*************************************************************************************** 223 ** Function name: pushBlock - for STM32 224 ** Description: Write a block of pixels of the same colour 225 ***************************************************************************************/ 226 void TFT_eSPI::pushBlock(uint16_t color, uint32_t len){ 227 228 while ( len-- ) {tft_Write_16(color);} 229 } 230 231 /*************************************************************************************** 232 ** Function name: pushPixels - for STM32 233 ** Description: Write a sequence of pixels 234 ***************************************************************************************/ 235 void TFT_eSPI::pushPixels(const void* data_in, uint32_t len){ 236 237 uint16_t *data = (uint16_t*)data_in; 238 239 if (_swapBytes) while ( len-- ) {tft_Write_16(*data); data++;} 240 else while ( len-- ) {tft_Write_16S(*data); data++;} 241 } 242 243 //////////////////////////////////////////////////////////////////////////////////////// 244 #endif // End of display interface specific functions 245 //////////////////////////////////////////////////////////////////////////////////////// 246 247 248 //////////////////////////////////////////////////////////////////////////////////////// 249 // DMA FUNCTIONS 250 //////////////////////////////////////////////////////////////////////////////////////// 251 252 // Placeholder for DMA functions 253 254 /* 255 Minimal function set to support DMA: 256 257 bool TFT_eSPI::initDMA(void) 258 void TFT_eSPI::deInitDMA(void) 259 bool TFT_eSPI::dmaBusy(void) 260 void TFT_eSPI::pushPixelsDMA(uint16_t* image, uint32_t len) 261 void TFT_eSPI::pushImageDMA(int32_t x, int32_t y, int32_t w, int32_t h, uint16_t* image) 262 263 */