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 */