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_ESP8266.h (8665B)

      1         //////////////////////////////////////////////////////
      2         // TFT_eSPI driver functions for ESP8266 processors //
      3         //////////////////////////////////////////////////////
      4 
      5 #ifndef _TFT_eSPI_ESP8266H_
      6 #define _TFT_eSPI_ESP8266H_
      7 
      8 // Processor ID reported by getSetup()
      9 #define PROCESSOR_ID 0x8266
     10 
     11 // Include processor specific header
     12 // None
     13 
     14 // Processor specific code used by SPI bus transaction startWrite and endWrite functions
     15 #define SET_BUS_WRITE_MODE SPI1U=SPI1U_WRITE
     16 #define SET_BUS_READ_MODE  SPI1U=SPI1U_READ
     17 
     18 // Code to check if DMA is busy, used by SPI bus transaction transaction and endWrite functions
     19 #define DMA_BUSY_CHECK // DMA not available, leave blank
     20 
     21 // Initialise processor specific SPI functions, used by init()
     22 #if (!defined (SUPPORT_TRANSACTIONS) && defined (ARDUINO_ARCH_ESP8266))
     23   #define INIT_TFT_DATA_BUS \
     24     spi.setBitOrder(MSBFIRST); \
     25     spi.setDataMode(TFT_SPI_MODE); \
     26     spi.setFrequency(SPI_FREQUENCY);
     27   #else
     28     #define INIT_TFT_DATA_BUS
     29 #endif
     30 
     31 // If smooth fonts are enabled the filing system may need to be loaded
     32 #ifdef SMOOTH_FONT
     33   // Call up the SPIFFS FLASH filing system for the anti-aliased fonts
     34   #define FS_NO_GLOBALS
     35   #include <FS.h>
     36   #define FONT_FS_AVAILABLE
     37 #endif
     38 
     39 // Do not allow parallel mode for ESP8266
     40 #ifdef ESP32_PARALLEL
     41   #undef ESP32_PARALLEL
     42 #endif
     43 #ifdef TFT_PARALLEL_8_BIT
     44   #undef TFT_PARALLEL_8_BIT
     45 #endif
     46 
     47 ////////////////////////////////////////////////////////////////////////////////////////
     48 // Define the DC (TFT Data/Command or Register Select (RS))pin drive code
     49 ////////////////////////////////////////////////////////////////////////////////////////
     50 #ifndef TFT_DC
     51   #define DC_C // No macro allocated so it generates no code
     52   #define DC_D // No macro allocated so it generates no code
     53 #else
     54   #if (TFT_DC == 16)
     55     #define DC_C digitalWrite(TFT_DC, LOW)
     56     #define DC_D digitalWrite(TFT_DC, HIGH)
     57   #else
     58     #define DC_C GPOC=dcpinmask
     59     #define DC_D GPOS=dcpinmask
     60   #endif
     61 #endif
     62 
     63 ////////////////////////////////////////////////////////////////////////////////////////
     64 // Define the CS (TFT chip select) pin drive code
     65 ////////////////////////////////////////////////////////////////////////////////////////
     66 #ifndef TFT_CS
     67   #define CS_L // No macro allocated so it generates no code
     68   #define CS_H // No macro allocated so it generates no code
     69 #else
     70   #if (TFT_CS == 16)
     71     #define CS_L digitalWrite(TFT_CS, LOW)
     72     #define CS_H digitalWrite(TFT_CS, HIGH)
     73   #else
     74     #define CS_L GPOC=cspinmask
     75     #define CS_H GPOS=cspinmask
     76   #endif
     77 #endif
     78 
     79 ////////////////////////////////////////////////////////////////////////////////////////
     80 // Define the WR (TFT Write) pin drive code
     81 ////////////////////////////////////////////////////////////////////////////////////////
     82 #ifdef TFT_WR
     83   #define WR_L GPOC=wrpinmask
     84   #define WR_H GPOS=wrpinmask
     85 #endif
     86 
     87 ////////////////////////////////////////////////////////////////////////////////////////
     88 // Define the touch screen chip select pin drive code
     89 ////////////////////////////////////////////////////////////////////////////////////////
     90 #ifndef TOUCH_CS
     91   #define T_CS_L // No macro allocated so it generates no code
     92   #define T_CS_H // No macro allocated so it generates no code
     93 #else
     94   #define T_CS_L digitalWrite(TOUCH_CS, LOW)
     95   #define T_CS_H digitalWrite(TOUCH_CS, HIGH)
     96 #endif
     97 
     98 ////////////////////////////////////////////////////////////////////////////////////////
     99 // Make sure TFT_MISO is defined if not used to avoid an error message
    100 ////////////////////////////////////////////////////////////////////////////////////////
    101 #ifndef TFT_MISO
    102   #define TFT_MISO -1
    103 #endif
    104 
    105 ////////////////////////////////////////////////////////////////////////////////////////
    106 // ESP8266 specific SPI macros
    107 ////////////////////////////////////////////////////////////////////////////////////////
    108 #if defined (TFT_SPI_OVERLAP)
    109   #undef TFT_CS
    110   #define SPI1U_WRITE (SPIUMOSI | SPIUSSE | SPIUCSSETUP | SPIUCSHOLD)
    111   #define SPI1U_READ  (SPIUMOSI | SPIUSSE | SPIUCSSETUP | SPIUCSHOLD | SPIUDUPLEX)
    112 #else
    113   #define SPI1U_WRITE (SPIUMOSI | SPIUSSE)
    114   #define SPI1U_READ  (SPIUMOSI | SPIUSSE | SPIUDUPLEX)
    115 #endif
    116 
    117 ////////////////////////////////////////////////////////////////////////////////////////
    118 // Macros to write commands/pixel colour data to a SPI ILI948x TFT
    119 ////////////////////////////////////////////////////////////////////////////////////////
    120 #if  defined (SPI_18BIT_DRIVER) // SPI 18 bit colour
    121 
    122   // Write 8 bits to TFT
    123   #define tft_Write_8(C)   spi.transfer(C)
    124 
    125   // Convert 16 bit colour to 18 bit and write in 3 bytes
    126   #define tft_Write_16(C)  spi.transfer(((C) & 0xF800)>>8); \
    127                            spi.transfer(((C) & 0x07E0)>>3); \
    128                            spi.transfer(((C) & 0x001F)<<3)
    129 
    130   // Convert swapped byte 16 bit colour to 18 bit and write in 3 bytes
    131   #define tft_Write_16S(C) spi.transfer((C) & 0xF8); \
    132                            spi.transfer(((C) & 0xE000)>>11 | ((C) & 0x07)<<5); \
    133                            spi.transfer(((C) & 0x1F00)>>5)
    134 
    135   // Write 32 bits to TFT
    136   #define tft_Write_32(C)  spi.write32(C)
    137 
    138   // Write two address coordinates
    139   #define tft_Write_32C(C,D) spi.write32((C)<<16 | (D))
    140   
    141   // Write same value twice
    142   #define tft_Write_32D(C) spi.write32((C)<<16 | (C))
    143 
    144 ////////////////////////////////////////////////////////////////////////////////////////
    145 // Macros to write commands/pixel colour data to an Raspberry Pi TFT
    146 ////////////////////////////////////////////////////////////////////////////////////////
    147 #elif  defined (RPI_DISPLAY_TYPE)
    148   // Command is 16 bits
    149   #define CMD_BITS 16
    150 
    151   // ESP8266 low level SPI writes for 8, 16 and 32 bit values
    152   // to avoid the function call overhead
    153   #define TFT_WRITE_BITS(D, B) \
    154   SPI1U1 = ((B-1) << SPILMOSI); \
    155   SPI1W0 = D; \
    156   SPI1CMD |= SPIBUSY; \
    157   while(SPI1CMD & SPIBUSY) {}
    158 
    159   #define tft_Write_8(C)     TFT_WRITE_BITS((uint16_t)(C)<<8, CMD_BITS)
    160 
    161   #define tft_Write_16(C)    TFT_WRITE_BITS((C)>>8 | (C)<<8, 16)
    162 
    163   #define tft_Write_16S(C)   TFT_WRITE_BITS(C, 16)
    164 
    165   #define tft_Write_32(C)    TFT_WRITE_BITS(C, 32)
    166 
    167   #define tft_Write_32C(C,D) SPI1U1 = ((64-1) << SPILMOSI); \
    168                              SPI1W0 = ((C)<<24) | (C); \
    169                              SPI1W1 = ((D)<<24) | (D); \
    170                              SPI1CMD |= SPIBUSY; \
    171                              while(SPI1CMD & SPIBUSY) {;}
    172 
    173   #define tft_Write_32D(C) tft_Write_32C(C,C)
    174 
    175 ////////////////////////////////////////////////////////////////////////////////////////
    176 // Macros for all other SPI displays
    177 ////////////////////////////////////////////////////////////////////////////////////////
    178 #else
    179   // Command is 8 bits
    180   #define CMD_BITS 8
    181 
    182   #define tft_Write_8(C) \
    183   SPI1U1 = ((CMD_BITS-1) << SPILMOSI) | ((CMD_BITS-1) << SPILMISO); \
    184   SPI1W0 = (C)<<(CMD_BITS - 8); \
    185   SPI1CMD |= SPIBUSY; \
    186   while(SPI1CMD & SPIBUSY) {;}
    187 
    188   #define tft_Write_16(C) \
    189   SPI1U1 = (15 << SPILMOSI) | (15 << SPILMISO); \
    190   SPI1W0 = ((C)<<8 | (C)>>8); \
    191   SPI1CMD |= SPIBUSY; \
    192   while(SPI1CMD & SPIBUSY) {;}
    193 
    194   #define tft_Write_16N(C) \
    195   SPI1U1 = (15 << SPILMOSI) | (15 << SPILMISO); \
    196   SPI1W0 = ((C)<<8 | (C)>>8); \
    197   SPI1CMD |= SPIBUSY
    198 
    199   #define tft_Write_16S(C) \
    200   SPI1U1 = (15 << SPILMOSI) | (15 << SPILMISO); \
    201   SPI1W0 = C; \
    202   SPI1CMD |= SPIBUSY; \
    203   while(SPI1CMD & SPIBUSY) {;}
    204 
    205   #define tft_Write_32(C) \
    206   SPI1U1 = (31 << SPILMOSI) | (31 << SPILMISO); \
    207   SPI1W0 = C; \
    208   SPI1CMD |= SPIBUSY; \
    209   while(SPI1CMD & SPIBUSY) {;}
    210 
    211   #define tft_Write_32C(C,D) \
    212   SPI1U1 = (31 << SPILMOSI) | (31 << SPILMISO); \
    213   SPI1W0 = ((D)>>8 | (D)<<8)<<16 | ((C)>>8 | (C)<<8); \
    214   SPI1CMD |= SPIBUSY; \
    215   while(SPI1CMD & SPIBUSY) {;}
    216 
    217   #define tft_Write_32D(C) \
    218   SPI1U1 = (31 << SPILMOSI) | (31 << SPILMISO); \
    219   SPI1W0 = ((C)>>8 | (C)<<8)<<16 | ((C)>>8 | (C)<<8); \
    220   SPI1CMD |= SPIBUSY; \
    221   while(SPI1CMD & SPIBUSY) {;}
    222 
    223 #endif
    224 
    225 #ifndef tft_Write_16N
    226   #define tft_Write_16N tft_Write_16
    227 #endif
    228 
    229 ////////////////////////////////////////////////////////////////////////////////////////
    230 // Macros to read from display using SPI or software SPI
    231 ////////////////////////////////////////////////////////////////////////////////////////
    232 #if defined (TFT_SDA_READ)
    233   // Use a bit banged function call for ESP8266 and bi-directional SDA pin
    234   #define TFT_eSPI_ENABLE_8_BIT_READ // Enable tft_Read_8(void);
    235   #define SCLK_L GPOC=sclkpinmask
    236   #define SCLK_H GPOS=sclkpinmask
    237 #else
    238   // Use a SPI read transfer
    239   #define tft_Read_8() spi.transfer(0)
    240 #endif
    241 
    242 // Concatenate a byte sequence A,B,C,D to CDAB, P is a uint8_t pointer
    243 #define DAT8TO32(P) ( (uint32_t)P[0]<<8 | P[1] | P[2]<<24 | P[3]<<16 )
    244 
    245 #endif // Header end