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