Basically i glued Peter Drescher and Simon Ford libs in a GraphicsDisplay class, then derived TFT or LCD class (which inherits Protocols class), then the most derived ones (Inits), which are per-display and are the only part needed to be adapted to diff hw.

Dependents:   testUniGraphic_150217 maze_TFT_MMA8451Q TFT_test_frdm-kl25z TFT_test_NUCLEO-F411RE ... more

Committer:
Geremia
Date:
Fri Feb 20 21:32:25 2015 +0000
Revision:
11:b842b8e332cb
Parent:
10:668cf78ff93a
Child:
34:c66986d80f72
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?

UserRevisionLine numberNew contents of line
Geremia 4:12ba0ecc2c1f 1 /* mbed UniGraphic library - Device specific 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 #include "Protocols.h"
Geremia 4:12ba0ecc2c1f 6 #include "TFT_MIPI.h"
Geremia 4:12ba0ecc2c1f 7
Geremia 4:12ba0ecc2c1f 8 //////////////////////////////////////////////////////////////////////////////////
Geremia 4:12ba0ecc2c1f 9 // display settings ///////////////////////////////////////////////////////
Geremia 4:12ba0ecc2c1f 10 /////////////////////////////////////////////////////////////////////////
Geremia 4:12ba0ecc2c1f 11
dreschpe 9:1749ae993cfe 12 // put in constructor
dreschpe 9:1749ae993cfe 13 //#define LCDSIZE_X 320 // display X pixels, TFTs are usually portrait view
dreschpe 9:1749ae993cfe 14 //#define LCDSIZE_Y 480 // display Y pixels
Geremia 4:12ba0ecc2c1f 15
Geremia 4:12ba0ecc2c1f 16
Geremia 4:12ba0ecc2c1f 17
dreschpe 9:1749ae993cfe 18 TFT_MIPI::TFT_MIPI(proto_t displayproto, PortName port, PinName CS, PinName reset, PinName DC, PinName WR, PinName RD, const char *name , unsigned int LCDSIZE_X, unsigned int LCDSIZE_Y)
Geremia 4:12ba0ecc2c1f 19 : TFT(displayproto, port, CS, reset, DC, WR, RD, LCDSIZE_X, LCDSIZE_Y, name)
Geremia 4:12ba0ecc2c1f 20 {
Geremia 4:12ba0ecc2c1f 21 hw_reset();
Geremia 4:12ba0ecc2c1f 22 BusEnable(true);
Geremia 7:bb0383b91104 23 identify(); // will collect tftID, set mipistd flag
Geremia 4:12ba0ecc2c1f 24 init();
Geremia 11:b842b8e332cb 25 auto_gram_read_format();// try to get read gram pixel format, could be 16bit or 18bit, RGB or BGR. Will set flags accordingly
Geremia 7:bb0383b91104 26 // scrollbugfix=1; // when scrolling 1 line, the last line disappears, set to 1 to fix it, for ili9481 is set automatically in identify()
Geremia 4:12ba0ecc2c1f 27 set_orientation(0);
Geremia 10:668cf78ff93a 28 // FastWindow(true); // most but not all controllers support this, even if datasheet tells they should. Give a try
Geremia 4:12ba0ecc2c1f 29 cls();
Geremia 4:12ba0ecc2c1f 30 locate(0,0);
Geremia 4:12ba0ecc2c1f 31 }
dreschpe 9:1749ae993cfe 32 TFT_MIPI::TFT_MIPI(proto_t displayproto, int Hz, PinName mosi, PinName miso, PinName sclk, PinName CS, PinName reset, PinName DC, const char *name , unsigned int LCDSIZE_X , unsigned int LCDSIZE_Y )
Geremia 4:12ba0ecc2c1f 33 : TFT(displayproto, Hz, mosi, miso, sclk, CS, reset, DC, LCDSIZE_X, LCDSIZE_Y, name)
Geremia 4:12ba0ecc2c1f 34 {
Geremia 4:12ba0ecc2c1f 35 hw_reset(); //TFT class forwards to Protocol class
Geremia 4:12ba0ecc2c1f 36 BusEnable(true); //TFT class forwards to Protocol class
Geremia 7:bb0383b91104 37 identify(); // will collect tftID and set mipistd flag
Geremia 4:12ba0ecc2c1f 38 init(); // per display custom init cmd sequence, implemented here
Geremia 11:b842b8e332cb 39 auto_gram_read_format();// try to get read gram pixel format, could be 16bit or 18bit, RGB or BGR. Will set flags accordingly
Geremia 7:bb0383b91104 40 // scrollbugfix=1; // when scrolling 1 line, the last line disappears, set to 1 to fix it, for ili9481 is set automatically in identify()
Geremia 4:12ba0ecc2c1f 41 set_orientation(0); //TFT class does for MIPI standard and some ILIxxx
Geremia 10:668cf78ff93a 42 // FastWindow(true); // most but not all controllers support this, even if datasheet tells they should. Give a try
Geremia 4:12ba0ecc2c1f 43 cls();
Geremia 4:12ba0ecc2c1f 44 locate(0,0);
Geremia 4:12ba0ecc2c1f 45 }
Geremia 4:12ba0ecc2c1f 46 // reset and init the lcd controller
Geremia 4:12ba0ecc2c1f 47 void TFT_MIPI::init()
Geremia 4:12ba0ecc2c1f 48 {
Geremia 4:12ba0ecc2c1f 49 /* Start Initial Sequence ----------------------------------------------------*/
Geremia 4:12ba0ecc2c1f 50
Geremia 4:12ba0ecc2c1f 51 /* Start Initial Sequence ----------------------------------------------------*/
Geremia 4:12ba0ecc2c1f 52 wr_cmd8(0xD0); // POWER SETTING
Geremia 4:12ba0ecc2c1f 53 wr_data8(0x07);
Geremia 4:12ba0ecc2c1f 54 wr_data8(0x42);
Geremia 4:12ba0ecc2c1f 55 wr_data8(0x18);
Geremia 4:12ba0ecc2c1f 56
Geremia 4:12ba0ecc2c1f 57 wr_cmd8(0xD1); // VCOM control
Geremia 4:12ba0ecc2c1f 58 wr_data8(0x00);
Geremia 4:12ba0ecc2c1f 59 wr_data8(0x07);
Geremia 4:12ba0ecc2c1f 60 wr_data8(0x10);
Geremia 4:12ba0ecc2c1f 61
Geremia 4:12ba0ecc2c1f 62 wr_cmd8(0xD2); // Power_Setting for Normal Mode
Geremia 4:12ba0ecc2c1f 63 wr_data8(0x01); // LCD power supply current
Geremia 4:12ba0ecc2c1f 64 wr_data8(0x02); // charge pumps
Geremia 4:12ba0ecc2c1f 65
Geremia 4:12ba0ecc2c1f 66 wr_cmd8(0xC0); // Panel Driving Setting
Geremia 4:12ba0ecc2c1f 67 wr_data8(0x10); // 10 orig
Geremia 4:12ba0ecc2c1f 68 wr_data8(0x3B); //number of lines+1 *8
Geremia 4:12ba0ecc2c1f 69 wr_data8(0x00);
Geremia 4:12ba0ecc2c1f 70 wr_data8(0x02);
Geremia 4:12ba0ecc2c1f 71 wr_data8(0x11);
Geremia 4:12ba0ecc2c1f 72
Geremia 4:12ba0ecc2c1f 73 // C1 missing? Display_Timing_Setting for Normal Mode
Geremia 4:12ba0ecc2c1f 74
Geremia 4:12ba0ecc2c1f 75 //renesas does not have this
Geremia 4:12ba0ecc2c1f 76 // wr_cmd8(0xC5); // Frame Rate and Inversion Control
Geremia 4:12ba0ecc2c1f 77 // wr_data8(0x03); // 72hz, datashet tells default 02=85hz
Geremia 4:12ba0ecc2c1f 78
Geremia 4:12ba0ecc2c1f 79 wr_cmd8(0xC8); // Gamma settings
Geremia 4:12ba0ecc2c1f 80 wr_data8(0x00);
Geremia 4:12ba0ecc2c1f 81 wr_data8(0x32);
Geremia 4:12ba0ecc2c1f 82 wr_data8(0x36);
Geremia 4:12ba0ecc2c1f 83 wr_data8(0x45);
Geremia 4:12ba0ecc2c1f 84 wr_data8(0x06);
Geremia 4:12ba0ecc2c1f 85 wr_data8(0x16);
Geremia 4:12ba0ecc2c1f 86 wr_data8(0x37);
Geremia 4:12ba0ecc2c1f 87 wr_data8(0x75);
Geremia 4:12ba0ecc2c1f 88 wr_data8(0x77);
Geremia 4:12ba0ecc2c1f 89 wr_data8(0x54);
Geremia 4:12ba0ecc2c1f 90 wr_data8(0x0C);
Geremia 4:12ba0ecc2c1f 91 wr_data8(0x00);
Geremia 4:12ba0ecc2c1f 92
Geremia 4:12ba0ecc2c1f 93
Geremia 4:12ba0ecc2c1f 94
Geremia 4:12ba0ecc2c1f 95 wr_cmd8(0x36); // MEMORY_ACCESS_CONTROL (orientation stuff)
Geremia 4:12ba0ecc2c1f 96 wr_data8(0x0A); // 0A as per chinese example (vertical flipped)
Geremia 4:12ba0ecc2c1f 97
Geremia 4:12ba0ecc2c1f 98 wr_cmd8(0x3A); // COLMOD_PIXEL_FORMAT_SET, not present in AN
Geremia 4:12ba0ecc2c1f 99 wr_data8(0x55); // 16 bit pixel
Geremia 4:12ba0ecc2c1f 100
Geremia 4:12ba0ecc2c1f 101 wr_cmd8(0x13); // Nomal Displaymode
Geremia 4:12ba0ecc2c1f 102
Geremia 4:12ba0ecc2c1f 103 wr_cmd8(0x11); // sleep out
Geremia 4:12ba0ecc2c1f 104 wait_ms(150);
Geremia 4:12ba0ecc2c1f 105
Geremia 4:12ba0ecc2c1f 106 wr_cmd8(0x29); // display on
Geremia 4:12ba0ecc2c1f 107 wait_ms(150);
Geremia 4:12ba0ecc2c1f 108
Geremia 4:12ba0ecc2c1f 109 }