This is the final version of Mini Gateway for Automation and Security desgined for Renesas GR Peach Design Contest

Dependencies:   GR-PEACH_video GraphicsFramework HTTPServer R_BSP mbed-rpc mbed-rtos Socket lwip-eth lwip-sys lwip FATFileSystem

Fork of mbed-os-example-mbed5-blinky by mbed-os-examples

Committer:
vipinranka
Date:
Wed Jan 11 11:41:30 2017 +0000
Revision:
12:9a20164dcc47
This is the final version MGAS Project for Renesas GR Peach Design Contest

Who changed what in which revision?

UserRevisionLine numberNew contents of line
vipinranka 12:9a20164dcc47 1 /* mbed UniGraphic library - universal TFT driver class
vipinranka 12:9a20164dcc47 2 * Copyright (c) 2015 Giuliano Dianda
vipinranka 12:9a20164dcc47 3 * Released under the MIT License: http://mbed.org/license/mit
vipinranka 12:9a20164dcc47 4 *
vipinranka 12:9a20164dcc47 5 * Derived work of:
vipinranka 12:9a20164dcc47 6 *
vipinranka 12:9a20164dcc47 7 * mbed library for 240*320 pixel display TFT based on ILI9341 LCD Controller
vipinranka 12:9a20164dcc47 8 * Copyright (c) 2013 Peter Drescher - DC2PD
vipinranka 12:9a20164dcc47 9 *
vipinranka 12:9a20164dcc47 10 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
vipinranka 12:9a20164dcc47 11 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
vipinranka 12:9a20164dcc47 12 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
vipinranka 12:9a20164dcc47 13 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
vipinranka 12:9a20164dcc47 14 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
vipinranka 12:9a20164dcc47 15 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
vipinranka 12:9a20164dcc47 16 * THE SOFTWARE.
vipinranka 12:9a20164dcc47 17 */
vipinranka 12:9a20164dcc47 18
vipinranka 12:9a20164dcc47 19 #include "TFT.h"
vipinranka 12:9a20164dcc47 20
vipinranka 12:9a20164dcc47 21 //#include "mbed_debug.h"
vipinranka 12:9a20164dcc47 22
vipinranka 12:9a20164dcc47 23 #define SWAP(a, b) { a ^= b; b ^= a; a ^= b; }
vipinranka 12:9a20164dcc47 24
vipinranka 12:9a20164dcc47 25 #if DEVICE_PORTINOUT
vipinranka 12:9a20164dcc47 26 TFT::TFT(proto_t displayproto, PortName port, PinName CS, PinName reset, PinName DC, PinName WR, PinName RD, const int lcdsize_x, const int lcdsize_y, const char *name)
vipinranka 12:9a20164dcc47 27 : GraphicsDisplay(name), screensize_X(lcdsize_x), screensize_Y(lcdsize_y)
vipinranka 12:9a20164dcc47 28 {
vipinranka 12:9a20164dcc47 29 if(displayproto==PAR_8) proto = new PAR8(port, CS, reset, DC, WR, RD);
vipinranka 12:9a20164dcc47 30 else if(displayproto==PAR_16) proto = new PAR16(port, CS, reset, DC, WR, RD);
vipinranka 12:9a20164dcc47 31 useNOP=false;
vipinranka 12:9a20164dcc47 32 scrollbugfix=0;
vipinranka 12:9a20164dcc47 33 mipistd=false;
vipinranka 12:9a20164dcc47 34 set_orientation(0);
vipinranka 12:9a20164dcc47 35 foreground(White);
vipinranka 12:9a20164dcc47 36 background(Black);
vipinranka 12:9a20164dcc47 37 set_auto_up(false); //we don't have framebuffer
vipinranka 12:9a20164dcc47 38 topfixedareasize=0;
vipinranka 12:9a20164dcc47 39 scrollareasize=0;
vipinranka 12:9a20164dcc47 40 usefastwindow=true;
vipinranka 12:9a20164dcc47 41 fastwindowready=false;
vipinranka 12:9a20164dcc47 42 is18bit=true;
vipinranka 12:9a20164dcc47 43 isBGR=true;
vipinranka 12:9a20164dcc47 44 // cls();
vipinranka 12:9a20164dcc47 45 // locate(0,0);
vipinranka 12:9a20164dcc47 46 }
vipinranka 12:9a20164dcc47 47 #endif
vipinranka 12:9a20164dcc47 48
vipinranka 12:9a20164dcc47 49 TFT::TFT(proto_t displayproto, PinName* buspins, PinName CS, PinName reset, PinName DC, PinName WR, PinName RD, const int lcdsize_x, const int lcdsize_y, const char *name)
vipinranka 12:9a20164dcc47 50 : GraphicsDisplay(name), screensize_X(lcdsize_x), screensize_Y(lcdsize_y)
vipinranka 12:9a20164dcc47 51 {
vipinranka 12:9a20164dcc47 52 if(displayproto==BUS_8)
vipinranka 12:9a20164dcc47 53 {
vipinranka 12:9a20164dcc47 54 PinName pins[16];
vipinranka 12:9a20164dcc47 55 for(int i=0; i<16; i++) pins[i]=NC;
vipinranka 12:9a20164dcc47 56 for(int i=0; i<8; i++) pins[i]=buspins[i];
vipinranka 12:9a20164dcc47 57 proto = new BUS8(pins, CS, reset, DC, WR, RD);
vipinranka 12:9a20164dcc47 58 }
vipinranka 12:9a20164dcc47 59 else if(displayproto==BUS_16)
vipinranka 12:9a20164dcc47 60 {
vipinranka 12:9a20164dcc47 61 proto = new BUS16(buspins, CS, reset, DC, WR, RD);
vipinranka 12:9a20164dcc47 62 }
vipinranka 12:9a20164dcc47 63 useNOP=false;
vipinranka 12:9a20164dcc47 64 scrollbugfix=0;
vipinranka 12:9a20164dcc47 65 mipistd=false;
vipinranka 12:9a20164dcc47 66 set_orientation(0);
vipinranka 12:9a20164dcc47 67 foreground(White);
vipinranka 12:9a20164dcc47 68 background(Black);
vipinranka 12:9a20164dcc47 69 set_auto_up(false); //we don't have framebuffer
vipinranka 12:9a20164dcc47 70 topfixedareasize=0;
vipinranka 12:9a20164dcc47 71 scrollareasize=0;
vipinranka 12:9a20164dcc47 72 usefastwindow=false;
vipinranka 12:9a20164dcc47 73 fastwindowready=false;
vipinranka 12:9a20164dcc47 74 is18bit=false;
vipinranka 12:9a20164dcc47 75 isBGR=false;
vipinranka 12:9a20164dcc47 76 // cls();
vipinranka 12:9a20164dcc47 77 // locate(0,0);
vipinranka 12:9a20164dcc47 78 }
vipinranka 12:9a20164dcc47 79 TFT::TFT(proto_t displayproto, int Hz, PinName mosi, PinName miso, PinName sclk, PinName CS, PinName reset, PinName DC, const int lcdsize_x, const int lcdsize_y, const char *name)
vipinranka 12:9a20164dcc47 80 : GraphicsDisplay(name), screensize_X(lcdsize_x), screensize_Y(lcdsize_y)
vipinranka 12:9a20164dcc47 81 {
vipinranka 12:9a20164dcc47 82 if(displayproto==SPI_8)
vipinranka 12:9a20164dcc47 83 {
vipinranka 12:9a20164dcc47 84 proto = new SPI8(Hz, mosi, miso, sclk, CS, reset, DC);
vipinranka 12:9a20164dcc47 85 useNOP=false;
vipinranka 12:9a20164dcc47 86 }
vipinranka 12:9a20164dcc47 87 else if(displayproto==SPI_16)
vipinranka 12:9a20164dcc47 88 {
vipinranka 12:9a20164dcc47 89 proto = new SPI16(Hz, mosi, miso, sclk, CS, reset, DC);
vipinranka 12:9a20164dcc47 90 useNOP=true;
vipinranka 12:9a20164dcc47 91 }
vipinranka 12:9a20164dcc47 92 scrollbugfix=0;
vipinranka 12:9a20164dcc47 93 mipistd=false;
vipinranka 12:9a20164dcc47 94 set_orientation(0);
vipinranka 12:9a20164dcc47 95 foreground(White);
vipinranka 12:9a20164dcc47 96 background(Black);
vipinranka 12:9a20164dcc47 97 set_auto_up(false);
vipinranka 12:9a20164dcc47 98 topfixedareasize=0;
vipinranka 12:9a20164dcc47 99 scrollareasize=0;
vipinranka 12:9a20164dcc47 100 usefastwindow=false;
vipinranka 12:9a20164dcc47 101 fastwindowready=false;
vipinranka 12:9a20164dcc47 102 is18bit=false;
vipinranka 12:9a20164dcc47 103 isBGR=true;
vipinranka 12:9a20164dcc47 104 // locate(0,0);
vipinranka 12:9a20164dcc47 105 }
vipinranka 12:9a20164dcc47 106 void TFT::wr_cmd8(unsigned char cmd)
vipinranka 12:9a20164dcc47 107 {
vipinranka 12:9a20164dcc47 108 if(useNOP) proto->wr_cmd16(cmd); // 0x0000|cmd, 00 is NOP cmd for TFT
vipinranka 12:9a20164dcc47 109 else proto->wr_cmd8(cmd);
vipinranka 12:9a20164dcc47 110 }
vipinranka 12:9a20164dcc47 111 void TFT::wr_data8(unsigned char data)
vipinranka 12:9a20164dcc47 112 {
vipinranka 12:9a20164dcc47 113 proto->wr_data8(data);
vipinranka 12:9a20164dcc47 114 }
vipinranka 12:9a20164dcc47 115 void TFT::wr_data16(unsigned short data)
vipinranka 12:9a20164dcc47 116 {
vipinranka 12:9a20164dcc47 117 proto->wr_data16(data);
vipinranka 12:9a20164dcc47 118 }
vipinranka 12:9a20164dcc47 119 void TFT::wr_gram(unsigned short data)
vipinranka 12:9a20164dcc47 120 {
vipinranka 12:9a20164dcc47 121 proto->wr_gram(data);
vipinranka 12:9a20164dcc47 122 }
vipinranka 12:9a20164dcc47 123 void TFT::wr_gram(unsigned short data, unsigned int count)
vipinranka 12:9a20164dcc47 124 {
vipinranka 12:9a20164dcc47 125 proto->wr_gram(data, count);
vipinranka 12:9a20164dcc47 126 }
vipinranka 12:9a20164dcc47 127 void TFT::wr_grambuf(unsigned short* data, unsigned int lenght)
vipinranka 12:9a20164dcc47 128 {
vipinranka 12:9a20164dcc47 129 proto->wr_grambuf(data, lenght);
vipinranka 12:9a20164dcc47 130 }
vipinranka 12:9a20164dcc47 131 unsigned short TFT::rd_gram()
vipinranka 12:9a20164dcc47 132 {
vipinranka 12:9a20164dcc47 133 return proto->rd_gram(is18bit); // protocol will handle 18to16 bit conversion
vipinranka 12:9a20164dcc47 134 }
vipinranka 12:9a20164dcc47 135 unsigned int TFT::rd_reg_data32(unsigned char reg)
vipinranka 12:9a20164dcc47 136 {
vipinranka 12:9a20164dcc47 137 return proto->rd_reg_data32(reg);
vipinranka 12:9a20164dcc47 138 }
vipinranka 12:9a20164dcc47 139 unsigned int TFT::rd_extcreg_data32(unsigned char reg, unsigned char SPIreadenablecmd)
vipinranka 12:9a20164dcc47 140 {
vipinranka 12:9a20164dcc47 141 return proto->rd_extcreg_data32(reg, SPIreadenablecmd);
vipinranka 12:9a20164dcc47 142 }
vipinranka 12:9a20164dcc47 143 //for TFT, just send data, position counters are in hw
vipinranka 12:9a20164dcc47 144 void TFT::window_pushpixel(unsigned short color)
vipinranka 12:9a20164dcc47 145 {
vipinranka 12:9a20164dcc47 146 proto->wr_gram(color);
vipinranka 12:9a20164dcc47 147 }
vipinranka 12:9a20164dcc47 148 void TFT::window_pushpixel(unsigned short color, unsigned int count)
vipinranka 12:9a20164dcc47 149 {
vipinranka 12:9a20164dcc47 150 proto->wr_gram(color, count);
vipinranka 12:9a20164dcc47 151 }
vipinranka 12:9a20164dcc47 152 void TFT::window_pushpixelbuf(unsigned short* color, unsigned int lenght)
vipinranka 12:9a20164dcc47 153 {
vipinranka 12:9a20164dcc47 154 proto->wr_grambuf(color, lenght);
vipinranka 12:9a20164dcc47 155 }
vipinranka 12:9a20164dcc47 156 void TFT::hw_reset()
vipinranka 12:9a20164dcc47 157 {
vipinranka 12:9a20164dcc47 158 proto->hw_reset();
vipinranka 12:9a20164dcc47 159 BusEnable(true);
vipinranka 12:9a20164dcc47 160 }
vipinranka 12:9a20164dcc47 161 void TFT::BusEnable(bool enable)
vipinranka 12:9a20164dcc47 162 {
vipinranka 12:9a20164dcc47 163 proto->BusEnable(enable);
vipinranka 12:9a20164dcc47 164 }
vipinranka 12:9a20164dcc47 165 // color TFT can rotate in hw (swap raw<->columns) for landscape views
vipinranka 12:9a20164dcc47 166 void TFT::set_orientation(int o)
vipinranka 12:9a20164dcc47 167 {
vipinranka 12:9a20164dcc47 168 orientation = o;
vipinranka 12:9a20164dcc47 169 wr_cmd8(0x36);
vipinranka 12:9a20164dcc47 170 switch (orientation) {
vipinranka 12:9a20164dcc47 171 case 0:// default, portrait view 0°
vipinranka 12:9a20164dcc47 172 if(mipistd) wr_data8(0x0A); // this is in real a vertical flip enabled, seems most displays are vertical flipped
vipinranka 12:9a20164dcc47 173 else wr_data8(0x48); //for some other ILIxxxx
vipinranka 12:9a20164dcc47 174 set_width(screensize_X);
vipinranka 12:9a20164dcc47 175 set_height(screensize_Y);
vipinranka 12:9a20164dcc47 176 break;
vipinranka 12:9a20164dcc47 177 case 1:// landscape view +90°
vipinranka 12:9a20164dcc47 178 if(mipistd) wr_data8(0x28);
vipinranka 12:9a20164dcc47 179 else wr_data8(0x29);//for some other ILIxxxx
vipinranka 12:9a20164dcc47 180 set_width(screensize_Y);
vipinranka 12:9a20164dcc47 181 set_height(screensize_X);
vipinranka 12:9a20164dcc47 182 break;
vipinranka 12:9a20164dcc47 183 case 2:// portrait view +180°
vipinranka 12:9a20164dcc47 184 if(mipistd) wr_data8(0x09);
vipinranka 12:9a20164dcc47 185 else wr_data8(0x99);//for some other ILIxxxx
vipinranka 12:9a20164dcc47 186 set_width(screensize_X);
vipinranka 12:9a20164dcc47 187 set_height(screensize_Y);
vipinranka 12:9a20164dcc47 188 break;
vipinranka 12:9a20164dcc47 189 case 3:// landscape view -90°
vipinranka 12:9a20164dcc47 190 if(mipistd) wr_data8(0x2B);
vipinranka 12:9a20164dcc47 191 else wr_data8(0xF8);//for some other ILIxxxx
vipinranka 12:9a20164dcc47 192 set_width(screensize_Y);
vipinranka 12:9a20164dcc47 193 set_height(screensize_X);
vipinranka 12:9a20164dcc47 194 break;
vipinranka 12:9a20164dcc47 195 }
vipinranka 12:9a20164dcc47 196 }
vipinranka 12:9a20164dcc47 197 void TFT::invert(unsigned char o)
vipinranka 12:9a20164dcc47 198 {
vipinranka 12:9a20164dcc47 199 if(o == 0) wr_cmd8(0x20);
vipinranka 12:9a20164dcc47 200 else wr_cmd8(0x21);
vipinranka 12:9a20164dcc47 201 }
vipinranka 12:9a20164dcc47 202 void TFT::FastWindow(bool enable)
vipinranka 12:9a20164dcc47 203 {
vipinranka 12:9a20164dcc47 204 usefastwindow=enable;
vipinranka 12:9a20164dcc47 205 }
vipinranka 12:9a20164dcc47 206 // TFT have both column and raw autoincrement inside a window, with internal counters
vipinranka 12:9a20164dcc47 207 void TFT::window(int x, int y, int w, int h)
vipinranka 12:9a20164dcc47 208 {
vipinranka 12:9a20164dcc47 209 fastwindowready=false; // end raw/column going to be set to lower value than bottom-right corner
vipinranka 12:9a20164dcc47 210 wr_cmd8(0x2A);
vipinranka 12:9a20164dcc47 211 wr_data16((x>>8)&0xff);
vipinranka 12:9a20164dcc47 212 wr_data16(x&0xff); //start column
vipinranka 12:9a20164dcc47 213 wr_data16(((x+w-1)>>8)&0xff);//end column
vipinranka 12:9a20164dcc47 214 wr_data16((x+w-1)&0xff);
vipinranka 12:9a20164dcc47 215
vipinranka 12:9a20164dcc47 216 wr_cmd8(0x2B);
vipinranka 12:9a20164dcc47 217 wr_data16(y>>8); //start page
vipinranka 12:9a20164dcc47 218 wr_data16(y&0xff);
vipinranka 12:9a20164dcc47 219 wr_data16(((y+h-1)>>8)&0xff);//end page
vipinranka 12:9a20164dcc47 220 wr_data16((y+h-1)&0xff);
vipinranka 12:9a20164dcc47 221
vipinranka 12:9a20164dcc47 222 wr_cmd8(0x2C); //write mem, just send pixels color next
vipinranka 12:9a20164dcc47 223 }
vipinranka 12:9a20164dcc47 224 void TFT::window4read(int x, int y, int w, int h)
vipinranka 12:9a20164dcc47 225 {
vipinranka 12:9a20164dcc47 226 fastwindowready=false;
vipinranka 12:9a20164dcc47 227 wr_cmd8(0x2A);
vipinranka 12:9a20164dcc47 228 wr_data16(x); //start column
vipinranka 12:9a20164dcc47 229 wr_data16(x+w-1);//end column
vipinranka 12:9a20164dcc47 230
vipinranka 12:9a20164dcc47 231 wr_cmd8(0x2B);
vipinranka 12:9a20164dcc47 232 wr_data16(y); //start page
vipinranka 12:9a20164dcc47 233 wr_data16(y+h-1);//end page
vipinranka 12:9a20164dcc47 234
vipinranka 12:9a20164dcc47 235 wr_cmd8(0x2E); //read mem, just pixelread next
vipinranka 12:9a20164dcc47 236 }
vipinranka 12:9a20164dcc47 237 void TFT::pixel(int x, int y, unsigned short color)
vipinranka 12:9a20164dcc47 238 {
vipinranka 12:9a20164dcc47 239 if(usefastwindow) //ili9486 does not like truncated 2A/2B cmds, at least in par mode
vipinranka 12:9a20164dcc47 240 {
vipinranka 12:9a20164dcc47 241 if(fastwindowready) //setting only start column/page does speedup, but needs end raw/column previously set to bottom-right corner
vipinranka 12:9a20164dcc47 242 {
vipinranka 12:9a20164dcc47 243 wr_cmd8(0x2A);
vipinranka 12:9a20164dcc47 244 wr_data16((x>>8)&0xff);
vipinranka 12:9a20164dcc47 245 wr_data16(x&0xff); //start column
vipinranka 12:9a20164dcc47 246 wr_cmd8(0x2B);
vipinranka 12:9a20164dcc47 247 wr_data16(y>>8); //start page
vipinranka 12:9a20164dcc47 248 wr_data16(y&0xff);
vipinranka 12:9a20164dcc47 249 wr_cmd8(0x2C); //write mem, just send pixels color next
vipinranka 12:9a20164dcc47 250 }
vipinranka 12:9a20164dcc47 251 else
vipinranka 12:9a20164dcc47 252 {
vipinranka 12:9a20164dcc47 253 window(x,y,width()-x,height()-y); // set also end raw/column to bottom-right corner
vipinranka 12:9a20164dcc47 254 fastwindowready=true;
vipinranka 12:9a20164dcc47 255 }
vipinranka 12:9a20164dcc47 256 }
vipinranka 12:9a20164dcc47 257 else window(x,y,width()-x,height()-y);
vipinranka 12:9a20164dcc47 258 // proto->wr_gram(color); // 2C expects 16bit parameters
vipinranka 12:9a20164dcc47 259 wr_gram(color);
vipinranka 12:9a20164dcc47 260 }
vipinranka 12:9a20164dcc47 261 unsigned short TFT::pixelread(int x, int y)
vipinranka 12:9a20164dcc47 262 {
vipinranka 12:9a20164dcc47 263 if(usefastwindow) //ili9486 does not like truncated 2A/2B cmds, at least in par mode
vipinranka 12:9a20164dcc47 264 {
vipinranka 12:9a20164dcc47 265 if(fastwindowready) //setting only start column/page does speedup, but needs end raw/column previously set to bottom-right corner
vipinranka 12:9a20164dcc47 266 {
vipinranka 12:9a20164dcc47 267 wr_cmd8(0x2A);
vipinranka 12:9a20164dcc47 268 wr_data16(x); //start column only
vipinranka 12:9a20164dcc47 269 wr_cmd8(0x2B);
vipinranka 12:9a20164dcc47 270 wr_data16(y); //start page only
vipinranka 12:9a20164dcc47 271 wr_cmd8(0x2E); //read mem, just pixelread next
vipinranka 12:9a20164dcc47 272 }
vipinranka 12:9a20164dcc47 273 else
vipinranka 12:9a20164dcc47 274 {
vipinranka 12:9a20164dcc47 275 window4read(x,y,width()-x,height()-y); // set also end raw/column to bottom-right corner
vipinranka 12:9a20164dcc47 276 fastwindowready=true;
vipinranka 12:9a20164dcc47 277 }
vipinranka 12:9a20164dcc47 278 }
vipinranka 12:9a20164dcc47 279 else window4read(x,y,1,1);
vipinranka 12:9a20164dcc47 280
vipinranka 12:9a20164dcc47 281 unsigned short color;
vipinranka 12:9a20164dcc47 282 // proto->wr_gram(color); // 2C expects 16bit parameters
vipinranka 12:9a20164dcc47 283 color = rd_gram();
vipinranka 12:9a20164dcc47 284 if(isBGR) color = BGR2RGB(color); // in case, convert BGR to RGB (should depend on cmd36 bit3) but maybe is device specific
vipinranka 12:9a20164dcc47 285 return color;
vipinranka 12:9a20164dcc47 286 }
vipinranka 12:9a20164dcc47 287 void TFT::setscrollarea (int startY, int areasize) // ie 0,480 for whole screen
vipinranka 12:9a20164dcc47 288 {
vipinranka 12:9a20164dcc47 289 unsigned int bfa;
vipinranka 12:9a20164dcc47 290 topfixedareasize=startY;
vipinranka 12:9a20164dcc47 291 scrollareasize=areasize;
vipinranka 12:9a20164dcc47 292 wr_cmd8(0x33);
vipinranka 12:9a20164dcc47 293 wr_data16(topfixedareasize); //num lines of top fixed area
vipinranka 12:9a20164dcc47 294 wr_data16(scrollareasize+scrollbugfix); //num lines of vertical scroll area, +1 for ILI9481 fix
vipinranka 12:9a20164dcc47 295 if((areasize+startY)>screensize_Y) bfa=0;
vipinranka 12:9a20164dcc47 296 else bfa = screensize_Y-(areasize+startY);
vipinranka 12:9a20164dcc47 297 wr_data16(bfa); //num lines of bottom fixed area
vipinranka 12:9a20164dcc47 298 }
vipinranka 12:9a20164dcc47 299 void TFT::scroll (int lines) // ie 1= scrollup 1, 479= scrolldown 1
vipinranka 12:9a20164dcc47 300 {
vipinranka 12:9a20164dcc47 301 wr_cmd8(0x37);
vipinranka 12:9a20164dcc47 302 wr_data16(topfixedareasize+(lines%scrollareasize)); // select the (absolute)line which will be displayed as first scrollarea line
vipinranka 12:9a20164dcc47 303 }
vipinranka 12:9a20164dcc47 304 void TFT::scrollreset()
vipinranka 12:9a20164dcc47 305 {
vipinranka 12:9a20164dcc47 306 wr_cmd8(0x13); //normal display mode
vipinranka 12:9a20164dcc47 307 }
vipinranka 12:9a20164dcc47 308 void TFT::cls (void)
vipinranka 12:9a20164dcc47 309 {
vipinranka 12:9a20164dcc47 310 WindowMax();
vipinranka 12:9a20164dcc47 311 // proto->wr_gram(_background,screensize_X*screensize_Y);
vipinranka 12:9a20164dcc47 312 // proto->wr_gram(0,screensize_X*screensize_Y);
vipinranka 12:9a20164dcc47 313 wr_gram(_background,screensize_X*screensize_Y);
vipinranka 12:9a20164dcc47 314 }
vipinranka 12:9a20164dcc47 315 // try to get read gram pixel format, could be 16bit or 18bit, RGB or BGR
vipinranka 12:9a20164dcc47 316 void TFT::auto_gram_read_format()
vipinranka 12:9a20164dcc47 317 {
vipinranka 12:9a20164dcc47 318 unsigned short px=0xCDB1;
vipinranka 12:9a20164dcc47 319 unsigned short rback, rback18;
vipinranka 12:9a20164dcc47 320 pixel(0,0,px);
vipinranka 12:9a20164dcc47 321 window4read(0,0,1,1);
vipinranka 12:9a20164dcc47 322 rback=proto->rd_gram(0); // try 16bit
vipinranka 12:9a20164dcc47 323 window4read(0,0,1,1);
vipinranka 12:9a20164dcc47 324 rback18=proto->rd_gram(1); // try 18bit converted to 16
vipinranka 12:9a20164dcc47 325 if((rback18==px) || (BGR2RGB(rback18)==px))
vipinranka 12:9a20164dcc47 326 {
vipinranka 12:9a20164dcc47 327 is18bit=true;
vipinranka 12:9a20164dcc47 328 if(BGR2RGB(rback18)==px) isBGR=true;
vipinranka 12:9a20164dcc47 329 }
vipinranka 12:9a20164dcc47 330 else if((rback==px) || (BGR2RGB(rback)==px))
vipinranka 12:9a20164dcc47 331 {
vipinranka 12:9a20164dcc47 332 if(BGR2RGB(rback)==px) isBGR=true;
vipinranka 12:9a20164dcc47 333 }
vipinranka 12:9a20164dcc47 334 // debug("\r\nIdentify gram read color format,\r\nsent %.4X read16 %.4X(bgr%.4X) read18 %.4X(bgr%.4X)", px, rback, BGR2RGB(rback), rback18, BGR2RGB(rback18));
vipinranka 12:9a20164dcc47 335 }
vipinranka 12:9a20164dcc47 336 // try to identify display controller
vipinranka 12:9a20164dcc47 337 void TFT::identify()
vipinranka 12:9a20164dcc47 338 {
vipinranka 12:9a20164dcc47 339 // MIPI std read ID cmd
vipinranka 12:9a20164dcc47 340 tftID=rd_reg_data32(0xBF);
vipinranka 12:9a20164dcc47 341 mipistd=false;
vipinranka 12:9a20164dcc47 342 // debug("ID MIPI : 0x%8X\r\n",tftID);
vipinranka 12:9a20164dcc47 343 if(((tftID&0xFF)==((tftID>>8)&0xFF)) && ((tftID&0xFF)==((tftID>>16)&0xFF)))
vipinranka 12:9a20164dcc47 344 {
vipinranka 12:9a20164dcc47 345 mipistd=false;
vipinranka 12:9a20164dcc47 346 // ILI specfic read ID cmd
vipinranka 12:9a20164dcc47 347 tftID=rd_reg_data32(0xD3)>>8;
vipinranka 12:9a20164dcc47 348 // debug("ID ILI : 0x%8X\r\n",tftID);
vipinranka 12:9a20164dcc47 349 }
vipinranka 12:9a20164dcc47 350 if(((tftID&0xFF)==((tftID>>8)&0xFF)) && ((tftID&0xFF)==((tftID>>16)&0xFF)))
vipinranka 12:9a20164dcc47 351 {
vipinranka 12:9a20164dcc47 352 // ILI specfic read ID cmd with ili9341 specific spi read-in enable 0xD9 cmd
vipinranka 12:9a20164dcc47 353 tftID=rd_extcreg_data32(0xD3, 0xD9);
vipinranka 12:9a20164dcc47 354 // debug("ID D9 extc ILI : 0x%8X\r\n",tftID);
vipinranka 12:9a20164dcc47 355 }
vipinranka 12:9a20164dcc47 356 if(((tftID&0xFF)==((tftID>>8)&0xFF)) && ((tftID&0xFF)==((tftID>>16)&0xFF)))
vipinranka 12:9a20164dcc47 357 {
vipinranka 12:9a20164dcc47 358 // ILI specfic read ID cmd with ili9486/88 specific spi read-in enable 0xFB cmd
vipinranka 12:9a20164dcc47 359 tftID=rd_extcreg_data32(0xD3, 0xFB);
vipinranka 12:9a20164dcc47 360 // debug("ID D9 extc ILI : 0x%8X\r\n",tftID);
vipinranka 12:9a20164dcc47 361 }
vipinranka 12:9a20164dcc47 362 if(((tftID&0xFF)==((tftID>>8)&0xFF)) && ((tftID&0xFF)==((tftID>>16)&0xFF))) tftID=0xDEAD;
vipinranka 12:9a20164dcc47 363 if ((tftID&0xFFFF)==0x9481) scrollbugfix=1;
vipinranka 12:9a20164dcc47 364 else scrollbugfix=0;
vipinranka 12:9a20164dcc47 365 hw_reset(); // in case wrong cmds messed up important settings
vipinranka 12:9a20164dcc47 366 }
vipinranka 12:9a20164dcc47 367 int TFT::sizeX()
vipinranka 12:9a20164dcc47 368 {
vipinranka 12:9a20164dcc47 369 return screensize_X;
vipinranka 12:9a20164dcc47 370 }
vipinranka 12:9a20164dcc47 371 int TFT::sizeY()
vipinranka 12:9a20164dcc47 372 {
vipinranka 12:9a20164dcc47 373 return screensize_Y;
vipinranka 12:9a20164dcc47 374 }