Please run it on your NUCLEO-L152

Dependencies:   mbed

Committer:
davidprentice
Date:
Wed Sep 18 10:38:19 2019 +0000
Revision:
1:d88d2ad55fac
Parent:
0:b608c7f02f80
Added messages to Serial Terminal (9600 baud)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
davidprentice 0:b608c7f02f80 1 //#define SUPPORT_0139 //S6D0139 +280 bytes
davidprentice 0:b608c7f02f80 2 #define SUPPORT_0154 //S6D0154 +320 bytes
davidprentice 0:b608c7f02f80 3 //#define SUPPORT_1289 //SSD1289,SSD1297 (ID=0x9797) +626 bytes, 0.03s
davidprentice 0:b608c7f02f80 4 //#define SUPPORT_1580 //R61580 Untested
davidprentice 0:b608c7f02f80 5 #define SUPPORT_1963 //only works with 16BIT bus anyway
davidprentice 0:b608c7f02f80 6 //#define SUPPORT_4532 //LGDP4532 +120 bytes. thanks Leodino
davidprentice 0:b608c7f02f80 7 #define SUPPORT_4535 //LGDP4535 +180 bytes
davidprentice 0:b608c7f02f80 8 #define SUPPORT_68140 //RM68140 +52 bytes defaults to PIXFMT=0x55
davidprentice 0:b608c7f02f80 9 //#define SUPPORT_7735
davidprentice 0:b608c7f02f80 10 #define SUPPORT_7781 //ST7781 +172 bytes
davidprentice 0:b608c7f02f80 11 //#define SUPPORT_8230 //UC8230 +118 bytes
davidprentice 0:b608c7f02f80 12 //#define SUPPORT_8347D //HX8347-D, HX8347-G, HX8347-I, HX8367-A +520 bytes, 0.27s
davidprentice 0:b608c7f02f80 13 //#define SUPPORT_8347A //HX8347-A +500 bytes, 0.27s
davidprentice 0:b608c7f02f80 14 //#define SUPPORT_8352A //HX8352A +486 bytes, 0.27s
davidprentice 0:b608c7f02f80 15 //#define SUPPORT_8352B //HX8352B
davidprentice 0:b608c7f02f80 16 //#define SUPPORT_8357D_GAMMA //monster 34 byte
davidprentice 0:b608c7f02f80 17 //#define SUPPORT_9163 //
davidprentice 0:b608c7f02f80 18 //#define SUPPORT_9225 //ILI9225-B, ILI9225-G ID=0x9225, ID=0x9226, ID=0x6813 +380 bytes
davidprentice 0:b608c7f02f80 19 //#define SUPPORT_9326_5420 //ILI9326, SPFD5420 +246 bytes
davidprentice 0:b608c7f02f80 20 //#define SUPPORT_9342 //costs +114 bytes
davidprentice 0:b608c7f02f80 21 //#define SUPPORT_9806 //UNTESTED
davidprentice 0:b608c7f02f80 22 #define SUPPORT_9488_555 //costs +230 bytes, 0.03s / 0.19s
davidprentice 0:b608c7f02f80 23 #define SUPPORT_B509_7793 //R61509, ST7793 +244 bytes
davidprentice 0:b608c7f02f80 24 #define OFFSET_9327 32 //costs about 103 bytes, 0.08s
davidprentice 0:b608c7f02f80 25
davidprentice 0:b608c7f02f80 26 #include "MCUFRIEND_kbv.h"
davidprentice 0:b608c7f02f80 27 #if defined(USE_SERIAL)
davidprentice 0:b608c7f02f80 28 #include "utility/mcufriend_serial.h"
davidprentice 0:b608c7f02f80 29 //uint8_t running;
davidprentice 0:b608c7f02f80 30 #elif defined(__MBED__)
davidprentice 0:b608c7f02f80 31 #include "utility/mcufriend_mbed.h"
davidprentice 0:b608c7f02f80 32 #elif defined(__CC_ARM) || defined(__CROSSWORKS_ARM)
davidprentice 0:b608c7f02f80 33 #include "utility/mcufriend_keil.h"
davidprentice 0:b608c7f02f80 34 #else
davidprentice 0:b608c7f02f80 35 #include "utility/mcufriend_shield.h"
davidprentice 0:b608c7f02f80 36 #endif
davidprentice 0:b608c7f02f80 37
davidprentice 0:b608c7f02f80 38 #define MIPI_DCS_REV1 (1<<0)
davidprentice 0:b608c7f02f80 39 #define AUTO_READINC (1<<1)
davidprentice 0:b608c7f02f80 40 #define READ_BGR (1<<2)
davidprentice 0:b608c7f02f80 41 #define READ_LOWHIGH (1<<3)
davidprentice 0:b608c7f02f80 42 #define READ_24BITS (1<<4)
davidprentice 0:b608c7f02f80 43 #define XSA_XEA_16BIT (1<<5)
davidprentice 0:b608c7f02f80 44 #define READ_NODUMMY (1<<6)
davidprentice 0:b608c7f02f80 45 #define INVERT_GS (1<<8)
davidprentice 0:b608c7f02f80 46 #define INVERT_SS (1<<9)
davidprentice 0:b608c7f02f80 47 #define MV_AXIS (1<<10)
davidprentice 0:b608c7f02f80 48 #define INVERT_RGB (1<<11)
davidprentice 0:b608c7f02f80 49 #define REV_SCREEN (1<<12)
davidprentice 0:b608c7f02f80 50 #define FLIP_VERT (1<<13)
davidprentice 0:b608c7f02f80 51 #define FLIP_HORIZ (1<<14)
davidprentice 0:b608c7f02f80 52
davidprentice 0:b608c7f02f80 53 #if (defined(USES_16BIT_BUS)) //only comes from SPECIALs
davidprentice 0:b608c7f02f80 54 #define USING_16BIT_BUS 1
davidprentice 0:b608c7f02f80 55 #else
davidprentice 0:b608c7f02f80 56 #define USING_16BIT_BUS 0
davidprentice 0:b608c7f02f80 57 #endif
davidprentice 0:b608c7f02f80 58
davidprentice 0:b608c7f02f80 59 MCUFRIEND_kbv::MCUFRIEND_kbv(int CS, int RS, int WR, int RD, int _RST):Adafruit_GFX(240, 320)
davidprentice 0:b608c7f02f80 60 {
davidprentice 0:b608c7f02f80 61 // we can not access GPIO pins until AHB has been enabled.
davidprentice 0:b608c7f02f80 62 }
davidprentice 0:b608c7f02f80 63
davidprentice 0:b608c7f02f80 64 static uint8_t done_reset, is8347, is555, is9797;
davidprentice 0:b608c7f02f80 65 static uint16_t color565_to_555(uint16_t color) {
davidprentice 0:b608c7f02f80 66 return (color & 0xFFC0) | ((color & 0x1F) << 1) | ((color & 0x01)); //lose Green LSB, extend Blue LSB
davidprentice 0:b608c7f02f80 67 }
davidprentice 0:b608c7f02f80 68 static uint16_t color555_to_565(uint16_t color) {
davidprentice 0:b608c7f02f80 69 return (color & 0xFFC0) | ((color & 0x0400) >> 5) | ((color & 0x3F) >> 1); //extend Green LSB
davidprentice 0:b608c7f02f80 70 }
davidprentice 0:b608c7f02f80 71 static uint8_t color565_to_r(uint16_t color) {
davidprentice 0:b608c7f02f80 72 return ((color & 0xF800) >> 8); // transform to rrrrrxxx
davidprentice 0:b608c7f02f80 73 }
davidprentice 0:b608c7f02f80 74 static uint8_t color565_to_g(uint16_t color) {
davidprentice 0:b608c7f02f80 75 return ((color & 0x07E0) >> 3); // transform to ggggggxx
davidprentice 0:b608c7f02f80 76 }
davidprentice 0:b608c7f02f80 77 static uint8_t color565_to_b(uint16_t color) {
davidprentice 0:b608c7f02f80 78 return ((color & 0x001F) << 3); // transform to bbbbbxxx
davidprentice 0:b608c7f02f80 79 }
davidprentice 0:b608c7f02f80 80 static void write24(uint16_t color) {
davidprentice 0:b608c7f02f80 81 uint8_t r = color565_to_r(color);
davidprentice 0:b608c7f02f80 82 uint8_t g = color565_to_g(color);
davidprentice 0:b608c7f02f80 83 uint8_t b = color565_to_b(color);
davidprentice 0:b608c7f02f80 84 write8(r);
davidprentice 0:b608c7f02f80 85 write8(g);
davidprentice 0:b608c7f02f80 86 write8(b);
davidprentice 0:b608c7f02f80 87 }
davidprentice 0:b608c7f02f80 88
davidprentice 0:b608c7f02f80 89 void MCUFRIEND_kbv::reset(void)
davidprentice 0:b608c7f02f80 90 {
davidprentice 0:b608c7f02f80 91 done_reset = 1;
davidprentice 0:b608c7f02f80 92 setWriteDir();
davidprentice 0:b608c7f02f80 93 CTL_INIT();
davidprentice 0:b608c7f02f80 94 CS_IDLE;
davidprentice 0:b608c7f02f80 95 RD_IDLE;
davidprentice 0:b608c7f02f80 96 WR_IDLE;
davidprentice 0:b608c7f02f80 97 RESET_IDLE;
davidprentice 0:b608c7f02f80 98 delay(50);
davidprentice 0:b608c7f02f80 99 RESET_ACTIVE;
davidprentice 0:b608c7f02f80 100 delay(100);
davidprentice 0:b608c7f02f80 101 RESET_IDLE;
davidprentice 0:b608c7f02f80 102 delay(100);
davidprentice 0:b608c7f02f80 103 WriteCmdData(0xB0, 0x0000); //R61520 needs this to read ID
davidprentice 0:b608c7f02f80 104 }
davidprentice 0:b608c7f02f80 105
davidprentice 0:b608c7f02f80 106 static void writecmddata(uint16_t cmd, uint16_t dat)
davidprentice 0:b608c7f02f80 107 {
davidprentice 0:b608c7f02f80 108 CS_ACTIVE;
davidprentice 0:b608c7f02f80 109 WriteCmd(cmd);
davidprentice 0:b608c7f02f80 110 WriteData(dat);
davidprentice 0:b608c7f02f80 111 CS_IDLE;
davidprentice 0:b608c7f02f80 112 }
davidprentice 0:b608c7f02f80 113
davidprentice 0:b608c7f02f80 114 void MCUFRIEND_kbv::WriteCmdData(uint16_t cmd, uint16_t dat) { writecmddata(cmd, dat); }
davidprentice 0:b608c7f02f80 115
davidprentice 0:b608c7f02f80 116 static void WriteCmdParamN(uint16_t cmd, int8_t N, uint8_t * block)
davidprentice 0:b608c7f02f80 117 {
davidprentice 0:b608c7f02f80 118 CS_ACTIVE;
davidprentice 0:b608c7f02f80 119 WriteCmd(cmd);
davidprentice 0:b608c7f02f80 120 while (N-- > 0) {
davidprentice 0:b608c7f02f80 121 uint8_t u8 = *block++;
davidprentice 0:b608c7f02f80 122 write8(u8);
davidprentice 0:b608c7f02f80 123 if (N && is8347) {
davidprentice 0:b608c7f02f80 124 cmd++;
davidprentice 0:b608c7f02f80 125 WriteCmd(cmd);
davidprentice 0:b608c7f02f80 126 }
davidprentice 0:b608c7f02f80 127 }
davidprentice 0:b608c7f02f80 128 CS_IDLE;
davidprentice 0:b608c7f02f80 129 }
davidprentice 0:b608c7f02f80 130
davidprentice 0:b608c7f02f80 131 static inline void WriteCmdParam4(uint8_t cmd, uint8_t d1, uint8_t d2, uint8_t d3, uint8_t d4)
davidprentice 0:b608c7f02f80 132 {
davidprentice 0:b608c7f02f80 133 uint8_t d[4];
davidprentice 0:b608c7f02f80 134 d[0] = d1, d[1] = d2, d[2] = d3, d[3] = d4;
davidprentice 0:b608c7f02f80 135 WriteCmdParamN(cmd, 4, d);
davidprentice 0:b608c7f02f80 136 }
davidprentice 0:b608c7f02f80 137
davidprentice 0:b608c7f02f80 138 //#define WriteCmdParam4(cmd, d1, d2, d3, d4) {uint8_t d[4];d[0] = d1, d[1] = d2, d[2] = d3, d[3] = d4;WriteCmdParamN(cmd, 4, d);}
davidprentice 0:b608c7f02f80 139 void MCUFRIEND_kbv::pushCommand(uint16_t cmd, uint8_t * block, int8_t N) { WriteCmdParamN(cmd, N, block); }
davidprentice 0:b608c7f02f80 140
davidprentice 0:b608c7f02f80 141 static uint16_t read16bits(void)
davidprentice 0:b608c7f02f80 142 {
davidprentice 0:b608c7f02f80 143 uint16_t ret;
davidprentice 0:b608c7f02f80 144 uint8_t lo;
davidprentice 0:b608c7f02f80 145 #if USING_16BIT_BUS
davidprentice 0:b608c7f02f80 146 READ_16(ret); //single strobe to read whole bus
davidprentice 0:b608c7f02f80 147 if (ret > 255) //ID might say 0x00D3
davidprentice 0:b608c7f02f80 148 return ret;
davidprentice 0:b608c7f02f80 149 #else
davidprentice 0:b608c7f02f80 150 READ_8(ret);
davidprentice 0:b608c7f02f80 151 #endif
davidprentice 0:b608c7f02f80 152 //all MIPI_DCS_REV1 style params are 8-bit
davidprentice 0:b608c7f02f80 153 READ_8(lo);
davidprentice 0:b608c7f02f80 154 return (ret << 8) | lo;
davidprentice 0:b608c7f02f80 155 }
davidprentice 0:b608c7f02f80 156
davidprentice 0:b608c7f02f80 157 uint16_t MCUFRIEND_kbv::readReg(uint16_t reg, int8_t index)
davidprentice 0:b608c7f02f80 158 {
davidprentice 0:b608c7f02f80 159 uint16_t ret;
davidprentice 0:b608c7f02f80 160 uint8_t lo;
davidprentice 0:b608c7f02f80 161 if (!done_reset)
davidprentice 0:b608c7f02f80 162 reset();
davidprentice 0:b608c7f02f80 163 CS_ACTIVE;
davidprentice 0:b608c7f02f80 164 WriteCmd(reg);
davidprentice 0:b608c7f02f80 165 setReadDir();
davidprentice 0:b608c7f02f80 166 delay(1); //1us should be adequate
davidprentice 0:b608c7f02f80 167 // READ_16(ret);
davidprentice 0:b608c7f02f80 168 do { ret = read16bits(); }while (--index >= 0); //need to test with SSD1963
davidprentice 0:b608c7f02f80 169 RD_IDLE;
davidprentice 0:b608c7f02f80 170 CS_IDLE;
davidprentice 0:b608c7f02f80 171 setWriteDir();
davidprentice 0:b608c7f02f80 172 return ret;
davidprentice 0:b608c7f02f80 173 }
davidprentice 0:b608c7f02f80 174
davidprentice 0:b608c7f02f80 175 uint32_t MCUFRIEND_kbv::readReg32(uint16_t reg)
davidprentice 0:b608c7f02f80 176 {
davidprentice 0:b608c7f02f80 177 uint16_t h = readReg(reg, 0);
davidprentice 0:b608c7f02f80 178 uint16_t l = readReg(reg, 1);
davidprentice 0:b608c7f02f80 179 return ((uint32_t) h << 16) | (l);
davidprentice 0:b608c7f02f80 180 }
davidprentice 0:b608c7f02f80 181
davidprentice 0:b608c7f02f80 182 uint32_t MCUFRIEND_kbv::readReg40(uint16_t reg)
davidprentice 0:b608c7f02f80 183 {
davidprentice 0:b608c7f02f80 184 uint16_t h = readReg(reg, 0);
davidprentice 0:b608c7f02f80 185 uint16_t m = readReg(reg, 1);
davidprentice 0:b608c7f02f80 186 uint16_t l = readReg(reg, 2);
davidprentice 0:b608c7f02f80 187 return ((uint32_t) h << 24) | (m << 8) | (l >> 8);
davidprentice 0:b608c7f02f80 188 }
davidprentice 0:b608c7f02f80 189
davidprentice 0:b608c7f02f80 190 uint16_t MCUFRIEND_kbv::readID(void)
davidprentice 0:b608c7f02f80 191 {
davidprentice 0:b608c7f02f80 192 uint16_t ret, ret2;
davidprentice 0:b608c7f02f80 193 uint8_t msb;
davidprentice 0:b608c7f02f80 194 ret = readReg(0); //forces a reset() if called before begin()
davidprentice 0:b608c7f02f80 195 if (ret == 0x5408) //the SPFD5408 fails the 0xD3D3 test.
davidprentice 0:b608c7f02f80 196 return 0x5408;
davidprentice 0:b608c7f02f80 197 if (ret == 0x5420) //the SPFD5420 fails the 0xD3D3 test.
davidprentice 0:b608c7f02f80 198 return 0x5420;
davidprentice 0:b608c7f02f80 199 if (ret == 0x8989) //SSD1289 is always 8989
davidprentice 0:b608c7f02f80 200 return 0x1289;
davidprentice 0:b608c7f02f80 201 ret = readReg(0x67); //HX8347-A
davidprentice 0:b608c7f02f80 202 if (ret == 0x4747)
davidprentice 0:b608c7f02f80 203 return 0x8347;
davidprentice 0:b608c7f02f80 204 //#if defined(SUPPORT_1963) && USING_16BIT_BUS
davidprentice 0:b608c7f02f80 205 ret = readReg32(0xA1); //SSD1963: [01 57 61 01]
davidprentice 0:b608c7f02f80 206 if (ret == 0x6101)
davidprentice 0:b608c7f02f80 207 return 0x1963;
davidprentice 0:b608c7f02f80 208 if (ret == 0xFFFF) //R61526: [xx FF FF FF]
davidprentice 0:b608c7f02f80 209 return 0x1526; //subsequent begin() enables Command Access
davidprentice 0:b608c7f02f80 210 // if (ret == 0xFF00) //R61520: [xx FF FF 00]
davidprentice 0:b608c7f02f80 211 // return 0x1520; //subsequent begin() enables Command Access
davidprentice 0:b608c7f02f80 212 //#endif
davidprentice 0:b608c7f02f80 213 ret = readReg40(0xBF);
davidprentice 0:b608c7f02f80 214 if (ret == 0x8357) //HX8357B: [xx 01 62 83 57 FF]
davidprentice 0:b608c7f02f80 215 return 0x8357;
davidprentice 0:b608c7f02f80 216 if (ret == 0x9481) //ILI9481: [xx 02 04 94 81 FF]
davidprentice 0:b608c7f02f80 217 return 0x9481;
davidprentice 0:b608c7f02f80 218 if (ret == 0x1511) //?R61511: [xx 02 04 15 11] not tested yet
davidprentice 0:b608c7f02f80 219 return 0x1511;
davidprentice 0:b608c7f02f80 220 if (ret == 0x1520) //?R61520: [xx 01 22 15 20]
davidprentice 0:b608c7f02f80 221 return 0x1520;
davidprentice 0:b608c7f02f80 222 if (ret == 0x1526) //?R61526: [xx 01 22 15 26]
davidprentice 0:b608c7f02f80 223 return 0x1526;
davidprentice 0:b608c7f02f80 224 if (ret == 0x1581) //R61581: [xx 01 22 15 81]
davidprentice 0:b608c7f02f80 225 return 0x1581;
davidprentice 0:b608c7f02f80 226 if (ret == 0x1400) //?RM68140:[xx FF 68 14 00] not tested yet
davidprentice 0:b608c7f02f80 227 return 0x6814;
davidprentice 0:b608c7f02f80 228 ret = readReg32(0xD4);
davidprentice 0:b608c7f02f80 229 if (ret == 0x5310) //NT35310: [xx 01 53 10]
davidprentice 0:b608c7f02f80 230 return 0x5310;
davidprentice 0:b608c7f02f80 231 ret = readReg32(0xD7);
davidprentice 0:b608c7f02f80 232 if (ret == 0x8031) //weird unknown from BangGood [xx 20 80 31] PrinceCharles
davidprentice 0:b608c7f02f80 233 return 0x8031;
davidprentice 0:b608c7f02f80 234 ret = readReg40(0xEF); //ILI9327: [xx 02 04 93 27 FF]
davidprentice 0:b608c7f02f80 235 if (ret == 0x9327)
davidprentice 0:b608c7f02f80 236 return 0x9327;
davidprentice 0:b608c7f02f80 237 ret = readReg32(0xFE) >> 8; //weird unknown from BangGood [04 20 53]
davidprentice 0:b608c7f02f80 238 if (ret == 0x2053)
davidprentice 0:b608c7f02f80 239 return 0x2053;
davidprentice 0:b608c7f02f80 240 uint32_t ret32 = readReg32(0x04);
davidprentice 0:b608c7f02f80 241 msb = ret32 >> 16;
davidprentice 0:b608c7f02f80 242 ret = ret32;
davidprentice 0:b608c7f02f80 243 // if (msb = 0x38 && ret == 0x8000) //unknown [xx 38 80 00] with D3 = 0x1602
davidprentice 0:b608c7f02f80 244 if (msb == 0x00 && ret == 0x8000) { //HX8357-D [xx 00 80 00]
davidprentice 0:b608c7f02f80 245 #if 1
davidprentice 0:b608c7f02f80 246 uint8_t cmds[] = {0xFF, 0x83, 0x57};
davidprentice 0:b608c7f02f80 247 pushCommand(0xB9, cmds, 3);
davidprentice 0:b608c7f02f80 248 msb = readReg(0xD0);
davidprentice 0:b608c7f02f80 249 if (msb == 0x99) return 0x0099; //HX8357-D from datasheet
davidprentice 0:b608c7f02f80 250 if (msb == 0x90) //HX8357-C undocumented
davidprentice 0:b608c7f02f80 251 #endif
davidprentice 0:b608c7f02f80 252 return 0x9090; //BIG CHANGE: HX8357-D was 0x8357
davidprentice 0:b608c7f02f80 253 }
davidprentice 0:b608c7f02f80 254 // if (msb == 0xFF && ret == 0xFFFF) //R61526 [xx FF FF FF]
davidprentice 0:b608c7f02f80 255 // return 0x1526; //subsequent begin() enables Command Access
davidprentice 0:b608c7f02f80 256 if (ret == 0x1526) //R61526 [xx 06 15 26] if I have written NVM
davidprentice 0:b608c7f02f80 257 return 0x1526; //subsequent begin() enables Command Access
davidprentice 0:b608c7f02f80 258 if (ret == 0x89F0) //ST7735S: [xx 7C 89 F0]
davidprentice 0:b608c7f02f80 259 return 0x7735;
davidprentice 0:b608c7f02f80 260 if (ret == 0x8552) //ST7789V: [xx 85 85 52]
davidprentice 0:b608c7f02f80 261 return 0x7789;
davidprentice 0:b608c7f02f80 262 if (ret == 0xAC11) //?unknown [xx 61 AC 11]
davidprentice 0:b608c7f02f80 263 return 0xAC11;
davidprentice 0:b608c7f02f80 264 ret32 = readReg32(0xD3); //[xx 91 63 00]
davidprentice 0:b608c7f02f80 265 ret = ret32 >> 8;
davidprentice 0:b608c7f02f80 266 if (ret == 0x9163) return ret;
davidprentice 0:b608c7f02f80 267 ret = readReg32(0xD3); //for ILI9488, 9486, 9340, 9341
davidprentice 0:b608c7f02f80 268 msb = ret >> 8;
davidprentice 0:b608c7f02f80 269 if (msb == 0x93 || msb == 0x94 || msb == 0x98 || msb == 0x77 || msb == 0x16)
davidprentice 0:b608c7f02f80 270 return ret; //0x9488, 9486, 9340, 9341, 7796
davidprentice 0:b608c7f02f80 271 if (ret == 0x00D3 || ret == 0xD3D3)
davidprentice 0:b608c7f02f80 272 return ret; //16-bit write-only bus
davidprentice 0:b608c7f02f80 273 /*
davidprentice 0:b608c7f02f80 274 msb = 0x12; //read 3rd,4th byte. does not work in parallel
davidprentice 0:b608c7f02f80 275 pushCommand(0xD9, &msb, 1);
davidprentice 0:b608c7f02f80 276 ret2 = readReg(0xD3);
davidprentice 0:b608c7f02f80 277 msb = 0x13;
davidprentice 0:b608c7f02f80 278 pushCommand(0xD9, &msb, 1);
davidprentice 0:b608c7f02f80 279 ret = (ret2 << 8) | readReg(0xD3);
davidprentice 0:b608c7f02f80 280 // if (ret2 == 0x93)
davidprentice 0:b608c7f02f80 281 return ret2;
davidprentice 0:b608c7f02f80 282 */
davidprentice 0:b608c7f02f80 283 return readReg(0); //0154, 7783, 9320, 9325, 9335, B505, B509
davidprentice 0:b608c7f02f80 284 }
davidprentice 0:b608c7f02f80 285
davidprentice 0:b608c7f02f80 286 // independent cursor and window registers. S6D0154, ST7781 increments. ILI92320/5 do not.
davidprentice 0:b608c7f02f80 287 int16_t MCUFRIEND_kbv::readGRAM(int16_t x, int16_t y, uint16_t * block, int16_t w, int16_t h)
davidprentice 0:b608c7f02f80 288 {
davidprentice 0:b608c7f02f80 289 uint16_t ret, dummy, _MR = _MW;
davidprentice 0:b608c7f02f80 290 int16_t n = w * h, row = 0, col = 0;
davidprentice 0:b608c7f02f80 291 uint8_t r, g, b, tmp;
davidprentice 0:b608c7f02f80 292 if (!is8347 && _lcd_capable & MIPI_DCS_REV1) // HX8347 uses same register
davidprentice 0:b608c7f02f80 293 _MR = 0x2E;
davidprentice 0:b608c7f02f80 294 if (_lcd_ID == 0x1602) _MR = 0x2E;
davidprentice 0:b608c7f02f80 295 setAddrWindow(x, y, x + w - 1, y + h - 1);
davidprentice 0:b608c7f02f80 296 while (n > 0) {
davidprentice 0:b608c7f02f80 297 if (!(_lcd_capable & MIPI_DCS_REV1)) {
davidprentice 0:b608c7f02f80 298 WriteCmdData(_MC, x + col);
davidprentice 0:b608c7f02f80 299 WriteCmdData(_MP, y + row);
davidprentice 0:b608c7f02f80 300 }
davidprentice 0:b608c7f02f80 301 CS_ACTIVE;
davidprentice 0:b608c7f02f80 302 WriteCmd(_MR);
davidprentice 0:b608c7f02f80 303 setReadDir();
davidprentice 0:b608c7f02f80 304 if (_lcd_capable & READ_NODUMMY) {
davidprentice 0:b608c7f02f80 305 ;
davidprentice 0:b608c7f02f80 306 } else if ((_lcd_capable & MIPI_DCS_REV1) || _lcd_ID == 0x1289) {
davidprentice 0:b608c7f02f80 307 READ_8(r);
davidprentice 0:b608c7f02f80 308 } else {
davidprentice 0:b608c7f02f80 309 READ_16(dummy);
davidprentice 0:b608c7f02f80 310 }
davidprentice 0:b608c7f02f80 311 if (_lcd_ID == 0x1511) READ_8(r); //extra dummy for R61511
davidprentice 0:b608c7f02f80 312 while (n) {
davidprentice 0:b608c7f02f80 313 if (_lcd_capable & READ_24BITS) {
davidprentice 0:b608c7f02f80 314 READ_8(r);
davidprentice 0:b608c7f02f80 315 READ_8(g);
davidprentice 0:b608c7f02f80 316 READ_8(b);
davidprentice 0:b608c7f02f80 317 if (_lcd_capable & READ_BGR)
davidprentice 0:b608c7f02f80 318 ret = color565(b, g, r);
davidprentice 0:b608c7f02f80 319 else
davidprentice 0:b608c7f02f80 320 ret = color565(r, g, b);
davidprentice 0:b608c7f02f80 321 } else {
davidprentice 0:b608c7f02f80 322 READ_16(ret);
davidprentice 0:b608c7f02f80 323 if (_lcd_capable & READ_LOWHIGH)
davidprentice 0:b608c7f02f80 324 ret = (ret >> 8) | (ret << 8);
davidprentice 0:b608c7f02f80 325 if (_lcd_capable & READ_BGR)
davidprentice 0:b608c7f02f80 326 ret = (ret & 0x07E0) | (ret >> 11) | (ret << 11);
davidprentice 0:b608c7f02f80 327 }
davidprentice 0:b608c7f02f80 328 #if defined(SUPPORT_9488_555)
davidprentice 0:b608c7f02f80 329 if (is555) ret = color555_to_565(ret);
davidprentice 0:b608c7f02f80 330 #endif
davidprentice 0:b608c7f02f80 331 *block++ = ret;
davidprentice 0:b608c7f02f80 332 n--;
davidprentice 0:b608c7f02f80 333 if (!(_lcd_capable & AUTO_READINC))
davidprentice 0:b608c7f02f80 334 break;
davidprentice 0:b608c7f02f80 335 }
davidprentice 0:b608c7f02f80 336 if (++col >= w) {
davidprentice 0:b608c7f02f80 337 col = 0;
davidprentice 0:b608c7f02f80 338 if (++row >= h)
davidprentice 0:b608c7f02f80 339 row = 0;
davidprentice 0:b608c7f02f80 340 }
davidprentice 0:b608c7f02f80 341 RD_IDLE;
davidprentice 0:b608c7f02f80 342 CS_IDLE;
davidprentice 0:b608c7f02f80 343 setWriteDir();
davidprentice 0:b608c7f02f80 344 }
davidprentice 0:b608c7f02f80 345 if (!(_lcd_capable & MIPI_DCS_REV1))
davidprentice 0:b608c7f02f80 346 setAddrWindow(0, 0, width() - 1, height() - 1);
davidprentice 0:b608c7f02f80 347 return 0;
davidprentice 0:b608c7f02f80 348 }
davidprentice 0:b608c7f02f80 349
davidprentice 0:b608c7f02f80 350 void MCUFRIEND_kbv::setRotation(uint8_t r)
davidprentice 0:b608c7f02f80 351 {
davidprentice 0:b608c7f02f80 352 uint16_t GS, SS_v, ORG, REV = _lcd_rev;
davidprentice 0:b608c7f02f80 353 uint8_t val, d[3];
davidprentice 0:b608c7f02f80 354 rotation = r & 3; // just perform the operation ourselves on the protected variables
davidprentice 0:b608c7f02f80 355 _width = (rotation & 1) ? HEIGHT : WIDTH;
davidprentice 0:b608c7f02f80 356 _height = (rotation & 1) ? WIDTH : HEIGHT;
davidprentice 0:b608c7f02f80 357 switch (rotation) {
davidprentice 0:b608c7f02f80 358 case 0: //PORTRAIT:
davidprentice 0:b608c7f02f80 359 val = 0x48; //MY=0, MX=1, MV=0, ML=0, BGR=1
davidprentice 0:b608c7f02f80 360 break;
davidprentice 0:b608c7f02f80 361 case 1: //LANDSCAPE: 90 degrees
davidprentice 0:b608c7f02f80 362 val = 0x28; //MY=0, MX=0, MV=1, ML=0, BGR=1
davidprentice 0:b608c7f02f80 363 break;
davidprentice 0:b608c7f02f80 364 case 2: //PORTRAIT_REV: 180 degrees
davidprentice 0:b608c7f02f80 365 val = 0x98; //MY=1, MX=0, MV=0, ML=1, BGR=1
davidprentice 0:b608c7f02f80 366 break;
davidprentice 0:b608c7f02f80 367 case 3: //LANDSCAPE_REV: 270 degrees
davidprentice 0:b608c7f02f80 368 val = 0xF8; //MY=1, MX=1, MV=1, ML=1, BGR=1
davidprentice 0:b608c7f02f80 369 break;
davidprentice 0:b608c7f02f80 370 }
davidprentice 0:b608c7f02f80 371 if (_lcd_capable & INVERT_GS)
davidprentice 0:b608c7f02f80 372 val ^= 0x80;
davidprentice 0:b608c7f02f80 373 if (_lcd_capable & INVERT_SS)
davidprentice 0:b608c7f02f80 374 val ^= 0x40;
davidprentice 0:b608c7f02f80 375 if (_lcd_capable & INVERT_RGB)
davidprentice 0:b608c7f02f80 376 val ^= 0x08;
davidprentice 0:b608c7f02f80 377 if (_lcd_capable & MIPI_DCS_REV1) {
davidprentice 0:b608c7f02f80 378 if (_lcd_ID == 0x6814) { //.kbv my weird 0x9486 might be 68140
davidprentice 0:b608c7f02f80 379 GS = (val & 0x80) ? (1 << 6) : 0; //MY
davidprentice 0:b608c7f02f80 380 SS_v = (val & 0x40) ? (1 << 5) : 0; //MX
davidprentice 0:b608c7f02f80 381 val &= 0x28; //keep MV, BGR, MY=0, MX=0, ML=0
davidprentice 0:b608c7f02f80 382 d[0] = 0;
davidprentice 0:b608c7f02f80 383 d[1] = GS | SS_v | 0x02; //MY, MX
davidprentice 0:b608c7f02f80 384 d[2] = 0x3B;
davidprentice 0:b608c7f02f80 385 WriteCmdParamN(0xB6, 3, d);
davidprentice 0:b608c7f02f80 386 goto common_MC;
davidprentice 0:b608c7f02f80 387 } else if (_lcd_ID == 0x1963 || _lcd_ID == 0x9481 || _lcd_ID == 0x1511) {
davidprentice 0:b608c7f02f80 388 if (val & 0x80)
davidprentice 0:b608c7f02f80 389 val |= 0x01; //GS
davidprentice 0:b608c7f02f80 390 if ((val & 0x40))
davidprentice 0:b608c7f02f80 391 val |= 0x02; //SS
davidprentice 0:b608c7f02f80 392 if (_lcd_ID == 0x1963) val &= ~0xC0;
davidprentice 0:b608c7f02f80 393 if (_lcd_ID == 0x9481) val &= ~0xD0;
davidprentice 0:b608c7f02f80 394 if (_lcd_ID == 0x1511) {
davidprentice 0:b608c7f02f80 395 val &= ~0x10; //remove ML
davidprentice 0:b608c7f02f80 396 val |= 0xC0; //force penguin 180 rotation
davidprentice 0:b608c7f02f80 397 }
davidprentice 0:b608c7f02f80 398 // val &= (_lcd_ID == 0x1963) ? ~0xC0 : ~0xD0; //MY=0, MX=0 with ML=0 for ILI9481
davidprentice 0:b608c7f02f80 399 goto common_MC;
davidprentice 0:b608c7f02f80 400 } else if (is8347) {
davidprentice 0:b608c7f02f80 401 _MC = 0x02, _MP = 0x06, _MW = 0x22, _SC = 0x02, _EC = 0x04, _SP = 0x06, _EP = 0x08;
davidprentice 0:b608c7f02f80 402 if (_lcd_ID == 0x0065) { //HX8352-B
davidprentice 0:b608c7f02f80 403 val |= 0x01; //GS=1
davidprentice 0:b608c7f02f80 404 if ((val & 0x10)) val ^= 0xD3; //(ML) flip MY, MX, ML, SS, GS
davidprentice 0:b608c7f02f80 405 if (r & 1) _MC = 0x82, _MP = 0x80;
davidprentice 0:b608c7f02f80 406 else _MC = 0x80, _MP = 0x82;
davidprentice 0:b608c7f02f80 407 }
davidprentice 0:b608c7f02f80 408 if (_lcd_ID == 0x5252) { //HX8352-A
davidprentice 0:b608c7f02f80 409 val |= 0x02; //VERT_SCROLLON
davidprentice 0:b608c7f02f80 410 if ((val & 0x10)) val ^= 0xD4; //(ML) flip MY, MX, SS. GS=1
davidprentice 0:b608c7f02f80 411 }
davidprentice 0:b608c7f02f80 412 goto common_BGR;
davidprentice 0:b608c7f02f80 413 }
davidprentice 0:b608c7f02f80 414 common_MC:
davidprentice 0:b608c7f02f80 415 _MC = 0x2A, _MP = 0x2B, _MW = 0x2C, _SC = 0x2A, _EC = 0x2A, _SP = 0x2B, _EP = 0x2B;
davidprentice 0:b608c7f02f80 416 common_BGR:
davidprentice 0:b608c7f02f80 417 WriteCmdParamN(is8347 ? 0x16 : 0x36, 1, &val);
davidprentice 0:b608c7f02f80 418 _lcd_madctl = val;
davidprentice 0:b608c7f02f80 419 // if (_lcd_ID == 0x1963) WriteCmdParamN(0x13, 0, NULL); //NORMAL mode
davidprentice 0:b608c7f02f80 420 }
davidprentice 0:b608c7f02f80 421 // cope with 9320 variants
davidprentice 0:b608c7f02f80 422 else {
davidprentice 0:b608c7f02f80 423 switch (_lcd_ID) {
davidprentice 0:b608c7f02f80 424 #if defined(SUPPORT_9225)
davidprentice 0:b608c7f02f80 425 case 0x9225:
davidprentice 0:b608c7f02f80 426 _SC = 0x37, _EC = 0x36, _SP = 0x39, _EP = 0x38;
davidprentice 0:b608c7f02f80 427 _MC = 0x20, _MP = 0x21, _MW = 0x22;
davidprentice 0:b608c7f02f80 428 GS = (val & 0x80) ? (1 << 9) : 0;
davidprentice 0:b608c7f02f80 429 SS_v = (val & 0x40) ? (1 << 8) : 0;
davidprentice 0:b608c7f02f80 430 WriteCmdData(0x01, GS | SS_v | 0x001C); // set Driver Output Control
davidprentice 0:b608c7f02f80 431 goto common_ORG;
davidprentice 0:b608c7f02f80 432 #endif
davidprentice 0:b608c7f02f80 433 #if defined(SUPPORT_0139) || defined(SUPPORT_0154)
davidprentice 0:b608c7f02f80 434 #ifdef SUPPORT_0139
davidprentice 0:b608c7f02f80 435 case 0x0139:
davidprentice 0:b608c7f02f80 436 _SC = 0x46, _EC = 0x46, _SP = 0x48, _EP = 0x47;
davidprentice 0:b608c7f02f80 437 goto common_S6D;
davidprentice 0:b608c7f02f80 438 #endif
davidprentice 0:b608c7f02f80 439 #ifdef SUPPORT_0154
davidprentice 0:b608c7f02f80 440 case 0x0154:
davidprentice 0:b608c7f02f80 441 _SC = 0x37, _EC = 0x36, _SP = 0x39, _EP = 0x38;
davidprentice 0:b608c7f02f80 442 goto common_S6D;
davidprentice 0:b608c7f02f80 443 #endif
davidprentice 0:b608c7f02f80 444 common_S6D:
davidprentice 0:b608c7f02f80 445 _MC = 0x20, _MP = 0x21, _MW = 0x22;
davidprentice 0:b608c7f02f80 446 GS = (val & 0x80) ? (1 << 9) : 0;
davidprentice 0:b608c7f02f80 447 SS_v = (val & 0x40) ? (1 << 8) : 0;
davidprentice 0:b608c7f02f80 448 // S6D0139 requires NL = 0x27, S6D0154 NL = 0x28
davidprentice 0:b608c7f02f80 449 WriteCmdData(0x01, GS | SS_v | ((_lcd_ID == 0x0139) ? 0x27 : 0x28));
davidprentice 0:b608c7f02f80 450 goto common_ORG;
davidprentice 0:b608c7f02f80 451 #endif
davidprentice 0:b608c7f02f80 452 case 0x5420:
davidprentice 0:b608c7f02f80 453 case 0x7793:
davidprentice 0:b608c7f02f80 454 case 0x9326:
davidprentice 0:b608c7f02f80 455 case 0xB509:
davidprentice 0:b608c7f02f80 456 _MC = 0x200, _MP = 0x201, _MW = 0x202, _SC = 0x210, _EC = 0x211, _SP = 0x212, _EP = 0x213;
davidprentice 0:b608c7f02f80 457 GS = (val & 0x80) ? (1 << 15) : 0;
davidprentice 0:b608c7f02f80 458 uint16_t NL;
davidprentice 0:b608c7f02f80 459 NL = ((432 / 8) - 1) << 9;
davidprentice 0:b608c7f02f80 460 if (_lcd_ID == 0x9326 || _lcd_ID == 0x5420) NL >>= 1;
davidprentice 0:b608c7f02f80 461 WriteCmdData(0x400, GS | NL);
davidprentice 0:b608c7f02f80 462 goto common_SS;
davidprentice 0:b608c7f02f80 463 default:
davidprentice 0:b608c7f02f80 464 _MC = 0x20, _MP = 0x21, _MW = 0x22, _SC = 0x50, _EC = 0x51, _SP = 0x52, _EP = 0x53;
davidprentice 0:b608c7f02f80 465 GS = (val & 0x80) ? (1 << 15) : 0;
davidprentice 0:b608c7f02f80 466 WriteCmdData(0x60, GS | 0x2700); // Gate Scan Line (0xA700)
davidprentice 0:b608c7f02f80 467 common_SS:
davidprentice 0:b608c7f02f80 468 SS_v = (val & 0x40) ? (1 << 8) : 0;
davidprentice 0:b608c7f02f80 469 WriteCmdData(0x01, SS_v); // set Driver Output Control
davidprentice 0:b608c7f02f80 470 common_ORG:
davidprentice 0:b608c7f02f80 471 ORG = (val & 0x20) ? (1 << 3) : 0;
davidprentice 0:b608c7f02f80 472 #ifdef SUPPORT_8230
davidprentice 0:b608c7f02f80 473 if (_lcd_ID == 0x8230) { // UC8230 has strange BGR and READ_BGR behaviour
davidprentice 0:b608c7f02f80 474 if (rotation == 1 || rotation == 2) {
davidprentice 0:b608c7f02f80 475 val ^= 0x08; // change BGR bit for LANDSCAPE and PORTRAIT_REV
davidprentice 0:b608c7f02f80 476 }
davidprentice 0:b608c7f02f80 477 }
davidprentice 0:b608c7f02f80 478 #endif
davidprentice 0:b608c7f02f80 479 if (val & 0x08)
davidprentice 0:b608c7f02f80 480 ORG |= 0x1000; //BGR
davidprentice 0:b608c7f02f80 481 _lcd_madctl = ORG | 0x0030;
davidprentice 0:b608c7f02f80 482 WriteCmdData(0x03, _lcd_madctl); // set GRAM write direction and BGR=1.
davidprentice 0:b608c7f02f80 483 break;
davidprentice 0:b608c7f02f80 484 #ifdef SUPPORT_1289
davidprentice 0:b608c7f02f80 485 case 0x1289:
davidprentice 0:b608c7f02f80 486 _MC = 0x4E, _MP = 0x4F, _MW = 0x22, _SC = 0x44, _EC = 0x44, _SP = 0x45, _EP = 0x46;
davidprentice 0:b608c7f02f80 487 if (rotation & 1)
davidprentice 0:b608c7f02f80 488 val ^= 0xD0; // exchange Landscape modes
davidprentice 0:b608c7f02f80 489 GS = (val & 0x80) ? (1 << 14) : 0; //called TB (top-bottom), CAD=0
davidprentice 0:b608c7f02f80 490 SS_v = (val & 0x40) ? (1 << 9) : 0; //called RL (right-left)
davidprentice 0:b608c7f02f80 491 ORG = (val & 0x20) ? (1 << 3) : 0; //called AM
davidprentice 0:b608c7f02f80 492 _lcd_drivOut = GS | SS_v | (REV << 13) | 0x013F; //REV=0, BGR=0, MUX=319
davidprentice 0:b608c7f02f80 493 if (val & 0x08)
davidprentice 0:b608c7f02f80 494 _lcd_drivOut |= 0x0800; //BGR
davidprentice 0:b608c7f02f80 495 WriteCmdData(0x01, _lcd_drivOut); // set Driver Output Control
davidprentice 0:b608c7f02f80 496 if (is9797) WriteCmdData(0x11, ORG | 0x4C30); else // DFM=2, DEN=1, WM=1, TY=0
davidprentice 0:b608c7f02f80 497 WriteCmdData(0x11, ORG | 0x6070); // DFM=3, EN=0, TY=1
davidprentice 0:b608c7f02f80 498 break;
davidprentice 0:b608c7f02f80 499 #endif
davidprentice 0:b608c7f02f80 500 }
davidprentice 0:b608c7f02f80 501 }
davidprentice 0:b608c7f02f80 502 if ((rotation & 1) && ((_lcd_capable & MV_AXIS) == 0)) {
davidprentice 0:b608c7f02f80 503 uint16_t x;
davidprentice 0:b608c7f02f80 504 x = _MC, _MC = _MP, _MP = x;
davidprentice 0:b608c7f02f80 505 x = _SC, _SC = _SP, _SP = x; //.kbv check 0139
davidprentice 0:b608c7f02f80 506 x = _EC, _EC = _EP, _EP = x; //.kbv check 0139
davidprentice 0:b608c7f02f80 507 }
davidprentice 0:b608c7f02f80 508 setAddrWindow(0, 0, width() - 1, height() - 1);
davidprentice 0:b608c7f02f80 509 vertScroll(0, HEIGHT, 0); //reset scrolling after a rotation
davidprentice 0:b608c7f02f80 510 }
davidprentice 0:b608c7f02f80 511
davidprentice 0:b608c7f02f80 512 void MCUFRIEND_kbv::drawPixel(int16_t x, int16_t y, uint16_t color)
davidprentice 0:b608c7f02f80 513 {
davidprentice 0:b608c7f02f80 514 // MCUFRIEND just plots at edge if you try to write outside of the box:
davidprentice 0:b608c7f02f80 515 if (x < 0 || y < 0 || x >= width() || y >= height())
davidprentice 0:b608c7f02f80 516 return;
davidprentice 0:b608c7f02f80 517 #if defined(SUPPORT_9488_555)
davidprentice 0:b608c7f02f80 518 if (is555) color = color565_to_555(color);
davidprentice 0:b608c7f02f80 519 #endif
davidprentice 0:b608c7f02f80 520 setAddrWindow(x, y, x, y);
davidprentice 0:b608c7f02f80 521 // CS_ACTIVE; WriteCmd(_MW); write16(color); CS_IDLE; //-0.01s +98B
davidprentice 0:b608c7f02f80 522 if (is9797) { CS_ACTIVE; WriteCmd(_MW); write24(color); CS_IDLE;} else
davidprentice 0:b608c7f02f80 523 WriteCmdData(_MW, color);
davidprentice 0:b608c7f02f80 524 }
davidprentice 0:b608c7f02f80 525
davidprentice 0:b608c7f02f80 526 void MCUFRIEND_kbv::setAddrWindow(int16_t x, int16_t y, int16_t x1, int16_t y1)
davidprentice 0:b608c7f02f80 527 {
davidprentice 0:b608c7f02f80 528 #if defined(OFFSET_9327)
davidprentice 0:b608c7f02f80 529 if (_lcd_ID == 0x9327) {
davidprentice 0:b608c7f02f80 530 if (rotation == 2) y += OFFSET_9327, y1 += OFFSET_9327;
davidprentice 0:b608c7f02f80 531 if (rotation == 3) x += OFFSET_9327, x1 += OFFSET_9327;
davidprentice 0:b608c7f02f80 532 }
davidprentice 0:b608c7f02f80 533 #endif
davidprentice 0:b608c7f02f80 534 #if 1
davidprentice 0:b608c7f02f80 535 if (_lcd_ID == 0x1526 && (rotation & 1)) {
davidprentice 0:b608c7f02f80 536 int16_t dx = x1 - x, dy = y1 - y;
davidprentice 0:b608c7f02f80 537 if (dy == 0) { y1++; }
davidprentice 0:b608c7f02f80 538 else if (dx == 0) { x1 += dy; y1 -= dy; }
davidprentice 0:b608c7f02f80 539 }
davidprentice 0:b608c7f02f80 540 #endif
davidprentice 0:b608c7f02f80 541 if (_lcd_capable & MIPI_DCS_REV1) {
davidprentice 0:b608c7f02f80 542 WriteCmdParam4(_SC, x >> 8, x, x1 >> 8, x1); //Start column instead of _MC
davidprentice 0:b608c7f02f80 543 WriteCmdParam4(_SP, y >> 8, y, y1 >> 8, y1); //
davidprentice 0:b608c7f02f80 544 if (is8347 && _lcd_ID == 0x0065) { //HX8352-B has separate _MC, _SC
davidprentice 0:b608c7f02f80 545 uint8_t d[2];
davidprentice 0:b608c7f02f80 546 d[0] = x >> 8; d[1] = x;
davidprentice 0:b608c7f02f80 547 WriteCmdParamN(_MC, 2, d); //allows !MV_AXIS to work
davidprentice 0:b608c7f02f80 548 d[0] = y >> 8; d[1] = y;
davidprentice 0:b608c7f02f80 549 WriteCmdParamN(_MP, 2, d);
davidprentice 0:b608c7f02f80 550 }
davidprentice 0:b608c7f02f80 551 } else {
davidprentice 0:b608c7f02f80 552 WriteCmdData(_MC, x);
davidprentice 0:b608c7f02f80 553 WriteCmdData(_MP, y);
davidprentice 0:b608c7f02f80 554 if (!(x == x1 && y == y1)) { //only need MC,MP for drawPixel
davidprentice 0:b608c7f02f80 555 if (_lcd_capable & XSA_XEA_16BIT) {
davidprentice 0:b608c7f02f80 556 if (rotation & 1)
davidprentice 0:b608c7f02f80 557 y1 = y = (y1 << 8) | y;
davidprentice 0:b608c7f02f80 558 else
davidprentice 0:b608c7f02f80 559 x1 = x = (x1 << 8) | x;
davidprentice 0:b608c7f02f80 560 }
davidprentice 0:b608c7f02f80 561 WriteCmdData(_SC, x);
davidprentice 0:b608c7f02f80 562 WriteCmdData(_SP, y);
davidprentice 0:b608c7f02f80 563 WriteCmdData(_EC, x1);
davidprentice 0:b608c7f02f80 564 WriteCmdData(_EP, y1);
davidprentice 0:b608c7f02f80 565 }
davidprentice 0:b608c7f02f80 566 }
davidprentice 0:b608c7f02f80 567 }
davidprentice 0:b608c7f02f80 568
davidprentice 0:b608c7f02f80 569 void MCUFRIEND_kbv::fillRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color)
davidprentice 0:b608c7f02f80 570 {
davidprentice 0:b608c7f02f80 571 int16_t end;
davidprentice 0:b608c7f02f80 572 #if defined(SUPPORT_9488_555)
davidprentice 0:b608c7f02f80 573 if (is555) color = color565_to_555(color);
davidprentice 0:b608c7f02f80 574 #endif
davidprentice 0:b608c7f02f80 575 if (w < 0) {
davidprentice 0:b608c7f02f80 576 w = -w;
davidprentice 0:b608c7f02f80 577 x -= w;
davidprentice 0:b608c7f02f80 578 } //+ve w
davidprentice 0:b608c7f02f80 579 end = x + w;
davidprentice 0:b608c7f02f80 580 if (x < 0)
davidprentice 0:b608c7f02f80 581 x = 0;
davidprentice 0:b608c7f02f80 582 if (end > width())
davidprentice 0:b608c7f02f80 583 end = width();
davidprentice 0:b608c7f02f80 584 w = end - x;
davidprentice 0:b608c7f02f80 585 if (h < 0) {
davidprentice 0:b608c7f02f80 586 h = -h;
davidprentice 0:b608c7f02f80 587 y -= h;
davidprentice 0:b608c7f02f80 588 } //+ve h
davidprentice 0:b608c7f02f80 589 end = y + h;
davidprentice 0:b608c7f02f80 590 if (y < 0)
davidprentice 0:b608c7f02f80 591 y = 0;
davidprentice 0:b608c7f02f80 592 if (end > height())
davidprentice 0:b608c7f02f80 593 end = height();
davidprentice 0:b608c7f02f80 594 h = end - y;
davidprentice 0:b608c7f02f80 595 setAddrWindow(x, y, x + w - 1, y + h - 1);
davidprentice 0:b608c7f02f80 596 CS_ACTIVE;
davidprentice 0:b608c7f02f80 597 WriteCmd(_MW);
davidprentice 0:b608c7f02f80 598 if (h > w) {
davidprentice 0:b608c7f02f80 599 end = h;
davidprentice 0:b608c7f02f80 600 h = w;
davidprentice 0:b608c7f02f80 601 w = end;
davidprentice 0:b608c7f02f80 602 }
davidprentice 0:b608c7f02f80 603 uint8_t hi = color >> 8, lo = color & 0xFF;
davidprentice 0:b608c7f02f80 604 while (h-- > 0) {
davidprentice 0:b608c7f02f80 605 end = w;
davidprentice 0:b608c7f02f80 606 #if USING_16BIT_BUS
davidprentice 0:b608c7f02f80 607 #if defined(__MK66FX1M0__) //180MHz M4
davidprentice 0:b608c7f02f80 608 #define STROBE_16BIT {WR_ACTIVE4;WR_ACTIVE;WR_IDLE4;WR_IDLE;} //56ns
davidprentice 0:b608c7f02f80 609 #elif defined(__SAM3X8E__) //84MHz M3
davidprentice 0:b608c7f02f80 610 #define STROBE_16BIT {WR_ACTIVE4;WR_ACTIVE2;WR_IDLE4;WR_IDLE2;} //286ns ?ILI9486
davidprentice 0:b608c7f02f80 611 //#define STROBE_16BIT {WR_ACTIVE4;WR_ACTIVE;WR_IDLE4;WR_IDLE;} //238ns SSD1289
davidprentice 0:b608c7f02f80 612 //#define STROBE_16BIT {WR_ACTIVE2;WR_ACTIVE;WR_IDLE2;} //119ns RM68140
davidprentice 0:b608c7f02f80 613 #else //16MHz AVR
davidprentice 0:b608c7f02f80 614 #define STROBE_16BIT {WR_ACTIVE;WR_ACTIVE;WR_IDLE; } //375ns ?ILI9486
davidprentice 0:b608c7f02f80 615 #endif
davidprentice 0:b608c7f02f80 616 write_16(color); //we could just do the strobe
davidprentice 0:b608c7f02f80 617 lo = end & 7;
davidprentice 0:b608c7f02f80 618 hi = end >> 3;
davidprentice 0:b608c7f02f80 619 if (hi)
davidprentice 0:b608c7f02f80 620 do {
davidprentice 0:b608c7f02f80 621 STROBE_16BIT;
davidprentice 0:b608c7f02f80 622 STROBE_16BIT;
davidprentice 0:b608c7f02f80 623 STROBE_16BIT;
davidprentice 0:b608c7f02f80 624 STROBE_16BIT;
davidprentice 0:b608c7f02f80 625 STROBE_16BIT;
davidprentice 0:b608c7f02f80 626 STROBE_16BIT;
davidprentice 0:b608c7f02f80 627 STROBE_16BIT;
davidprentice 0:b608c7f02f80 628 STROBE_16BIT;
davidprentice 0:b608c7f02f80 629 } while (--hi > 0);
davidprentice 0:b608c7f02f80 630 while (lo-- > 0) {
davidprentice 0:b608c7f02f80 631 STROBE_16BIT;
davidprentice 0:b608c7f02f80 632 }
davidprentice 0:b608c7f02f80 633 #else
davidprentice 0:b608c7f02f80 634 #if defined(SUPPORT_1289)
davidprentice 0:b608c7f02f80 635 if (is9797) {
davidprentice 0:b608c7f02f80 636 uint8_t r = color565_to_r(color);
davidprentice 0:b608c7f02f80 637 uint8_t g = color565_to_g(color);
davidprentice 0:b608c7f02f80 638 uint8_t b = color565_to_b(color);
davidprentice 0:b608c7f02f80 639 do {
davidprentice 0:b608c7f02f80 640 write8(r);
davidprentice 0:b608c7f02f80 641 write8(g);
davidprentice 0:b608c7f02f80 642 write8(b);
davidprentice 0:b608c7f02f80 643 } while (--end != 0);
davidprentice 0:b608c7f02f80 644 } else
davidprentice 0:b608c7f02f80 645 #endif
davidprentice 0:b608c7f02f80 646 do {
davidprentice 0:b608c7f02f80 647 write8(hi);
davidprentice 0:b608c7f02f80 648 write8(lo);
davidprentice 0:b608c7f02f80 649 } while (--end != 0);
davidprentice 0:b608c7f02f80 650 #endif
davidprentice 0:b608c7f02f80 651 }
davidprentice 0:b608c7f02f80 652 CS_IDLE;
davidprentice 0:b608c7f02f80 653 if (!(_lcd_capable & MIPI_DCS_REV1) || ((_lcd_ID == 0x1526) && (rotation & 1)))
davidprentice 0:b608c7f02f80 654 setAddrWindow(0, 0, width() - 1, height() - 1);
davidprentice 0:b608c7f02f80 655 }
davidprentice 0:b608c7f02f80 656
davidprentice 0:b608c7f02f80 657 static void pushColors_any(uint16_t cmd, uint8_t * block, int16_t n, bool first, uint8_t flags)
davidprentice 0:b608c7f02f80 658 {
davidprentice 0:b608c7f02f80 659 uint16_t color;
davidprentice 0:b608c7f02f80 660 uint8_t h, l;
davidprentice 0:b608c7f02f80 661 bool isconst = flags & 1;
davidprentice 0:b608c7f02f80 662 bool isbigend = (flags & 2) != 0;
davidprentice 0:b608c7f02f80 663 CS_ACTIVE;
davidprentice 0:b608c7f02f80 664 if (first) {
davidprentice 0:b608c7f02f80 665 WriteCmd(cmd);
davidprentice 0:b608c7f02f80 666 }
davidprentice 0:b608c7f02f80 667
davidprentice 0:b608c7f02f80 668 if (!isconst && !isbigend) {
davidprentice 0:b608c7f02f80 669 uint16_t *block16 = (uint16_t*)block;
davidprentice 0:b608c7f02f80 670 while (n-- > 0) {
davidprentice 0:b608c7f02f80 671 color = *block16++;
davidprentice 0:b608c7f02f80 672 write16(color);
davidprentice 0:b608c7f02f80 673 }
davidprentice 0:b608c7f02f80 674 } else
davidprentice 0:b608c7f02f80 675
davidprentice 0:b608c7f02f80 676 while (n-- > 0) {
davidprentice 0:b608c7f02f80 677 if (isconst) {
davidprentice 0:b608c7f02f80 678 h = pgm_read_byte(block++);
davidprentice 0:b608c7f02f80 679 l = pgm_read_byte(block++);
davidprentice 0:b608c7f02f80 680 } else {
davidprentice 0:b608c7f02f80 681 h = (*block++);
davidprentice 0:b608c7f02f80 682 l = (*block++);
davidprentice 0:b608c7f02f80 683 }
davidprentice 0:b608c7f02f80 684 color = (isbigend) ? (h << 8 | l) : (l << 8 | h);
davidprentice 0:b608c7f02f80 685 #if defined(SUPPORT_9488_555)
davidprentice 0:b608c7f02f80 686 if (is555) color = color565_to_555(color);
davidprentice 0:b608c7f02f80 687 #endif
davidprentice 0:b608c7f02f80 688 if (is9797) write24(color); else
davidprentice 0:b608c7f02f80 689 write16(color);
davidprentice 0:b608c7f02f80 690 }
davidprentice 0:b608c7f02f80 691 CS_IDLE;
davidprentice 0:b608c7f02f80 692 }
davidprentice 0:b608c7f02f80 693
davidprentice 0:b608c7f02f80 694 void MCUFRIEND_kbv::pushColors(uint16_t * block, int16_t n, bool first)
davidprentice 0:b608c7f02f80 695 {
davidprentice 0:b608c7f02f80 696 pushColors_any(_MW, (uint8_t *)block, n, first, 0);
davidprentice 0:b608c7f02f80 697 }
davidprentice 0:b608c7f02f80 698 void MCUFRIEND_kbv::pushColors(uint8_t * block, int16_t n, bool first)
davidprentice 0:b608c7f02f80 699 {
davidprentice 0:b608c7f02f80 700 pushColors_any(_MW, (uint8_t *)block, n, first, 2); //regular bigend
davidprentice 0:b608c7f02f80 701 }
davidprentice 0:b608c7f02f80 702 void MCUFRIEND_kbv::pushColors(const uint8_t * block, int16_t n, bool first, bool bigend)
davidprentice 0:b608c7f02f80 703 {
davidprentice 0:b608c7f02f80 704 pushColors_any(_MW, (uint8_t *)block, n, first, bigend ? 3 : 1);
davidprentice 0:b608c7f02f80 705 }
davidprentice 0:b608c7f02f80 706
davidprentice 0:b608c7f02f80 707 void MCUFRIEND_kbv::vertScroll(int16_t top, int16_t scrollines, int16_t offset)
davidprentice 0:b608c7f02f80 708 {
davidprentice 0:b608c7f02f80 709 #if defined(OFFSET_9327)
davidprentice 0:b608c7f02f80 710 if (_lcd_ID == 0x9327) {
davidprentice 0:b608c7f02f80 711 if (rotation == 2 || rotation == 3) top += OFFSET_9327;
davidprentice 0:b608c7f02f80 712 }
davidprentice 0:b608c7f02f80 713 #endif
davidprentice 0:b608c7f02f80 714 int16_t bfa = HEIGHT - top - scrollines; // bottom fixed area
davidprentice 0:b608c7f02f80 715 int16_t vsp;
davidprentice 0:b608c7f02f80 716 int16_t sea = top;
davidprentice 0:b608c7f02f80 717 if (_lcd_ID == 0x9327) bfa += 32;
davidprentice 0:b608c7f02f80 718 if (offset <= -scrollines || offset >= scrollines) offset = 0; //valid scroll
davidprentice 0:b608c7f02f80 719 vsp = top + offset; // vertical start position
davidprentice 0:b608c7f02f80 720 if (offset < 0)
davidprentice 0:b608c7f02f80 721 vsp += scrollines; //keep in unsigned range
davidprentice 0:b608c7f02f80 722 sea = top + scrollines - 1;
davidprentice 0:b608c7f02f80 723 if (_lcd_capable & MIPI_DCS_REV1) {
davidprentice 0:b608c7f02f80 724 uint8_t d[6]; // for multi-byte parameters
davidprentice 0:b608c7f02f80 725 /*
davidprentice 0:b608c7f02f80 726 if (_lcd_ID == 0x9327) { //panel is wired for 240x432
davidprentice 0:b608c7f02f80 727 if (rotation == 2 || rotation == 3) { //180 or 270 degrees
davidprentice 0:b608c7f02f80 728 if (scrollines == HEIGHT) {
davidprentice 0:b608c7f02f80 729 scrollines = 432; // we get a glitch but hey-ho
davidprentice 0:b608c7f02f80 730 vsp -= 432 - HEIGHT;
davidprentice 0:b608c7f02f80 731 }
davidprentice 0:b608c7f02f80 732 if (vsp < 0)
davidprentice 0:b608c7f02f80 733 vsp += 432;
davidprentice 0:b608c7f02f80 734 }
davidprentice 0:b608c7f02f80 735 bfa = 432 - top - scrollines;
davidprentice 0:b608c7f02f80 736 }
davidprentice 0:b608c7f02f80 737 */
davidprentice 0:b608c7f02f80 738 d[0] = top >> 8; //TFA
davidprentice 0:b608c7f02f80 739 d[1] = top;
davidprentice 0:b608c7f02f80 740 d[2] = scrollines >> 8; //VSA
davidprentice 0:b608c7f02f80 741 d[3] = scrollines;
davidprentice 0:b608c7f02f80 742 d[4] = bfa >> 8; //BFA
davidprentice 0:b608c7f02f80 743 d[5] = bfa;
davidprentice 0:b608c7f02f80 744 WriteCmdParamN(is8347 ? 0x0E : 0x33, 6, d);
davidprentice 0:b608c7f02f80 745 // if (offset == 0 && rotation > 1) vsp = top + scrollines; //make non-valid
davidprentice 0:b608c7f02f80 746 d[0] = vsp >> 8; //VSP
davidprentice 0:b608c7f02f80 747 d[1] = vsp;
davidprentice 0:b608c7f02f80 748 WriteCmdParamN(is8347 ? 0x14 : 0x37, 2, d);
davidprentice 0:b608c7f02f80 749 if (is8347) {
davidprentice 0:b608c7f02f80 750 d[0] = (offset != 0) ? (_lcd_ID == 0x8347 ? 0x02 : 0x08) : 0;
davidprentice 0:b608c7f02f80 751 WriteCmdParamN(_lcd_ID == 0x8347 ? 0x18 : 0x01, 1, d); //HX8347-D
davidprentice 0:b608c7f02f80 752 } else if (offset == 0 && (_lcd_capable & MIPI_DCS_REV1)) {
davidprentice 0:b608c7f02f80 753 WriteCmdParamN(0x13, 0, NULL); //NORMAL i.e. disable scroll
davidprentice 0:b608c7f02f80 754 }
davidprentice 0:b608c7f02f80 755 return;
davidprentice 0:b608c7f02f80 756 }
davidprentice 0:b608c7f02f80 757 // cope with 9320 style variants:
davidprentice 0:b608c7f02f80 758 switch (_lcd_ID) {
davidprentice 0:b608c7f02f80 759 case 0x7783:
davidprentice 0:b608c7f02f80 760 WriteCmdData(0x61, _lcd_rev); //!NDL, !VLE, REV
davidprentice 0:b608c7f02f80 761 WriteCmdData(0x6A, vsp); //VL#
davidprentice 0:b608c7f02f80 762 break;
davidprentice 0:b608c7f02f80 763 #ifdef SUPPORT_0139
davidprentice 0:b608c7f02f80 764 case 0x0139:
davidprentice 0:b608c7f02f80 765 WriteCmdData(0x07, 0x0213 | (_lcd_rev << 2)); //VLE1=1, GON=1, REV=x, D=3
davidprentice 0:b608c7f02f80 766 WriteCmdData(0x41, vsp); //VL# check vsp
davidprentice 0:b608c7f02f80 767 break;
davidprentice 0:b608c7f02f80 768 #endif
davidprentice 0:b608c7f02f80 769 #if defined(SUPPORT_0154) || defined(SUPPORT_9225) //thanks tongbajiel
davidprentice 0:b608c7f02f80 770 case 0x9225:
davidprentice 0:b608c7f02f80 771 case 0x0154:
davidprentice 0:b608c7f02f80 772 WriteCmdData(0x31, sea); //SEA
davidprentice 0:b608c7f02f80 773 WriteCmdData(0x32, top); //SSA
davidprentice 0:b608c7f02f80 774 WriteCmdData(0x33, vsp - top); //SST
davidprentice 0:b608c7f02f80 775 break;
davidprentice 0:b608c7f02f80 776 #endif
davidprentice 0:b608c7f02f80 777 #ifdef SUPPORT_1289
davidprentice 0:b608c7f02f80 778 case 0x1289:
davidprentice 0:b608c7f02f80 779 WriteCmdData(0x41, vsp); //VL#
davidprentice 0:b608c7f02f80 780 break;
davidprentice 0:b608c7f02f80 781 #endif
davidprentice 0:b608c7f02f80 782 case 0x5420:
davidprentice 0:b608c7f02f80 783 case 0x7793:
davidprentice 0:b608c7f02f80 784 case 0x9326:
davidprentice 0:b608c7f02f80 785 case 0xB509:
davidprentice 0:b608c7f02f80 786 WriteCmdData(0x401, (1 << 1) | _lcd_rev); //VLE, REV
davidprentice 0:b608c7f02f80 787 WriteCmdData(0x404, vsp); //VL#
davidprentice 0:b608c7f02f80 788 break;
davidprentice 0:b608c7f02f80 789 default:
davidprentice 0:b608c7f02f80 790 // 0x6809, 0x9320, 0x9325, 0x9335, 0xB505 can only scroll whole screen
davidprentice 0:b608c7f02f80 791 WriteCmdData(0x61, (1 << 1) | _lcd_rev); //!NDL, VLE, REV
davidprentice 0:b608c7f02f80 792 WriteCmdData(0x6A, vsp); //VL#
davidprentice 0:b608c7f02f80 793 break;
davidprentice 0:b608c7f02f80 794 }
davidprentice 0:b608c7f02f80 795 }
davidprentice 0:b608c7f02f80 796
davidprentice 0:b608c7f02f80 797 void MCUFRIEND_kbv::invertDisplay(boolean i)
davidprentice 0:b608c7f02f80 798 {
davidprentice 0:b608c7f02f80 799 uint8_t val;
davidprentice 0:b608c7f02f80 800 _lcd_rev = ((_lcd_capable & REV_SCREEN) != 0) ^ i;
davidprentice 0:b608c7f02f80 801 if (_lcd_capable & MIPI_DCS_REV1) {
davidprentice 0:b608c7f02f80 802 if (is8347) {
davidprentice 0:b608c7f02f80 803 // HX8347D: 0x36 Panel Characteristic. REV_Panel
davidprentice 0:b608c7f02f80 804 // HX8347A: 0x36 is Display Control 10
davidprentice 0:b608c7f02f80 805 if (_lcd_ID == 0x8347 || _lcd_ID == 0x5252) // HX8347-A, HX5352-A
davidprentice 0:b608c7f02f80 806 val = _lcd_rev ? 6 : 2; //INVON id bit#2, NORON=bit#1
davidprentice 0:b608c7f02f80 807 else val = _lcd_rev ? 8 : 10; //HX8347-D, G, I: SCROLLON=bit3, INVON=bit1
davidprentice 0:b608c7f02f80 808 // HX8347: 0x01 Display Mode has diff bit mapping for A, D
davidprentice 0:b608c7f02f80 809 WriteCmdParamN(0x01, 1, &val);
davidprentice 0:b608c7f02f80 810 } else
davidprentice 0:b608c7f02f80 811 WriteCmdParamN(_lcd_rev ? 0x21 : 0x20, 0, NULL);
davidprentice 0:b608c7f02f80 812 return;
davidprentice 0:b608c7f02f80 813 }
davidprentice 0:b608c7f02f80 814 // cope with 9320 style variants:
davidprentice 0:b608c7f02f80 815 switch (_lcd_ID) {
davidprentice 0:b608c7f02f80 816 #ifdef SUPPORT_0139
davidprentice 0:b608c7f02f80 817 case 0x0139:
davidprentice 0:b608c7f02f80 818 #endif
davidprentice 0:b608c7f02f80 819 case 0x9225: //REV is in reg(0x07) like Samsung
davidprentice 0:b608c7f02f80 820 case 0x0154:
davidprentice 0:b608c7f02f80 821 WriteCmdData(0x07, 0x13 | (_lcd_rev << 2)); //.kbv kludge
davidprentice 0:b608c7f02f80 822 break;
davidprentice 0:b608c7f02f80 823 #ifdef SUPPORT_1289
davidprentice 0:b608c7f02f80 824 case 0x1289:
davidprentice 0:b608c7f02f80 825 _lcd_drivOut &= ~(1 << 13);
davidprentice 0:b608c7f02f80 826 if (_lcd_rev)
davidprentice 0:b608c7f02f80 827 _lcd_drivOut |= (1 << 13);
davidprentice 0:b608c7f02f80 828 WriteCmdData(0x01, _lcd_drivOut);
davidprentice 0:b608c7f02f80 829 break;
davidprentice 0:b608c7f02f80 830 #endif
davidprentice 0:b608c7f02f80 831 case 0x5420:
davidprentice 0:b608c7f02f80 832 case 0x7793:
davidprentice 0:b608c7f02f80 833 case 0x9326:
davidprentice 0:b608c7f02f80 834 case 0xB509:
davidprentice 0:b608c7f02f80 835 WriteCmdData(0x401, (1 << 1) | _lcd_rev); //.kbv kludge VLE
davidprentice 0:b608c7f02f80 836 break;
davidprentice 0:b608c7f02f80 837 default:
davidprentice 0:b608c7f02f80 838 WriteCmdData(0x61, _lcd_rev);
davidprentice 0:b608c7f02f80 839 break;
davidprentice 0:b608c7f02f80 840 }
davidprentice 0:b608c7f02f80 841 }
davidprentice 0:b608c7f02f80 842
davidprentice 0:b608c7f02f80 843 #define TFTLCD_DELAY 0xFFFF
davidprentice 0:b608c7f02f80 844 #define TFTLCD_DELAY8 0x7F
davidprentice 0:b608c7f02f80 845 static void init_table(const void *table, int16_t size)
davidprentice 0:b608c7f02f80 846 {
davidprentice 0:b608c7f02f80 847 #ifdef SUPPORT_8357D_GAMMA
davidprentice 0:b608c7f02f80 848 uint8_t *p = (uint8_t *) table, dat[36]; //HX8357_99 has GAMMA[34]
davidprentice 0:b608c7f02f80 849 #else
davidprentice 0:b608c7f02f80 850 uint8_t *p = (uint8_t *) table, dat[24]; //R61526 has GAMMA[22]
davidprentice 0:b608c7f02f80 851 #endif
davidprentice 0:b608c7f02f80 852 while (size > 0) {
davidprentice 0:b608c7f02f80 853 uint8_t cmd = pgm_read_byte(p++);
davidprentice 0:b608c7f02f80 854 uint8_t len = pgm_read_byte(p++);
davidprentice 0:b608c7f02f80 855 if (cmd == TFTLCD_DELAY8) {
davidprentice 0:b608c7f02f80 856 delay(len);
davidprentice 0:b608c7f02f80 857 len = 0;
davidprentice 0:b608c7f02f80 858 } else {
davidprentice 0:b608c7f02f80 859 for (uint8_t i = 0; i < len; i++)
davidprentice 0:b608c7f02f80 860 dat[i] = pgm_read_byte(p++);
davidprentice 0:b608c7f02f80 861 WriteCmdParamN(cmd, len, dat);
davidprentice 0:b608c7f02f80 862 }
davidprentice 0:b608c7f02f80 863 size -= len + 2;
davidprentice 0:b608c7f02f80 864 }
davidprentice 0:b608c7f02f80 865 }
davidprentice 0:b608c7f02f80 866
davidprentice 0:b608c7f02f80 867 static void init_table16(const void *table, int16_t size)
davidprentice 0:b608c7f02f80 868 {
davidprentice 0:b608c7f02f80 869 uint16_t *p = (uint16_t *) table;
davidprentice 0:b608c7f02f80 870 while (size > 0) {
davidprentice 0:b608c7f02f80 871 uint16_t cmd = pgm_read_word(p++);
davidprentice 0:b608c7f02f80 872 uint16_t d = pgm_read_word(p++);
davidprentice 0:b608c7f02f80 873 if (cmd == TFTLCD_DELAY)
davidprentice 0:b608c7f02f80 874 delay(d);
davidprentice 0:b608c7f02f80 875 else {
davidprentice 0:b608c7f02f80 876 writecmddata(cmd, d); //static function
davidprentice 0:b608c7f02f80 877 }
davidprentice 0:b608c7f02f80 878 size -= 2 * sizeof(int16_t);
davidprentice 0:b608c7f02f80 879 }
davidprentice 0:b608c7f02f80 880 }
davidprentice 0:b608c7f02f80 881
davidprentice 0:b608c7f02f80 882 void MCUFRIEND_kbv::begin(uint16_t ID)
davidprentice 0:b608c7f02f80 883 {
davidprentice 0:b608c7f02f80 884 int16_t *p16; //so we can "write" to a const protected variable.
davidprentice 0:b608c7f02f80 885 const uint8_t *table8_ads = NULL;
davidprentice 0:b608c7f02f80 886 int16_t table_size;
davidprentice 0:b608c7f02f80 887 reset();
davidprentice 0:b608c7f02f80 888 _lcd_xor = 0;
davidprentice 0:b608c7f02f80 889 switch (_lcd_ID = ID) {
davidprentice 0:b608c7f02f80 890 /*
davidprentice 0:b608c7f02f80 891 static const uint16_t _regValues[] PROGMEM = {
davidprentice 0:b608c7f02f80 892 0x0000, 0x0001, // start oscillation
davidprentice 0:b608c7f02f80 893 0x0007, 0x0000, // source output control 0 D0
davidprentice 0:b608c7f02f80 894 0x0013, 0x0000, // power control 3 off
davidprentice 0:b608c7f02f80 895 0x0011, 0x2604, //
davidprentice 0:b608c7f02f80 896 0x0014, 0x0015, //
davidprentice 0:b608c7f02f80 897 0x0010, 0x3C00, //
davidprentice 0:b608c7f02f80 898 // 0x0013, 0x0040, //
davidprentice 0:b608c7f02f80 899 // 0x0013, 0x0060, //
davidprentice 0:b608c7f02f80 900 // 0x0013, 0x0070, //
davidprentice 0:b608c7f02f80 901 0x0013, 0x0070, // power control 3 PON PON1 AON
davidprentice 0:b608c7f02f80 902
davidprentice 0:b608c7f02f80 903 0x0001, 0x0127, // driver output control
davidprentice 0:b608c7f02f80 904 // 0x0002, 0x0700, // field 0 b/c waveform xor waveform
davidprentice 0:b608c7f02f80 905 0x0003, 0x1030, //
davidprentice 0:b608c7f02f80 906 0x0007, 0x0000, //
davidprentice 0:b608c7f02f80 907 0x0008, 0x0404, //
davidprentice 0:b608c7f02f80 908 0x000B, 0x0200, //
davidprentice 0:b608c7f02f80 909 0x000C, 0x0000, //
davidprentice 0:b608c7f02f80 910 0x00015,0x0000, //
davidprentice 0:b608c7f02f80 911
davidprentice 0:b608c7f02f80 912 //gamma setting
davidprentice 0:b608c7f02f80 913 0x0030, 0x0000,
davidprentice 0:b608c7f02f80 914 0x0031, 0x0606,
davidprentice 0:b608c7f02f80 915 0x0032, 0x0006,
davidprentice 0:b608c7f02f80 916 0x0033, 0x0403,
davidprentice 0:b608c7f02f80 917 0x0034, 0x0107,
davidprentice 0:b608c7f02f80 918 0x0035, 0x0101,
davidprentice 0:b608c7f02f80 919 0x0036, 0x0707,
davidprentice 0:b608c7f02f80 920 0x0037, 0x0304,
davidprentice 0:b608c7f02f80 921 0x0038, 0x0A00,
davidprentice 0:b608c7f02f80 922 0x0039, 0x0706,
davidprentice 0:b608c7f02f80 923
davidprentice 0:b608c7f02f80 924 0x0040, 0x0000,
davidprentice 0:b608c7f02f80 925 0x0041, 0x0000,
davidprentice 0:b608c7f02f80 926 0x0042, 0x013F,
davidprentice 0:b608c7f02f80 927 0x0043, 0x0000,
davidprentice 0:b608c7f02f80 928 0x0044, 0x0000,
davidprentice 0:b608c7f02f80 929 0x0045, 0x0000,
davidprentice 0:b608c7f02f80 930 0x0046, 0xEF00,
davidprentice 0:b608c7f02f80 931 0x0047, 0x013F,
davidprentice 0:b608c7f02f80 932 0x0048, 0x0000,
davidprentice 0:b608c7f02f80 933 0x0007, 0x0011,
davidprentice 0:b608c7f02f80 934 0x0007, 0x0017,
davidprentice 0:b608c7f02f80 935 };
davidprentice 0:b608c7f02f80 936 */
davidprentice 0:b608c7f02f80 937 #ifdef SUPPORT_0139
davidprentice 0:b608c7f02f80 938 case 0x0139:
davidprentice 0:b608c7f02f80 939 _lcd_capable = REV_SCREEN | XSA_XEA_16BIT; //remove AUTO_READINC
davidprentice 0:b608c7f02f80 940 static const uint16_t S6D0139_regValues[] PROGMEM = {
davidprentice 0:b608c7f02f80 941 0x0000, 0x0001, //Start oscillator
davidprentice 0:b608c7f02f80 942 0x0011, 0x1a00, //Power Control 2
davidprentice 0:b608c7f02f80 943 0x0014, 0x2020, //Power Control 4
davidprentice 0:b608c7f02f80 944 0x0010, 0x0900, //Power Control 1
davidprentice 0:b608c7f02f80 945 0x0013, 0x0040, //Power Control 3
davidprentice 0:b608c7f02f80 946 0x0013, 0x0060, //Power Control 3
davidprentice 0:b608c7f02f80 947 0x0013, 0x0070, //Power Control 3
davidprentice 0:b608c7f02f80 948 0x0011, 0x1a04, //Power Control 2
davidprentice 0:b608c7f02f80 949 0x0010, 0x2f00, //Power Control 1
davidprentice 0:b608c7f02f80 950 0x0001, 0x0127, //Driver Control: SM=0, GS=0, SS=1, 240x320
davidprentice 0:b608c7f02f80 951 0x0002, 0x0100, //LCD Control: (.kbv was 0700) FLD=0, BC= 0, EOR=1
davidprentice 0:b608c7f02f80 952 0x0003, 0x1030, //Entry Mode: TR1=0, DFM=0, BGR=1, I_D=3
davidprentice 0:b608c7f02f80 953 0x0007, 0x0000, //Display Control: everything off
davidprentice 0:b608c7f02f80 954 0x0008, 0x0303, //Blank Period: FP=3, BP=3
davidprentice 0:b608c7f02f80 955 0x0009, 0x0000, //f.k.
davidprentice 0:b608c7f02f80 956 0x000b, 0x0000, //Frame Control:
davidprentice 0:b608c7f02f80 957 0x000c, 0x0000, //Interface Control: system i/f
davidprentice 0:b608c7f02f80 958 0x0040, 0x0000, //Scan Line
davidprentice 0:b608c7f02f80 959 0x0041, 0x0000, //Vertical Scroll Control
davidprentice 0:b608c7f02f80 960 0x0007, 0x0014, //Display Control: VLE1=0, SPT=0, GON=1, REV=1, D=0 (halt)
davidprentice 0:b608c7f02f80 961 0x0007, 0x0016, //Display Control: VLE1=0, SPT=0, GON=1, REV=1, D=2 (blank)
davidprentice 0:b608c7f02f80 962 0x0007, 0x0017, //Display Control: VLE1=0, SPT=0, GON=1, REV=1, D=3 (normal)
davidprentice 0:b608c7f02f80 963 // 0x0007, 0x0217, //Display Control: VLE1=1, SPT=0, GON=1, REV=1, D=3
davidprentice 0:b608c7f02f80 964 };
davidprentice 0:b608c7f02f80 965 init_table16(S6D0139_regValues, sizeof(S6D0139_regValues));
davidprentice 0:b608c7f02f80 966 break;
davidprentice 0:b608c7f02f80 967 #endif
davidprentice 0:b608c7f02f80 968
davidprentice 0:b608c7f02f80 969 #ifdef SUPPORT_0154
davidprentice 0:b608c7f02f80 970 case 0x0154:
davidprentice 0:b608c7f02f80 971 _lcd_capable = AUTO_READINC | REV_SCREEN;
davidprentice 0:b608c7f02f80 972 static const uint16_t S6D0154_regValues[] PROGMEM = {
davidprentice 0:b608c7f02f80 973 0x0011, 0x001A,
davidprentice 0:b608c7f02f80 974 0x0012, 0x3121, //BT=3, DC1=1, DC2=2, DC3=1
davidprentice 0:b608c7f02f80 975 0x0013, 0x006C, //GVD=108
davidprentice 0:b608c7f02f80 976 0x0014, 0x4249, //VCM=66, VML=73
davidprentice 0:b608c7f02f80 977
davidprentice 0:b608c7f02f80 978 0x0010, 0x0800, //SAP=8
davidprentice 0:b608c7f02f80 979 TFTLCD_DELAY, 10,
davidprentice 0:b608c7f02f80 980 0x0011, 0x011A, //APON=0, PON=1, AON=0, VCI1_EN=1, VC=10
davidprentice 0:b608c7f02f80 981 TFTLCD_DELAY, 10,
davidprentice 0:b608c7f02f80 982 0x0011, 0x031A, //APON=0, PON=3, AON=0, VCI1_EN=1, VC=10
davidprentice 0:b608c7f02f80 983 TFTLCD_DELAY, 10,
davidprentice 0:b608c7f02f80 984 0x0011, 0x071A, //APON=0, PON=7, AON=0, VCI1_EN=1, VC=10
davidprentice 0:b608c7f02f80 985 TFTLCD_DELAY, 10,
davidprentice 0:b608c7f02f80 986 0x0011, 0x0F1A, //APON=0, PON=15, AON=0, VCI1_EN=1, VC=10
davidprentice 0:b608c7f02f80 987 TFTLCD_DELAY, 10,
davidprentice 0:b608c7f02f80 988 0x0011, 0x0F3A, //APON=0, PON=15, AON=1, VCI1_EN=1, VC=10
davidprentice 0:b608c7f02f80 989 TFTLCD_DELAY, 30,
davidprentice 0:b608c7f02f80 990
davidprentice 0:b608c7f02f80 991 0x0001, 0x0128,
davidprentice 0:b608c7f02f80 992 0x0002, 0x0100,
davidprentice 0:b608c7f02f80 993 0x0003, 0x1030,
davidprentice 0:b608c7f02f80 994 0x0007, 0x1012,
davidprentice 0:b608c7f02f80 995 0x0008, 0x0303,
davidprentice 0:b608c7f02f80 996 0x000B, 0x1100,
davidprentice 0:b608c7f02f80 997 0x000C, 0x0000,
davidprentice 0:b608c7f02f80 998 0x000F, 0x1801,
davidprentice 0:b608c7f02f80 999 0x0015, 0x0020,
davidprentice 0:b608c7f02f80 1000
davidprentice 0:b608c7f02f80 1001 0x0050,0x0101,
davidprentice 0:b608c7f02f80 1002 0x0051,0x0603,
davidprentice 0:b608c7f02f80 1003 0x0052,0x0408,
davidprentice 0:b608c7f02f80 1004 0x0053,0x0000,
davidprentice 0:b608c7f02f80 1005 0x0054,0x0605,
davidprentice 0:b608c7f02f80 1006 0x0055,0x0406,
davidprentice 0:b608c7f02f80 1007 0x0056,0x0303,
davidprentice 0:b608c7f02f80 1008 0x0057,0x0303,
davidprentice 0:b608c7f02f80 1009 0x0058,0x0010,
davidprentice 0:b608c7f02f80 1010 0x0059,0x1000,
davidprentice 0:b608c7f02f80 1011
davidprentice 0:b608c7f02f80 1012 0x0007, 0x0012, //GON=1, REV=0, D=2
davidprentice 0:b608c7f02f80 1013 TFTLCD_DELAY, 40,
davidprentice 0:b608c7f02f80 1014 0x0007, 0x0013, //GON=1, REV=0, D=3
davidprentice 0:b608c7f02f80 1015 0x0007, 0x0017, //GON=1, REV=1, D=3 DISPLAY ON
davidprentice 0:b608c7f02f80 1016 };
davidprentice 0:b608c7f02f80 1017 init_table16(S6D0154_regValues, sizeof(S6D0154_regValues));
davidprentice 0:b608c7f02f80 1018
davidprentice 0:b608c7f02f80 1019 break;
davidprentice 0:b608c7f02f80 1020 #endif
davidprentice 0:b608c7f02f80 1021
davidprentice 0:b608c7f02f80 1022 #ifdef SUPPORT_1289
davidprentice 0:b608c7f02f80 1023 case 0x9797:
davidprentice 0:b608c7f02f80 1024 is9797 = 1;
davidprentice 0:b608c7f02f80 1025 // _lcd_capable = 0 | XSA_XEA_16BIT | REV_SCREEN | AUTO_READINC | READ_24BITS;
davidprentice 0:b608c7f02f80 1026 // deliberately set READ_BGR to disable Software Scroll in graphictest_kbv example
davidprentice 0:b608c7f02f80 1027 _lcd_capable = 0 | XSA_XEA_16BIT | REV_SCREEN | AUTO_READINC | READ_24BITS | READ_BGR;
davidprentice 0:b608c7f02f80 1028 _lcd_ID = 0x1289;
davidprentice 0:b608c7f02f80 1029 goto common_1289;
davidprentice 0:b608c7f02f80 1030 case 0x1289:
davidprentice 0:b608c7f02f80 1031 _lcd_capable = 0 | XSA_XEA_16BIT | REV_SCREEN | AUTO_READINC;
davidprentice 0:b608c7f02f80 1032 common_1289:
davidprentice 0:b608c7f02f80 1033 // came from MikroElektronika library http://www.hmsprojects.com/tft_lcd.html
davidprentice 0:b608c7f02f80 1034 static const uint16_t SSD1289_regValues[] PROGMEM = {
davidprentice 0:b608c7f02f80 1035 0x0000, 0x0001,
davidprentice 0:b608c7f02f80 1036 0x0003, 0xA8A4,
davidprentice 0:b608c7f02f80 1037 0x000C, 0x0000,
davidprentice 0:b608c7f02f80 1038 0x000D, 0x000A, // VRH=10
davidprentice 0:b608c7f02f80 1039 0x000E, 0x2B00,
davidprentice 0:b608c7f02f80 1040 0x001E, 0x00B7,
davidprentice 0:b608c7f02f80 1041 0x0001, 0x2B3F, // setRotation() alters
davidprentice 0:b608c7f02f80 1042 0x0002, 0x0600, // B_C=1, EOR=1
davidprentice 0:b608c7f02f80 1043 0x0010, 0x0000,
davidprentice 0:b608c7f02f80 1044 0x0011, 0x6070, // setRotation() alters
davidprentice 0:b608c7f02f80 1045 0x0005, 0x0000,
davidprentice 0:b608c7f02f80 1046 0x0006, 0x0000,
davidprentice 0:b608c7f02f80 1047 0x0016, 0xEF1C,
davidprentice 0:b608c7f02f80 1048 0x0017, 0x0003,
davidprentice 0:b608c7f02f80 1049 0x0007, 0x0233,
davidprentice 0:b608c7f02f80 1050 0x000B, 0x0000,
davidprentice 0:b608c7f02f80 1051 0x000F, 0x0000,
davidprentice 0:b608c7f02f80 1052 0x0030, 0x0707,
davidprentice 0:b608c7f02f80 1053 0x0031, 0x0204,
davidprentice 0:b608c7f02f80 1054 0x0032, 0x0204,
davidprentice 0:b608c7f02f80 1055 0x0033, 0x0502,
davidprentice 0:b608c7f02f80 1056 0x0034, 0x0507,
davidprentice 0:b608c7f02f80 1057 0x0035, 0x0204,
davidprentice 0:b608c7f02f80 1058 0x0036, 0x0204,
davidprentice 0:b608c7f02f80 1059 0x0037, 0x0502,
davidprentice 0:b608c7f02f80 1060 0x003A, 0x0302,
davidprentice 0:b608c7f02f80 1061 0x003B, 0x0302,
davidprentice 0:b608c7f02f80 1062 0x0023, 0x0000,
davidprentice 0:b608c7f02f80 1063 0x0024, 0x0000,
davidprentice 0:b608c7f02f80 1064 0x0025, 0x8000,
davidprentice 0:b608c7f02f80 1065 };
davidprentice 0:b608c7f02f80 1066 init_table16(SSD1289_regValues, sizeof(SSD1289_regValues));
davidprentice 0:b608c7f02f80 1067 break;
davidprentice 0:b608c7f02f80 1068 #endif
davidprentice 0:b608c7f02f80 1069
davidprentice 0:b608c7f02f80 1070 case 0x1511: // Unknown from Levy
davidprentice 0:b608c7f02f80 1071 _lcd_capable = AUTO_READINC | MIPI_DCS_REV1; //extra read_8(dummy)
davidprentice 0:b608c7f02f80 1072 static const uint8_t R61511_regValues[] PROGMEM = {
davidprentice 0:b608c7f02f80 1073 0xB0, 1, 0x00, //Command Access Protect
davidprentice 0:b608c7f02f80 1074 };
davidprentice 0:b608c7f02f80 1075 table8_ads = R61511_regValues, table_size = sizeof(R61511_regValues);
davidprentice 0:b608c7f02f80 1076 p16 = (int16_t *) & HEIGHT;
davidprentice 0:b608c7f02f80 1077 *p16 = 480;
davidprentice 0:b608c7f02f80 1078 p16 = (int16_t *) & WIDTH;
davidprentice 0:b608c7f02f80 1079 *p16 = 320;
davidprentice 0:b608c7f02f80 1080 break;
davidprentice 0:b608c7f02f80 1081
davidprentice 0:b608c7f02f80 1082 case 0x1520:
davidprentice 0:b608c7f02f80 1083 _lcd_capable = AUTO_READINC | MIPI_DCS_REV1 | MV_AXIS | READ_24BITS;
davidprentice 0:b608c7f02f80 1084 static const uint8_t R61520_regValues[] PROGMEM = {
davidprentice 0:b608c7f02f80 1085 0xB0, 1, 0x00, //Command Access Protect
davidprentice 0:b608c7f02f80 1086 0xC0, 1, 0x0A, //DM=1, BGR=1
davidprentice 0:b608c7f02f80 1087 };
davidprentice 0:b608c7f02f80 1088 table8_ads = R61520_regValues, table_size = sizeof(R61520_regValues);
davidprentice 0:b608c7f02f80 1089 break;
davidprentice 0:b608c7f02f80 1090
davidprentice 0:b608c7f02f80 1091 case 0x1526:
davidprentice 0:b608c7f02f80 1092 _lcd_capable = AUTO_READINC | MIPI_DCS_REV1 | MV_AXIS | READ_24BITS;
davidprentice 0:b608c7f02f80 1093 static const uint8_t R61526_regValues[] PROGMEM = {
davidprentice 0:b608c7f02f80 1094 0xB0, 1, 0x03, //Command Access
davidprentice 0:b608c7f02f80 1095 0xE2, 1, 0x3F, //Command Write Access
davidprentice 0:b608c7f02f80 1096 0xC0, 1, 0x22, //REV=0, BGR=1, SS=0
davidprentice 0:b608c7f02f80 1097 0xE2, 1, 0x00, //Command Write Protect
davidprentice 0:b608c7f02f80 1098 };
davidprentice 0:b608c7f02f80 1099 table8_ads = R61526_regValues, table_size = sizeof(R61526_regValues);
davidprentice 0:b608c7f02f80 1100 break;
davidprentice 0:b608c7f02f80 1101
davidprentice 0:b608c7f02f80 1102 #ifdef SUPPORT_1580
davidprentice 0:b608c7f02f80 1103 case 0x1580:
davidprentice 0:b608c7f02f80 1104 _lcd_capable = 0 | REV_SCREEN | READ_BGR | INVERT_GS | READ_NODUMMY; //thanks vanhan123
davidprentice 0:b608c7f02f80 1105 static const uint16_t R61580_regValues[] PROGMEM = { //from MCHIP Graphics Lib drvTFT001.c
davidprentice 0:b608c7f02f80 1106 // Synchronization after reset
davidprentice 0:b608c7f02f80 1107 TFTLCD_DELAY, 2,
davidprentice 0:b608c7f02f80 1108 0x0000, 0x0000,
davidprentice 0:b608c7f02f80 1109 0x0000, 0x0000,
davidprentice 0:b608c7f02f80 1110 0x0000, 0x0000,
davidprentice 0:b608c7f02f80 1111 0x0000, 0x0000,
davidprentice 0:b608c7f02f80 1112
davidprentice 0:b608c7f02f80 1113 // Setup display
davidprentice 0:b608c7f02f80 1114 0x00A4, 0x0001, // CALB=1
davidprentice 0:b608c7f02f80 1115 TFTLCD_DELAY, 2,
davidprentice 0:b608c7f02f80 1116 0x0060, 0xA700, // Driver Output Control
davidprentice 0:b608c7f02f80 1117 0x0008, 0x0808, // Display Control BP=8, FP=8
davidprentice 0:b608c7f02f80 1118 0x0030, 0x0111, // y control
davidprentice 0:b608c7f02f80 1119 0x0031, 0x2410, // y control
davidprentice 0:b608c7f02f80 1120 0x0032, 0x0501, // y control
davidprentice 0:b608c7f02f80 1121 0x0033, 0x050C, // y control
davidprentice 0:b608c7f02f80 1122 0x0034, 0x2211, // y control
davidprentice 0:b608c7f02f80 1123 0x0035, 0x0C05, // y control
davidprentice 0:b608c7f02f80 1124 0x0036, 0x2105, // y control
davidprentice 0:b608c7f02f80 1125 0x0037, 0x1004, // y control
davidprentice 0:b608c7f02f80 1126 0x0038, 0x1101, // y control
davidprentice 0:b608c7f02f80 1127 0x0039, 0x1122, // y control
davidprentice 0:b608c7f02f80 1128 0x0090, 0x0019, // 80Hz
davidprentice 0:b608c7f02f80 1129 0x0010, 0x0530, // Power Control
davidprentice 0:b608c7f02f80 1130 0x0011, 0x0237, //DC1=2, DC0=3, VC=7
davidprentice 0:b608c7f02f80 1131 // 0x0011, 0x17B0, //DC1=7, DC0=3, VC=0 ?b12 ?b7 vanhan123
davidprentice 0:b608c7f02f80 1132 0x0012, 0x01BF, //VCMR=1, PSON=1, PON=1, VRH=15
davidprentice 0:b608c7f02f80 1133 // 0x0012, 0x013A, //VCMR=1, PSON=1, PON=1, VRH=10 vanhan123
davidprentice 0:b608c7f02f80 1134 0x0013, 0x1300, //VDV=19
davidprentice 0:b608c7f02f80 1135 TFTLCD_DELAY, 100,
davidprentice 0:b608c7f02f80 1136
davidprentice 0:b608c7f02f80 1137 0x0001, 0x0100,
davidprentice 0:b608c7f02f80 1138 0x0002, 0x0200,
davidprentice 0:b608c7f02f80 1139 0x0003, 0x1030,
davidprentice 0:b608c7f02f80 1140 0x0009, 0x0001,
davidprentice 0:b608c7f02f80 1141 0x000A, 0x0008,
davidprentice 0:b608c7f02f80 1142 0x000C, 0x0001,
davidprentice 0:b608c7f02f80 1143 0x000D, 0xD000,
davidprentice 0:b608c7f02f80 1144 0x000E, 0x0030,
davidprentice 0:b608c7f02f80 1145 0x000F, 0x0000,
davidprentice 0:b608c7f02f80 1146 0x0020, 0x0000,
davidprentice 0:b608c7f02f80 1147 0x0021, 0x0000,
davidprentice 0:b608c7f02f80 1148 0x0029, 0x0077,
davidprentice 0:b608c7f02f80 1149 0x0050, 0x0000,
davidprentice 0:b608c7f02f80 1150 0x0051, 0xD0EF,
davidprentice 0:b608c7f02f80 1151 0x0052, 0x0000,
davidprentice 0:b608c7f02f80 1152 0x0053, 0x013F,
davidprentice 0:b608c7f02f80 1153 0x0061, 0x0001,
davidprentice 0:b608c7f02f80 1154 0x006A, 0x0000,
davidprentice 0:b608c7f02f80 1155 0x0080, 0x0000,
davidprentice 0:b608c7f02f80 1156 0x0081, 0x0000,
davidprentice 0:b608c7f02f80 1157 0x0082, 0x005F,
davidprentice 0:b608c7f02f80 1158 0x0093, 0x0701,
davidprentice 0:b608c7f02f80 1159 0x0007, 0x0100,
davidprentice 0:b608c7f02f80 1160 };
davidprentice 0:b608c7f02f80 1161 static const uint16_t R61580_DEM240320C[] PROGMEM = { //from DEM 240320C TMH-PW-N
davidprentice 0:b608c7f02f80 1162 0x00, 0x0000,
davidprentice 0:b608c7f02f80 1163 0x00, 0x0000,
davidprentice 0:b608c7f02f80 1164 TFTLCD_DELAY, 100,
davidprentice 0:b608c7f02f80 1165 0x00, 0x0000,
davidprentice 0:b608c7f02f80 1166 0x00, 0x0000,
davidprentice 0:b608c7f02f80 1167 0x00, 0x0000,
davidprentice 0:b608c7f02f80 1168 0x00, 0x0000,
davidprentice 0:b608c7f02f80 1169 0xA4, 0x0001,
davidprentice 0:b608c7f02f80 1170 TFTLCD_DELAY, 100,
davidprentice 0:b608c7f02f80 1171 0x60, 0xA700,
davidprentice 0:b608c7f02f80 1172 0x08, 0x0808,
davidprentice 0:b608c7f02f80 1173 /******************************************/
davidprentice 0:b608c7f02f80 1174 //Gamma Setting:
davidprentice 0:b608c7f02f80 1175 0x30, 0x0203,
davidprentice 0:b608c7f02f80 1176 0x31, 0x080F,
davidprentice 0:b608c7f02f80 1177 0x32, 0x0401,
davidprentice 0:b608c7f02f80 1178 0x33, 0x050B,
davidprentice 0:b608c7f02f80 1179 0x34, 0x3330,
davidprentice 0:b608c7f02f80 1180 0x35, 0x0B05,
davidprentice 0:b608c7f02f80 1181 0x36, 0x0005,
davidprentice 0:b608c7f02f80 1182 0x37, 0x0F08,
davidprentice 0:b608c7f02f80 1183 0x38, 0x0302,
davidprentice 0:b608c7f02f80 1184 0x39, 0x3033,
davidprentice 0:b608c7f02f80 1185 /******************************************/
davidprentice 0:b608c7f02f80 1186 //Power Setting:
davidprentice 0:b608c7f02f80 1187 0x90, 0x0018, //80Hz
davidprentice 0:b608c7f02f80 1188 0x10, 0x0530, //BT,AP
davidprentice 0:b608c7f02f80 1189 0x11, 0x0237, //DC1,DC0,VC
davidprentice 0:b608c7f02f80 1190 0x12, 0x01BF,
davidprentice 0:b608c7f02f80 1191 0x13, 0x1000, //VCOM
davidprentice 0:b608c7f02f80 1192 TFTLCD_DELAY, 200,
davidprentice 0:b608c7f02f80 1193 /******************************************/
davidprentice 0:b608c7f02f80 1194 0x01, 0x0100,
davidprentice 0:b608c7f02f80 1195 0x02, 0x0200,
davidprentice 0:b608c7f02f80 1196 0x03, 0x1030,
davidprentice 0:b608c7f02f80 1197 0x09, 0x0001,
davidprentice 0:b608c7f02f80 1198 0x0A, 0x0008,
davidprentice 0:b608c7f02f80 1199 0x0C, 0x0000,
davidprentice 0:b608c7f02f80 1200 0x0D, 0xD000,
davidprentice 0:b608c7f02f80 1201
davidprentice 0:b608c7f02f80 1202 0x0E, 0x0030,
davidprentice 0:b608c7f02f80 1203 0x0F, 0x0000,
davidprentice 0:b608c7f02f80 1204 0x20, 0x0000, //H Start
davidprentice 0:b608c7f02f80 1205 0x21, 0x0000, //V Start
davidprentice 0:b608c7f02f80 1206 0x29, 0x002E,
davidprentice 0:b608c7f02f80 1207 0x50, 0x0000,
davidprentice 0:b608c7f02f80 1208 0x51, 0x00EF,
davidprentice 0:b608c7f02f80 1209 0x52, 0x0000,
davidprentice 0:b608c7f02f80 1210 0x53, 0x013F,
davidprentice 0:b608c7f02f80 1211 0x61, 0x0001,
davidprentice 0:b608c7f02f80 1212 0x6A, 0x0000,
davidprentice 0:b608c7f02f80 1213 0x80, 0x0000,
davidprentice 0:b608c7f02f80 1214 0x81, 0x0000,
davidprentice 0:b608c7f02f80 1215 0x82, 0x005F,
davidprentice 0:b608c7f02f80 1216 0x93, 0x0701,
davidprentice 0:b608c7f02f80 1217 /******************************************/
davidprentice 0:b608c7f02f80 1218 0x07, 0x0100,
davidprentice 0:b608c7f02f80 1219 TFTLCD_DELAY, 100,
davidprentice 0:b608c7f02f80 1220 };
davidprentice 0:b608c7f02f80 1221 init_table16(R61580_DEM240320C, sizeof(R61580_DEM240320C));
davidprentice 0:b608c7f02f80 1222 // init_table16(R61580_regValues, sizeof(R61580_regValues));
davidprentice 0:b608c7f02f80 1223 break;
davidprentice 0:b608c7f02f80 1224 #endif
davidprentice 0:b608c7f02f80 1225
davidprentice 0:b608c7f02f80 1226 #if defined(SUPPORT_1963) && USING_16BIT_BUS
davidprentice 0:b608c7f02f80 1227 case 0x1963:
davidprentice 0:b608c7f02f80 1228 _lcd_capable = AUTO_READINC | MIPI_DCS_REV1 | READ_NODUMMY | INVERT_SS | INVERT_RGB;
davidprentice 0:b608c7f02f80 1229 // from NHD 5.0" 8-bit
davidprentice 0:b608c7f02f80 1230 static const uint8_t SSD1963_NHD_50_regValues[] PROGMEM = {
davidprentice 0:b608c7f02f80 1231 (0xE0), 1, 0x01, // PLL enable
davidprentice 0:b608c7f02f80 1232 TFTLCD_DELAY8, 10,
davidprentice 0:b608c7f02f80 1233 (0xE0), 1, 0x03, // Lock PLL
davidprentice 0:b608c7f02f80 1234 (0xB0), 7, 0x08, 0x80, 0x03, 0x1F, 0x01, 0xDF, 0x00, //LCD SPECIFICATION
davidprentice 0:b608c7f02f80 1235 (0xF0), 1, 0x03, //was 00 pixel data interface
davidprentice 0:b608c7f02f80 1236 // (0x3A), 1, 0x60, // SET R G B format = 6 6 6
davidprentice 0:b608c7f02f80 1237 (0xE2), 3, 0x1D, 0x02, 0x54, //PLL multiplier, set PLL clock to 120M
davidprentice 0:b608c7f02f80 1238 (0xE6), 3, 0x02, 0xFF, 0xFF, //PLL setting for PCLK, depends on resolution
davidprentice 0:b608c7f02f80 1239 (0xB4), 8, 0x04, 0x20, 0x00, 0x58, 0x80, 0x00, 0x00, 0x00, //HSYNC
davidprentice 0:b608c7f02f80 1240 (0xB6), 7, 0x02, 0x0D, 0x00, 0x20, 0x01, 0x00, 0x00, //VSYNC
davidprentice 0:b608c7f02f80 1241 (0x13), 0, //Enter Normal mode
davidprentice 0:b608c7f02f80 1242 (0x38), 0, //Exit Idle mode
davidprentice 0:b608c7f02f80 1243 };
davidprentice 0:b608c7f02f80 1244 // from NHD 7.0" 8-bit
davidprentice 0:b608c7f02f80 1245 static const uint8_t SSD1963_NHD_70_regValues[] PROGMEM = {
davidprentice 0:b608c7f02f80 1246 (0xE2), 3, 0x1D, 0x02, 0x04, //PLL multiplier, set PLL clock to 120M
davidprentice 0:b608c7f02f80 1247 (0xE0), 1, 0x01, // PLL enable
davidprentice 0:b608c7f02f80 1248 TFTLCD_DELAY8, 10,
davidprentice 0:b608c7f02f80 1249 (0xE0), 1, 0x03, // Lock PLL
davidprentice 0:b608c7f02f80 1250 0x01, 0, //Soft Reset
davidprentice 0:b608c7f02f80 1251 TFTLCD_DELAY8, 120,
davidprentice 0:b608c7f02f80 1252 (0xB0), 7, 0x08, 0x80, 0x03, 0x1F, 0x01, 0xDF, 0x00, //LCD SPECIFICATION
davidprentice 0:b608c7f02f80 1253 (0xF0), 1, 0x03, //was 00 pixel data interface
davidprentice 0:b608c7f02f80 1254 // (0x3A), 1, 0x60, // SET R G B format = 6 6 6
davidprentice 0:b608c7f02f80 1255 (0xE6), 3, 0x0F, 0xFF, 0xFF, //PLL setting for PCLK, depends on resolution
davidprentice 0:b608c7f02f80 1256 (0xB4), 8, 0x04, 0x20, 0x00, 0x58, 0x80, 0x00, 0x00, 0x00, //HSYNC
davidprentice 0:b608c7f02f80 1257 (0xB6), 7, 0x02, 0x0D, 0x00, 0x20, 0x01, 0x00, 0x00, //VSYNC
davidprentice 0:b608c7f02f80 1258 (0x13), 0, //Enter Normal mode
davidprentice 0:b608c7f02f80 1259 (0x38), 0, //Exit Idle mode
davidprentice 0:b608c7f02f80 1260 };
davidprentice 0:b608c7f02f80 1261 // from UTFTv2.81 initlcd.h
davidprentice 0:b608c7f02f80 1262 static const uint8_t SSD1963_800_regValues[] PROGMEM = {
davidprentice 0:b608c7f02f80 1263 (0xE2), 3, 0x1E, 0x02, 0x54, //PLL multiplier, set PLL clock to 120M
davidprentice 0:b608c7f02f80 1264 (0xE0), 1, 0x01, // PLL enable
davidprentice 0:b608c7f02f80 1265 TFTLCD_DELAY8, 10,
davidprentice 0:b608c7f02f80 1266 (0xE0), 1, 0x03, //
davidprentice 0:b608c7f02f80 1267 TFTLCD_DELAY8, 10,
davidprentice 0:b608c7f02f80 1268 0x01, 0, //Soft Reset
davidprentice 0:b608c7f02f80 1269 TFTLCD_DELAY8, 100,
davidprentice 0:b608c7f02f80 1270 (0xE6), 3, 0x03, 0xFF, 0xFF, //PLL setting for PCLK, depends on resolution
davidprentice 0:b608c7f02f80 1271 (0xB0), 7, 0x24, 0x00, 0x03, 0x1F, 0x01, 0xDF, 0x00, //LCD SPECIFICATION
davidprentice 0:b608c7f02f80 1272 // (0xB0), 7, 0x24, 0x00, 0x03, 0x1F, 0x01, 0xDF, 0x2D, //LCD SPECIFICATION
davidprentice 0:b608c7f02f80 1273 (0xB4), 8, 0x03, 0xA0, 0x00, 0x2E, 0x30, 0x00, 0x0F, 0x00, //HSYNC
davidprentice 0:b608c7f02f80 1274 (0xB6), 7, 0x02, 0x0D, 0x00, 0x10, 0x10, 0x00, 0x08, //VSYNC
davidprentice 0:b608c7f02f80 1275 (0xBA), 1, 0x0F, //GPIO[3:0] out 1
davidprentice 0:b608c7f02f80 1276 (0xB8), 2, 0x07, 0x01, //GPIO3=input, GPIO[2:0]=output
davidprentice 0:b608c7f02f80 1277 (0xF0), 1, 0x03, //pixel data interface
davidprentice 0:b608c7f02f80 1278 TFTLCD_DELAY8, 1,
davidprentice 0:b608c7f02f80 1279 0x28, 0, //Display Off
davidprentice 0:b608c7f02f80 1280 0x11, 0, //Sleep Out
davidprentice 0:b608c7f02f80 1281 TFTLCD_DELAY8, 100,
davidprentice 0:b608c7f02f80 1282 0x29, 0, //Display On
davidprentice 0:b608c7f02f80 1283 (0xBE), 6, 0x06, 0xF0, 0x01, 0xF0, 0x00, 0x00, //set PWM for B/L
davidprentice 0:b608c7f02f80 1284 (0xD0), 1, 0x0D,
davidprentice 0:b608c7f02f80 1285 };
davidprentice 0:b608c7f02f80 1286 // from UTFTv2.82 initlcd.h
davidprentice 0:b608c7f02f80 1287 static const uint8_t SSD1963_800NEW_regValues[] PROGMEM = {
davidprentice 0:b608c7f02f80 1288 (0xE2), 3, 0x1E, 0x02, 0x54, //PLL multiplier, set PLL clock to 120M
davidprentice 0:b608c7f02f80 1289 (0xE0), 1, 0x01, // PLL enable
davidprentice 0:b608c7f02f80 1290 TFTLCD_DELAY8, 10,
davidprentice 0:b608c7f02f80 1291 (0xE0), 1, 0x03, //
davidprentice 0:b608c7f02f80 1292 TFTLCD_DELAY8, 10,
davidprentice 0:b608c7f02f80 1293 0x01, 0, //Soft Reset
davidprentice 0:b608c7f02f80 1294 TFTLCD_DELAY8, 100,
davidprentice 0:b608c7f02f80 1295 (0xE6), 3, 0x03, 0xFF, 0xFF, //PLL setting for PCLK, depends on resolution
davidprentice 0:b608c7f02f80 1296 (0xB0), 7, 0x24, 0x00, 0x03, 0x1F, 0x01, 0xDF, 0x00, //LCD SPECIFICATION
davidprentice 0:b608c7f02f80 1297 (0xB4), 8, 0x03, 0xA0, 0x00, 0x2E, 0x30, 0x00, 0x0F, 0x00, //HSYNC HT=928, HPS=46, HPW=48, LPS=15
davidprentice 0:b608c7f02f80 1298 (0xB6), 7, 0x02, 0x0D, 0x00, 0x10, 0x10, 0x00, 0x08, //VSYNC VT=525, VPS=16, VPW=16, FPS=8
davidprentice 0:b608c7f02f80 1299 (0xBA), 1, 0x0F, //GPIO[3:0] out 1
davidprentice 0:b608c7f02f80 1300 (0xB8), 2, 0x07, 0x01, //GPIO3=input, GPIO[2:0]=output
davidprentice 0:b608c7f02f80 1301 (0xF0), 1, 0x03, //pixel data interface
davidprentice 0:b608c7f02f80 1302 TFTLCD_DELAY8, 1,
davidprentice 0:b608c7f02f80 1303 0x28, 0, //Display Off
davidprentice 0:b608c7f02f80 1304 0x11, 0, //Sleep Out
davidprentice 0:b608c7f02f80 1305 TFTLCD_DELAY8, 100,
davidprentice 0:b608c7f02f80 1306 0x29, 0, //Display On
davidprentice 0:b608c7f02f80 1307 (0xBE), 6, 0x06, 0xF0, 0x01, 0xF0, 0x00, 0x00, //set PWM for B/L
davidprentice 0:b608c7f02f80 1308 (0xD0), 1, 0x0D,
davidprentice 0:b608c7f02f80 1309 };
davidprentice 0:b608c7f02f80 1310 // from UTFTv2.82 initlcd.h
davidprentice 0:b608c7f02f80 1311 static const uint8_t SSD1963_800ALT_regValues[] PROGMEM = {
davidprentice 0:b608c7f02f80 1312 (0xE2), 3, 0x23, 0x02, 0x04, //PLL multiplier, set PLL clock to 120M
davidprentice 0:b608c7f02f80 1313 (0xE0), 1, 0x01, // PLL enable
davidprentice 0:b608c7f02f80 1314 TFTLCD_DELAY8, 10,
davidprentice 0:b608c7f02f80 1315 (0xE0), 1, 0x03, //
davidprentice 0:b608c7f02f80 1316 TFTLCD_DELAY8, 10,
davidprentice 0:b608c7f02f80 1317 0x01, 0, //Soft Reset
davidprentice 0:b608c7f02f80 1318 TFTLCD_DELAY8, 100,
davidprentice 0:b608c7f02f80 1319 (0xE6), 3, 0x04, 0x93, 0xE0, //PLL setting for PCLK, depends on resolution
davidprentice 0:b608c7f02f80 1320 (0xB0), 7, 0x00, 0x00, 0x03, 0x1F, 0x01, 0xDF, 0x00, //LCD SPECIFICATION
davidprentice 0:b608c7f02f80 1321 (0xB4), 8, 0x03, 0xA0, 0x00, 0x2E, 0x30, 0x00, 0x0F, 0x00, //HSYNC HT=928, HPS=46, HPW=48, LPS=15
davidprentice 0:b608c7f02f80 1322 (0xB6), 7, 0x02, 0x0D, 0x00, 0x10, 0x10, 0x00, 0x08, //VSYNC VT=525, VPS=16, VPW=16, FPS=8
davidprentice 0:b608c7f02f80 1323 (0xBA), 1, 0x0F, //GPIO[3:0] out 1
davidprentice 0:b608c7f02f80 1324 (0xB8), 2, 0x07, 0x01, //GPIO3=input, GPIO[2:0]=output
davidprentice 0:b608c7f02f80 1325 (0xF0), 1, 0x03, //pixel data interface
davidprentice 0:b608c7f02f80 1326 TFTLCD_DELAY8, 1,
davidprentice 0:b608c7f02f80 1327 0x28, 0, //Display Off
davidprentice 0:b608c7f02f80 1328 0x11, 0, //Sleep Out
davidprentice 0:b608c7f02f80 1329 TFTLCD_DELAY8, 100,
davidprentice 0:b608c7f02f80 1330 0x29, 0, //Display On
davidprentice 0:b608c7f02f80 1331 (0xBE), 6, 0x06, 0xF0, 0x01, 0xF0, 0x00, 0x00, //set PWM for B/L
davidprentice 0:b608c7f02f80 1332 (0xD0), 1, 0x0D,
davidprentice 0:b608c7f02f80 1333 };
davidprentice 0:b608c7f02f80 1334 // from UTFTv2.82 initlcd.h
davidprentice 0:b608c7f02f80 1335 static const uint8_t SSD1963_480_regValues[] PROGMEM = {
davidprentice 0:b608c7f02f80 1336 (0xE2), 3, 0x23, 0x02, 0x54, //PLL multiplier, set PLL clock to 120M
davidprentice 0:b608c7f02f80 1337 (0xE0), 1, 0x01, // PLL enable
davidprentice 0:b608c7f02f80 1338 TFTLCD_DELAY8, 10,
davidprentice 0:b608c7f02f80 1339 (0xE0), 1, 0x03, //
davidprentice 0:b608c7f02f80 1340 TFTLCD_DELAY8, 10,
davidprentice 0:b608c7f02f80 1341 0x01, 0, //Soft Reset
davidprentice 0:b608c7f02f80 1342 TFTLCD_DELAY8, 100,
davidprentice 0:b608c7f02f80 1343 (0xE6), 3, 0x01, 0x1F, 0xFF, //PLL setting for PCLK, depends on resolution
davidprentice 0:b608c7f02f80 1344 (0xB0), 7, 0x20, 0x00, 0x01, 0xDF, 0x01, 0x0F, 0x00, //LCD SPECIFICATION
davidprentice 0:b608c7f02f80 1345 (0xB4), 8, 0x02, 0x13, 0x00, 0x08, 0x2B, 0x00, 0x02, 0x00, //HSYNC
davidprentice 0:b608c7f02f80 1346 (0xB6), 7, 0x01, 0x20, 0x00, 0x04, 0x0C, 0x00, 0x02, //VSYNC
davidprentice 0:b608c7f02f80 1347 (0xBA), 1, 0x0F, //GPIO[3:0] out 1
davidprentice 0:b608c7f02f80 1348 (0xB8), 2, 0x07, 0x01, //GPIO3=input, GPIO[2:0]=output
davidprentice 0:b608c7f02f80 1349 (0xF0), 1, 0x03, //pixel data interface
davidprentice 0:b608c7f02f80 1350 TFTLCD_DELAY8, 1,
davidprentice 0:b608c7f02f80 1351 0x28, 0, //Display Off
davidprentice 0:b608c7f02f80 1352 0x11, 0, //Sleep Out
davidprentice 0:b608c7f02f80 1353 TFTLCD_DELAY8, 100,
davidprentice 0:b608c7f02f80 1354 0x29, 0, //Display On
davidprentice 0:b608c7f02f80 1355 (0xBE), 6, 0x06, 0xF0, 0x01, 0xF0, 0x00, 0x00, //set PWM for B/L
davidprentice 0:b608c7f02f80 1356 (0xD0), 1, 0x0D,
davidprentice 0:b608c7f02f80 1357 };
davidprentice 0:b608c7f02f80 1358 // table8_ads = SSD1963_480_regValues, table_size = sizeof(SSD1963_480_regValues);
davidprentice 0:b608c7f02f80 1359 table8_ads = SSD1963_800_regValues, table_size = sizeof(SSD1963_800_regValues);
davidprentice 0:b608c7f02f80 1360 // table8_ads = SSD1963_NHD_50_regValues, table_size = sizeof(SSD1963_NHD_50_regValues);
davidprentice 0:b608c7f02f80 1361 // table8_ads = SSD1963_NHD_70_regValues, table_size = sizeof(SSD1963_NHD_70_regValues);
davidprentice 0:b608c7f02f80 1362 // table8_ads = SSD1963_800NEW_regValues, table_size = sizeof(SSD1963_800NEW_regValues);
davidprentice 0:b608c7f02f80 1363 // table8_ads = SSD1963_800ALT_regValues, table_size = sizeof(SSD1963_800ALT_regValues);
davidprentice 0:b608c7f02f80 1364 p16 = (int16_t *) & HEIGHT;
davidprentice 0:b608c7f02f80 1365 *p16 = 480;
davidprentice 0:b608c7f02f80 1366 p16 = (int16_t *) & WIDTH;
davidprentice 0:b608c7f02f80 1367 *p16 = 800;
davidprentice 0:b608c7f02f80 1368 break;
davidprentice 0:b608c7f02f80 1369 #endif
davidprentice 0:b608c7f02f80 1370
davidprentice 0:b608c7f02f80 1371 #ifdef SUPPORT_4532
davidprentice 0:b608c7f02f80 1372 //Support for LG Electronics LGDP4532 (also 4531 i guess) by Leodino v1.0 2-Nov-2016
davidprentice 0:b608c7f02f80 1373 //based on data by waveshare and the datasheet of LG Electronics
davidprentice 0:b608c7f02f80 1374 //My approach to get it working: the parameters by waveshare did no make it function allright
davidprentice 0:b608c7f02f80 1375 //I started with remming lines to see if this helped. Basically the stuff in range 41-93
davidprentice 0:b608c7f02f80 1376 //gives problems.
davidprentice 0:b608c7f02f80 1377 //The other lines that are REMmed give no problems, but it seems default values are OK as well.
davidprentice 0:b608c7f02f80 1378 case 0x4532: // thanks Leodino
davidprentice 0:b608c7f02f80 1379 _lcd_capable = 0 | REV_SCREEN; // | INVERT_GS;
davidprentice 0:b608c7f02f80 1380 static const uint16_t LGDP4532_regValues[] PROGMEM = {
davidprentice 0:b608c7f02f80 1381 0x0000,0x0001, //Device code read
davidprentice 0:b608c7f02f80 1382 0x0010,0x0628, //Power control 1 SAP[2:0] BT[3:0] AP[2:0] DK DSTB SLP
davidprentice 0:b608c7f02f80 1383 0x0012,0x0006, //Power control 3 PON VRH[3:0]
davidprentice 0:b608c7f02f80 1384 //0x0013,0x0A32, //Power control 4 VCOMG VDV[4:0] VCM[6:0]
davidprentice 0:b608c7f02f80 1385 0x0011,0x0040, //Power control 2; DC1[2:0] DC0[2:0] VC[2:0]
davidprentice 0:b608c7f02f80 1386 //0x0015,0x0050, //Regulator control RSET RI[2:0] RV[2:0] RCONT[2:0]
davidprentice 0:b608c7f02f80 1387 0x0012,0x0016, //Power control 3 PON VRH[3:0]
davidprentice 0:b608c7f02f80 1388 TFTLCD_DELAY,50,
davidprentice 0:b608c7f02f80 1389 0x0010,0x5660, //Power control 1 SAP[2:0] BT[3:0] AP[2:0] DK DSTB SLP
davidprentice 0:b608c7f02f80 1390 TFTLCD_DELAY,50,
davidprentice 0:b608c7f02f80 1391 //0x0013,0x2A4E, //Power control 4 VCOMG VDV[4:0] VCM[6:0]
davidprentice 0:b608c7f02f80 1392 //0x0001,0x0100, //Driver output control SM SS
davidprentice 0:b608c7f02f80 1393 //0x0002,0x0300, //LCD Driving Wave Control
davidprentice 0:b608c7f02f80 1394 //0x0003,0x1030, //Entry mode TRI DFM BGR ORG I/D[1:0] AM
davidprentice 0:b608c7f02f80 1395 //0x0007,0x0202, //Display Control 1 PTDE[1:0] BASEE GON DTE COL D[1:0]
davidprentice 0:b608c7f02f80 1396 TFTLCD_DELAY,50,
davidprentice 0:b608c7f02f80 1397 //0x0008,0x0202, //Display Control 2 FP[3:0] BP[3:0] front and back porch (blank period at begin and end..)
davidprentice 0:b608c7f02f80 1398 //0x000A,0x0000, //Test Register 1 (RA0h)
davidprentice 0:b608c7f02f80 1399 //Gamma adjustment
davidprentice 0:b608c7f02f80 1400 0x0030,0x0000,
davidprentice 0:b608c7f02f80 1401 0x0031,0x0402,
davidprentice 0:b608c7f02f80 1402 0x0032,0x0106,
davidprentice 0:b608c7f02f80 1403 0x0033,0x0700,
davidprentice 0:b608c7f02f80 1404 0x0034,0x0104,
davidprentice 0:b608c7f02f80 1405 0x0035,0x0301,
davidprentice 0:b608c7f02f80 1406 0x0036,0x0707,
davidprentice 0:b608c7f02f80 1407 0x0037,0x0305,
davidprentice 0:b608c7f02f80 1408 0x0038,0x0208,
davidprentice 0:b608c7f02f80 1409 0x0039,0x0F0B,
davidprentice 0:b608c7f02f80 1410 TFTLCD_DELAY,50,
davidprentice 0:b608c7f02f80 1411 //some of this stuff in range 41-93 really throws things off....
davidprentice 0:b608c7f02f80 1412 //0x0041,0x0002,
davidprentice 0:b608c7f02f80 1413 //0x0060,0x2700, //Driver Output Control (R60h)
davidprentice 0:b608c7f02f80 1414 //0x0061,0x0001, //Base Image Display Control (R61h)
davidprentice 0:b608c7f02f80 1415 //0x0090,0x0119, //Panel Interface Control 1 (R90h) DIVI[1:0] RTNI[4:0]
davidprentice 0:b608c7f02f80 1416 //0x0092,0x010A, //Panel Interface Control 2 (R92h) NOWI[2:0] EQI2[1:0] EQI1[1:0]
davidprentice 0:b608c7f02f80 1417 //0x0093,0x0004, //Panel Interface Control 3 (R93h) MCPI[2:0]
davidprentice 0:b608c7f02f80 1418 //0x00A0,0x0100, //Test Register 1 (RA0h)
davidprentice 0:b608c7f02f80 1419 TFTLCD_DELAY,50,
davidprentice 0:b608c7f02f80 1420 0x0007,0x0133, //Display Control 1 PTDE[1:0] BASEE GON DTE COL D[1:0]
davidprentice 0:b608c7f02f80 1421 TFTLCD_DELAY,50,
davidprentice 0:b608c7f02f80 1422 //0x00A0,0x0000, //Test Register 1 (RA0h)
davidprentice 0:b608c7f02f80 1423 };
davidprentice 0:b608c7f02f80 1424 init_table16(LGDP4532_regValues, sizeof(LGDP4532_regValues));
davidprentice 0:b608c7f02f80 1425 break;
davidprentice 0:b608c7f02f80 1426 #endif
davidprentice 0:b608c7f02f80 1427
davidprentice 0:b608c7f02f80 1428 #ifdef SUPPORT_4535
davidprentice 0:b608c7f02f80 1429 case 0x4535:
davidprentice 0:b608c7f02f80 1430 _lcd_capable = 0 | REV_SCREEN; // | INVERT_GS;
davidprentice 0:b608c7f02f80 1431 static const uint16_t LGDP4535_regValues[] PROGMEM = {
davidprentice 0:b608c7f02f80 1432 0x0015, 0x0030, // Set the internal vcore voltage
davidprentice 0:b608c7f02f80 1433 0x009A, 0x0010, // Start internal OSC
davidprentice 0:b608c7f02f80 1434 0x0011, 0x0020, // set SS and SM bit
davidprentice 0:b608c7f02f80 1435 0x0010, 0x3428, // set 1 line inversion
davidprentice 0:b608c7f02f80 1436 0x0012, 0x0002, // set GRAM write direction and BGR=1
davidprentice 0:b608c7f02f80 1437 0x0013, 0x1038, // Resize register
davidprentice 0:b608c7f02f80 1438 TFTLCD_DELAY, 40,
davidprentice 0:b608c7f02f80 1439 0x0012, 0x0012, // set the back porch and front porch
davidprentice 0:b608c7f02f80 1440 TFTLCD_DELAY, 40,
davidprentice 0:b608c7f02f80 1441 0x0010, 0x3420, // set non-display area refresh cycle ISC[3:0]
davidprentice 0:b608c7f02f80 1442 0x0013, 0x3045, // FMARK function
davidprentice 0:b608c7f02f80 1443 TFTLCD_DELAY, 70,
davidprentice 0:b608c7f02f80 1444 0x0030, 0x0000, // RGB interface setting
davidprentice 0:b608c7f02f80 1445 0x0031, 0x0402, // Frame marker Position
davidprentice 0:b608c7f02f80 1446 0x0032, 0x0307, // RGB interface polarity
davidprentice 0:b608c7f02f80 1447 0x0033, 0x0304, // SAP, BT[3:0], AP, DSTB, SLP, STB
davidprentice 0:b608c7f02f80 1448 0x0034, 0x0004, // DC1[2:0], DC0[2:0], VC[2:0]
davidprentice 0:b608c7f02f80 1449 0x0035, 0x0401, // VREG1OUT voltage
davidprentice 0:b608c7f02f80 1450 0x0036, 0x0707, // VDV[4:0] for VCOM amplitude
davidprentice 0:b608c7f02f80 1451 0x0037, 0x0305, // SAP, BT[3:0], AP, DSTB, SLP, STB
davidprentice 0:b608c7f02f80 1452 0x0038, 0x0610, // DC1[2:0], DC0[2:0], VC[2:0]
davidprentice 0:b608c7f02f80 1453 0x0039, 0x0610, // VREG1OUT voltage
davidprentice 0:b608c7f02f80 1454 0x0001, 0x0100, // VDV[4:0] for VCOM amplitude
davidprentice 0:b608c7f02f80 1455 0x0002, 0x0300, // VCM[4:0] for VCOMH
davidprentice 0:b608c7f02f80 1456 0x0003, 0x1030, // GRAM horizontal Address
davidprentice 0:b608c7f02f80 1457 0x0008, 0x0808, // GRAM Vertical Address
davidprentice 0:b608c7f02f80 1458 0x000A, 0x0008,
davidprentice 0:b608c7f02f80 1459 0x0060, 0x2700, // Gate Scan Line
davidprentice 0:b608c7f02f80 1460 0x0061, 0x0001, // NDL,VLE, REV
davidprentice 0:b608c7f02f80 1461 0x0090, 0x013E,
davidprentice 0:b608c7f02f80 1462 0x0092, 0x0100,
davidprentice 0:b608c7f02f80 1463 0x0093, 0x0100,
davidprentice 0:b608c7f02f80 1464 0x00A0, 0x3000,
davidprentice 0:b608c7f02f80 1465 0x00A3, 0x0010,
davidprentice 0:b608c7f02f80 1466 0x0007, 0x0001,
davidprentice 0:b608c7f02f80 1467 0x0007, 0x0021,
davidprentice 0:b608c7f02f80 1468 0x0007, 0x0023,
davidprentice 0:b608c7f02f80 1469 0x0007, 0x0033,
davidprentice 0:b608c7f02f80 1470 0x0007, 0x0133,
davidprentice 0:b608c7f02f80 1471 };
davidprentice 0:b608c7f02f80 1472 init_table16(LGDP4535_regValues, sizeof(LGDP4535_regValues));
davidprentice 0:b608c7f02f80 1473 break;
davidprentice 0:b608c7f02f80 1474 #endif
davidprentice 0:b608c7f02f80 1475
davidprentice 0:b608c7f02f80 1476 case 0x5310:
davidprentice 0:b608c7f02f80 1477 _lcd_capable = AUTO_READINC | MIPI_DCS_REV1 | MV_AXIS | INVERT_SS | INVERT_RGB | READ_24BITS;
davidprentice 0:b608c7f02f80 1478 static const uint8_t NT35310_regValues[] PROGMEM = { //
davidprentice 0:b608c7f02f80 1479 TFTLCD_DELAY8, 10, //just some dummy
davidprentice 0:b608c7f02f80 1480 };
davidprentice 0:b608c7f02f80 1481 table8_ads = NT35310_regValues, table_size = sizeof(NT35310_regValues);
davidprentice 0:b608c7f02f80 1482 p16 = (int16_t *) & HEIGHT;
davidprentice 0:b608c7f02f80 1483 *p16 = 480;
davidprentice 0:b608c7f02f80 1484 p16 = (int16_t *) & WIDTH;
davidprentice 0:b608c7f02f80 1485 *p16 = 320;
davidprentice 0:b608c7f02f80 1486 break;
davidprentice 0:b608c7f02f80 1487
davidprentice 0:b608c7f02f80 1488 #ifdef SUPPORT_68140
davidprentice 0:b608c7f02f80 1489 case 0x6814:
davidprentice 0:b608c7f02f80 1490 _lcd_capable = AUTO_READINC | MIPI_DCS_REV1 | MV_AXIS;
davidprentice 0:b608c7f02f80 1491 static const uint8_t RM68140_regValues_max[] PROGMEM = { //
davidprentice 0:b608c7f02f80 1492 0x3A, 1, 0x55, //Pixel format .kbv my Mega Shield
davidprentice 0:b608c7f02f80 1493 };
davidprentice 0:b608c7f02f80 1494 table8_ads = RM68140_regValues_max, table_size = sizeof(RM68140_regValues_max);
davidprentice 0:b608c7f02f80 1495 p16 = (int16_t *) & HEIGHT;
davidprentice 0:b608c7f02f80 1496 *p16 = 480;
davidprentice 0:b608c7f02f80 1497 p16 = (int16_t *) & WIDTH;
davidprentice 0:b608c7f02f80 1498 *p16 = 320;
davidprentice 0:b608c7f02f80 1499 break;
davidprentice 0:b608c7f02f80 1500 #endif
davidprentice 0:b608c7f02f80 1501
davidprentice 0:b608c7f02f80 1502 #ifdef SUPPORT_7735
davidprentice 0:b608c7f02f80 1503 case 0x7735: //
davidprentice 0:b608c7f02f80 1504 _lcd_capable = AUTO_READINC | MIPI_DCS_REV1 | MV_AXIS | REV_SCREEN | READ_24BITS;
davidprentice 0:b608c7f02f80 1505 static const uint8_t PROGMEM table7735S[] = {
davidprentice 0:b608c7f02f80 1506 // (COMMAND_BYTE), n, data_bytes....
davidprentice 0:b608c7f02f80 1507 0xB1, 3, 0x01, 0x2C, 0x2D, // [05 3C 3C] FRMCTR1 if GM==11
davidprentice 0:b608c7f02f80 1508 0xB2, 3, 0x01, 0x2C, 0x2D, // [05 3C 3C]
davidprentice 0:b608c7f02f80 1509 0xB3, 6, 0x01, 0x2C, 0x2D, 0x01, 0x2C, 0x2D, // [05 3C 3C 05 3C 3C]
davidprentice 0:b608c7f02f80 1510 0xB4, 1, 0x07, // [07] INVCTR Column inversion
davidprentice 0:b608c7f02f80 1511 //ST7735XR Power Sequence
davidprentice 0:b608c7f02f80 1512 0xC0, 3, 0xA2, 0x02, 0x84, // [A8 08 84] PWCTR1
davidprentice 0:b608c7f02f80 1513 0xC1, 1, 0xC5, // [C0]
davidprentice 0:b608c7f02f80 1514 0xC2, 2, 0x0A, 0x00, // [0A 00]
davidprentice 0:b608c7f02f80 1515 0xC3, 2, 0x8A, 0x2A, // [8A 26]
davidprentice 0:b608c7f02f80 1516 0xC4, 2, 0x8A, 0xEE, // [8A EE]
davidprentice 0:b608c7f02f80 1517 0xC5, 1, 0x0E, // [05] VMCTR1 VCOM
davidprentice 0:b608c7f02f80 1518 };
davidprentice 0:b608c7f02f80 1519 table8_ads = table7735S, table_size = sizeof(table7735S); //
davidprentice 0:b608c7f02f80 1520 p16 = (int16_t *) & HEIGHT;
davidprentice 0:b608c7f02f80 1521 *p16 = 160;
davidprentice 0:b608c7f02f80 1522 p16 = (int16_t *) & WIDTH;
davidprentice 0:b608c7f02f80 1523 *p16 = 128;
davidprentice 0:b608c7f02f80 1524 break;
davidprentice 0:b608c7f02f80 1525 #endif
davidprentice 0:b608c7f02f80 1526
davidprentice 0:b608c7f02f80 1527 #ifdef SUPPORT_7781
davidprentice 0:b608c7f02f80 1528 case 0x7783:
davidprentice 0:b608c7f02f80 1529 _lcd_capable = AUTO_READINC | REV_SCREEN | INVERT_GS;
davidprentice 0:b608c7f02f80 1530 static const uint16_t ST7781_regValues[] PROGMEM = {
davidprentice 0:b608c7f02f80 1531 0x00FF, 0x0001, //can we do 0xFF
davidprentice 0:b608c7f02f80 1532 0x00F3, 0x0008,
davidprentice 0:b608c7f02f80 1533 // LCD_Write_COM(0x00F3,
davidprentice 0:b608c7f02f80 1534
davidprentice 0:b608c7f02f80 1535 0x00, 0x0001,
davidprentice 0:b608c7f02f80 1536 0x0001, 0x0100, // Driver Output Control Register (R01h)
davidprentice 0:b608c7f02f80 1537 0x0002, 0x0700, // LCD Driving Waveform Control (R02h)
davidprentice 0:b608c7f02f80 1538 0x0003, 0x1030, // Entry Mode (R03h)
davidprentice 0:b608c7f02f80 1539 0x0008, 0x0302,
davidprentice 0:b608c7f02f80 1540 0x0009, 0x0000,
davidprentice 0:b608c7f02f80 1541 0x0010, 0x0000, // Power Control 1 (R10h)
davidprentice 0:b608c7f02f80 1542 0x0011, 0x0007, // Power Control 2 (R11h)
davidprentice 0:b608c7f02f80 1543 0x0012, 0x0000, // Power Control 3 (R12h)
davidprentice 0:b608c7f02f80 1544 0x0013, 0x0000, // Power Control 4 (R13h)
davidprentice 0:b608c7f02f80 1545 TFTLCD_DELAY, 50,
davidprentice 0:b608c7f02f80 1546 0x0010, 0x14B0, // Power Control 1 SAP=1, BT=4, APE=1, AP=3
davidprentice 0:b608c7f02f80 1547 TFTLCD_DELAY, 10,
davidprentice 0:b608c7f02f80 1548 0x0011, 0x0007, // Power Control 2 VC=7
davidprentice 0:b608c7f02f80 1549 TFTLCD_DELAY, 10,
davidprentice 0:b608c7f02f80 1550 0x0012, 0x008E, // Power Control 3 VCIRE=1, VRH=14
davidprentice 0:b608c7f02f80 1551 0x0013, 0x0C00, // Power Control 4 VDV=12
davidprentice 0:b608c7f02f80 1552 0x0029, 0x0015, // NVM read data 2 VCM=21
davidprentice 0:b608c7f02f80 1553 TFTLCD_DELAY, 10,
davidprentice 0:b608c7f02f80 1554 0x0030, 0x0000, // Gamma Control 1
davidprentice 0:b608c7f02f80 1555 0x0031, 0x0107, // Gamma Control 2
davidprentice 0:b608c7f02f80 1556 0x0032, 0x0000, // Gamma Control 3
davidprentice 0:b608c7f02f80 1557 0x0035, 0x0203, // Gamma Control 6
davidprentice 0:b608c7f02f80 1558 0x0036, 0x0402, // Gamma Control 7
davidprentice 0:b608c7f02f80 1559 0x0037, 0x0000, // Gamma Control 8
davidprentice 0:b608c7f02f80 1560 0x0038, 0x0207, // Gamma Control 9
davidprentice 0:b608c7f02f80 1561 0x0039, 0x0000, // Gamma Control 10
davidprentice 0:b608c7f02f80 1562 0x003C, 0x0203, // Gamma Control 13
davidprentice 0:b608c7f02f80 1563 0x003D, 0x0403, // Gamma Control 14
davidprentice 0:b608c7f02f80 1564 0x0060, 0xA700, // Driver Output Control (R60h) .kbv was 0xa700
davidprentice 0:b608c7f02f80 1565 0x0061, 0x0001, // Driver Output Control (R61h)
davidprentice 0:b608c7f02f80 1566 0x0090, 0X0029, // Panel Interface Control 1 (R90h)
davidprentice 0:b608c7f02f80 1567
davidprentice 0:b608c7f02f80 1568 // Display On
davidprentice 0:b608c7f02f80 1569 0x0007, 0x0133, // Display Control (R07h)
davidprentice 0:b608c7f02f80 1570 TFTLCD_DELAY, 50,
davidprentice 0:b608c7f02f80 1571 };
davidprentice 0:b608c7f02f80 1572 init_table16(ST7781_regValues, sizeof(ST7781_regValues));
davidprentice 0:b608c7f02f80 1573 break;
davidprentice 0:b608c7f02f80 1574 #endif
davidprentice 0:b608c7f02f80 1575
davidprentice 0:b608c7f02f80 1576 case 0x7789:
davidprentice 0:b608c7f02f80 1577 _lcd_capable = AUTO_READINC | MIPI_DCS_REV1 | MV_AXIS | READ_24BITS;
davidprentice 0:b608c7f02f80 1578 static const uint8_t ST7789_regValues[] PROGMEM = {
davidprentice 0:b608c7f02f80 1579 (0xB2), 5, 0x0C, 0x0C, 0x00, 0x33, 0x33, //PORCTRK: Porch setting [08 08 00 22 22] PSEN=0 anyway
davidprentice 0:b608c7f02f80 1580 (0xB7), 1, 0x35, //GCTRL: Gate Control [35]
davidprentice 0:b608c7f02f80 1581 (0xBB), 1, 0x2B, //VCOMS: VCOM setting VCOM=1.175 [20] VCOM=0.9
davidprentice 0:b608c7f02f80 1582 (0xC0), 1, 0x04, //LCMCTRL: LCM Control [2C]
davidprentice 0:b608c7f02f80 1583 (0xC2), 2, 0x01, 0xFF, //VDVVRHEN: VDV and VRH Command Enable [01 FF]
davidprentice 0:b608c7f02f80 1584 (0xC3), 1, 0x11, //VRHS: VRH Set VAP=4.4, VAN=-4.4 [0B]
davidprentice 0:b608c7f02f80 1585 (0xC4), 1, 0x20, //VDVS: VDV Set [20]
davidprentice 0:b608c7f02f80 1586 (0xC6), 1, 0x0F, //FRCTRL2: Frame Rate control in normal mode [0F]
davidprentice 0:b608c7f02f80 1587 (0xD0), 2, 0xA4, 0xA1, //PWCTRL1: Power Control 1 [A4 A1]
davidprentice 0:b608c7f02f80 1588 (0xE0), 14, 0xD0, 0x00, 0x05, 0x0E, 0x15, 0x0D, 0x37, 0x43, 0x47, 0x09, 0x15, 0x12, 0x16, 0x19, //PVGAMCTRL: Positive Voltage Gamma control
davidprentice 0:b608c7f02f80 1589 (0xE1), 14, 0xD0, 0x00, 0x05, 0x0D, 0x0C, 0x06, 0x2D, 0x44, 0x40, 0x0E, 0x1C, 0x18, 0x16, 0x19, //NVGAMCTRL: Negative Voltage Gamma control
davidprentice 0:b608c7f02f80 1590 };
davidprentice 0:b608c7f02f80 1591 static const uint8_t ST7789_regValues_arcain6[] PROGMEM = {
davidprentice 0:b608c7f02f80 1592 (0xB2), 5, 0x0C, 0x0C, 0x00, 0x33, 0x33, //PORCTRK: Porch setting [08 08 00 22 22] PSEN=0 anyway
davidprentice 0:b608c7f02f80 1593 (0xB7), 1, 0x35, //GCTRL: Gate Control [35]
davidprentice 0:b608c7f02f80 1594 (0xBB), 1, 0x35, //VCOMS: VCOM setting VCOM=??? [20] VCOM=0.9
davidprentice 0:b608c7f02f80 1595 (0xC0), 1, 0x2C, //LCMCTRL: LCM Control [2C]
davidprentice 0:b608c7f02f80 1596 (0xC2), 2, 0x01, 0xFF, //VDVVRHEN: VDV and VRH Command Enable [01 FF]
davidprentice 0:b608c7f02f80 1597 (0xC3), 1, 0x13, //VRHS: VRH Set VAP=???, VAN=-??? [0B]
davidprentice 0:b608c7f02f80 1598 (0xC4), 1, 0x20, //VDVS: VDV Set [20]
davidprentice 0:b608c7f02f80 1599 (0xC6), 1, 0x0F, //FRCTRL2: Frame Rate control in normal mode [0F]
davidprentice 0:b608c7f02f80 1600 (0xCA), 1, 0x0F, //REGSEL2 [0F]
davidprentice 0:b608c7f02f80 1601 (0xC8), 1, 0x08, //REGSEL1 [08]
davidprentice 0:b608c7f02f80 1602 (0x55), 1, 0x90, //WRCACE [00]
davidprentice 0:b608c7f02f80 1603 (0xD0), 2, 0xA4, 0xA1, //PWCTRL1: Power Control 1 [A4 A1]
davidprentice 0:b608c7f02f80 1604 (0xE0), 14, 0xD0, 0x00, 0x06, 0x09, 0x0B, 0x2A, 0x3C, 0x55, 0x4B, 0x08, 0x16, 0x14, 0x19, 0x20, //PVGAMCTRL: Positive Voltage Gamma control
davidprentice 0:b608c7f02f80 1605 (0xE1), 14, 0xD0, 0x00, 0x06, 0x09, 0x0B, 0x29, 0x36, 0x54, 0x4B, 0x0D, 0x16, 0x14, 0x21, 0x20, //NVGAMCTRL: Negative Voltage Gamma control
davidprentice 0:b608c7f02f80 1606 };
davidprentice 0:b608c7f02f80 1607 table8_ads = ST7789_regValues, table_size = sizeof(ST7789_regValues); //
davidprentice 0:b608c7f02f80 1608 break;
davidprentice 0:b608c7f02f80 1609
davidprentice 0:b608c7f02f80 1610 case 0x8031: //Unknown BangGood thanks PrinceCharles
davidprentice 0:b608c7f02f80 1611 _lcd_capable = AUTO_READINC | MIPI_DCS_REV1 | MV_AXIS | READ_24BITS | REV_SCREEN;
davidprentice 0:b608c7f02f80 1612 static const uint8_t FK8031_regValues[] PROGMEM = {
davidprentice 0:b608c7f02f80 1613 // 0xF2:8.2 = SM, 0xF2:8.0 = REV. invertDisplay(), vertScroll() do not work
davidprentice 0:b608c7f02f80 1614 0xF2,11, 0x16, 0x16, 0x03, 0x08, 0x08, 0x08, 0x08, 0x10, 0x04, 0x16, 0x16, // f.k. 0xF2:8.2 SM=1
davidprentice 0:b608c7f02f80 1615 0xFD, 3, 0x11, 0x02, 0x35, //f.k 0xFD:1.1 creates contiguous scan lins
davidprentice 0:b608c7f02f80 1616 };
davidprentice 0:b608c7f02f80 1617 table8_ads = FK8031_regValues, table_size = sizeof(FK8031_regValues);
davidprentice 0:b608c7f02f80 1618 break;
davidprentice 0:b608c7f02f80 1619
davidprentice 0:b608c7f02f80 1620 #ifdef SUPPORT_8347D
davidprentice 0:b608c7f02f80 1621 case 0x4747: //HX8347-D
davidprentice 0:b608c7f02f80 1622 _lcd_capable = REV_SCREEN | MIPI_DCS_REV1 | MV_AXIS | INVERT_SS | AUTO_READINC | READ_24BITS;
davidprentice 0:b608c7f02f80 1623 goto common_8347DGI;
davidprentice 0:b608c7f02f80 1624 case 0x6767: //HX8367-A
davidprentice 0:b608c7f02f80 1625 case 0x7575: //HX8347-G
davidprentice 0:b608c7f02f80 1626 case 0x9595: //HX8347-I
davidprentice 0:b608c7f02f80 1627 _lcd_capable = REV_SCREEN | MIPI_DCS_REV1 | MV_AXIS;
davidprentice 0:b608c7f02f80 1628 common_8347DGI:
davidprentice 0:b608c7f02f80 1629 is8347 = 1;
davidprentice 0:b608c7f02f80 1630 static const uint8_t HX8347G_2_regValues[] PROGMEM = {
davidprentice 0:b608c7f02f80 1631 0xEA, 2, 0x00, 0x20, //PTBA[15:0]
davidprentice 0:b608c7f02f80 1632 0xEC, 2, 0x0C, 0xC4, //STBA[15:0]
davidprentice 0:b608c7f02f80 1633 0xE8, 1, 0x38, //OPON[7:0]
davidprentice 0:b608c7f02f80 1634 0xE9, 1, 0x10, //OPON1[7:0]
davidprentice 0:b608c7f02f80 1635 0xF1, 1, 0x01, //OTPS1B
davidprentice 0:b608c7f02f80 1636 0xF2, 1, 0x10, //GEN
davidprentice 0:b608c7f02f80 1637 //Gamma 2.2 Setting
davidprentice 0:b608c7f02f80 1638 0x40, 13, 0x01, 0x00, 0x00, 0x10, 0x0E, 0x24, 0x04, 0x50, 0x02, 0x13, 0x19, 0x19, 0x16,
davidprentice 0:b608c7f02f80 1639 0x50, 14, 0x1B, 0x31, 0x2F, 0x3F, 0x3F, 0x3E, 0x2F, 0x7B, 0x09, 0x06, 0x06, 0x0C, 0x1D, 0xCC,
davidprentice 0:b608c7f02f80 1640 //Power Voltage Setting
davidprentice 0:b608c7f02f80 1641 0x1B, 1, 0x1B, //VRH=4.65V
davidprentice 0:b608c7f02f80 1642 0x1A, 1, 0x01, //BT (VGH~15V,VGL~-10V,DDVDH~5V)
davidprentice 0:b608c7f02f80 1643 0x24, 1, 0x2F, //VMH(VCOM High voltage ~3.2V)
davidprentice 0:b608c7f02f80 1644 0x25, 1, 0x57, //VML(VCOM Low voltage -1.2V)
davidprentice 0:b608c7f02f80 1645 //****VCOM offset**///
davidprentice 0:b608c7f02f80 1646 0x23, 1, 0x88, //for Flicker adjust //can reload from OTP
davidprentice 0:b608c7f02f80 1647 //Power on Setting
davidprentice 0:b608c7f02f80 1648 0x18, 1, 0x34, //I/P_RADJ,N/P_RADJ, Normal mode 60Hz
davidprentice 0:b608c7f02f80 1649 0x19, 1, 0x01, //OSC_EN='1', start Osc
davidprentice 0:b608c7f02f80 1650 0x01, 1, 0x00, //DP_STB='0', out deep sleep
davidprentice 0:b608c7f02f80 1651 0x1F, 1, 0x88, // GAS=1, VOMG=00, PON=0, DK=1, XDK=0, DVDH_TRI=0, STB=0
davidprentice 0:b608c7f02f80 1652 TFTLCD_DELAY8, 5,
davidprentice 0:b608c7f02f80 1653 0x1F, 1, 0x80, // GAS=1, VOMG=00, PON=0, DK=0, XDK=0, DVDH_TRI=0, STB=0
davidprentice 0:b608c7f02f80 1654 TFTLCD_DELAY8, 3,
davidprentice 0:b608c7f02f80 1655 0x1F, 1, 0x90, // GAS=1, VOMG=00, PON=1, DK=0, XDK=0, DVDH_TRI=0, STB=0
davidprentice 0:b608c7f02f80 1656 TFTLCD_DELAY8, 5,
davidprentice 0:b608c7f02f80 1657 0x1F, 1, 0xD0, // GAS=1, VOMG=10, PON=1, DK=0, XDK=0, DDVDH_TRI=0, STB=0
davidprentice 0:b608c7f02f80 1658 TFTLCD_DELAY8, 5,
davidprentice 0:b608c7f02f80 1659 //262k/65k color selection
davidprentice 0:b608c7f02f80 1660 0x17, 1, 0x05, //default 0x06 262k color // 0x05 65k color
davidprentice 0:b608c7f02f80 1661 //SET PANEL
davidprentice 0:b608c7f02f80 1662 0x36, 1, 0x00, //SS_P, GS_P,REV_P,BGR_P
davidprentice 0:b608c7f02f80 1663 //Display ON Setting
davidprentice 0:b608c7f02f80 1664 0x28, 1, 0x38, //GON=1, DTE=1, D=1000
davidprentice 0:b608c7f02f80 1665 TFTLCD_DELAY8, 40,
davidprentice 0:b608c7f02f80 1666 0x28, 1, 0x3F, //GON=1, DTE=1, D=1100
davidprentice 0:b608c7f02f80 1667
davidprentice 0:b608c7f02f80 1668 0x16, 1, 0x18,
davidprentice 0:b608c7f02f80 1669 };
davidprentice 0:b608c7f02f80 1670 init_table(HX8347G_2_regValues, sizeof(HX8347G_2_regValues));
davidprentice 0:b608c7f02f80 1671 break;
davidprentice 0:b608c7f02f80 1672 #endif
davidprentice 0:b608c7f02f80 1673
davidprentice 0:b608c7f02f80 1674 #ifdef SUPPORT_8352A
davidprentice 0:b608c7f02f80 1675 case 0x5252: //HX8352-A
davidprentice 0:b608c7f02f80 1676 _lcd_capable = MIPI_DCS_REV1 | MV_AXIS;
davidprentice 0:b608c7f02f80 1677 is8347 = 1;
davidprentice 0:b608c7f02f80 1678 static const uint8_t HX8352A_regValues[] PROGMEM = {
davidprentice 0:b608c7f02f80 1679 0x83, 1, 0x02, //Test Mode: TESTM=1
davidprentice 0:b608c7f02f80 1680 0x85, 1, 0x03, //VDD ctl : VDC_SEL=3 [05]
davidprentice 0:b608c7f02f80 1681 0x8B, 1, 0x01, //VGS_RES 1: RES_VGS1=1
davidprentice 0:b608c7f02f80 1682 0x8C, 1, 0x93, //VGS_RES 2: RES_VGS2=1, anon=0x13 [93]
davidprentice 0:b608c7f02f80 1683 0x91, 1, 0x01, //PWM control: SYNC=1
davidprentice 0:b608c7f02f80 1684 0x83, 1, 0x00, //Test Mode: TESTM=0
davidprentice 0:b608c7f02f80 1685 //Gamma Setting
davidprentice 0:b608c7f02f80 1686 0x3E, 12, 0xB0, 0x03, 0x10, 0x56, 0x13, 0x46, 0x23, 0x76, 0x00, 0x5E, 0x4F, 0x40,
davidprentice 0:b608c7f02f80 1687 //Power Voltage Setting
davidprentice 0:b608c7f02f80 1688 0x17, 1, 0x91, //OSC 1: RADJ=9, OSC_EN=1 [F0]
davidprentice 0:b608c7f02f80 1689 0x2B, 1, 0xF9, //Cycle 1: N_DC=F9 [BE]
davidprentice 0:b608c7f02f80 1690 TFTLCD_DELAY8, 10,
davidprentice 0:b608c7f02f80 1691 0x1B, 1, 0x14, //Power 3: BT=1, ??=1, AP=0 [42]
davidprentice 0:b608c7f02f80 1692 0x1A, 1, 0x11, //Power 2: VC3=1, VC1=1 [05]
davidprentice 0:b608c7f02f80 1693 0x1C, 1, 0x06, //Power 4: VRH=6 [0D]
davidprentice 0:b608c7f02f80 1694 0x1F, 1, 0x42, //VCOM : VCM=42 [55]
davidprentice 0:b608c7f02f80 1695 TFTLCD_DELAY8, 20,
davidprentice 0:b608c7f02f80 1696 0x19, 1, 0x0A, //Power 1: DK=1, VL_TR1=1 [09]
davidprentice 0:b608c7f02f80 1697 0x19, 1, 0x1A, //Power 1: PON=1, DK=1, VL_TR1=1 [09]
davidprentice 0:b608c7f02f80 1698 TFTLCD_DELAY8, 40,
davidprentice 0:b608c7f02f80 1699 0x19, 1, 0x12, //Power 1: PON=1, DK=1, STB=1 [09]
davidprentice 0:b608c7f02f80 1700 TFTLCD_DELAY8, 40,
davidprentice 0:b608c7f02f80 1701 0x1E, 1, 0x27, //Power 6: VCOMG=1, VDV=7 [10]
davidprentice 0:b608c7f02f80 1702 TFTLCD_DELAY8, 100,
davidprentice 0:b608c7f02f80 1703 //Display ON Setting
davidprentice 0:b608c7f02f80 1704 0x24, 1, 0x60, //Display 2: PT=1, GON=1 [A0]
davidprentice 0:b608c7f02f80 1705 0x3D, 1, 0x40, //Source 1: N_SAP=40 [C0]
davidprentice 0:b608c7f02f80 1706 0x34, 1, 0x38, //Cycle 10: EQS=0x38 [38]
davidprentice 0:b608c7f02f80 1707 0x35, 1, 0x38, //Cycle 11: EQP=0x38 [38]
davidprentice 0:b608c7f02f80 1708 0x24, 1, 0x38, //Display 2: GON=1 D=2 [A0]
davidprentice 0:b608c7f02f80 1709 TFTLCD_DELAY8, 40,
davidprentice 0:b608c7f02f80 1710 0x24, 1, 0x3C, //Display 2: GON=1 D=3 [A0]
davidprentice 0:b608c7f02f80 1711 0x16, 1, 0x1C, //Memaccess: GS=1, BGR=1, SS=1
davidprentice 0:b608c7f02f80 1712 0x01, 1, 0x06, //Disp Mode: INVON=1, NORON=1 [02]
davidprentice 0:b608c7f02f80 1713 0x55, 1, 0x06, //SM_PANEL=0, SS_PANEL=0, GS_PANEL=1, REV_PANEL=1, BGR_PANEL=0
davidprentice 0:b608c7f02f80 1714 };
davidprentice 0:b608c7f02f80 1715 init_table(HX8352A_regValues, sizeof(HX8352A_regValues));
davidprentice 0:b608c7f02f80 1716 p16 = (int16_t *) & HEIGHT;
davidprentice 0:b608c7f02f80 1717 *p16 = 400;
davidprentice 0:b608c7f02f80 1718 break;
davidprentice 0:b608c7f02f80 1719 #endif
davidprentice 0:b608c7f02f80 1720
davidprentice 0:b608c7f02f80 1721 #ifdef SUPPORT_8352B
davidprentice 0:b608c7f02f80 1722 case 0x0065: //HX8352-B
davidprentice 0:b608c7f02f80 1723 _lcd_capable = AUTO_READINC | MIPI_DCS_REV1 | MV_AXIS | READ_24BITS | REV_SCREEN;
davidprentice 0:b608c7f02f80 1724 is8347 = 1;
davidprentice 0:b608c7f02f80 1725 static const uint8_t HX8352B_regValues[] PROGMEM = {
davidprentice 0:b608c7f02f80 1726 // Register setting for EQ setting
davidprentice 0:b608c7f02f80 1727 0xe5, 1, 0x10, //
davidprentice 0:b608c7f02f80 1728 0xe7, 1, 0x10, //
davidprentice 0:b608c7f02f80 1729 0xe8, 1, 0x48, //
davidprentice 0:b608c7f02f80 1730 0xec, 1, 0x09, //
davidprentice 0:b608c7f02f80 1731 0xed, 1, 0x6c, //
davidprentice 0:b608c7f02f80 1732 // Power on Setting
davidprentice 0:b608c7f02f80 1733 0x23, 1, 0x6F, //VMF
davidprentice 0:b608c7f02f80 1734 0x24, 1, 0x57, //VMH
davidprentice 0:b608c7f02f80 1735 0x25, 1, 0x71, //VML
davidprentice 0:b608c7f02f80 1736 0xE2, 1, 0x18, //
davidprentice 0:b608c7f02f80 1737 0x1B, 1, 0x15, //VRH
davidprentice 0:b608c7f02f80 1738 0x01, 1, 0x00, //
davidprentice 0:b608c7f02f80 1739 0x1C, 1, 0x03, //AP=3
davidprentice 0:b608c7f02f80 1740 // Power on sequence
davidprentice 0:b608c7f02f80 1741 0x19, 1, 0x01, //OSCEN=1
davidprentice 0:b608c7f02f80 1742 TFTLCD_DELAY8, 5,
davidprentice 0:b608c7f02f80 1743 0x1F, 1, 0x8C, //GASEN=1, DK=1, XDK=1
davidprentice 0:b608c7f02f80 1744 0x1F, 1, 0x84, //GASEN=1, XDK=1
davidprentice 0:b608c7f02f80 1745 TFTLCD_DELAY8, 10,
davidprentice 0:b608c7f02f80 1746 0x1F, 1, 0x94, //GASEN=1, PON=1, XDK=1
davidprentice 0:b608c7f02f80 1747 TFTLCD_DELAY8, 10,
davidprentice 0:b608c7f02f80 1748 0x1F, 1, 0xD4, //GASEN=1, VCOMG=1, PON=1, XDK=1
davidprentice 0:b608c7f02f80 1749 TFTLCD_DELAY8, 5,
davidprentice 0:b608c7f02f80 1750 // Gamma Setting
davidprentice 0:b608c7f02f80 1751 0x40, 13, 0x00, 0x2B, 0x29, 0x3E, 0x3D, 0x3F, 0x24, 0x74, 0x08, 0x06, 0x07, 0x0D, 0x17,
davidprentice 0:b608c7f02f80 1752 0x50, 13, 0x00, 0x02, 0x01, 0x16, 0x14, 0x3F, 0x0B, 0x5B, 0x08, 0x12, 0x18, 0x19, 0x17,
davidprentice 0:b608c7f02f80 1753 0x5D, 1, 0xFF, //
davidprentice 0:b608c7f02f80 1754
davidprentice 0:b608c7f02f80 1755 0x16, 1, 0x08, //MemoryAccess BGR=1
davidprentice 0:b608c7f02f80 1756 0x28, 1, 0x20, //GON=1
davidprentice 0:b608c7f02f80 1757 TFTLCD_DELAY8, 40,
davidprentice 0:b608c7f02f80 1758 0x28, 1, 0x38, //GON=1, DTE=1, D=2
davidprentice 0:b608c7f02f80 1759 TFTLCD_DELAY8, 40,
davidprentice 0:b608c7f02f80 1760 0x28, 1, 0x3C, //GON=1, DTE=1, D=3
davidprentice 0:b608c7f02f80 1761
davidprentice 0:b608c7f02f80 1762 0x02, 2, 0x00, 0x00, //SC
davidprentice 0:b608c7f02f80 1763 0x04, 2, 0x00, 0xEF, //EC
davidprentice 0:b608c7f02f80 1764 0x06, 2, 0x00, 0x00, //SP
davidprentice 0:b608c7f02f80 1765 0x08, 2, 0x01, 0x8F, //EP
davidprentice 0:b608c7f02f80 1766
davidprentice 0:b608c7f02f80 1767 0x80, 2, 0x00, 0x00, //CAC
davidprentice 0:b608c7f02f80 1768 0x82, 2, 0x00, 0x00, //RAC
davidprentice 0:b608c7f02f80 1769 0x17, 1, 0x05, //COLMOD = 565
davidprentice 0:b608c7f02f80 1770
davidprentice 0:b608c7f02f80 1771 };
davidprentice 0:b608c7f02f80 1772 init_table(HX8352B_regValues, sizeof(HX8352B_regValues));
davidprentice 0:b608c7f02f80 1773 p16 = (int16_t *) & HEIGHT;
davidprentice 0:b608c7f02f80 1774 *p16 = 400;
davidprentice 0:b608c7f02f80 1775 break;
davidprentice 0:b608c7f02f80 1776 #endif
davidprentice 0:b608c7f02f80 1777
davidprentice 0:b608c7f02f80 1778 #ifdef SUPPORT_8347A
davidprentice 0:b608c7f02f80 1779 case 0x8347:
davidprentice 0:b608c7f02f80 1780 _lcd_capable = REV_SCREEN | MIPI_DCS_REV1 | MV_AXIS;
davidprentice 0:b608c7f02f80 1781 // AN.01 The reference setting of CMO 3.2” Panel
davidprentice 0:b608c7f02f80 1782 static const uint8_t HX8347A_CMO32_regValues[] PROGMEM = {
davidprentice 0:b608c7f02f80 1783 // VENDOR Gamma for 3.2"
davidprentice 0:b608c7f02f80 1784 (0x46), 12, 0xA4, 0x53, 0x00, 0x44, 0x04, 0x67, 0x33, 0x77, 0x12, 0x4C, 0x46, 0x44,
davidprentice 0:b608c7f02f80 1785 // Display Setting
davidprentice 0:b608c7f02f80 1786 (0x01), 1, 0x06, // IDMON=0, INVON=1, NORON=1, PTLON=0
davidprentice 0:b608c7f02f80 1787 (0x16), 1, 0x48, // MY=0, MX=0, MV=0, ML=1, BGR=0, TEON=0
davidprentice 0:b608c7f02f80 1788 (0x23), 3, 0x95, 0x95, 0xFF, // N_DC=1001 0101, PI_DC=1001 0101, I_DC=1111 1111
davidprentice 0:b608c7f02f80 1789
davidprentice 0:b608c7f02f80 1790 (0x27), 4, 0x02, 0x02, 0x02, 0x02, // N_BP=2, N_FP=2, PI_BP=2, PI_FP=2
davidprentice 0:b608c7f02f80 1791 (0x2C), 2, 0x02, 0x02, // I_BP=2, I_FP=2
davidprentice 0:b608c7f02f80 1792
davidprentice 0:b608c7f02f80 1793 (0x3a), 4, 0x01, 0x01, 0xF0, 0x00, // N_RTN=0, N_NW=1, P_RTN=0, P_NW=1, I_RTN=15, I_NW=0, DIV=0
davidprentice 0:b608c7f02f80 1794 TFTLCD_DELAY8, 5,
davidprentice 0:b608c7f02f80 1795 (0x35), 2, 0x38, 0x78, // EQS=38h, EQP=78h
davidprentice 0:b608c7f02f80 1796 (0x3E), 1, 0x38, // SON=38h
davidprentice 0:b608c7f02f80 1797 (0x40), 2, 0x0F, 0xF0, // GDON=0Fh, GDOFF
davidprentice 0:b608c7f02f80 1798 // Power Supply Setting
davidprentice 0:b608c7f02f80 1799 (0x19), 1, 0x49, // CADJ=0100, CUADJ=100, OSD_EN=1 ,60Hz
davidprentice 0:b608c7f02f80 1800 (0x93), 1, 0x0F, // RADJ=1111, 100%
davidprentice 0:b608c7f02f80 1801 TFTLCD_DELAY8, 5,
davidprentice 0:b608c7f02f80 1802 (0x20), 1, 0x40, // BT=0100
davidprentice 0:b608c7f02f80 1803 (0x1D), 3, 0x07, 0x00, 0x04, // VC1=7, VC3=0, VRH=??
davidprentice 0:b608c7f02f80 1804 //VCOM SETTING for 3.2"
davidprentice 0:b608c7f02f80 1805 (0x44), 2, 0x4D, 0x11, // VCM=100 1101, VDV=1 0001
davidprentice 0:b608c7f02f80 1806 TFTLCD_DELAY8, 10,
davidprentice 0:b608c7f02f80 1807 (0x1C), 1, 0x04, // AP=100
davidprentice 0:b608c7f02f80 1808 TFTLCD_DELAY8, 20,
davidprentice 0:b608c7f02f80 1809 (0x1B), 1, 0x18, // GASENB=0, PON=0, DK=1, XDK=0, VLCD_TRI=0, STB=0
davidprentice 0:b608c7f02f80 1810 TFTLCD_DELAY8, 40,
davidprentice 0:b608c7f02f80 1811 (0x1B), 1, 0x10, // GASENB=0, PON=1, DK=0, XDK=0, VLCD_TRI=0, STB=0
davidprentice 0:b608c7f02f80 1812 TFTLCD_DELAY8, 40,
davidprentice 0:b608c7f02f80 1813 (0x43), 1, 0x80, //set VCOMG=1
davidprentice 0:b608c7f02f80 1814 TFTLCD_DELAY8, 100,
davidprentice 0:b608c7f02f80 1815 // Display ON Setting
davidprentice 0:b608c7f02f80 1816 (0x90), 1, 0x7F, // SAP=0111 1111
davidprentice 0:b608c7f02f80 1817 (0x26), 1, 0x04, //GON=0, DTE=0, D=01
davidprentice 0:b608c7f02f80 1818 TFTLCD_DELAY8, 40,
davidprentice 0:b608c7f02f80 1819 (0x26), 1, 0x24, //GON=1, DTE=0, D=01
davidprentice 0:b608c7f02f80 1820 (0x26), 1, 0x2C, //GON=1, DTE=0, D=11
davidprentice 0:b608c7f02f80 1821 TFTLCD_DELAY8, 40,
davidprentice 0:b608c7f02f80 1822 (0x26), 1, 0x3C, //GON=1, DTE=1, D=11
davidprentice 0:b608c7f02f80 1823 // INTERNAL REGISTER SETTING
davidprentice 0:b608c7f02f80 1824 (0x57), 1, 0x02, // TEST_Mode=1: into TEST mode
davidprentice 0:b608c7f02f80 1825 (0x55), 1, 0x00, // VDC_SEL=000, VDDD=1.95V
davidprentice 0:b608c7f02f80 1826 (0xFE), 1, 0x5A, // For ESD protection
davidprentice 0:b608c7f02f80 1827 (0x57), 1, 0x00, // TEST_Mode=0: exit TEST mode
davidprentice 0:b608c7f02f80 1828 };
davidprentice 0:b608c7f02f80 1829 // AN.01 The reference setting of CMO 2.4” Panel
davidprentice 0:b608c7f02f80 1830 static const uint8_t HX8347A_CMO24_regValues[] PROGMEM = {
davidprentice 0:b608c7f02f80 1831 // VENDOR Gamma for 2.4"
davidprentice 0:b608c7f02f80 1832 (0x46), 12, 0x94, 0x41, 0x00, 0x33, 0x23, 0x45, 0x44, 0x77, 0x12, 0xCC, 0x46, 0x82,
davidprentice 0:b608c7f02f80 1833 // Display Setting
davidprentice 0:b608c7f02f80 1834 (0x01), 1, 0x06, // IDMON=0, INVON=1, NORON=1, PTLON=0
davidprentice 0:b608c7f02f80 1835 (0x16), 1, 0x48, // MY=0, MX=0, MV=0, ML=1, BGR=0, TEON=0
davidprentice 0:b608c7f02f80 1836 (0x23), 3, 0x95, 0x95, 0xFF, // N_DC=1001 0101, PI_DC=1001 0101, I_DC=1111 1111
davidprentice 0:b608c7f02f80 1837
davidprentice 0:b608c7f02f80 1838 (0x27), 4, 0x02, 0x02, 0x02, 0x02, // N_BP=2, N_FP=2, PI_BP=2, PI_FP=2
davidprentice 0:b608c7f02f80 1839 (0x2C), 2, 0x02, 0x02, // I_BP=2, I_FP=2
davidprentice 0:b608c7f02f80 1840
davidprentice 0:b608c7f02f80 1841 (0x3a), 4, 0x01, 0x01, 0xF0, 0x00, // N_RTN=0, N_NW=1, P_RTN=0, P_NW=1, I_RTN=15, I_NW=0, DIV=0
davidprentice 0:b608c7f02f80 1842 TFTLCD_DELAY8, 5,
davidprentice 0:b608c7f02f80 1843 (0x35), 2, 0x38, 0x78, // EQS=38h, EQP=78h
davidprentice 0:b608c7f02f80 1844 (0x3E), 1, 0x38, // SON=38h
davidprentice 0:b608c7f02f80 1845 (0x40), 2, 0x0F, 0xF0, // GDON=0Fh, GDOFF
davidprentice 0:b608c7f02f80 1846 // Power Supply Setting
davidprentice 0:b608c7f02f80 1847 (0x19), 1, 0x49, // CADJ=0100, CUADJ=100, OSD_EN=1 ,60Hz
davidprentice 0:b608c7f02f80 1848 (0x93), 1, 0x0F, // RADJ=1111, 100%
davidprentice 0:b608c7f02f80 1849 TFTLCD_DELAY8, 5,
davidprentice 0:b608c7f02f80 1850 (0x20), 1, 0x40, // BT=0100
davidprentice 0:b608c7f02f80 1851 (0x1D), 3, 0x07, 0x00, 0x04, // VC1=7, VC3=0, VRH=??
davidprentice 0:b608c7f02f80 1852 //VCOM SETTING for 2.4"
davidprentice 0:b608c7f02f80 1853 (0x44), 2, 0x40, 0x12, // VCM=100 0000, VDV=1 0001
davidprentice 0:b608c7f02f80 1854 TFTLCD_DELAY8, 10,
davidprentice 0:b608c7f02f80 1855 (0x1C), 1, 0x04, // AP=100
davidprentice 0:b608c7f02f80 1856 TFTLCD_DELAY8, 20,
davidprentice 0:b608c7f02f80 1857 (0x1B), 1, 0x18, // GASENB=0, PON=0, DK=1, XDK=0, VLCD_TRI=0, STB=0
davidprentice 0:b608c7f02f80 1858 TFTLCD_DELAY8, 40,
davidprentice 0:b608c7f02f80 1859 (0x1B), 1, 0x10, // GASENB=0, PON=1, DK=0, XDK=0, VLCD_TRI=0, STB=0
davidprentice 0:b608c7f02f80 1860 TFTLCD_DELAY8, 40,
davidprentice 0:b608c7f02f80 1861 (0x43), 1, 0x80, //set VCOMG=1
davidprentice 0:b608c7f02f80 1862 TFTLCD_DELAY8, 100,
davidprentice 0:b608c7f02f80 1863 // Display ON Setting
davidprentice 0:b608c7f02f80 1864 (0x90), 1, 0x7F, // SAP=0111 1111
davidprentice 0:b608c7f02f80 1865 (0x26), 1, 0x04, //GON=0, DTE=0, D=01
davidprentice 0:b608c7f02f80 1866 TFTLCD_DELAY8, 40,
davidprentice 0:b608c7f02f80 1867 (0x26), 1, 0x24, //GON=1, DTE=0, D=01
davidprentice 0:b608c7f02f80 1868 (0x26), 1, 0x2C, //GON=1, DTE=0, D=11
davidprentice 0:b608c7f02f80 1869 TFTLCD_DELAY8, 40,
davidprentice 0:b608c7f02f80 1870 (0x26), 1, 0x3C, //GON=1, DTE=1, D=11
davidprentice 0:b608c7f02f80 1871 // INTERNAL REGISTER SETTING
davidprentice 0:b608c7f02f80 1872 (0x57), 1, 0x02, // TEST_Mode=1: into TEST mode
davidprentice 0:b608c7f02f80 1873 (0x55), 1, 0x00, // VDC_SEL=000, VDDD=1.95V
davidprentice 0:b608c7f02f80 1874 (0xFE), 1, 0x5A, // For ESD protection
davidprentice 0:b608c7f02f80 1875 (0x57), 1, 0x00, // TEST_Mode=0: exit TEST mode
davidprentice 0:b608c7f02f80 1876 };
davidprentice 0:b608c7f02f80 1877 static const uint8_t HX8347A_ITDB02_regValues[] PROGMEM = {
davidprentice 0:b608c7f02f80 1878 // VENDOR Gamma ITDB02 same as CMO32. Delays are shorter than AN01
davidprentice 0:b608c7f02f80 1879 (0x46), 12, 0xA4, 0x53, 0x00, 0x44, 0x04, 0x67, 0x33, 0x77, 0x12, 0x4C, 0x46, 0x44,
davidprentice 0:b608c7f02f80 1880 // Display Setting
davidprentice 0:b608c7f02f80 1881 (0x01), 1, 0x06, // IDMON=0, INVON=1, NORON=1, PTLON=0
davidprentice 0:b608c7f02f80 1882 (0x16), 1, 0xC8, // MY=0, MX=0, MV=0, ML=1, BGR=0, TEON=0 .itead
davidprentice 0:b608c7f02f80 1883 (0x23), 3, 0x95, 0x95, 0xFF, // N_DC=1001 0101, PI_DC=1001 0101, I_DC=1111 1111
davidprentice 0:b608c7f02f80 1884
davidprentice 0:b608c7f02f80 1885 (0x27), 4, 0x02, 0x02, 0x02, 0x02, // N_BP=2, N_FP=2, PI_BP=2, PI_FP=2
davidprentice 0:b608c7f02f80 1886 (0x2C), 2, 0x02, 0x02, // I_BP=2, I_FP=2
davidprentice 0:b608c7f02f80 1887
davidprentice 0:b608c7f02f80 1888 (0x3a), 4, 0x01, 0x00, 0xF0, 0x00, // N_RTN=0, N_NW=1, P_RTN=0, ?? P_NW=1, I_RTN=15, I_NW=0, DIV=0 .itead
davidprentice 0:b608c7f02f80 1889 TFTLCD_DELAY8, 5,
davidprentice 0:b608c7f02f80 1890 (0x35), 2, 0x38, 0x78, // EQS=38h, EQP=78h
davidprentice 0:b608c7f02f80 1891 (0x3E), 1, 0x38, // SON=38h
davidprentice 0:b608c7f02f80 1892 (0x40), 2, 0x0F, 0xF0, // GDON=0Fh, GDOFF
davidprentice 0:b608c7f02f80 1893 // Power Supply Setting
davidprentice 0:b608c7f02f80 1894 (0x19), 1, 0x49, // CADJ=0100, CUADJ=100, OSD_EN=1 ,60Hz
davidprentice 0:b608c7f02f80 1895 (0x93), 1, 0x0F, // RADJ=1111, 100%
davidprentice 0:b608c7f02f80 1896 TFTLCD_DELAY8, 5,
davidprentice 0:b608c7f02f80 1897 (0x20), 1, 0x40, // BT=0100
davidprentice 0:b608c7f02f80 1898 (0x1D), 3, 0x07, 0x00, 0x04, // VC1=7, VC3=0, VRH=??
davidprentice 0:b608c7f02f80 1899 //VCOM SETTING for ITDB02
davidprentice 0:b608c7f02f80 1900 (0x44), 2, 0x4D, 0x0E, // VCM=101 0000 4D, VDV=1 0001 .itead
davidprentice 0:b608c7f02f80 1901 TFTLCD_DELAY8, 5,
davidprentice 0:b608c7f02f80 1902 (0x1C), 1, 0x04, // AP=100
davidprentice 0:b608c7f02f80 1903 TFTLCD_DELAY8, 5,
davidprentice 0:b608c7f02f80 1904 (0x1B), 1, 0x18, // GASENB=0, PON=0, DK=1, XDK=0, VLCD_TRI=0, STB=0
davidprentice 0:b608c7f02f80 1905 TFTLCD_DELAY8, 5,
davidprentice 0:b608c7f02f80 1906 (0x1B), 1, 0x10, // GASENB=0, PON=1, DK=0, XDK=0, VLCD_TRI=0, STB=0
davidprentice 0:b608c7f02f80 1907 TFTLCD_DELAY8, 5,
davidprentice 0:b608c7f02f80 1908 (0x43), 1, 0x80, //set VCOMG=1
davidprentice 0:b608c7f02f80 1909 TFTLCD_DELAY8, 5,
davidprentice 0:b608c7f02f80 1910 // Display ON Setting
davidprentice 0:b608c7f02f80 1911 (0x90), 1, 0x7F, // SAP=0111 1111
davidprentice 0:b608c7f02f80 1912 (0x26), 1, 0x04, //GON=0, DTE=0, D=01
davidprentice 0:b608c7f02f80 1913 TFTLCD_DELAY8, 5,
davidprentice 0:b608c7f02f80 1914 (0x26), 1, 0x24, //GON=1, DTE=0, D=01
davidprentice 0:b608c7f02f80 1915 (0x26), 1, 0x2C, //GON=1, DTE=0, D=11
davidprentice 0:b608c7f02f80 1916 TFTLCD_DELAY8, 5,
davidprentice 0:b608c7f02f80 1917 (0x26), 1, 0x3C, //GON=1, DTE=1, D=11
davidprentice 0:b608c7f02f80 1918 // INTERNAL REGISTER SETTING for ITDB02
davidprentice 0:b608c7f02f80 1919 (0x57), 1, 0x02, // TEST_Mode=1: into TEST mode
davidprentice 0:b608c7f02f80 1920 (0x95), 1, 0x01, // SET DISPLAY CLOCK AND PUMPING CLOCK TO SYNCHRONIZE .itead
davidprentice 0:b608c7f02f80 1921 (0x57), 1, 0x00, // TEST_Mode=0: exit TEST mode
davidprentice 0:b608c7f02f80 1922 };
davidprentice 0:b608c7f02f80 1923 static const uint8_t HX8347A_NHD_regValues[] PROGMEM = {
davidprentice 0:b608c7f02f80 1924 //Gamma Setting NHD
davidprentice 0:b608c7f02f80 1925 (0x46), 12, 0x94, 0x41, 0x00, 0x33, 0x23, 0x45, 0x44, 0x77, 0x12, 0xCC, 0x46, 0x82,
davidprentice 0:b608c7f02f80 1926 (0x01), 1, 0x06, //Display Mode [06]
davidprentice 0:b608c7f02f80 1927 (0x16), 1, 0xC8, //MADCTL [00] MY=1, MX=1, BGR=1
davidprentice 0:b608c7f02f80 1928 // (0x70), 1, 0x05, //Panel [06] 16-bit
davidprentice 0:b608c7f02f80 1929 (0x23), 3, 0x95, 0x95, 0xFF, //Cycle Control 1-3 [95 95 FF]
davidprentice 0:b608c7f02f80 1930 (0x27), 4, 0x02, 0x02, 0x02, 0x02, //Display Control 2-5 [02 02 02 02]
davidprentice 0:b608c7f02f80 1931 (0x2C), 2, 0x02, 0x02, //Display Control 6-7 [02 02]
davidprentice 0:b608c7f02f80 1932 (0x3A), 4, 0x01, 0x01, 0xF0, 0x00, //Cycle Control 1-4 [01 01 F0 00]
davidprentice 0:b608c7f02f80 1933 TFTLCD_DELAY8, 80,
davidprentice 0:b608c7f02f80 1934 (0x35), 2, 0x38, 0x78, //Display Control 9-10 [09 09] EQS=56, EQP=120
davidprentice 0:b608c7f02f80 1935 (0x3E), 1, 0x38, //Cycle Control 5 [38]
davidprentice 0:b608c7f02f80 1936 (0x40), 1, 0x0F, //Cycle Control 6 [03] GDON=15
davidprentice 0:b608c7f02f80 1937 (0x41), 1, 0xF0, //Cycle Control 14 [F8] GDOF=248
davidprentice 0:b608c7f02f80 1938
davidprentice 0:b608c7f02f80 1939 (0x19), 1, 0x2D, //OSC Control 1 [86] CADJ=2, CUADJ=6, OSCEN=1
davidprentice 0:b608c7f02f80 1940 (0x93), 1, 0x06, //SAP Idle mode [00] ??? .nhd
davidprentice 0:b608c7f02f80 1941 TFTLCD_DELAY8, 80,
davidprentice 0:b608c7f02f80 1942 (0x20), 1, 0x40, //Power Control 6 [40]
davidprentice 0:b608c7f02f80 1943 (0x1D), 3, 0x07, 0x00, 0x04, //Power Control 3-5 [04 00 06] VC=7
davidprentice 0:b608c7f02f80 1944 (0x44), 2, 0x3C, 0x12, //VCOM Control 2-3 [5A 11] VCM=60, VDV=18
davidprentice 0:b608c7f02f80 1945 TFTLCD_DELAY8, 80,
davidprentice 0:b608c7f02f80 1946 (0x1C), 1, 0x04, //Power Control 2 [04]
davidprentice 0:b608c7f02f80 1947 TFTLCD_DELAY8, 80,
davidprentice 0:b608c7f02f80 1948 (0x43), 1, 0x80, //VCOM Control 1 [80]
davidprentice 0:b608c7f02f80 1949 TFTLCD_DELAY8, 80,
davidprentice 0:b608c7f02f80 1950 (0x1B), 1, 0x08, //Power Control 1 [00] DK=1
davidprentice 0:b608c7f02f80 1951 TFTLCD_DELAY8, 80,
davidprentice 0:b608c7f02f80 1952 (0x1B), 1, 0x10, //Power Control 1 [00] PON=1
davidprentice 0:b608c7f02f80 1953 TFTLCD_DELAY8, 80,
davidprentice 0:b608c7f02f80 1954 (0x90), 1, 0x7F, //Display Control 8 [0A]
davidprentice 0:b608c7f02f80 1955 (0x26), 1, 0x04, //Display Control 1 [A0] D=1
davidprentice 0:b608c7f02f80 1956 TFTLCD_DELAY8, 80,
davidprentice 0:b608c7f02f80 1957 (0x26), 1, 0x24, //Display Control 1 [A0] GON=1, D=1
davidprentice 0:b608c7f02f80 1958 (0x26), 1, 0x2C, //Display Control 1 [A0] GON=1, D=3
davidprentice 0:b608c7f02f80 1959 TFTLCD_DELAY8, 80,
davidprentice 0:b608c7f02f80 1960 (0x26), 1, 0x3C, //Display Control 1 [A0] GON=1, DTE=1, D=3
davidprentice 0:b608c7f02f80 1961 (0x57), 1, 0x02, //?
davidprentice 0:b608c7f02f80 1962 (0x55), 1, 0x00, //?
davidprentice 0:b608c7f02f80 1963 (0x57), 1, 0x00, //?
davidprentice 0:b608c7f02f80 1964 };
davidprentice 0:b608c7f02f80 1965 // Atmel ASF code uses VCOM2-3: 0x38, 0x12. 50ms delays and no TEST mode changes.
davidprentice 0:b608c7f02f80 1966 init_table(HX8347A_NHD_regValues, sizeof(HX8347A_NHD_regValues));
davidprentice 0:b608c7f02f80 1967 // init_table(HX8347A_CMO32_regValues, sizeof(HX8347A_CMO32_regValues));
davidprentice 0:b608c7f02f80 1968 // init_table(HX8347A_CMO24_regValues, sizeof(HX8347A_CMO24_regValues));
davidprentice 0:b608c7f02f80 1969 // init_table(HX8347A_ITDB02_regValues, sizeof(HX8347A_ITDB02_regValues));
davidprentice 0:b608c7f02f80 1970 // init_table(HX8347G_2_regValues, sizeof(HX8347G_2_regValues));
davidprentice 0:b608c7f02f80 1971 break;
davidprentice 0:b608c7f02f80 1972 #endif
davidprentice 0:b608c7f02f80 1973
davidprentice 0:b608c7f02f80 1974 case 0x8357: //BIG CHANGE: HX8357-B is now 0x8357
davidprentice 0:b608c7f02f80 1975 _lcd_capable = AUTO_READINC | MIPI_DCS_REV1 | MV_AXIS | REV_SCREEN;
davidprentice 0:b608c7f02f80 1976 goto common_8357;
davidprentice 0:b608c7f02f80 1977 case 0x9090: //BIG CHANGE: HX8357-D was 0x8357
davidprentice 0:b608c7f02f80 1978 _lcd_capable = AUTO_READINC | MIPI_DCS_REV1 | MV_AXIS | REV_SCREEN | READ_24BITS;
davidprentice 0:b608c7f02f80 1979 common_8357:
davidprentice 0:b608c7f02f80 1980 static const uint8_t HX8357C_regValues[] PROGMEM = {
davidprentice 0:b608c7f02f80 1981 TFTLCD_DELAY8, 1, //dummy table
davidprentice 0:b608c7f02f80 1982 };
davidprentice 0:b608c7f02f80 1983 table8_ads = HX8357C_regValues, table_size = sizeof(HX8357C_regValues);
davidprentice 0:b608c7f02f80 1984 p16 = (int16_t *) & HEIGHT;
davidprentice 0:b608c7f02f80 1985 *p16 = 480;
davidprentice 0:b608c7f02f80 1986 p16 = (int16_t *) & WIDTH;
davidprentice 0:b608c7f02f80 1987 *p16 = 320;
davidprentice 0:b608c7f02f80 1988 break;
davidprentice 0:b608c7f02f80 1989
davidprentice 0:b608c7f02f80 1990 case 0x0099: //HX8357-D matches datasheet
davidprentice 0:b608c7f02f80 1991 _lcd_capable = AUTO_READINC | MIPI_DCS_REV1 | MV_AXIS | REV_SCREEN | READ_24BITS;
davidprentice 0:b608c7f02f80 1992 static const uint8_t HX8357_99_regValues[] PROGMEM = {
davidprentice 0:b608c7f02f80 1993 (0xB9), 3, 0xFF, 0x83, 0x57, // SETEXTC
davidprentice 0:b608c7f02f80 1994 TFTLCD_DELAY8, 150,
davidprentice 0:b608c7f02f80 1995 TFTLCD_DELAY8, 150,
davidprentice 0:b608c7f02f80 1996 (0xB6), 1, 0x25, // SETCOM [4B 00] -2.5V+37*0.02V=-1.76V [-1.00V]
davidprentice 0:b608c7f02f80 1997 (0xC0), 6, 0x50, 0x50, 0x01, 0x3C, 0x1E, 0x08, // SETSTBA [73 50 00 3C C4 08]
davidprentice 0:b608c7f02f80 1998 (0xB4), 7, 0x02, 0x40, 0x00, 0x2A, 0x2A, 0x0D, 0x78, // SETCYC [02 40 00 2A 2A 0D 96]
davidprentice 0:b608c7f02f80 1999 #ifdef SUPPORT_8357D_GAMMA
davidprentice 0:b608c7f02f80 2000 // HX8357D_SETGAMMA [0B 0C 11 1D 25 37 43 4B 4E 47 41 39 35 31 2E 21 1C 1D 1D 26 31 44 4E 56 44 3F 39 33 31 2E 28 1D E0 01]
davidprentice 0:b608c7f02f80 2001 (0xE0),34, 0x02, 0x0A, 0x11, 0x1D, 0x23, 0x35, 0x41, 0x4B, 0x4B, 0x42, 0x3A, 0x27, 0x1B, 0x08, 0x09, 0x03, 0x02, 0x0A, 0x11, 0x1D, 0x23, 0x35, 0x41, 0x4B, 0x4B, 0x42, 0x3A, 0x27, 0x1B, 0x08, 0x09, 0x03, 0x00, 0x01,
davidprentice 0:b608c7f02f80 2002 #endif
davidprentice 0:b608c7f02f80 2003 };
davidprentice 0:b608c7f02f80 2004 table8_ads = HX8357_99_regValues, table_size = sizeof(HX8357_99_regValues);
davidprentice 0:b608c7f02f80 2005 p16 = (int16_t *) & HEIGHT;
davidprentice 0:b608c7f02f80 2006 *p16 = 480;
davidprentice 0:b608c7f02f80 2007 p16 = (int16_t *) & WIDTH;
davidprentice 0:b608c7f02f80 2008 *p16 = 320;
davidprentice 0:b608c7f02f80 2009 break;
davidprentice 0:b608c7f02f80 2010
davidprentice 0:b608c7f02f80 2011 #ifdef SUPPORT_8230
davidprentice 0:b608c7f02f80 2012 case 0x8230: //thanks Auzman
davidprentice 0:b608c7f02f80 2013 _lcd_capable = 0 | REV_SCREEN | INVERT_GS | INVERT_RGB | READ_BGR;
davidprentice 0:b608c7f02f80 2014 static const uint16_t UC8230_regValues[] PROGMEM = {
davidprentice 0:b608c7f02f80 2015 //After pin Reset wait at least 100ms
davidprentice 0:b608c7f02f80 2016 TFTLCD_DELAY, 100, //at least 100ms
davidprentice 0:b608c7f02f80 2017 0x0046, 0x0002, //MTP Disable
davidprentice 0:b608c7f02f80 2018 0x0010, 0x1590, //SAP=1, BT=5, APE=1, AP=1
davidprentice 0:b608c7f02f80 2019 0x0011, 0x0227, //DC1=2, DC0=2, VC=7
davidprentice 0:b608c7f02f80 2020 0x0012, 0x80ff, //P5VMD=1, PON=7, VRH=15
davidprentice 0:b608c7f02f80 2021 0x0013, 0x9c31, //VDV=28, VCM=49
davidprentice 0:b608c7f02f80 2022 TFTLCD_DELAY, 10, //at least 10ms
davidprentice 0:b608c7f02f80 2023 0x0002, 0x0300, //set N-line = 1
davidprentice 0:b608c7f02f80 2024 0x0003, 0x1030, //set GRAM writing direction & BGR=1
davidprentice 0:b608c7f02f80 2025 0x0060, 0xa700, //GS; gate scan: start position & drive line Q'ty
davidprentice 0:b608c7f02f80 2026 0x0061, 0x0001, //REV, NDL, VLE
davidprentice 0:b608c7f02f80 2027 /*--------------------Gamma control------------------------*/
davidprentice 0:b608c7f02f80 2028 0x0030, 0x0303,
davidprentice 0:b608c7f02f80 2029 0x0031, 0x0303,
davidprentice 0:b608c7f02f80 2030 0x0032, 0x0303,
davidprentice 0:b608c7f02f80 2031 0x0033, 0x0300,
davidprentice 0:b608c7f02f80 2032 0x0034, 0x0003,
davidprentice 0:b608c7f02f80 2033 0x0035, 0x0303,
davidprentice 0:b608c7f02f80 2034 0x0036, 0x1400,
davidprentice 0:b608c7f02f80 2035 0x0037, 0x0303,
davidprentice 0:b608c7f02f80 2036 0x0038, 0x0303,
davidprentice 0:b608c7f02f80 2037 0x0039, 0x0303,
davidprentice 0:b608c7f02f80 2038 0x003a, 0x0300,
davidprentice 0:b608c7f02f80 2039 0x003b, 0x0003,
davidprentice 0:b608c7f02f80 2040 0x003c, 0x0303,
davidprentice 0:b608c7f02f80 2041 0x003d, 0x1400,
davidprentice 0:b608c7f02f80 2042 //-----------------------------------------------------------//
davidprentice 0:b608c7f02f80 2043 0x0020, 0x0000, //GRAM horizontal address
davidprentice 0:b608c7f02f80 2044 0x0021, 0x0000, //GRAM vertical address
davidprentice 0:b608c7f02f80 2045 //************** Partial Display control*********************//
davidprentice 0:b608c7f02f80 2046 0x0080, 0x0000,
davidprentice 0:b608c7f02f80 2047 0x0081, 0x0000,
davidprentice 0:b608c7f02f80 2048 0x0082, 0x0000,
davidprentice 0:b608c7f02f80 2049 0x0083, 0x0000,
davidprentice 0:b608c7f02f80 2050 0x0084, 0x0000,
davidprentice 0:b608c7f02f80 2051 0x0085, 0x0000,
davidprentice 0:b608c7f02f80 2052 //-----------------------------------------------------------//
davidprentice 0:b608c7f02f80 2053 0x0092, 0x0200,
davidprentice 0:b608c7f02f80 2054 0x0093, 0x0303,
davidprentice 0:b608c7f02f80 2055 0x0090, 0x0010, //set clocks/Line
davidprentice 0:b608c7f02f80 2056 0x0000, 0x0001,
davidprentice 0:b608c7f02f80 2057 TFTLCD_DELAY, 200, // Delay 200 ms
davidprentice 0:b608c7f02f80 2058 0x0007, 0x0173, //Display on setting
davidprentice 0:b608c7f02f80 2059 };
davidprentice 0:b608c7f02f80 2060 init_table16(UC8230_regValues, sizeof(UC8230_regValues));
davidprentice 0:b608c7f02f80 2061 break;
davidprentice 0:b608c7f02f80 2062 #endif
davidprentice 0:b608c7f02f80 2063
davidprentice 0:b608c7f02f80 2064 #ifdef SUPPORT_9163
davidprentice 0:b608c7f02f80 2065 case 0x9163: //
davidprentice 0:b608c7f02f80 2066 _lcd_capable = AUTO_READINC | MIPI_DCS_REV1 | MV_AXIS | READ_24BITS;
davidprentice 0:b608c7f02f80 2067 static const uint8_t PROGMEM table9163C[] = {
davidprentice 0:b608c7f02f80 2068 // (COMMAND_BYTE), n, data_bytes....
davidprentice 0:b608c7f02f80 2069 0x26, 1, 0x02, // [01] GAMMASET use CURVE=1, 2, 4, 8
davidprentice 0:b608c7f02f80 2070 0xB1, 2, 0x08, 0x02, // [0E 14] FRMCTR1 if GM==011 61.7Hz
davidprentice 0:b608c7f02f80 2071 0xB4, 1, 0x07, // [02] INVCTR
davidprentice 0:b608c7f02f80 2072 0xB8, 1, 0x01, // [00] GSCTRL
davidprentice 0:b608c7f02f80 2073 0xC0, 2, 0x0A, 0x02, // [0A 05] PWCTR1 if LCM==10
davidprentice 0:b608c7f02f80 2074 0xC1, 1, 0x02, // [07] PWCTR2
davidprentice 0:b608c7f02f80 2075 0xC5, 2, 0x50, 0x63, // [43 4D] VMCTR1
davidprentice 0:b608c7f02f80 2076 0xC7, 1, 0, // [40] VCOMOFFS
davidprentice 0:b608c7f02f80 2077 };
davidprentice 0:b608c7f02f80 2078 table8_ads = table9163C, table_size = sizeof(table9163C); //
davidprentice 0:b608c7f02f80 2079 p16 = (int16_t *) & HEIGHT;
davidprentice 0:b608c7f02f80 2080 *p16 = 160;
davidprentice 0:b608c7f02f80 2081 p16 = (int16_t *) & WIDTH;
davidprentice 0:b608c7f02f80 2082 *p16 = 128;
davidprentice 0:b608c7f02f80 2083 break;
davidprentice 0:b608c7f02f80 2084 #endif
davidprentice 0:b608c7f02f80 2085
davidprentice 0:b608c7f02f80 2086 #ifdef SUPPORT_9225
davidprentice 0:b608c7f02f80 2087 #define ILI9225_DRIVER_OUTPUT_CTRL (0x01u) // Driver Output Control
davidprentice 0:b608c7f02f80 2088 #define ILI9225_LCD_AC_DRIVING_CTRL (0x02u) // LCD AC Driving Control
davidprentice 0:b608c7f02f80 2089 #define ILI9225_ENTRY_MODE (0x03u) // Entry Mode
davidprentice 0:b608c7f02f80 2090 #define ILI9225_DISP_CTRL1 (0x07u) // Display Control 1
davidprentice 0:b608c7f02f80 2091 #define ILI9225_BLANK_PERIOD_CTRL1 (0x08u) // Blank Period Control
davidprentice 0:b608c7f02f80 2092 #define ILI9225_FRAME_CYCLE_CTRL (0x0Bu) // Frame Cycle Control
davidprentice 0:b608c7f02f80 2093 #define ILI9225_INTERFACE_CTRL (0x0Cu) // Interface Control
davidprentice 0:b608c7f02f80 2094 #define ILI9225_OSC_CTRL (0x0Fu) // Osc Control
davidprentice 0:b608c7f02f80 2095 #define ILI9225_POWER_CTRL1 (0x10u) // Power Control 1
davidprentice 0:b608c7f02f80 2096 #define ILI9225_POWER_CTRL2 (0x11u) // Power Control 2
davidprentice 0:b608c7f02f80 2097 #define ILI9225_POWER_CTRL3 (0x12u) // Power Control 3
davidprentice 0:b608c7f02f80 2098 #define ILI9225_POWER_CTRL4 (0x13u) // Power Control 4
davidprentice 0:b608c7f02f80 2099 #define ILI9225_POWER_CTRL5 (0x14u) // Power Control 5
davidprentice 0:b608c7f02f80 2100 #define ILI9225_VCI_RECYCLING (0x15u) // VCI Recycling
davidprentice 0:b608c7f02f80 2101 #define ILI9225_RAM_ADDR_SET1 (0x20u) // Horizontal GRAM Address Set
davidprentice 0:b608c7f02f80 2102 #define ILI9225_RAM_ADDR_SET2 (0x21u) // Vertical GRAM Address Set
davidprentice 0:b608c7f02f80 2103 #define ILI9225_GRAM_DATA_REG (0x22u) // GRAM Data Register
davidprentice 0:b608c7f02f80 2104 #define ILI9225_GATE_SCAN_CTRL (0x30u) // Gate Scan Control Register
davidprentice 0:b608c7f02f80 2105 #define ILI9225_VERTICAL_SCROLL_CTRL1 (0x31u) // Vertical Scroll Control 1 Register
davidprentice 0:b608c7f02f80 2106 #define ILI9225_VERTICAL_SCROLL_CTRL2 (0x32u) // Vertical Scroll Control 2 Register
davidprentice 0:b608c7f02f80 2107 #define ILI9225_VERTICAL_SCROLL_CTRL3 (0x33u) // Vertical Scroll Control 3 Register
davidprentice 0:b608c7f02f80 2108 #define ILI9225_PARTIAL_DRIVING_POS1 (0x34u) // Partial Driving Position 1 Register
davidprentice 0:b608c7f02f80 2109 #define ILI9225_PARTIAL_DRIVING_POS2 (0x35u) // Partial Driving Position 2 Register
davidprentice 0:b608c7f02f80 2110 #define ILI9225_HORIZONTAL_WINDOW_ADDR1 (0x36u) // Horizontal Address END Position HEA
davidprentice 0:b608c7f02f80 2111 #define ILI9225_HORIZONTAL_WINDOW_ADDR2 (0x37u) // Horizontal Address START Position HSA
davidprentice 0:b608c7f02f80 2112 #define ILI9225_VERTICAL_WINDOW_ADDR1 (0x38u) // Vertical Address END Position VEA
davidprentice 0:b608c7f02f80 2113 #define ILI9225_VERTICAL_WINDOW_ADDR2 (0x39u) // Vertical Address START Position VSA
davidprentice 0:b608c7f02f80 2114 #define ILI9225_GAMMA_CTRL1 (0x50u) // Gamma Control 1
davidprentice 0:b608c7f02f80 2115 #define ILI9225_GAMMA_CTRL2 (0x51u) // Gamma Control 2
davidprentice 0:b608c7f02f80 2116 #define ILI9225_GAMMA_CTRL3 (0x52u) // Gamma Control 3
davidprentice 0:b608c7f02f80 2117 #define ILI9225_GAMMA_CTRL4 (0x53u) // Gamma Control 4
davidprentice 0:b608c7f02f80 2118 #define ILI9225_GAMMA_CTRL5 (0x54u) // Gamma Control 5
davidprentice 0:b608c7f02f80 2119 #define ILI9225_GAMMA_CTRL6 (0x55u) // Gamma Control 6
davidprentice 0:b608c7f02f80 2120 #define ILI9225_GAMMA_CTRL7 (0x56u) // Gamma Control 7
davidprentice 0:b608c7f02f80 2121 #define ILI9225_GAMMA_CTRL8 (0x57u) // Gamma Control 8
davidprentice 0:b608c7f02f80 2122 #define ILI9225_GAMMA_CTRL9 (0x58u) // Gamma Control 9
davidprentice 0:b608c7f02f80 2123 #define ILI9225_GAMMA_CTRL10 (0x59u) // Gamma Control 10
davidprentice 0:b608c7f02f80 2124
davidprentice 0:b608c7f02f80 2125 #define ILI9225C_INVOFF 0x20
davidprentice 0:b608c7f02f80 2126 #define ILI9225C_INVON 0x21
davidprentice 0:b608c7f02f80 2127
davidprentice 0:b608c7f02f80 2128 case 0x6813:
davidprentice 0:b608c7f02f80 2129 case 0x9226:
davidprentice 0:b608c7f02f80 2130 _lcd_ID = 0x9225; //fall through
davidprentice 0:b608c7f02f80 2131 case 0x9225:
davidprentice 0:b608c7f02f80 2132 _lcd_capable = REV_SCREEN | READ_BGR; //thanks tongbajiel
davidprentice 0:b608c7f02f80 2133 static const uint16_t ILI9225_regValues[] PROGMEM = {
davidprentice 0:b608c7f02f80 2134 /* Start Initial Sequence */
davidprentice 0:b608c7f02f80 2135 /* Set SS bit and direction output from S528 to S1 */
davidprentice 0:b608c7f02f80 2136 ILI9225_POWER_CTRL1, 0x0000, // Set SAP,DSTB,STB
davidprentice 0:b608c7f02f80 2137 ILI9225_POWER_CTRL2, 0x0000, // Set APON,PON,AON,VCI1EN,VC
davidprentice 0:b608c7f02f80 2138 ILI9225_POWER_CTRL3, 0x0000, // Set BT,DC1,DC2,DC3
davidprentice 0:b608c7f02f80 2139 ILI9225_POWER_CTRL4, 0x0000, // Set GVDD
davidprentice 0:b608c7f02f80 2140 ILI9225_POWER_CTRL5, 0x0000, // Set VCOMH/VCOML voltage
davidprentice 0:b608c7f02f80 2141 TFTLCD_DELAY, 40,
davidprentice 0:b608c7f02f80 2142
davidprentice 0:b608c7f02f80 2143 // Power-on sequence
davidprentice 0:b608c7f02f80 2144 ILI9225_POWER_CTRL2, 0x0018, // Set APON,PON,AON,VCI1EN,VC
davidprentice 0:b608c7f02f80 2145 ILI9225_POWER_CTRL3, 0x6121, // Set BT,DC1,DC2,DC3
davidprentice 0:b608c7f02f80 2146 ILI9225_POWER_CTRL4, 0x006F, // Set GVDD /*007F 0088 */
davidprentice 0:b608c7f02f80 2147 ILI9225_POWER_CTRL5, 0x495F, // Set VCOMH/VCOML voltage
davidprentice 0:b608c7f02f80 2148 ILI9225_POWER_CTRL1, 0x0800, // Set SAP,DSTB,STB
davidprentice 0:b608c7f02f80 2149 TFTLCD_DELAY, 10,
davidprentice 0:b608c7f02f80 2150 ILI9225_POWER_CTRL2, 0x103B, // Set APON,PON,AON,VCI1EN,VC
davidprentice 0:b608c7f02f80 2151 TFTLCD_DELAY, 50,
davidprentice 0:b608c7f02f80 2152
davidprentice 0:b608c7f02f80 2153 ILI9225_DRIVER_OUTPUT_CTRL, 0x011C, // set the display line number and display direction
davidprentice 0:b608c7f02f80 2154 ILI9225_LCD_AC_DRIVING_CTRL, 0x0100, // set 1 line inversion
davidprentice 0:b608c7f02f80 2155 ILI9225_ENTRY_MODE, 0x1030, // set GRAM write direction and BGR=1.
davidprentice 0:b608c7f02f80 2156 ILI9225_DISP_CTRL1, 0x0000, // Display off
davidprentice 0:b608c7f02f80 2157 ILI9225_BLANK_PERIOD_CTRL1, 0x0808, // set the back porch and front porch
davidprentice 0:b608c7f02f80 2158 ILI9225_FRAME_CYCLE_CTRL, 0x1100, // set the clocks number per line
davidprentice 0:b608c7f02f80 2159 ILI9225_INTERFACE_CTRL, 0x0000, // CPU interface
davidprentice 0:b608c7f02f80 2160 ILI9225_OSC_CTRL, 0x0D01, // Set Osc /*0e01*/
davidprentice 0:b608c7f02f80 2161 ILI9225_VCI_RECYCLING, 0x0020, // Set VCI recycling
davidprentice 0:b608c7f02f80 2162 ILI9225_RAM_ADDR_SET1, 0x0000, // RAM Address
davidprentice 0:b608c7f02f80 2163 ILI9225_RAM_ADDR_SET2, 0x0000, // RAM Address
davidprentice 0:b608c7f02f80 2164
davidprentice 0:b608c7f02f80 2165 /* Set GRAM area */
davidprentice 0:b608c7f02f80 2166 ILI9225_GATE_SCAN_CTRL, 0x0000,
davidprentice 0:b608c7f02f80 2167 ILI9225_VERTICAL_SCROLL_CTRL1, 0x00DB,
davidprentice 0:b608c7f02f80 2168 ILI9225_VERTICAL_SCROLL_CTRL2, 0x0000,
davidprentice 0:b608c7f02f80 2169 ILI9225_VERTICAL_SCROLL_CTRL3, 0x0000,
davidprentice 0:b608c7f02f80 2170 ILI9225_PARTIAL_DRIVING_POS1, 0x00DB,
davidprentice 0:b608c7f02f80 2171 ILI9225_PARTIAL_DRIVING_POS2, 0x0000,
davidprentice 0:b608c7f02f80 2172 ILI9225_HORIZONTAL_WINDOW_ADDR1, 0x00AF,
davidprentice 0:b608c7f02f80 2173 ILI9225_HORIZONTAL_WINDOW_ADDR2, 0x0000,
davidprentice 0:b608c7f02f80 2174 ILI9225_VERTICAL_WINDOW_ADDR1, 0x00DB,
davidprentice 0:b608c7f02f80 2175 ILI9225_VERTICAL_WINDOW_ADDR2, 0x0000,
davidprentice 0:b608c7f02f80 2176
davidprentice 0:b608c7f02f80 2177 /* Set GAMMA curve */
davidprentice 0:b608c7f02f80 2178 ILI9225_GAMMA_CTRL1, 0x0000,
davidprentice 0:b608c7f02f80 2179 ILI9225_GAMMA_CTRL2, 0x0808,
davidprentice 0:b608c7f02f80 2180 ILI9225_GAMMA_CTRL3, 0x080A,
davidprentice 0:b608c7f02f80 2181 ILI9225_GAMMA_CTRL4, 0x000A,
davidprentice 0:b608c7f02f80 2182 ILI9225_GAMMA_CTRL5, 0x0A08,
davidprentice 0:b608c7f02f80 2183 ILI9225_GAMMA_CTRL6, 0x0808,
davidprentice 0:b608c7f02f80 2184 ILI9225_GAMMA_CTRL7, 0x0000,
davidprentice 0:b608c7f02f80 2185 ILI9225_GAMMA_CTRL8, 0x0A00,
davidprentice 0:b608c7f02f80 2186 ILI9225_GAMMA_CTRL9, 0x0710,
davidprentice 0:b608c7f02f80 2187 ILI9225_GAMMA_CTRL10, 0x0710,
davidprentice 0:b608c7f02f80 2188
davidprentice 0:b608c7f02f80 2189 ILI9225_DISP_CTRL1, 0x0012,
davidprentice 0:b608c7f02f80 2190 TFTLCD_DELAY, 50,
davidprentice 0:b608c7f02f80 2191 ILI9225_DISP_CTRL1, 0x1017,
davidprentice 0:b608c7f02f80 2192 };
davidprentice 0:b608c7f02f80 2193 init_table16(ILI9225_regValues, sizeof(ILI9225_regValues));
davidprentice 0:b608c7f02f80 2194 p16 = (int16_t *) & HEIGHT;
davidprentice 0:b608c7f02f80 2195 *p16 = 220;
davidprentice 0:b608c7f02f80 2196 p16 = (int16_t *) & WIDTH;
davidprentice 0:b608c7f02f80 2197 *p16 = 176;
davidprentice 0:b608c7f02f80 2198 break;
davidprentice 0:b608c7f02f80 2199 #endif
davidprentice 0:b608c7f02f80 2200
davidprentice 0:b608c7f02f80 2201 case 0x0001:
davidprentice 0:b608c7f02f80 2202 _lcd_capable = 0 | REV_SCREEN | INVERT_GS; //no RGB bug. thanks Ivo_Deshev
davidprentice 0:b608c7f02f80 2203 goto common_9320;
davidprentice 0:b608c7f02f80 2204 case 0x5408:
davidprentice 0:b608c7f02f80 2205 _lcd_capable = 0 | REV_SCREEN | READ_BGR; //Red 2.4" thanks jorgenv, Ardlab_Gent
davidprentice 0:b608c7f02f80 2206 // _lcd_capable = 0 | REV_SCREEN | READ_BGR | INVERT_GS; //Blue 2.8" might be different
davidprentice 0:b608c7f02f80 2207 goto common_9320;
davidprentice 0:b608c7f02f80 2208 case 0x1505: //R61505 thanks Ravi_kanchan2004. R61505V, R61505W different
davidprentice 0:b608c7f02f80 2209 case 0x9320:
davidprentice 0:b608c7f02f80 2210 _lcd_capable = 0 | REV_SCREEN | READ_BGR;
davidprentice 0:b608c7f02f80 2211 common_9320:
davidprentice 0:b608c7f02f80 2212 static const uint16_t ILI9320_regValues[] PROGMEM = {
davidprentice 0:b608c7f02f80 2213 0x00e5, 0x8000,
davidprentice 0:b608c7f02f80 2214 0x0000, 0x0001,
davidprentice 0:b608c7f02f80 2215 0x0001, 0x100,
davidprentice 0:b608c7f02f80 2216 0x0002, 0x0700,
davidprentice 0:b608c7f02f80 2217 0x0003, 0x1030,
davidprentice 0:b608c7f02f80 2218 0x0004, 0x0000,
davidprentice 0:b608c7f02f80 2219 0x0008, 0x0202,
davidprentice 0:b608c7f02f80 2220 0x0009, 0x0000,
davidprentice 0:b608c7f02f80 2221 0x000A, 0x0000,
davidprentice 0:b608c7f02f80 2222 0x000C, 0x0000,
davidprentice 0:b608c7f02f80 2223 0x000D, 0x0000,
davidprentice 0:b608c7f02f80 2224 0x000F, 0x0000,
davidprentice 0:b608c7f02f80 2225 //-----Power On sequence-----------------------
davidprentice 0:b608c7f02f80 2226 0x0010, 0x0000,
davidprentice 0:b608c7f02f80 2227 0x0011, 0x0007,
davidprentice 0:b608c7f02f80 2228 0x0012, 0x0000,
davidprentice 0:b608c7f02f80 2229 0x0013, 0x0000,
davidprentice 0:b608c7f02f80 2230 TFTLCD_DELAY, 50,
davidprentice 0:b608c7f02f80 2231 0x0010, 0x17B0, //SAP=1, BT=7, APE=1, AP=3
davidprentice 0:b608c7f02f80 2232 0x0011, 0x0007, //DC1=0, DC0=0, VC=7
davidprentice 0:b608c7f02f80 2233 TFTLCD_DELAY, 10,
davidprentice 0:b608c7f02f80 2234 0x0012, 0x013A, //VCMR=1, PON=3, VRH=10
davidprentice 0:b608c7f02f80 2235 TFTLCD_DELAY, 10,
davidprentice 0:b608c7f02f80 2236 0x0013, 0x1A00, //VDV=26
davidprentice 0:b608c7f02f80 2237 0x0029, 0x000c, //VCM=12
davidprentice 0:b608c7f02f80 2238 TFTLCD_DELAY, 10,
davidprentice 0:b608c7f02f80 2239 //-----Gamma control-----------------------
davidprentice 0:b608c7f02f80 2240 0x0030, 0x0000,
davidprentice 0:b608c7f02f80 2241 0x0031, 0x0505,
davidprentice 0:b608c7f02f80 2242 0x0032, 0x0004,
davidprentice 0:b608c7f02f80 2243 0x0035, 0x0006,
davidprentice 0:b608c7f02f80 2244 0x0036, 0x0707,
davidprentice 0:b608c7f02f80 2245 0x0037, 0x0105,
davidprentice 0:b608c7f02f80 2246 0x0038, 0x0002,
davidprentice 0:b608c7f02f80 2247 0x0039, 0x0707,
davidprentice 0:b608c7f02f80 2248 0x003C, 0x0704,
davidprentice 0:b608c7f02f80 2249 0x003D, 0x0807,
davidprentice 0:b608c7f02f80 2250 //-----Set RAM area-----------------------
davidprentice 0:b608c7f02f80 2251 0x0060, 0xA700, //GS=1
davidprentice 0:b608c7f02f80 2252 0x0061, 0x0001,
davidprentice 0:b608c7f02f80 2253 0x006A, 0x0000,
davidprentice 0:b608c7f02f80 2254 0x0021, 0x0000,
davidprentice 0:b608c7f02f80 2255 0x0020, 0x0000,
davidprentice 0:b608c7f02f80 2256 //-----Partial Display Control------------
davidprentice 0:b608c7f02f80 2257 0x0080, 0x0000,
davidprentice 0:b608c7f02f80 2258 0x0081, 0x0000,
davidprentice 0:b608c7f02f80 2259 0x0082, 0x0000,
davidprentice 0:b608c7f02f80 2260 0x0083, 0x0000,
davidprentice 0:b608c7f02f80 2261 0x0084, 0x0000,
davidprentice 0:b608c7f02f80 2262 0x0085, 0x0000,
davidprentice 0:b608c7f02f80 2263 //-----Panel Control----------------------
davidprentice 0:b608c7f02f80 2264 0x0090, 0x0010,
davidprentice 0:b608c7f02f80 2265 0x0092, 0x0000,
davidprentice 0:b608c7f02f80 2266 0x0093, 0x0003,
davidprentice 0:b608c7f02f80 2267 0x0095, 0x0110,
davidprentice 0:b608c7f02f80 2268 0x0097, 0x0000,
davidprentice 0:b608c7f02f80 2269 0x0098, 0x0000,
davidprentice 0:b608c7f02f80 2270 //-----Display on-----------------------
davidprentice 0:b608c7f02f80 2271 0x0007, 0x0173,
davidprentice 0:b608c7f02f80 2272 TFTLCD_DELAY, 50,
davidprentice 0:b608c7f02f80 2273 };
davidprentice 0:b608c7f02f80 2274 init_table16(ILI9320_regValues, sizeof(ILI9320_regValues));
davidprentice 0:b608c7f02f80 2275 break;
davidprentice 0:b608c7f02f80 2276 case 0x6809:
davidprentice 0:b608c7f02f80 2277 _lcd_capable = 0 | REV_SCREEN | INVERT_GS | AUTO_READINC;
davidprentice 0:b608c7f02f80 2278 goto common_93x5;
davidprentice 0:b608c7f02f80 2279 case 0x9328:
davidprentice 0:b608c7f02f80 2280 case 0x9325:
davidprentice 0:b608c7f02f80 2281 _lcd_capable = 0 | REV_SCREEN | INVERT_GS;
davidprentice 0:b608c7f02f80 2282 goto common_93x5;
davidprentice 0:b608c7f02f80 2283 case 0x9331:
davidprentice 0:b608c7f02f80 2284 case 0x9335:
davidprentice 0:b608c7f02f80 2285 _lcd_capable = 0 | REV_SCREEN;
davidprentice 0:b608c7f02f80 2286 common_93x5:
davidprentice 0:b608c7f02f80 2287 static const uint16_t ILI9325_regValues[] PROGMEM = {
davidprentice 0:b608c7f02f80 2288 0x00E5, 0x78F0, // set SRAM internal timing
davidprentice 0:b608c7f02f80 2289 0x0001, 0x0100, // set Driver Output Control
davidprentice 0:b608c7f02f80 2290 0x0002, 0x0200, // set 1 line inversion
davidprentice 0:b608c7f02f80 2291 0x0003, 0x1030, // set GRAM write direction and BGR=1.
davidprentice 0:b608c7f02f80 2292 0x0004, 0x0000, // Resize register
davidprentice 0:b608c7f02f80 2293 0x0005, 0x0000, // .kbv 16bits Data Format Selection
davidprentice 0:b608c7f02f80 2294 0x0008, 0x0207, // set the back porch and front porch
davidprentice 0:b608c7f02f80 2295 0x0009, 0x0000, // set non-display area refresh cycle ISC[3:0]
davidprentice 0:b608c7f02f80 2296 0x000A, 0x0000, // FMARK function
davidprentice 0:b608c7f02f80 2297 0x000C, 0x0000, // RGB interface setting
davidprentice 0:b608c7f02f80 2298 0x000D, 0x0000, // Frame marker Position
davidprentice 0:b608c7f02f80 2299 0x000F, 0x0000, // RGB interface polarity
davidprentice 0:b608c7f02f80 2300 // ----------- Power On sequence ----------- //
davidprentice 0:b608c7f02f80 2301 0x0010, 0x0000, // SAP, BT[3:0], AP, DSTB, SLP, STB
davidprentice 0:b608c7f02f80 2302 0x0011, 0x0007, // DC1[2:0], DC0[2:0], VC[2:0]
davidprentice 0:b608c7f02f80 2303 0x0012, 0x0000, // VREG1OUT voltage
davidprentice 0:b608c7f02f80 2304 0x0013, 0x0000, // VDV[4:0] for VCOM amplitude
davidprentice 0:b608c7f02f80 2305 0x0007, 0x0001,
davidprentice 0:b608c7f02f80 2306 TFTLCD_DELAY, 200, // Dis-charge capacitor power voltage
davidprentice 0:b608c7f02f80 2307 0x0010, 0x1690, // SAP=1, BT=6, APE=1, AP=1, DSTB=0, SLP=0, STB=0
davidprentice 0:b608c7f02f80 2308 0x0011, 0x0227, // DC1=2, DC0=2, VC=7
davidprentice 0:b608c7f02f80 2309 TFTLCD_DELAY, 50, // wait_ms 50ms
davidprentice 0:b608c7f02f80 2310 0x0012, 0x000D, // VCIRE=1, PON=0, VRH=5
davidprentice 0:b608c7f02f80 2311 TFTLCD_DELAY, 50, // wait_ms 50ms
davidprentice 0:b608c7f02f80 2312 0x0013, 0x1200, // VDV=28 for VCOM amplitude
davidprentice 0:b608c7f02f80 2313 0x0029, 0x000A, // VCM=10 for VCOMH
davidprentice 0:b608c7f02f80 2314 0x002B, 0x000D, // Set Frame Rate
davidprentice 0:b608c7f02f80 2315 TFTLCD_DELAY, 50, // wait_ms 50ms
davidprentice 0:b608c7f02f80 2316 0x0020, 0x0000, // GRAM horizontal Address
davidprentice 0:b608c7f02f80 2317 0x0021, 0x0000, // GRAM Vertical Address
davidprentice 0:b608c7f02f80 2318 // ----------- Adjust the Gamma Curve ----------//
davidprentice 0:b608c7f02f80 2319
davidprentice 0:b608c7f02f80 2320 0x0030, 0x0000,
davidprentice 0:b608c7f02f80 2321 0x0031, 0x0404,
davidprentice 0:b608c7f02f80 2322 0x0032, 0x0003,
davidprentice 0:b608c7f02f80 2323 0x0035, 0x0405,
davidprentice 0:b608c7f02f80 2324 0x0036, 0x0808,
davidprentice 0:b608c7f02f80 2325 0x0037, 0x0407,
davidprentice 0:b608c7f02f80 2326 0x0038, 0x0303,
davidprentice 0:b608c7f02f80 2327 0x0039, 0x0707,
davidprentice 0:b608c7f02f80 2328 0x003C, 0x0504,
davidprentice 0:b608c7f02f80 2329 0x003D, 0x0808,
davidprentice 0:b608c7f02f80 2330
davidprentice 0:b608c7f02f80 2331 //------------------ Set GRAM area ---------------//
davidprentice 0:b608c7f02f80 2332 0x0060, 0x2700, // Gate Scan Line GS=0 [0xA700]
davidprentice 0:b608c7f02f80 2333 0x0061, 0x0001, // NDL,VLE, REV .kbv
davidprentice 0:b608c7f02f80 2334 0x006A, 0x0000, // set scrolling line
davidprentice 0:b608c7f02f80 2335 //-------------- Partial Display Control ---------//
davidprentice 0:b608c7f02f80 2336 0x0080, 0x0000,
davidprentice 0:b608c7f02f80 2337 0x0081, 0x0000,
davidprentice 0:b608c7f02f80 2338 0x0082, 0x0000,
davidprentice 0:b608c7f02f80 2339 0x0083, 0x0000,
davidprentice 0:b608c7f02f80 2340 0x0084, 0x0000,
davidprentice 0:b608c7f02f80 2341 0x0085, 0x0000,
davidprentice 0:b608c7f02f80 2342 //-------------- Panel Control -------------------//
davidprentice 0:b608c7f02f80 2343 0x0090, 0x0010,
davidprentice 0:b608c7f02f80 2344 0x0092, 0x0000,
davidprentice 0:b608c7f02f80 2345 0x0007, 0x0133, // 262K color and display ON
davidprentice 0:b608c7f02f80 2346 };
davidprentice 0:b608c7f02f80 2347 init_table16(ILI9325_regValues, sizeof(ILI9325_regValues));
davidprentice 0:b608c7f02f80 2348 break;
davidprentice 0:b608c7f02f80 2349
davidprentice 0:b608c7f02f80 2350 #if defined(SUPPORT_9326_5420)
davidprentice 0:b608c7f02f80 2351 case 0x5420:
davidprentice 0:b608c7f02f80 2352 case 0x9326:
davidprentice 0:b608c7f02f80 2353 _lcd_capable = REV_SCREEN | READ_BGR;
davidprentice 0:b608c7f02f80 2354 static const uint16_t ILI9326_CPT28_regValues[] PROGMEM = {
davidprentice 0:b608c7f02f80 2355 //************* Start Initial Sequence **********//
davidprentice 0:b608c7f02f80 2356 0x0702, 0x3008, // Set internal timing, don’t change this value
davidprentice 0:b608c7f02f80 2357 0x0705, 0x0036, // Set internal timing, don’t change this value
davidprentice 0:b608c7f02f80 2358 0x070B, 0x1213, // Set internal timing, don’t change this value
davidprentice 0:b608c7f02f80 2359 0x0001, 0x0100, // set SS and SM bit
davidprentice 0:b608c7f02f80 2360 0x0002, 0x0100, // set 1 line inversion
davidprentice 0:b608c7f02f80 2361 0x0003, 0x1030, // set GRAM write direction and BGR=1.
davidprentice 0:b608c7f02f80 2362 0x0008, 0x0202, // set the back porch and front porch
davidprentice 0:b608c7f02f80 2363 0x0009, 0x0000, // set non-display area refresh cycle ISC[3:0]
davidprentice 0:b608c7f02f80 2364 0x000C, 0x0000, // RGB interface setting
davidprentice 0:b608c7f02f80 2365 0x000F, 0x0000, // RGB interface polarity
davidprentice 0:b608c7f02f80 2366 //*************Power On sequence ****************//
davidprentice 0:b608c7f02f80 2367 0x0100, 0x0000, // SAP, BT[3:0], AP, DSTB, SLP, STB
davidprentice 0:b608c7f02f80 2368 0x0102, 0x0000, // VREG1OUT voltage
davidprentice 0:b608c7f02f80 2369 0x0103, 0x0000, // VDV[4:0] for VCOM amplitude
davidprentice 0:b608c7f02f80 2370 TFTLCD_DELAY, 200, // Dis-charge capacitor power voltage
davidprentice 0:b608c7f02f80 2371 0x0100, 0x1190, // SAP, BT[3:0], AP, DSTB, SLP, STB
davidprentice 0:b608c7f02f80 2372 0x0101, 0x0227, // DC1[2:0], DC0[2:0], VC[2:0]
davidprentice 0:b608c7f02f80 2373 TFTLCD_DELAY, 50, // Delay 50ms
davidprentice 0:b608c7f02f80 2374 0x0102, 0x01BD, // VREG1OUT voltage
davidprentice 0:b608c7f02f80 2375 TFTLCD_DELAY, 50, // Delay 50ms
davidprentice 0:b608c7f02f80 2376 0x0103, 0x2D00, // VDV[4:0] for VCOM amplitude
davidprentice 0:b608c7f02f80 2377 0x0281, 0x000E, // VCM[5:0] for VCOMH
davidprentice 0:b608c7f02f80 2378 TFTLCD_DELAY, 50, //
davidprentice 0:b608c7f02f80 2379 0x0200, 0x0000, // GRAM horizontal Address
davidprentice 0:b608c7f02f80 2380 0x0201, 0x0000, // GRAM Vertical Address
davidprentice 0:b608c7f02f80 2381 // ----------- Adjust the Gamma Curve ----------//
davidprentice 0:b608c7f02f80 2382 0x0300, 0x0000, //
davidprentice 0:b608c7f02f80 2383 0x0301, 0x0707, //
davidprentice 0:b608c7f02f80 2384 0x0302, 0x0606, //
davidprentice 0:b608c7f02f80 2385 0x0305, 0x0000, //
davidprentice 0:b608c7f02f80 2386 0x0306, 0x0D00, //
davidprentice 0:b608c7f02f80 2387 0x0307, 0x0706, //
davidprentice 0:b608c7f02f80 2388 0x0308, 0x0005, //
davidprentice 0:b608c7f02f80 2389 0x0309, 0x0007, //
davidprentice 0:b608c7f02f80 2390 0x030C, 0x0000, //
davidprentice 0:b608c7f02f80 2391 0x030D, 0x000A, //
davidprentice 0:b608c7f02f80 2392 //------------------ Set GRAM area ---------------//
davidprentice 0:b608c7f02f80 2393 0x0400, 0x3100, // Gate Scan Line 400 lines
davidprentice 0:b608c7f02f80 2394 0x0401, 0x0001, // NDL,VLE, REV
davidprentice 0:b608c7f02f80 2395 0x0404, 0x0000, // set scrolling line
davidprentice 0:b608c7f02f80 2396 //-------------- Partial Display Control ---------//
davidprentice 0:b608c7f02f80 2397 0x0500, 0x0000, // Partial Image 1 Display Position
davidprentice 0:b608c7f02f80 2398 0x0501, 0x0000, // Partial Image 1 RAM Start/End Address
davidprentice 0:b608c7f02f80 2399 0x0502, 0x0000, // Partial Image 1 RAM Start/End Address
davidprentice 0:b608c7f02f80 2400 0x0503, 0x0000, // Partial Image 2 Display Position
davidprentice 0:b608c7f02f80 2401 0x0504, 0x0000, // Partial Image 2 RAM Start/End Address
davidprentice 0:b608c7f02f80 2402 0x0505, 0x0000, // Partial Image 2 RAM Start/End Address
davidprentice 0:b608c7f02f80 2403 //-------------- Panel Control -------------------//
davidprentice 0:b608c7f02f80 2404 0x0010, 0x0010, // DIVI[1:0];RTNI[4:0]
davidprentice 0:b608c7f02f80 2405 0x0011, 0x0600, // NOWI[2:0];SDTI[2:0]
davidprentice 0:b608c7f02f80 2406 0x0020, 0x0002, // DIVE[1:0];RTNE[5:0]
davidprentice 0:b608c7f02f80 2407 0x0007, 0x0173, // 262K color and display ON
davidprentice 0:b608c7f02f80 2408 };
davidprentice 0:b608c7f02f80 2409 init_table16(ILI9326_CPT28_regValues, sizeof(ILI9326_CPT28_regValues));
davidprentice 0:b608c7f02f80 2410 p16 = (int16_t *) & HEIGHT;
davidprentice 0:b608c7f02f80 2411 *p16 = 400;
davidprentice 0:b608c7f02f80 2412 p16 = (int16_t *) & WIDTH;
davidprentice 0:b608c7f02f80 2413 *p16 = 240;
davidprentice 0:b608c7f02f80 2414 break;
davidprentice 0:b608c7f02f80 2415 #endif
davidprentice 0:b608c7f02f80 2416
davidprentice 0:b608c7f02f80 2417 case 0x9327:
davidprentice 0:b608c7f02f80 2418 _lcd_capable = AUTO_READINC | MIPI_DCS_REV1 | MV_AXIS;
davidprentice 0:b608c7f02f80 2419 static const uint8_t ILI9327_regValues[] PROGMEM = {
davidprentice 0:b608c7f02f80 2420 0xB0, 1, 0x00, //Disable Protect for cmds B1-DF, E0-EF, F0-FF
davidprentice 0:b608c7f02f80 2421 // 0xE0, 1, 0x20, //NV Memory Write [00]
davidprentice 0:b608c7f02f80 2422 // 0xD1, 3, 0x00, 0x71, 0x19, //VCOM control [00 40 0F]
davidprentice 0:b608c7f02f80 2423 // 0xD0, 3, 0x07, 0x01, 0x08, //Power Setting [07 04 8C]
davidprentice 0:b608c7f02f80 2424 0xC1, 4, 0x10, 0x10, 0x02, 0x02, //Display Timing [10 10 02 02]
davidprentice 0:b608c7f02f80 2425 0xC0, 6, 0x00, 0x35, 0x00, 0x00, 0x01, 0x02, //Panel Drive [00 35 00 00 01 02 REV=0,GS=0,SS=0
davidprentice 0:b608c7f02f80 2426 0xC5, 1, 0x04, //Frame Rate [04]
davidprentice 0:b608c7f02f80 2427 0xD2, 2, 0x01, 0x04, //Power Setting [01 44]
davidprentice 0:b608c7f02f80 2428 // 0xC8, 15, 0x04, 0x67, 0x35, 0x04, 0x08, 0x06, 0x24, 0x01, 0x37, 0x40, 0x03, 0x10, 0x08, 0x80, 0x00,
davidprentice 0:b608c7f02f80 2429 // 0xC8, 15, 0x00, 0x77, 0x77, 0x04, 0x04, 0x00, 0x00, 0x00, 0x77, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
davidprentice 0:b608c7f02f80 2430 0xCA, 1, 0x00, //DGC LUT ???
davidprentice 0:b608c7f02f80 2431 0xEA, 1, 0x80, //3-Gamma Function Enable
davidprentice 0:b608c7f02f80 2432 // 0xB0, 1, 0x03, //Enable Protect
davidprentice 0:b608c7f02f80 2433 };
davidprentice 0:b608c7f02f80 2434 table8_ads = ILI9327_regValues, table_size = sizeof(ILI9327_regValues);
davidprentice 0:b608c7f02f80 2435 p16 = (int16_t *) & HEIGHT;
davidprentice 0:b608c7f02f80 2436 *p16 = 400;
davidprentice 0:b608c7f02f80 2437 p16 = (int16_t *) & WIDTH;
davidprentice 0:b608c7f02f80 2438 *p16 = 240;
davidprentice 0:b608c7f02f80 2439 break;
davidprentice 0:b608c7f02f80 2440 case 0x1602:
davidprentice 0:b608c7f02f80 2441 _lcd_capable = AUTO_READINC | MIPI_DCS_REV1 | MV_AXIS; //does not readGRAM
davidprentice 0:b608c7f02f80 2442 static const uint8_t XX1602_regValues[] PROGMEM = {
davidprentice 0:b608c7f02f80 2443 0xB8, 1, 0x01, //GS [00]
davidprentice 0:b608c7f02f80 2444 0xC0, 1, 0x0E, //??Power [0A]
davidprentice 0:b608c7f02f80 2445 };
davidprentice 0:b608c7f02f80 2446 table8_ads = XX1602_regValues, table_size = sizeof(XX1602_regValues);
davidprentice 0:b608c7f02f80 2447 break;
davidprentice 0:b608c7f02f80 2448
davidprentice 0:b608c7f02f80 2449 case 0x2053: //weird from BangGood
davidprentice 0:b608c7f02f80 2450 _lcd_capable = AUTO_READINC | MIPI_DCS_REV1 | MV_AXIS | READ_24BITS | REV_SCREEN | READ_BGR;
davidprentice 0:b608c7f02f80 2451 goto common_9329;
davidprentice 0:b608c7f02f80 2452 case 0xAC11:
davidprentice 0:b608c7f02f80 2453 _lcd_capable = AUTO_READINC | MIPI_DCS_REV1 | MV_AXIS | READ_24BITS | REV_SCREEN; //thanks viliam
davidprentice 0:b608c7f02f80 2454 goto common_9329;
davidprentice 0:b608c7f02f80 2455 case 0x9302:
davidprentice 0:b608c7f02f80 2456 _lcd_capable = AUTO_READINC | MIPI_DCS_REV1 | MV_AXIS;
davidprentice 0:b608c7f02f80 2457 goto common_9329;
davidprentice 0:b608c7f02f80 2458 case 0x9338:
davidprentice 0:b608c7f02f80 2459 _lcd_capable = AUTO_READINC | MIPI_DCS_REV1 | MV_AXIS | READ_24BITS;
davidprentice 0:b608c7f02f80 2460 goto common_9329;
davidprentice 0:b608c7f02f80 2461 case 0x9329:
davidprentice 0:b608c7f02f80 2462 _lcd_capable = AUTO_READINC | MIPI_DCS_REV1 | MV_AXIS | INVERT_SS | REV_SCREEN;
davidprentice 0:b608c7f02f80 2463 common_9329:
davidprentice 0:b608c7f02f80 2464 static const uint8_t ILI9329_regValues[] PROGMEM = {
davidprentice 0:b608c7f02f80 2465 // 0xF6, 3, 0x01, 0x01, 0x00, //Interface Control needs EXTC=1 MX_EOR=1, TM=0, RIM=0
davidprentice 0:b608c7f02f80 2466 // 0xB6, 3, 0x0A, 0x82, 0x27, //Display Function [0A 82 27]
davidprentice 0:b608c7f02f80 2467 // 0xB7, 1, 0x06, //Entry Mode Set [06]
davidprentice 0:b608c7f02f80 2468 0x36, 1, 0x00, //Memory Access [00] pointless but stops an empty array
davidprentice 0:b608c7f02f80 2469 };
davidprentice 0:b608c7f02f80 2470 table8_ads = ILI9329_regValues, table_size = sizeof(ILI9329_regValues);
davidprentice 0:b608c7f02f80 2471 break;
davidprentice 0:b608c7f02f80 2472
davidprentice 0:b608c7f02f80 2473 case 0x9340: //ILI9340 thanks Ravi_kanchan2004.
davidprentice 0:b608c7f02f80 2474 _lcd_capable = AUTO_READINC | MIPI_DCS_REV1 | MV_AXIS | READ_24BITS | REV_SCREEN;
davidprentice 0:b608c7f02f80 2475 goto common_9341;
davidprentice 0:b608c7f02f80 2476 case 0x9341:
davidprentice 0:b608c7f02f80 2477 common_9341:
davidprentice 0:b608c7f02f80 2478 _lcd_capable = AUTO_READINC | MIPI_DCS_REV1 | MV_AXIS | READ_24BITS;
davidprentice 0:b608c7f02f80 2479 static const uint8_t ILI9341_regValues_2_4[] PROGMEM = { // BOE 2.4"
davidprentice 0:b608c7f02f80 2480 0xF6, 3, 0x01, 0x01, 0x00, //Interface Control needs EXTC=1 MV_EOR=0, TM=0, RIM=0
davidprentice 0:b608c7f02f80 2481 0xCF, 3, 0x00, 0x81, 0x30, //Power Control B [00 81 30]
davidprentice 0:b608c7f02f80 2482 0xED, 4, 0x64, 0x03, 0x12, 0x81, //Power On Seq [55 01 23 01]
davidprentice 0:b608c7f02f80 2483 0xE8, 3, 0x85, 0x10, 0x78, //Driver Timing A [04 11 7A]
davidprentice 0:b608c7f02f80 2484 0xCB, 5, 0x39, 0x2C, 0x00, 0x34, 0x02, //Power Control A [39 2C 00 34 02]
davidprentice 0:b608c7f02f80 2485 0xF7, 1, 0x20, //Pump Ratio [10]
davidprentice 0:b608c7f02f80 2486 0xEA, 2, 0x00, 0x00, //Driver Timing B [66 00]
davidprentice 0:b608c7f02f80 2487 0xB0, 1, 0x00, //RGB Signal [00]
davidprentice 0:b608c7f02f80 2488 0xB1, 2, 0x00, 0x1B, //Frame Control [00 1B]
davidprentice 0:b608c7f02f80 2489 // 0xB6, 2, 0x0A, 0xA2, 0x27, //Display Function [0A 82 27 XX] .kbv SS=1
davidprentice 0:b608c7f02f80 2490 0xB4, 1, 0x00, //Inversion Control [02] .kbv NLA=1, NLB=1, NLC=1
davidprentice 0:b608c7f02f80 2491 0xC0, 1, 0x21, //Power Control 1 [26]
davidprentice 0:b608c7f02f80 2492 0xC1, 1, 0x11, //Power Control 2 [00]
davidprentice 0:b608c7f02f80 2493 0xC5, 2, 0x3F, 0x3C, //VCOM 1 [31 3C]
davidprentice 0:b608c7f02f80 2494 0xC7, 1, 0xB5, //VCOM 2 [C0]
davidprentice 0:b608c7f02f80 2495 0x36, 1, 0x48, //Memory Access [00]
davidprentice 0:b608c7f02f80 2496 0xF2, 1, 0x00, //Enable 3G [02]
davidprentice 0:b608c7f02f80 2497 0x26, 1, 0x01, //Gamma Set [01]
davidprentice 0:b608c7f02f80 2498 0xE0, 15, 0x0f, 0x26, 0x24, 0x0b, 0x0e, 0x09, 0x54, 0xa8, 0x46, 0x0c, 0x17, 0x09, 0x0f, 0x07, 0x00,
davidprentice 0:b608c7f02f80 2499 0xE1, 15, 0x00, 0x19, 0x1b, 0x04, 0x10, 0x07, 0x2a, 0x47, 0x39, 0x03, 0x06, 0x06, 0x30, 0x38, 0x0f,
davidprentice 0:b608c7f02f80 2500 };
davidprentice 0:b608c7f02f80 2501 static const uint8_t ILI9341_regValues_ada[] PROGMEM = { // Adafruit_TFTLCD only works with EXTC=0
davidprentice 0:b608c7f02f80 2502 // 0xF6, 3, 0x00, 0x01, 0x00, //Interface Control needs EXTC=1 TM=0, RIM=0
davidprentice 0:b608c7f02f80 2503 // 0xF6, 3, 0x01, 0x01, 0x03, //Interface Control needs EXTC=1 RM=1, RIM=1
davidprentice 0:b608c7f02f80 2504 0xF6, 3, 0x09, 0x01, 0x03, //Interface Control needs EXTC=1 RM=0, RIM=1
davidprentice 0:b608c7f02f80 2505 0xB0, 1, 0x40, //RGB Signal [40] RCM=2
davidprentice 0:b608c7f02f80 2506 0xB4, 1, 0x00, //Inversion Control [02] .kbv NLA=1, NLB=1, NLC=1
davidprentice 0:b608c7f02f80 2507 0xC0, 1, 0x23, //Power Control 1 [26]
davidprentice 0:b608c7f02f80 2508 0xC1, 1, 0x10, //Power Control 2 [00]
davidprentice 0:b608c7f02f80 2509 0xC5, 2, 0x2B, 0x2B, //VCOM 1 [31 3C]
davidprentice 0:b608c7f02f80 2510 0xC7, 1, 0xC0, //VCOM 2 [C0]
davidprentice 0:b608c7f02f80 2511 0x36, 1, 0x88, //Memory Access [00]
davidprentice 0:b608c7f02f80 2512 0xB1, 2, 0x00, 0x1B, //Frame Control [00 1B]
davidprentice 0:b608c7f02f80 2513 0xB7, 1, 0x07, //Entry Mode [00]
davidprentice 0:b608c7f02f80 2514 };
davidprentice 0:b608c7f02f80 2515 table8_ads = ILI9341_regValues_2_4, table_size = sizeof(ILI9341_regValues_2_4); //
davidprentice 0:b608c7f02f80 2516 break;
davidprentice 0:b608c7f02f80 2517 #if defined(SUPPORT_9342)
davidprentice 0:b608c7f02f80 2518 case 0x9342:
davidprentice 0:b608c7f02f80 2519 _lcd_capable = AUTO_READINC | MIPI_DCS_REV1 | MV_AXIS | READ_24BITS | INVERT_GS | REV_SCREEN;
davidprentice 0:b608c7f02f80 2520 static const uint8_t ILI9342_regValues_CPT24[] PROGMEM = { //CPT 2.4"
davidprentice 0:b608c7f02f80 2521 (0xB9), 3, 0xFF, 0x93, 0x42, //[00 00 00]
davidprentice 0:b608c7f02f80 2522 (0xC0), 2, 0x1D, 0x0A, //[26 09]
davidprentice 0:b608c7f02f80 2523 (0xC1), 1, 0x02, //[10]
davidprentice 0:b608c7f02f80 2524 (0xC5), 2, 0x2F, 0x2F, //[31 3C]
davidprentice 0:b608c7f02f80 2525 (0xC7), 1, 0xC3, //[C0]
davidprentice 0:b608c7f02f80 2526 (0xB8), 1, 0x0B, //[07]
davidprentice 0:b608c7f02f80 2527 (0xE0), 15, 0x0F, 0x33, 0x30, 0x0C, 0x0F, 0x08, 0x5D, 0x66, 0x4A, 0x07, 0x13, 0x05, 0x1B, 0x0E, 0x08,
davidprentice 0:b608c7f02f80 2528 (0xE1), 15, 0x08, 0x0E, 0x11, 0x02, 0x0E, 0x02, 0x24, 0x33, 0x37, 0x03, 0x0A, 0x09, 0x26, 0x33, 0x0F,
davidprentice 0:b608c7f02f80 2529 };
davidprentice 0:b608c7f02f80 2530 static const uint8_t ILI9342_regValues_Tianma23[] PROGMEM = { //Tianma 2.3"
davidprentice 0:b608c7f02f80 2531 (0xB9), 3, 0xFF, 0x93, 0x42,
davidprentice 0:b608c7f02f80 2532 (0xC0), 2, 0x1D, 0x0A,
davidprentice 0:b608c7f02f80 2533 (0xC1), 1, 0x01,
davidprentice 0:b608c7f02f80 2534 (0xC5), 2, 0x2C, 0x2C,
davidprentice 0:b608c7f02f80 2535 (0xC7), 1, 0xC6,
davidprentice 0:b608c7f02f80 2536 (0xB8), 1, 0x09,
davidprentice 0:b608c7f02f80 2537 (0xE0), 15, 0x0F, 0x26, 0x21, 0x07, 0x0A, 0x03, 0x4E, 0x62, 0x3E, 0x0B, 0x11, 0x00, 0x08, 0x02, 0x00,
davidprentice 0:b608c7f02f80 2538 (0xE1), 15, 0x00, 0x19, 0x1E, 0x03, 0x0E, 0x03, 0x30, 0x23, 0x41, 0x03, 0x0B, 0x07, 0x2F, 0x36, 0x0F,
davidprentice 0:b608c7f02f80 2539 };
davidprentice 0:b608c7f02f80 2540 static const uint8_t ILI9342_regValues_HSD23[] PROGMEM = { //HSD 2.3"
davidprentice 0:b608c7f02f80 2541 (0xB9), 3, 0xFF, 0x93, 0x42,
davidprentice 0:b608c7f02f80 2542 (0xC0), 2, 0x1D, 0x0A,
davidprentice 0:b608c7f02f80 2543 (0xC1), 1, 0x02,
davidprentice 0:b608c7f02f80 2544 (0xC5), 2, 0x2F, 0x27,
davidprentice 0:b608c7f02f80 2545 (0xC7), 1, 0xA4,
davidprentice 0:b608c7f02f80 2546 (0xB8), 1, 0x0B,
davidprentice 0:b608c7f02f80 2547 (0xE0), 15, 0x0F, 0x24, 0x21, 0x0C, 0x0F, 0x06, 0x50, 0x75, 0x3F, 0x07, 0x12, 0x05, 0x11, 0x0B, 0x08,
davidprentice 0:b608c7f02f80 2548 (0xE1), 15, 0x08, 0x1D, 0x20, 0x02, 0x0E, 0x04, 0x31, 0x24, 0x42, 0x03, 0x0B, 0x09, 0x30, 0x36, 0x0F,
davidprentice 0:b608c7f02f80 2549 };
davidprentice 0:b608c7f02f80 2550 table8_ads = ILI9342_regValues_CPT24, table_size = sizeof(ILI9342_regValues_CPT24); //
davidprentice 0:b608c7f02f80 2551 // table8_ads = ILI9342_regValues_Tianma23, table_size = sizeof(ILI9342_regValues_Tianma23); //
davidprentice 0:b608c7f02f80 2552 // table8_ads = ILI9342_regValues_HSD23, table_size = sizeof(ILI9342_regValues_HSD23); //
davidprentice 0:b608c7f02f80 2553 p16 = (int16_t *) & HEIGHT;
davidprentice 0:b608c7f02f80 2554 *p16 = 240;
davidprentice 0:b608c7f02f80 2555 p16 = (int16_t *) & WIDTH;
davidprentice 0:b608c7f02f80 2556 *p16 = 320;
davidprentice 0:b608c7f02f80 2557 break;
davidprentice 0:b608c7f02f80 2558 #endif
davidprentice 0:b608c7f02f80 2559 case 0x1581: //no BGR in MADCTL. set BGR in Panel Control
davidprentice 0:b608c7f02f80 2560 _lcd_capable = AUTO_READINC | MIPI_DCS_REV1 | MV_AXIS | READ_24BITS; //thanks zdravke
davidprentice 0:b608c7f02f80 2561 goto common_9481;
davidprentice 0:b608c7f02f80 2562 case 0x9481:
davidprentice 0:b608c7f02f80 2563 _lcd_capable = AUTO_READINC | MIPI_DCS_REV1 | MV_AXIS | READ_BGR;
davidprentice 0:b608c7f02f80 2564 common_9481:
davidprentice 0:b608c7f02f80 2565 static const uint8_t ILI9481_regValues[] PROGMEM = { // Atmel MaxTouch
davidprentice 0:b608c7f02f80 2566 0xB0, 1, 0x00, // unlocks E0, F0
davidprentice 0:b608c7f02f80 2567 0xB3, 4, 0x02, 0x00, 0x00, 0x00, //Frame Memory, interface [02 00 00 00]
davidprentice 0:b608c7f02f80 2568 0xB4, 1, 0x00, // Frame mode [00]
davidprentice 0:b608c7f02f80 2569 0xD0, 3, 0x07, 0x42, 0x18, // Set Power [00 43 18] x1.00, x6, x3
davidprentice 0:b608c7f02f80 2570 0xD1, 3, 0x00, 0x07, 0x10, // Set VCOM [00 00 00] x0.72, x1.02
davidprentice 0:b608c7f02f80 2571 0xD2, 2, 0x01, 0x02, // Set Power for Normal Mode [01 22]
davidprentice 0:b608c7f02f80 2572 0xD3, 2, 0x01, 0x02, // Set Power for Partial Mode [01 22]
davidprentice 0:b608c7f02f80 2573 0xD4, 2, 0x01, 0x02, // Set Power for Idle Mode [01 22]
davidprentice 0:b608c7f02f80 2574 0xC0, 5, 0x12, 0x3B, 0x00, 0x02, 0x11, //Panel Driving BGR for 1581 [10 3B 00 02 11]
davidprentice 0:b608c7f02f80 2575 0xC1, 3, 0x10, 0x10, 0x88, // Display Timing Normal [10 10 88]
davidprentice 0:b608c7f02f80 2576 0xC5, 1, 0x03, //Frame Rate [03]
davidprentice 0:b608c7f02f80 2577 0xC6, 1, 0x02, //Interface Control [02]
davidprentice 0:b608c7f02f80 2578 0xC8, 12, 0x00, 0x32, 0x36, 0x45, 0x06, 0x16, 0x37, 0x75, 0x77, 0x54, 0x0C, 0x00,
davidprentice 0:b608c7f02f80 2579 0xCC, 1, 0x00, //Panel Control [00]
davidprentice 0:b608c7f02f80 2580 };
davidprentice 0:b608c7f02f80 2581 static const uint8_t ILI9481_CPT29_regValues[] PROGMEM = { // 320x430
davidprentice 0:b608c7f02f80 2582 0xB0, 1, 0x00,
davidprentice 0:b608c7f02f80 2583 0xD0, 3, 0x07, 0x42, 0x1C, // Set Power [00 43 18]
davidprentice 0:b608c7f02f80 2584 0xD1, 3, 0x00, 0x02, 0x0F, // Set VCOM [00 00 00] x0.695, x1.00
davidprentice 0:b608c7f02f80 2585 0xD2, 2, 0x01, 0x11, // Set Power for Normal Mode [01 22]
davidprentice 0:b608c7f02f80 2586 0xC0, 5, 0x10, 0x35, 0x00, 0x02, 0x11, //Set Panel Driving [10 3B 00 02 11]
davidprentice 0:b608c7f02f80 2587 0xC5, 1, 0x03, //Frame Rate [03]
davidprentice 0:b608c7f02f80 2588 0xC8, 12, 0x00, 0x30, 0x36, 0x45, 0x04, 0x16, 0x37, 0x75, 0x77, 0x54, 0x0F, 0x00,
davidprentice 0:b608c7f02f80 2589 0xE4, 1, 0xA0,
davidprentice 0:b608c7f02f80 2590 0xF0, 1, 0x01,
davidprentice 0:b608c7f02f80 2591 0xF3, 2, 0x02, 0x1A,
davidprentice 0:b608c7f02f80 2592 };
davidprentice 0:b608c7f02f80 2593 static const uint8_t ILI9481_PVI35_regValues[] PROGMEM = { // 320x480
davidprentice 0:b608c7f02f80 2594 0xB0, 1, 0x00,
davidprentice 0:b608c7f02f80 2595 0xD0, 3, 0x07, 0x41, 0x1D, // Set Power [00 43 18]
davidprentice 0:b608c7f02f80 2596 0xD1, 3, 0x00, 0x2B, 0x1F, // Set VCOM [00 00 00] x0.900, x1.32
davidprentice 0:b608c7f02f80 2597 0xD2, 2, 0x01, 0x11, // Set Power for Normal Mode [01 22]
davidprentice 0:b608c7f02f80 2598 0xC0, 5, 0x10, 0x3B, 0x00, 0x02, 0x11, //Set Panel Driving [10 3B 00 02 11]
davidprentice 0:b608c7f02f80 2599 0xC5, 1, 0x03, //Frame Rate [03]
davidprentice 0:b608c7f02f80 2600 0xC8, 12, 0x00, 0x14, 0x33, 0x10, 0x00, 0x16, 0x44, 0x36, 0x77, 0x00, 0x0F, 0x00,
davidprentice 0:b608c7f02f80 2601 0xE4, 1, 0xA0,
davidprentice 0:b608c7f02f80 2602 0xF0, 1, 0x01,
davidprentice 0:b608c7f02f80 2603 0xF3, 2, 0x40, 0x0A,
davidprentice 0:b608c7f02f80 2604 };
davidprentice 0:b608c7f02f80 2605 static const uint8_t ILI9481_AUO317_regValues[] PROGMEM = { // 320x480
davidprentice 0:b608c7f02f80 2606 0xB0, 1, 0x00,
davidprentice 0:b608c7f02f80 2607 0xD0, 3, 0x07, 0x40, 0x1D, // Set Power [00 43 18]
davidprentice 0:b608c7f02f80 2608 0xD1, 3, 0x00, 0x18, 0x13, // Set VCOM [00 00 00] x0.805, x1.08
davidprentice 0:b608c7f02f80 2609 0xD2, 2, 0x01, 0x11, // Set Power for Normal Mode [01 22]
davidprentice 0:b608c7f02f80 2610 0xC0, 5, 0x10, 0x3B, 0x00, 0x02, 0x11, //Set Panel Driving [10 3B 00 02 11]
davidprentice 0:b608c7f02f80 2611 0xC5, 1, 0x03, //Frame Rate [03]
davidprentice 0:b608c7f02f80 2612 0xC8, 12, 0x00, 0x44, 0x06, 0x44, 0x0A, 0x08, 0x17, 0x33, 0x77, 0x44, 0x08, 0x0C,
davidprentice 0:b608c7f02f80 2613 0xE4, 1, 0xA0,
davidprentice 0:b608c7f02f80 2614 0xF0, 1, 0x01,
davidprentice 0:b608c7f02f80 2615 };
davidprentice 0:b608c7f02f80 2616 static const uint8_t ILI9481_CMO35_regValues[] PROGMEM = { // 320480
davidprentice 0:b608c7f02f80 2617 0xB0, 1, 0x00,
davidprentice 0:b608c7f02f80 2618 0xD0, 3, 0x07, 0x41, 0x1D, // Set Power [00 43 18] 07,41,1D
davidprentice 0:b608c7f02f80 2619 0xD1, 3, 0x00, 0x1C, 0x1F, // Set VCOM [00 00 00] x0.825, x1.32 1C,1F
davidprentice 0:b608c7f02f80 2620 0xD2, 2, 0x01, 0x11, // Set Power for Normal Mode [01 22]
davidprentice 0:b608c7f02f80 2621 0xC0, 5, 0x10, 0x3B, 0x00, 0x02, 0x11, //Set Panel Driving [10 3B 00 02 11]
davidprentice 0:b608c7f02f80 2622 0xC5, 1, 0x03, //Frame Rate [03]
davidprentice 0:b608c7f02f80 2623 0xC6, 1, 0x83,
davidprentice 0:b608c7f02f80 2624 0xC8, 12, 0x00, 0x26, 0x21, 0x00, 0x00, 0x1F, 0x65, 0x23, 0x77, 0x00, 0x0F, 0x00,
davidprentice 0:b608c7f02f80 2625 0xF0, 1, 0x01, //?
davidprentice 0:b608c7f02f80 2626 0xE4, 1, 0xA0, //?SETCABC on Himax
davidprentice 0:b608c7f02f80 2627 0x36, 1, 0x48, //Memory Access [00]
davidprentice 0:b608c7f02f80 2628 0xB4, 1, 0x11,
davidprentice 0:b608c7f02f80 2629 };
davidprentice 0:b608c7f02f80 2630 static const uint8_t ILI9481_RGB_regValues[] PROGMEM = { // 320x480
davidprentice 0:b608c7f02f80 2631 0xB0, 1, 0x00,
davidprentice 0:b608c7f02f80 2632 0xD0, 3, 0x07, 0x41, 0x1D, // SETPOWER [00 43 18]
davidprentice 0:b608c7f02f80 2633 0xD1, 3, 0x00, 0x2B, 0x1F, // SETVCOM [00 00 00] x0.900, x1.32
davidprentice 0:b608c7f02f80 2634 0xD2, 2, 0x01, 0x11, // SETNORPOW for Normal Mode [01 22]
davidprentice 0:b608c7f02f80 2635 0xC0, 6, 0x10, 0x3B, 0x00, 0x02, 0x11, 0x00, //SETPANEL [10 3B 00 02 11]
davidprentice 0:b608c7f02f80 2636 0xC5, 1, 0x03, //SETOSC Frame Rate [03]
davidprentice 0:b608c7f02f80 2637 0xC6, 1, 0x80, //SETRGB interface control
davidprentice 0:b608c7f02f80 2638 0xC8, 12, 0x00, 0x14, 0x33, 0x10, 0x00, 0x16, 0x44, 0x36, 0x77, 0x00, 0x0F, 0x00,
davidprentice 0:b608c7f02f80 2639 0xF3, 2, 0x40, 0x0A,
davidprentice 0:b608c7f02f80 2640 0xF0, 1, 0x08,
davidprentice 0:b608c7f02f80 2641 0xF6, 1, 0x84,
davidprentice 0:b608c7f02f80 2642 0xF7, 1, 0x80,
davidprentice 0:b608c7f02f80 2643 0x0C, 2, 0x00, 0x55, //RDCOLMOD
davidprentice 0:b608c7f02f80 2644 0xB4, 1, 0x00, //SETDISPLAY
davidprentice 0:b608c7f02f80 2645 // 0xB3, 4, 0x00, 0x01, 0x06, 0x01, //SETGRAM simple example
davidprentice 0:b608c7f02f80 2646 0xB3, 4, 0x00, 0x01, 0x06, 0x30, //jpegs example
davidprentice 0:b608c7f02f80 2647 };
davidprentice 0:b608c7f02f80 2648 table8_ads = ILI9481_regValues, table_size = sizeof(ILI9481_regValues);
davidprentice 0:b608c7f02f80 2649 // table8_ads = ILI9481_CPT29_regValues, table_size = sizeof(ILI9481_CPT29_regValues);
davidprentice 0:b608c7f02f80 2650 // table8_ads = ILI9481_PVI35_regValues, table_size = sizeof(ILI9481_PVI35_regValues);
davidprentice 0:b608c7f02f80 2651 // table8_ads = ILI9481_AUO317_regValues, table_size = sizeof(ILI9481_AUO317_regValues);
davidprentice 0:b608c7f02f80 2652 // table8_ads = ILI9481_CMO35_regValues, table_size = sizeof(ILI9481_CMO35_regValues);
davidprentice 0:b608c7f02f80 2653 // table8_ads = ILI9481_RGB_regValues, table_size = sizeof(ILI9481_RGB_regValues);
davidprentice 0:b608c7f02f80 2654 p16 = (int16_t *) & HEIGHT;
davidprentice 0:b608c7f02f80 2655 *p16 = 480;
davidprentice 0:b608c7f02f80 2656 p16 = (int16_t *) & WIDTH;
davidprentice 0:b608c7f02f80 2657 *p16 = 320;
davidprentice 0:b608c7f02f80 2658 break;
davidprentice 0:b608c7f02f80 2659 case 0x9486:
davidprentice 0:b608c7f02f80 2660 _lcd_capable = AUTO_READINC | MIPI_DCS_REV1 | MV_AXIS; //Red 3.5", Blue 3.5"
davidprentice 0:b608c7f02f80 2661 // _lcd_capable = AUTO_READINC | MIPI_DCS_REV1 | MV_AXIS | REV_SCREEN; //old Red 3.5"
davidprentice 0:b608c7f02f80 2662 static const uint8_t ILI9486_regValues[] PROGMEM = {
davidprentice 0:b608c7f02f80 2663 /*
davidprentice 0:b608c7f02f80 2664 0xF2, 9, 0x1C, 0xA3, 0x32, 0x02, 0xB2, 0x12, 0xFF, 0x12, 0x00, //f.k
davidprentice 0:b608c7f02f80 2665 0xF1, 2, 0x36, 0xA4, //
davidprentice 0:b608c7f02f80 2666 0xF8, 2, 0x21, 0x04, //
davidprentice 0:b608c7f02f80 2667 0xF9, 2, 0x00, 0x08, //
davidprentice 0:b608c7f02f80 2668 */
davidprentice 0:b608c7f02f80 2669 0xC0, 2, 0x0d, 0x0d, //Power Control 1 [0E 0E]
davidprentice 0:b608c7f02f80 2670 0xC1, 2, 0x43, 0x00, //Power Control 2 [43 00]
davidprentice 0:b608c7f02f80 2671 0xC2, 1, 0x00, //Power Control 3 [33]
davidprentice 0:b608c7f02f80 2672 0xC5, 4, 0x00, 0x48, 0x00, 0x48, //VCOM Control 1 [00 40 00 40]
davidprentice 0:b608c7f02f80 2673 0xB4, 1, 0x00, //Inversion Control [00]
davidprentice 0:b608c7f02f80 2674 0xB6, 3, 0x02, 0x02, 0x3B, // Display Function Control [02 02 3B]
davidprentice 0:b608c7f02f80 2675 #define GAMMA9486 4
davidprentice 0:b608c7f02f80 2676 #if GAMMA9486 == 0
davidprentice 0:b608c7f02f80 2677 // default GAMMA terrible
davidprentice 0:b608c7f02f80 2678 #elif GAMMA9486 == 1
davidprentice 0:b608c7f02f80 2679 // GAMMA f.k. bad
davidprentice 0:b608c7f02f80 2680 0xE0, 15, 0x0f, 0x31, 0x2b, 0x0c, 0x0e, 0x08, 0x4e, 0xf1, 0x37, 0x07, 0x10, 0x03, 0x0e, 0x09, 0x00,
davidprentice 0:b608c7f02f80 2681 0xE1, 15, 0x00, 0x0e, 0x14, 0x03, 0x11, 0x07, 0x31, 0xC1, 0x48, 0x08, 0x0f, 0x0c, 0x31, 0x36, 0x0f,
davidprentice 0:b608c7f02f80 2682 #elif GAMMA9486 == 2
davidprentice 0:b608c7f02f80 2683 // 1.2 CPT 3.5 Inch Initial Code not bad
davidprentice 0:b608c7f02f80 2684 0xE0, 15, 0x0F, 0x1B, 0x18, 0x0B, 0x0E, 0x09, 0x47, 0x94, 0x35, 0x0A, 0x13, 0x05, 0x08, 0x03, 0x00,
davidprentice 0:b608c7f02f80 2685 0xE1, 15, 0x0F, 0x3A, 0x37, 0x0B, 0x0C, 0x05, 0x4A, 0x24, 0x39, 0x07, 0x10, 0x04, 0x27, 0x25, 0x00,
davidprentice 0:b608c7f02f80 2686 #elif GAMMA9486 == 3
davidprentice 0:b608c7f02f80 2687 // 2.2 HSD 3.5 Inch Initial Code not bad
davidprentice 0:b608c7f02f80 2688 0xE0, 15, 0x0F, 0x1F, 0x1C, 0x0C, 0x0F, 0x08, 0x48, 0x98, 0x37, 0x0A, 0x13, 0x04, 0x11, 0x0D, 0x00,
davidprentice 0:b608c7f02f80 2689 0xE1, 15, 0x0F, 0x32, 0x2E, 0x0B, 0x0D, 0x05, 0x47, 0x75, 0x37, 0x06, 0x10, 0x03, 0x24, 0x20, 0x00,
davidprentice 0:b608c7f02f80 2690 #elif GAMMA9486 == 4
davidprentice 0:b608c7f02f80 2691 // 3.2 TM 3.2 Inch Initial Code not bad
davidprentice 0:b608c7f02f80 2692 0xE0, 15, 0x0F, 0x21, 0x1C, 0x0B, 0x0E, 0x08, 0x49, 0x98, 0x38, 0x09, 0x11, 0x03, 0x14, 0x10, 0x00,
davidprentice 0:b608c7f02f80 2693 0xE1, 15, 0x0F, 0x2F, 0x2B, 0x0C, 0x0E, 0x06, 0x47, 0x76, 0x37, 0x07, 0x11, 0x04, 0x23, 0x1E, 0x00,
davidprentice 0:b608c7f02f80 2694 #elif GAMMA9486 == 5
davidprentice 0:b608c7f02f80 2695 // 4.2 WTK 3.5 Inch Initial Code too white
davidprentice 0:b608c7f02f80 2696 0xE0, 15, 0x0F, 0x10, 0x08, 0x05, 0x09, 0x05, 0x37, 0x98, 0x26, 0x07, 0x0F, 0x02, 0x09, 0x07, 0x00,
davidprentice 0:b608c7f02f80 2697 0xE1, 15, 0x0F, 0x38, 0x36, 0x0D, 0x10, 0x08, 0x59, 0x76, 0x48, 0x0A, 0x16, 0x0A, 0x37, 0x2F, 0x00,
davidprentice 0:b608c7f02f80 2698 #endif
davidprentice 0:b608c7f02f80 2699 };
davidprentice 0:b608c7f02f80 2700 table8_ads = ILI9486_regValues, table_size = sizeof(ILI9486_regValues);
davidprentice 0:b608c7f02f80 2701 p16 = (int16_t *) & HEIGHT;
davidprentice 0:b608c7f02f80 2702 *p16 = 480;
davidprentice 0:b608c7f02f80 2703 p16 = (int16_t *) & WIDTH;
davidprentice 0:b608c7f02f80 2704 *p16 = 320;
davidprentice 0:b608c7f02f80 2705 break;
davidprentice 0:b608c7f02f80 2706 case 0x7796:
davidprentice 0:b608c7f02f80 2707 _lcd_capable = AUTO_READINC | MIPI_DCS_REV1 | MV_AXIS; //thanks to safari1
davidprentice 0:b608c7f02f80 2708 goto common_9488;
davidprentice 0:b608c7f02f80 2709 case 0x9487: //with thanks to Charlyf
davidprentice 0:b608c7f02f80 2710 case 0x9488:
davidprentice 0:b608c7f02f80 2711 _lcd_capable = AUTO_READINC | MIPI_DCS_REV1 | MV_AXIS | READ_24BITS;
davidprentice 0:b608c7f02f80 2712 common_9488:
davidprentice 0:b608c7f02f80 2713 static const uint8_t ILI9488_regValues_max[] PROGMEM = { // Atmel MaxTouch
davidprentice 0:b608c7f02f80 2714 0xC0, 2, 0x10, 0x10, //Power Control 1 [0E 0E]
davidprentice 0:b608c7f02f80 2715 0xC1, 1, 0x41, //Power Control 2 [43]
davidprentice 0:b608c7f02f80 2716 0xC5, 4, 0x00, 0x22, 0x80, 0x40, //VCOM Control 1 [00 40 00 40]
davidprentice 0:b608c7f02f80 2717 0x36, 1, 0x68, //Memory Access [00]
davidprentice 0:b608c7f02f80 2718 0xB0, 1, 0x00, //Interface [00]
davidprentice 0:b608c7f02f80 2719 0xB1, 2, 0xB0, 0x11, //Frame Rate Control [B0 11]
davidprentice 0:b608c7f02f80 2720 0xB4, 1, 0x02, //Inversion Control [02]
davidprentice 0:b608c7f02f80 2721 0xB6, 3, 0x02, 0x02, 0x3B, // Display Function Control [02 02 3B] .kbv NL=480
davidprentice 0:b608c7f02f80 2722 0xB7, 1, 0xC6, //Entry Mode [06]
davidprentice 0:b608c7f02f80 2723 0x3A, 1, 0x55, //Interlace Pixel Format [XX]
davidprentice 0:b608c7f02f80 2724 0xF7, 4, 0xA9, 0x51, 0x2C, 0x82, //Adjustment Control 3 [A9 51 2C 82]
davidprentice 0:b608c7f02f80 2725 };
davidprentice 0:b608c7f02f80 2726 table8_ads = ILI9488_regValues_max, table_size = sizeof(ILI9488_regValues_max);
davidprentice 0:b608c7f02f80 2727 p16 = (int16_t *) & HEIGHT;
davidprentice 0:b608c7f02f80 2728 *p16 = 480;
davidprentice 0:b608c7f02f80 2729 p16 = (int16_t *) & WIDTH;
davidprentice 0:b608c7f02f80 2730 *p16 = 320;
davidprentice 0:b608c7f02f80 2731 break;
davidprentice 0:b608c7f02f80 2732 case 0xB505: //R61505V
davidprentice 0:b608c7f02f80 2733 case 0xC505: //R61505W
davidprentice 0:b608c7f02f80 2734 _lcd_capable = 0 | REV_SCREEN | READ_LOWHIGH;
davidprentice 0:b608c7f02f80 2735 static const uint16_t R61505V_regValues[] PROGMEM = {
davidprentice 0:b608c7f02f80 2736 0x0000, 0x0000,
davidprentice 0:b608c7f02f80 2737 0x0000, 0x0000,
davidprentice 0:b608c7f02f80 2738 0x0000, 0x0000,
davidprentice 0:b608c7f02f80 2739 0x0000, 0x0001,
davidprentice 0:b608c7f02f80 2740 0x00A4, 0x0001, //CALB=1
davidprentice 0:b608c7f02f80 2741 TFTLCD_DELAY, 10,
davidprentice 0:b608c7f02f80 2742 0x0060, 0x2700, //NL
davidprentice 0:b608c7f02f80 2743 0x0008, 0x0808, //FP & BP
davidprentice 0:b608c7f02f80 2744 0x0030, 0x0214, //Gamma settings
davidprentice 0:b608c7f02f80 2745 0x0031, 0x3715,
davidprentice 0:b608c7f02f80 2746 0x0032, 0x0604,
davidprentice 0:b608c7f02f80 2747 0x0033, 0x0E16,
davidprentice 0:b608c7f02f80 2748 0x0034, 0x2211,
davidprentice 0:b608c7f02f80 2749 0x0035, 0x1500,
davidprentice 0:b608c7f02f80 2750 0x0036, 0x8507,
davidprentice 0:b608c7f02f80 2751 0x0037, 0x1407,
davidprentice 0:b608c7f02f80 2752 0x0038, 0x1403,
davidprentice 0:b608c7f02f80 2753 0x0039, 0x0020,
davidprentice 0:b608c7f02f80 2754 0x0090, 0x0015, //DIVI & RTNI
davidprentice 0:b608c7f02f80 2755 0x0010, 0x0410, //BT=4,AP=1
davidprentice 0:b608c7f02f80 2756 0x0011, 0x0237, //DC1=2,DC0=3, VC=7
davidprentice 0:b608c7f02f80 2757 0x0029, 0x0046, //VCM1=70
davidprentice 0:b608c7f02f80 2758 0x002A, 0x0046, //VCMSEL=0,VCM2=70
davidprentice 0:b608c7f02f80 2759 // Sleep mode IN sequence
davidprentice 0:b608c7f02f80 2760 0x0007, 0x0000,
davidprentice 0:b608c7f02f80 2761 //0x0012, 0x0000, //PSON=0,PON=0
davidprentice 0:b608c7f02f80 2762 // Sleep mode EXIT sequence
davidprentice 0:b608c7f02f80 2763 0x0012, 0x0189, //VCMR=1,PSON=0,PON=0,VRH=9
davidprentice 0:b608c7f02f80 2764 0x0013, 0x1100, //VDV=17
davidprentice 0:b608c7f02f80 2765 TFTLCD_DELAY, 150,
davidprentice 0:b608c7f02f80 2766 0x0012, 0x01B9, //VCMR=1,PSON=1,PON=1,VRH=9 [018F]
davidprentice 0:b608c7f02f80 2767 0x0001, 0x0100, //SS=1 Other mode settings
davidprentice 0:b608c7f02f80 2768 0x0002, 0x0200, //BC0=1--Line inversion
davidprentice 0:b608c7f02f80 2769 0x0003, 0x1030,
davidprentice 0:b608c7f02f80 2770 0x0009, 0x0001, //ISC=1 [0000]
davidprentice 0:b608c7f02f80 2771 0x000A, 0x0000, // [0000]
davidprentice 0:b608c7f02f80 2772 // 0x000C, 0x0001, //RIM=1 [0000]
davidprentice 0:b608c7f02f80 2773 0x000D, 0x0000, // [0000]
davidprentice 0:b608c7f02f80 2774 0x000E, 0x0030, //VEM=3 VCOM equalize [0000]
davidprentice 0:b608c7f02f80 2775 0x0061, 0x0001,
davidprentice 0:b608c7f02f80 2776 0x006A, 0x0000,
davidprentice 0:b608c7f02f80 2777 0x0080, 0x0000,
davidprentice 0:b608c7f02f80 2778 0x0081, 0x0000,
davidprentice 0:b608c7f02f80 2779 0x0082, 0x005F,
davidprentice 0:b608c7f02f80 2780 0x0092, 0x0100,
davidprentice 0:b608c7f02f80 2781 0x0093, 0x0701,
davidprentice 0:b608c7f02f80 2782 TFTLCD_DELAY, 80,
davidprentice 0:b608c7f02f80 2783 0x0007, 0x0100, //BASEE=1--Display On
davidprentice 0:b608c7f02f80 2784 };
davidprentice 0:b608c7f02f80 2785 init_table16(R61505V_regValues, sizeof(R61505V_regValues));
davidprentice 0:b608c7f02f80 2786 break;
davidprentice 0:b608c7f02f80 2787
davidprentice 0:b608c7f02f80 2788 #if defined(SUPPORT_B509_7793)
davidprentice 0:b608c7f02f80 2789 case 0x7793:
davidprentice 0:b608c7f02f80 2790 case 0xB509:
davidprentice 0:b608c7f02f80 2791 _lcd_capable = REV_SCREEN;
davidprentice 0:b608c7f02f80 2792 static const uint16_t R61509V_regValues[] PROGMEM = {
davidprentice 0:b608c7f02f80 2793 0x0000, 0x0000,
davidprentice 0:b608c7f02f80 2794 0x0000, 0x0000,
davidprentice 0:b608c7f02f80 2795 0x0000, 0x0000,
davidprentice 0:b608c7f02f80 2796 0x0000, 0x0000,
davidprentice 0:b608c7f02f80 2797 TFTLCD_DELAY, 15,
davidprentice 0:b608c7f02f80 2798 0x0400, 0x6200, //NL=0x31 (49) i.e. 400 rows
davidprentice 0:b608c7f02f80 2799 0x0008, 0x0808,
davidprentice 0:b608c7f02f80 2800 //gamma
davidprentice 0:b608c7f02f80 2801 0x0300, 0x0C00,
davidprentice 0:b608c7f02f80 2802 0x0301, 0x5A0B,
davidprentice 0:b608c7f02f80 2803 0x0302, 0x0906,
davidprentice 0:b608c7f02f80 2804 0x0303, 0x1017,
davidprentice 0:b608c7f02f80 2805 0x0304, 0x2300,
davidprentice 0:b608c7f02f80 2806 0x0305, 0x1700,
davidprentice 0:b608c7f02f80 2807 0x0306, 0x6309,
davidprentice 0:b608c7f02f80 2808 0x0307, 0x0C09,
davidprentice 0:b608c7f02f80 2809 0x0308, 0x100C,
davidprentice 0:b608c7f02f80 2810 0x0309, 0x2232,
davidprentice 0:b608c7f02f80 2811
davidprentice 0:b608c7f02f80 2812 0x0010, 0x0016, //69.5Hz 0016
davidprentice 0:b608c7f02f80 2813 0x0011, 0x0101,
davidprentice 0:b608c7f02f80 2814 0x0012, 0x0000,
davidprentice 0:b608c7f02f80 2815 0x0013, 0x0001,
davidprentice 0:b608c7f02f80 2816
davidprentice 0:b608c7f02f80 2817 0x0100, 0x0330, //BT,AP
davidprentice 0:b608c7f02f80 2818 0x0101, 0x0237, //DC0,DC1,VC
davidprentice 0:b608c7f02f80 2819 0x0103, 0x0D00, //VDV
davidprentice 0:b608c7f02f80 2820 0x0280, 0x6100, //VCM
davidprentice 0:b608c7f02f80 2821 0x0102, 0xC1B0, //VRH,VCMR,PSON,PON
davidprentice 0:b608c7f02f80 2822 TFTLCD_DELAY, 50,
davidprentice 0:b608c7f02f80 2823
davidprentice 0:b608c7f02f80 2824 0x0001, 0x0100,
davidprentice 0:b608c7f02f80 2825 0x0002, 0x0100,
davidprentice 0:b608c7f02f80 2826 0x0003, 0x1030, //1030
davidprentice 0:b608c7f02f80 2827 0x0009, 0x0001,
davidprentice 0:b608c7f02f80 2828 0x000C, 0x0000,
davidprentice 0:b608c7f02f80 2829 0x0090, 0x8000,
davidprentice 0:b608c7f02f80 2830 0x000F, 0x0000,
davidprentice 0:b608c7f02f80 2831
davidprentice 0:b608c7f02f80 2832 0x0210, 0x0000,
davidprentice 0:b608c7f02f80 2833 0x0211, 0x00EF,
davidprentice 0:b608c7f02f80 2834 0x0212, 0x0000,
davidprentice 0:b608c7f02f80 2835 0x0213, 0x018F, //432=01AF,400=018F
davidprentice 0:b608c7f02f80 2836 0x0500, 0x0000,
davidprentice 0:b608c7f02f80 2837 0x0501, 0x0000,
davidprentice 0:b608c7f02f80 2838 0x0502, 0x005F, //???
davidprentice 0:b608c7f02f80 2839 0x0401, 0x0001, //REV=1
davidprentice 0:b608c7f02f80 2840 0x0404, 0x0000,
davidprentice 0:b608c7f02f80 2841 TFTLCD_DELAY, 50,
davidprentice 0:b608c7f02f80 2842
davidprentice 0:b608c7f02f80 2843 0x0007, 0x0100, //BASEE
davidprentice 0:b608c7f02f80 2844 TFTLCD_DELAY, 50,
davidprentice 0:b608c7f02f80 2845
davidprentice 0:b608c7f02f80 2846 0x0200, 0x0000,
davidprentice 0:b608c7f02f80 2847 0x0201, 0x0000,
davidprentice 0:b608c7f02f80 2848 };
davidprentice 0:b608c7f02f80 2849 init_table16(R61509V_regValues, sizeof(R61509V_regValues));
davidprentice 0:b608c7f02f80 2850 p16 = (int16_t *) & HEIGHT;
davidprentice 0:b608c7f02f80 2851 *p16 = 400;
davidprentice 0:b608c7f02f80 2852 break;
davidprentice 0:b608c7f02f80 2853 #endif
davidprentice 0:b608c7f02f80 2854
davidprentice 0:b608c7f02f80 2855 #ifdef SUPPORT_9806
davidprentice 0:b608c7f02f80 2856 case 0x9806:
davidprentice 0:b608c7f02f80 2857 _lcd_capable = AUTO_READINC | MIPI_DCS_REV1 | MV_AXIS | READ_24BITS;
davidprentice 0:b608c7f02f80 2858 // from ZinggJM
davidprentice 0:b608c7f02f80 2859 static const uint8_t ILI9806_regValues[] PROGMEM = {
davidprentice 0:b608c7f02f80 2860 (0xFF), 3, /* EXTC Command Set enable register*/ 0xFF, 0x98, 0x06,
davidprentice 0:b608c7f02f80 2861 (0xBA), 1, /* SPI Interface Setting*/0xE0,
davidprentice 0:b608c7f02f80 2862 (0xBC), 21, /* GIP 1*/0x03, 0x0F, 0x63, 0x69, 0x01, 0x01, 0x1B, 0x11, 0x70, 0x73, 0xFF, 0xFF, 0x08, 0x09, 0x05, 0x00, 0xEE, 0xE2, 0x01, 0x00, 0xC1,
davidprentice 0:b608c7f02f80 2863 (0xBD), 8, /* GIP 2*/0x01, 0x23, 0x45, 0x67, 0x01, 0x23, 0x45, 0x67,
davidprentice 0:b608c7f02f80 2864 (0xBE), 9, /* GIP 3*/0x00, 0x22, 0x27, 0x6A, 0xBC, 0xD8, 0x92, 0x22, 0x22,
davidprentice 0:b608c7f02f80 2865 (0xC7), 1, /* Vcom*/0x1E,
davidprentice 0:b608c7f02f80 2866 (0xED), 3, /* EN_volt_reg*/0x7F, 0x0F, 0x00,
davidprentice 0:b608c7f02f80 2867 (0xC0), 3, /* Power Control 1*/0xE3, 0x0B, 0x00,
davidprentice 0:b608c7f02f80 2868 (0xFC), 1, 0x08,
davidprentice 0:b608c7f02f80 2869 (0xDF), 6, /* Engineering Setting*/0x00, 0x00, 0x00, 0x00, 0x00, 0x02,
davidprentice 0:b608c7f02f80 2870 (0xF3), 1, /* DVDD Voltage Setting*/0x74,
davidprentice 0:b608c7f02f80 2871 (0xB4), 3, /* Display Inversion Control*/0x00, 0x00, 0x00,
davidprentice 0:b608c7f02f80 2872 (0xF7), 1, /* 480x854*/0x81,
davidprentice 0:b608c7f02f80 2873 (0xB1), 3, /* Frame Rate*/0x00, 0x10, 0x14,
davidprentice 0:b608c7f02f80 2874 (0xF1), 3, /* Panel Timing Control*/0x29, 0x8A, 0x07,
davidprentice 0:b608c7f02f80 2875 (0xF2), 4, /*Panel Timing Control*/0x40, 0xD2, 0x50, 0x28,
davidprentice 0:b608c7f02f80 2876 (0xC1), 4, /* Power Control 2*/0x17, 0x85, 0x85, 0x20,
davidprentice 0:b608c7f02f80 2877 (0xE0), 16, 0x00, 0x0C, 0x15, 0x0D, 0x0F, 0x0C, 0x07, 0x05, 0x07, 0x0B, 0x10, 0x10, 0x0D, 0x17, 0x0F, 0x00,
davidprentice 0:b608c7f02f80 2878 (0xE1), 16, 0x00, 0x0D, 0x15, 0x0E, 0x10, 0x0D, 0x08, 0x06, 0x07, 0x0C, 0x11, 0x11, 0x0E, 0x17, 0x0F, 0x00,
davidprentice 0:b608c7f02f80 2879 (0x35), 1, /*Tearing Effect ON*/0x00,
davidprentice 0:b608c7f02f80 2880 };
davidprentice 0:b608c7f02f80 2881 table8_ads = ILI9806_regValues, table_size = sizeof(ILI9806_regValues);
davidprentice 0:b608c7f02f80 2882 p16 = (int16_t *) & HEIGHT;
davidprentice 0:b608c7f02f80 2883 *p16 = 480;
davidprentice 0:b608c7f02f80 2884 p16 = (int16_t *) & WIDTH;
davidprentice 0:b608c7f02f80 2885 *p16 = 854;
davidprentice 0:b608c7f02f80 2886 break;
davidprentice 0:b608c7f02f80 2887 #endif
davidprentice 0:b608c7f02f80 2888 default:
davidprentice 0:b608c7f02f80 2889 p16 = (int16_t *) & WIDTH;
davidprentice 0:b608c7f02f80 2890 *p16 = 0; //error value for WIDTH
davidprentice 0:b608c7f02f80 2891 break;
davidprentice 0:b608c7f02f80 2892 }
davidprentice 0:b608c7f02f80 2893 _lcd_rev = ((_lcd_capable & REV_SCREEN) != 0);
davidprentice 0:b608c7f02f80 2894 if (table8_ads != NULL) {
davidprentice 0:b608c7f02f80 2895 static const uint8_t reset_off[] PROGMEM = {
davidprentice 0:b608c7f02f80 2896 0x01, 0, //Soft Reset
davidprentice 0:b608c7f02f80 2897 TFTLCD_DELAY8, 150, // .kbv will power up with ONLY reset, sleep out, display on
davidprentice 0:b608c7f02f80 2898 0x28, 0, //Display Off
davidprentice 0:b608c7f02f80 2899 0x3A, 1, 0x55, //Pixel read=565, write=565.
davidprentice 0:b608c7f02f80 2900 };
davidprentice 0:b608c7f02f80 2901 static const uint8_t wake_on[] PROGMEM = {
davidprentice 0:b608c7f02f80 2902 0x11, 0, //Sleep Out
davidprentice 0:b608c7f02f80 2903 TFTLCD_DELAY8, 150,
davidprentice 0:b608c7f02f80 2904 0x29, 0, //Display On
davidprentice 0:b608c7f02f80 2905 };
davidprentice 0:b608c7f02f80 2906 init_table(&reset_off, sizeof(reset_off));
davidprentice 0:b608c7f02f80 2907 init_table(table8_ads, table_size); //can change PIXFMT
davidprentice 0:b608c7f02f80 2908 init_table(&wake_on, sizeof(wake_on));
davidprentice 0:b608c7f02f80 2909 }
davidprentice 0:b608c7f02f80 2910 setRotation(0); //PORTRAIT
davidprentice 0:b608c7f02f80 2911 invertDisplay(false);
davidprentice 0:b608c7f02f80 2912 #if defined(SUPPORT_9488_555)
davidprentice 0:b608c7f02f80 2913 if (_lcd_ID == 0x9488) {
davidprentice 0:b608c7f02f80 2914 is555 = 0;
davidprentice 0:b608c7f02f80 2915 drawPixel(0, 0, 0xFFE0);
davidprentice 0:b608c7f02f80 2916 if (readPixel(0, 0) == 0xFF1F) {
davidprentice 0:b608c7f02f80 2917 uint8_t pixfmt = 0x06;
davidprentice 0:b608c7f02f80 2918 pushCommand(0x3A, &pixfmt, 1);
davidprentice 0:b608c7f02f80 2919 _lcd_capable &= ~READ_24BITS;
davidprentice 0:b608c7f02f80 2920 is555 = 1;
davidprentice 0:b608c7f02f80 2921 }
davidprentice 0:b608c7f02f80 2922 }
davidprentice 0:b608c7f02f80 2923 #endif
davidprentice 0:b608c7f02f80 2924 }