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.

Fork of UniGraphic by GraphicsDisplay

Committer:
Geremia
Date:
Mon Mar 23 14:08:04 2015 +0000
Revision:
20:14daa48ffd4c
Parent:
15:b9483ba842c8
Child:
21:ae0a4eedfc90
Add  ILI 9320/9325/9328 custom TFT932x class, parallel/spi 8/16bit, with orientation, scroll, pixelread, fastwindow.; Par8 and 16 tested, SPI not at all, needs checking if the CS toggle is necessary (see SPI8.cpp SPI16.cpp).

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Geremia 0:75ec1b3cde17 1
Geremia 0:75ec1b3cde17 2 #ifndef MBED_LCD_H
Geremia 0:75ec1b3cde17 3 #define MBED_LCD_H
Geremia 0:75ec1b3cde17 4
Geremia 0:75ec1b3cde17 5 #include "GraphicsDisplay.h"
Geremia 0:75ec1b3cde17 6 #include "PAR8.h"
Geremia 0:75ec1b3cde17 7 #include "SPI8.h"
Geremia 1:ff019d22b275 8 #include "SPI16.h"
Geremia 0:75ec1b3cde17 9 #include "Protocols.h"
Geremia 0:75ec1b3cde17 10
Geremia 15:b9483ba842c8 11 // undefine the KL43Z and KL46Z LCD macro
Geremia 15:b9483ba842c8 12 #ifdef LCD
Geremia 15:b9483ba842c8 13 #undef LCD
Geremia 15:b9483ba842c8 14 #endif
Geremia 1:ff019d22b275 15
Geremia 0:75ec1b3cde17 16 /** Draw mode
Geremia 0:75ec1b3cde17 17 * NORMAl
Geremia 0:75ec1b3cde17 18 * XOR set pixel by xor the screen
Geremia 0:75ec1b3cde17 19 */
Geremia 0:75ec1b3cde17 20 enum {NORMAL,XOR};
Geremia 0:75ec1b3cde17 21
Geremia 0:75ec1b3cde17 22 /** Mirror mode */
Geremia 0:75ec1b3cde17 23 enum mirror_t {X,Y,XY,NONE};
Geremia 0:75ec1b3cde17 24
Geremia 0:75ec1b3cde17 25
Geremia 0:75ec1b3cde17 26 /** A common base class for monochrome Display
Geremia 0:75ec1b3cde17 27 */
Geremia 0:75ec1b3cde17 28 class LCD : public GraphicsDisplay
Geremia 0:75ec1b3cde17 29 {
Geremia 0:75ec1b3cde17 30
Geremia 0:75ec1b3cde17 31 public:
Geremia 0:75ec1b3cde17 32
Geremia 0:75ec1b3cde17 33 /** Create a monochrome LCD Parallel interface
Geremia 0:75ec1b3cde17 34 * @param name The name used by the parent class to access the interface
Geremia 0:75ec1b3cde17 35 */
Geremia 0:75ec1b3cde17 36 LCD(proto_t displayproto,PortName port, PinName CS, PinName reset, PinName DC, PinName WR, PinName RD, const int lcdsize_x, const int lcdsize_y, const int ic_x_segs, const int ic_y_coms, const char* name);
Geremia 0:75ec1b3cde17 37
Geremia 0:75ec1b3cde17 38 /** Create a monochrome LCD SPI interface
Geremia 0:75ec1b3cde17 39 * @param name The name used by the parent class to access the interface
Geremia 0:75ec1b3cde17 40 */
Geremia 1:ff019d22b275 41 LCD(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 int ic_x_segs, const int ic_y_coms, const char* name);
Geremia 0:75ec1b3cde17 42
Geremia 0:75ec1b3cde17 43 /** Destructor
Geremia 0:75ec1b3cde17 44 * will free framebuffer
Geremia 0:75ec1b3cde17 45 */
Geremia 0:75ec1b3cde17 46 virtual ~LCD();
Geremia 0:75ec1b3cde17 47
Geremia 0:75ec1b3cde17 48
Geremia 0:75ec1b3cde17 49
Geremia 0:75ec1b3cde17 50 /////// functions that come for free, but can be overwritten///////////////////////////////////////////////////
Geremia 0:75ec1b3cde17 51 /////// ----------------------------------------------------///////////////////////////////////////////////////
Geremia 0:75ec1b3cde17 52
Geremia 0:75ec1b3cde17 53 /** Draw a pixel in the specified color.
Geremia 0:75ec1b3cde17 54 * @param x is the horizontal offset to this pixel.
Geremia 0:75ec1b3cde17 55 * @param y is the vertical offset to this pixel.
Geremia 0:75ec1b3cde17 56 * @param color defines the color for the pixel.
Geremia 0:75ec1b3cde17 57 */
Geremia 0:75ec1b3cde17 58 virtual void pixel(int x, int y, unsigned short color);
Geremia 0:75ec1b3cde17 59
Geremia 0:75ec1b3cde17 60 /** Set the window, which controls where items are written to the screen.
Geremia 0:75ec1b3cde17 61 * When something hits the window width, it wraps back to the left side
Geremia 0:75ec1b3cde17 62 * and down a row. If the initial write is outside the window, it will
Geremia 0:75ec1b3cde17 63 * be captured into the window when it crosses a boundary.
Geremia 0:75ec1b3cde17 64 * @param x is the left edge in pixels.
Geremia 0:75ec1b3cde17 65 * @param y is the top edge in pixels.
Geremia 0:75ec1b3cde17 66 * @param w is the window width in pixels.
Geremia 0:75ec1b3cde17 67 * @param h is the window height in pixels.
Geremia 0:75ec1b3cde17 68 */
Geremia 0:75ec1b3cde17 69 virtual void window(int x, int y, int w, int h);
Geremia 7:bb0383b91104 70
Geremia 20:14daa48ffd4c 71 /** Read pixel color at location
Geremia 20:14daa48ffd4c 72 * @param x is the horizontal offset to this pixel.
Geremia 20:14daa48ffd4c 73 * @param y is the vertical offset to this pixel.
Geremia 20:14daa48ffd4c 74 * @returns 16bit color, 0000=Black(pixel set), FFFF=White(pixel clear).
Geremia 20:14daa48ffd4c 75 */
Geremia 20:14daa48ffd4c 76 virtual unsigned short pixelread(int x, int y);
Geremia 0:75ec1b3cde17 77
Geremia 0:75ec1b3cde17 78 /** Push a single pixel into the window and increment position.
Geremia 0:75ec1b3cde17 79 * You must first call window() then push pixels in loop.
Geremia 0:75ec1b3cde17 80 * @param color is the pixel color.
Geremia 0:75ec1b3cde17 81 */
Geremia 0:75ec1b3cde17 82 virtual void window_pushpixel(unsigned short color);
Geremia 2:713844a55c4e 83
Geremia 2:713844a55c4e 84 /** Push some pixels of the same color into the window and increment position.
Geremia 2:713844a55c4e 85 * You must first call window() then push pixels.
Geremia 2:713844a55c4e 86 * @param color is the pixel color.
Geremia 2:713844a55c4e 87 * @param count: how many
Geremia 2:713844a55c4e 88 */
Geremia 2:713844a55c4e 89 virtual void window_pushpixel(unsigned short color, unsigned int count);
Geremia 2:713844a55c4e 90
Geremia 2:713844a55c4e 91 /** Push array of pixel colors into the window and increment position.
Geremia 2:713844a55c4e 92 * You must first call window() then push pixels.
Geremia 2:713844a55c4e 93 * @param color is the pixel color.
Geremia 2:713844a55c4e 94 */
Geremia 2:713844a55c4e 95 virtual void window_pushpixelbuf(unsigned short* color, unsigned int lenght);
Geremia 0:75ec1b3cde17 96
Geremia 0:75ec1b3cde17 97 /** Framebuffer is used, it needs to be sent to LCD from time to time
Geremia 0:75ec1b3cde17 98 */
Geremia 0:75ec1b3cde17 99 virtual void copy_to_lcd();
Geremia 0:75ec1b3cde17 100
Geremia 0:75ec1b3cde17 101 /** set the contrast of the screen
Geremia 0:75ec1b3cde17 102 *
Geremia 0:75ec1b3cde17 103 * @param o contrast 0-63
Geremia 0:75ec1b3cde17 104 * @note may be overrided in case of not standard command
Geremia 0:75ec1b3cde17 105 */
Geremia 0:75ec1b3cde17 106 virtual void set_contrast(int o);
Geremia 0:75ec1b3cde17 107
Geremia 0:75ec1b3cde17 108 /** read the contrast level
Geremia 0:75ec1b3cde17 109 *
Geremia 0:75ec1b3cde17 110 */
Geremia 0:75ec1b3cde17 111 int get_contrast(void);
Geremia 0:75ec1b3cde17 112
Geremia 7:bb0383b91104 113 /** display inverted colors
Geremia 0:75ec1b3cde17 114 *
Geremia 0:75ec1b3cde17 115 * @param o = 0 normal, 1 invert
Geremia 0:75ec1b3cde17 116 */
Geremia 0:75ec1b3cde17 117 void invert(unsigned char o);
Geremia 0:75ec1b3cde17 118
Geremia 0:75ec1b3cde17 119 /** clear the entire screen
Geremia 0:75ec1b3cde17 120 * The inherited one sets windomax then fill with background color
Geremia 0:75ec1b3cde17 121 * We override it to speedup
Geremia 0:75ec1b3cde17 122 */
Geremia 0:75ec1b3cde17 123 virtual void cls();
Geremia 0:75ec1b3cde17 124
Geremia 0:75ec1b3cde17 125 /** Set the orientation of the screen
Geremia 0:75ec1b3cde17 126 * x,y: 0,0 is always top left
Geremia 0:75ec1b3cde17 127 *
Geremia 0:75ec1b3cde17 128 * @param o direction to use the screen (0-3)
Geremia 0:75ec1b3cde17 129 * 0 = -90°
Geremia 0:75ec1b3cde17 130 * 1 = default 0°
Geremia 0:75ec1b3cde17 131 * 2 = +90°
Geremia 0:75ec1b3cde17 132 * 3 = +180°
Geremia 0:75ec1b3cde17 133 *
Geremia 0:75ec1b3cde17 134 */
Geremia 0:75ec1b3cde17 135 void set_orientation(int o);
Geremia 0:75ec1b3cde17 136
Geremia 0:75ec1b3cde17 137 /** Set ChipSelect high or low
Geremia 0:75ec1b3cde17 138 * @param enable 0/1
Geremia 0:75ec1b3cde17 139 */
Geremia 0:75ec1b3cde17 140 virtual void BusEnable(bool enable);
Geremia 0:75ec1b3cde17 141
Geremia 7:bb0383b91104 142 /** get display X size in pixels (native, orientation independent)
Geremia 7:bb0383b91104 143 * @returns X size in pixels
Geremia 7:bb0383b91104 144 */
Geremia 7:bb0383b91104 145 int sizeX();
Geremia 7:bb0383b91104 146
Geremia 20:14daa48ffd4c 147 /** get display Y size in pixels (native, orientation independent)
Geremia 20:14daa48ffd4c 148 * @returns Y size in pixels
Geremia 7:bb0383b91104 149 */
Geremia 7:bb0383b91104 150 int sizeY();
Geremia 7:bb0383b91104 151
Geremia 7:bb0383b91104 152 ////////////////////////////////////////////////////////////////////////////////
Geremia 7:bb0383b91104 153 // not implemented yet
Geremia 7:bb0383b91104 154 //////////////////////////////////////////////////////////////////
Geremia 20:14daa48ffd4c 155 // virtual unsigned short pixelread(int x, int y){return 0;};
Geremia 7:bb0383b91104 156 virtual void window4read(int x, int y, int w, int h){};
Geremia 7:bb0383b91104 157 void setscrollarea (int startY, int areasize){};
Geremia 7:bb0383b91104 158 void scroll (int lines){};
Geremia 7:bb0383b91104 159 void scrollreset(){};
Geremia 10:668cf78ff93a 160 void FastWindow(bool enable){};
Geremia 7:bb0383b91104 161
Geremia 7:bb0383b91104 162 unsigned int tftID;
Geremia 7:bb0383b91104 163
Geremia 7:bb0383b91104 164
Geremia 7:bb0383b91104 165
Geremia 0:75ec1b3cde17 166
Geremia 0:75ec1b3cde17 167 protected:
Geremia 0:75ec1b3cde17 168
Geremia 0:75ec1b3cde17 169 /** set mirror mode
Geremia 0:75ec1b3cde17 170 * @note may be overridden by specific display init class in case of not standard cmds or inverted wiring
Geremia 0:75ec1b3cde17 171 * @param mode NONE, X, Y, XY
Geremia 0:75ec1b3cde17 172 */
Geremia 0:75ec1b3cde17 173 virtual void mirrorXY(mirror_t mode);
Geremia 0:75ec1b3cde17 174
Geremia 0:75ec1b3cde17 175 ////// functions needed by parent class ///////////////////////////////////////
Geremia 0:75ec1b3cde17 176 ////// -------------------------------- ///////////////////////////////////////
Geremia 0:75ec1b3cde17 177
Geremia 1:ff019d22b275 178 /** Send 8bit command to display controller
Geremia 1:ff019d22b275 179 *
Geremia 1:ff019d22b275 180 * @param cmd: byte to send
Geremia 1:ff019d22b275 181 * @note if protocol is SPI16, it will insert NOP cmd before, so if cmd is a 2byte cmd, the second cmd will be broken. Use wr_cmd16 for 2bytes cmds
Geremia 1:ff019d22b275 182 */
Geremia 1:ff019d22b275 183 void wr_cmd8(unsigned char cmd);
Geremia 0:75ec1b3cde17 184
Geremia 1:ff019d22b275 185 /** Send 8bit data to display controller
Geremia 1:ff019d22b275 186 *
Geremia 1:ff019d22b275 187 * @param data: byte to send
Geremia 1:ff019d22b275 188 *
Geremia 1:ff019d22b275 189 */
Geremia 1:ff019d22b275 190 void wr_data8(unsigned char data);
Geremia 0:75ec1b3cde17 191
Geremia 1:ff019d22b275 192 /** Send 16bit command to display controller
Geremia 1:ff019d22b275 193 *
Geremia 1:ff019d22b275 194 * @param cmd: halfword to send
Geremia 1:ff019d22b275 195 *
Geremia 1:ff019d22b275 196 */
Geremia 1:ff019d22b275 197 void wr_cmd16(unsigned short cmd);
Geremia 1:ff019d22b275 198
Geremia 4:12ba0ecc2c1f 199 /** Send same 16bit pixeldata to display controller multiple times
Geremia 1:ff019d22b275 200 *
Geremia 1:ff019d22b275 201 * @param data: halfword to send
Geremia 1:ff019d22b275 202 * @param count: how many
Geremia 1:ff019d22b275 203 *
Geremia 1:ff019d22b275 204 */
Geremia 4:12ba0ecc2c1f 205 virtual void wr_gram(unsigned short data, unsigned int count);
Geremia 1:ff019d22b275 206
Geremia 4:12ba0ecc2c1f 207 /** Send array of pixeldata shorts to display controller
Geremia 1:ff019d22b275 208 *
Geremia 4:12ba0ecc2c1f 209 * @param data: unsigned short pixeldata array
Geremia 1:ff019d22b275 210 * @param lenght: lenght (in shorts)
Geremia 1:ff019d22b275 211 *
Geremia 1:ff019d22b275 212 */
Geremia 4:12ba0ecc2c1f 213 virtual void wr_grambuf(unsigned short* data, unsigned int lenght);
Geremia 0:75ec1b3cde17 214
Geremia 0:75ec1b3cde17 215 /** HW reset sequence (without display init commands)
Geremia 0:75ec1b3cde17 216 */
Geremia 0:75ec1b3cde17 217 void hw_reset();
Geremia 0:75ec1b3cde17 218
Geremia 0:75ec1b3cde17 219 int draw_mode;
Geremia 0:75ec1b3cde17 220 int contrast;
Geremia 0:75ec1b3cde17 221
Geremia 0:75ec1b3cde17 222 private:
Geremia 0:75ec1b3cde17 223
Geremia 2:713844a55c4e 224 Protocols* proto;
Geremia 0:75ec1b3cde17 225 unsigned char *buffer;
Geremia 1:ff019d22b275 226 unsigned short *buffer16;
Geremia 7:bb0383b91104 227 const int screensize_X;
Geremia 7:bb0383b91104 228 const int screensize_Y;
Geremia 7:bb0383b91104 229 const int _LCDPAGES;
Geremia 7:bb0383b91104 230 const int _IC_X_SEGS;
Geremia 7:bb0383b91104 231 const int _IC_Y_COMS;
Geremia 7:bb0383b91104 232 const int _IC_PAGES;
Geremia 0:75ec1b3cde17 233
Geremia 0:75ec1b3cde17 234 int page_offset;
Geremia 0:75ec1b3cde17 235 int col_offset;
Geremia 0:75ec1b3cde17 236 // pixel location
Geremia 0:75ec1b3cde17 237 int cur_x;
Geremia 0:75ec1b3cde17 238 int cur_y;
Geremia 0:75ec1b3cde17 239 // window location
Geremia 0:75ec1b3cde17 240 int win_x1;
Geremia 0:75ec1b3cde17 241 int win_x2;
Geremia 0:75ec1b3cde17 242 int win_y1;
Geremia 0:75ec1b3cde17 243 int win_y2;
Geremia 0:75ec1b3cde17 244 int orientation;
Geremia 1:ff019d22b275 245 bool useNOP;
Geremia 0:75ec1b3cde17 246 };
Geremia 0:75ec1b3cde17 247
Geremia 0:75ec1b3cde17 248 #endif