Library for MI0283QT-2 LCD

Committer:
clemente
Date:
Wed May 23 06:25:31 2012 +0000
Revision:
0:7ad454fed160

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
clemente 0:7ad454fed160 1 /* mbed Graphics LCD library. Library for MI0283QT-2 screen.
clemente 0:7ad454fed160 2
clemente 0:7ad454fed160 3 Copyright (c) 2011 NXP 3803
clemente 0:7ad454fed160 4
clemente 0:7ad454fed160 5 Permission is hereby granted, free of charge, to any person obtaining a copy
clemente 0:7ad454fed160 6 of this software and associated documentation files (the "Software"), to deal
clemente 0:7ad454fed160 7 in the Software without restriction, including without limitation the rights
clemente 0:7ad454fed160 8 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
clemente 0:7ad454fed160 9 copies of the Software, and to permit persons to whom the Software is
clemente 0:7ad454fed160 10 furnished to do so, subject to the following conditions:
clemente 0:7ad454fed160 11
clemente 0:7ad454fed160 12 The above copyright notice and this permission notice shall be included in
clemente 0:7ad454fed160 13 all copies or substantial portions of the Software.
clemente 0:7ad454fed160 14
clemente 0:7ad454fed160 15 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
clemente 0:7ad454fed160 16 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
clemente 0:7ad454fed160 17 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
clemente 0:7ad454fed160 18 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
clemente 0:7ad454fed160 19 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
clemente 0:7ad454fed160 20 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
clemente 0:7ad454fed160 21 THE SOFTWARE.
clemente 0:7ad454fed160 22 */
clemente 0:7ad454fed160 23
clemente 0:7ad454fed160 24 #include "MI0283QTlib.h"
clemente 0:7ad454fed160 25 #include "mbed.h"
clemente 0:7ad454fed160 26 #include "Terminal24x12.h"
clemente 0:7ad454fed160 27 #include "Terminal12x6.h"
clemente 0:7ad454fed160 28
clemente 0:7ad454fed160 29 #ifdef _USE_FILE
clemente 0:7ad454fed160 30 #include "SDFileSystem.h"
clemente 0:7ad454fed160 31 #endif
clemente 0:7ad454fed160 32
clemente 0:7ad454fed160 33 /* GLCD definition and functions. */
clemente 0:7ad454fed160 34 #define LCD_MODE_262K 5 // 5=65K, 6=262K colors.
clemente 0:7ad454fed160 35
clemente 0:7ad454fed160 36 /* */
clemente 0:7ad454fed160 37 #define LCD_FAST_SPEED 40000000
clemente 0:7ad454fed160 38 #define LCD_SLOW_SPEED 3000000
clemente 0:7ad454fed160 39 //
clemente 0:7ad454fed160 40 #define LCD_ID (0)
clemente 0:7ad454fed160 41 #define LCD_DATA ((0x72)|(LCD_ID<<2))
clemente 0:7ad454fed160 42 #define LCD_REGISTER ((0x70)|(LCD_ID<<2))
clemente 0:7ad454fed160 43 //
clemente 0:7ad454fed160 44 #define LCD_WIDTH (320)
clemente 0:7ad454fed160 45 #define LCD_HEIGHT (240)
clemente 0:7ad454fed160 46
clemente 0:7ad454fed160 47 #if ( LCD_MODE_262K==6 )
clemente 0:7ad454fed160 48 #define RGB(r,g,b) (((r&0xFC)<<16)|((g&0xFC)<<8)|((b&0xFC))) //6 red | 6 green | 6 blue
clemente 0:7ad454fed160 49 #else
clemente 0:7ad454fed160 50 #define RGB(r,g,b) (((r&0xF8)<<8)|((g&0xFC)<<3)|((b&0xF8)>>3)) //5 red | 6 green | 5 blue
clemente 0:7ad454fed160 51 #endif
clemente 0:7ad454fed160 52
clemente 0:7ad454fed160 53 #define LCD_RST_DISABLE() _rst = 1;
clemente 0:7ad454fed160 54 #define LCD_RST_ENABLE() _rst = 0;
clemente 0:7ad454fed160 55 #define LCD_CS_DISABLE() _cs = 1;
clemente 0:7ad454fed160 56 #define LCD_CS_ENABLE() _cs = 0;
clemente 0:7ad454fed160 57
clemente 0:7ad454fed160 58 //MODDMA dma;
clemente 0:7ad454fed160 59
clemente 0:7ad454fed160 60 GLCD::GLCD( PinName mosi, PinName miso, PinName sclk, PinName cs, PinName rst, PinName bklgh) : _spi( mosi, miso, sclk), _cs( cs), _rst( rst), _bklgh( bklgh) {
clemente 0:7ad454fed160 61 // deselect the device
clemente 0:7ad454fed160 62 LCD_CS_DISABLE();
clemente 0:7ad454fed160 63 LCD_RST_ENABLE();
clemente 0:7ad454fed160 64 // defaults params
clemente 0:7ad454fed160 65 SPIClkSpeed=LCD_FAST_SPEED;
clemente 0:7ad454fed160 66 SPISlowClkSpeed=LCD_SLOW_SPEED;
clemente 0:7ad454fed160 67 SPIMode=3;
clemente 0:7ad454fed160 68 LCDBkLight=0.5;
clemente 0:7ad454fed160 69 //
clemente 0:7ad454fed160 70 BackGroundColor=LCD_BLACK;
clemente 0:7ad454fed160 71 //
clemente 0:7ad454fed160 72 #if 0
clemente 0:7ad454fed160 73 struct _FONTINFO {
clemente 0:7ad454fed160 74 unsigned char *pText;
clemente 0:7ad454fed160 75 unsigned int h_size;
clemente 0:7ad454fed160 76 unsigned int v_size;
clemente 0:7ad454fed160 77 unsigned int h_line;
clemente 0:7ad454fed160 78 };
clemente 0:7ad454fed160 79 #endif
clemente 0:7ad454fed160 80
clemente 0:7ad454fed160 81 FontInfo[0].pText=(unsigned char*)&Text12x6[0];
clemente 0:7ad454fed160 82 FontInfo[0].h_size=6;
clemente 0:7ad454fed160 83 FontInfo[0].v_size=12;
clemente 0:7ad454fed160 84 FontInfo[0].h_line=1;
clemente 0:7ad454fed160 85
clemente 0:7ad454fed160 86 FontInfo[1].pText=(unsigned char*)&Text24x12[0];
clemente 0:7ad454fed160 87 FontInfo[1].h_size=12;
clemente 0:7ad454fed160 88 FontInfo[1].v_size=24;
clemente 0:7ad454fed160 89 FontInfo[1].h_line=2;
clemente 0:7ad454fed160 90
clemente 0:7ad454fed160 91 FontIdx=0;
clemente 0:7ad454fed160 92 }
clemente 0:7ad454fed160 93
clemente 0:7ad454fed160 94 void GLCD::backlighton( void)
clemente 0:7ad454fed160 95 {
clemente 0:7ad454fed160 96 backlightset( 1);
clemente 0:7ad454fed160 97 }
clemente 0:7ad454fed160 98
clemente 0:7ad454fed160 99 void GLCD::backlightoff( void)
clemente 0:7ad454fed160 100 {
clemente 0:7ad454fed160 101 backlightset( 0);
clemente 0:7ad454fed160 102 }
clemente 0:7ad454fed160 103
clemente 0:7ad454fed160 104 void GLCD::backlightset( double val)
clemente 0:7ad454fed160 105 {
clemente 0:7ad454fed160 106 LCDBkLight=val;
clemente 0:7ad454fed160 107 _bklgh = LCDBkLight;
clemente 0:7ad454fed160 108 }
clemente 0:7ad454fed160 109
clemente 0:7ad454fed160 110 void GLCD::lcd_init( void)
clemente 0:7ad454fed160 111 {
clemente 0:7ad454fed160 112 _spi.format(8,SPIMode);
clemente 0:7ad454fed160 113 _spi.frequency( SPIClkSpeed);
clemente 0:7ad454fed160 114 _bklgh = LCDBkLight;
clemente 0:7ad454fed160 115
clemente 0:7ad454fed160 116 lcd_reset();
clemente 0:7ad454fed160 117
clemente 0:7ad454fed160 118 }
clemente 0:7ad454fed160 119
clemente 0:7ad454fed160 120 void GLCD::lcd_init( unsigned int speedf)
clemente 0:7ad454fed160 121 {
clemente 0:7ad454fed160 122 _spi.format(8,SPIMode);
clemente 0:7ad454fed160 123 _spi.frequency( speedf);
clemente 0:7ad454fed160 124 SPIClkSpeed=speedf;
clemente 0:7ad454fed160 125 _bklgh = LCDBkLight;
clemente 0:7ad454fed160 126
clemente 0:7ad454fed160 127 lcd_reset();
clemente 0:7ad454fed160 128
clemente 0:7ad454fed160 129 }
clemente 0:7ad454fed160 130
clemente 0:7ad454fed160 131 void GLCD::lcd_init( unsigned int speedf, unsigned int speeds)
clemente 0:7ad454fed160 132 {
clemente 0:7ad454fed160 133 _spi.format(8,SPIMode);
clemente 0:7ad454fed160 134 _spi.frequency( speedf);
clemente 0:7ad454fed160 135 SPIClkSpeed=speedf;
clemente 0:7ad454fed160 136 SPISlowClkSpeed=speeds;
clemente 0:7ad454fed160 137 _bklgh = LCDBkLight;
clemente 0:7ad454fed160 138
clemente 0:7ad454fed160 139 lcd_reset();
clemente 0:7ad454fed160 140
clemente 0:7ad454fed160 141 }
clemente 0:7ad454fed160 142
clemente 0:7ad454fed160 143 void GLCD::lcd_setfontsmall( void)
clemente 0:7ad454fed160 144 {
clemente 0:7ad454fed160 145 FontIdx=0;
clemente 0:7ad454fed160 146 }
clemente 0:7ad454fed160 147
clemente 0:7ad454fed160 148 void GLCD::lcd_setfontbig( void)
clemente 0:7ad454fed160 149 {
clemente 0:7ad454fed160 150 FontIdx=1;
clemente 0:7ad454fed160 151 }
clemente 0:7ad454fed160 152
clemente 0:7ad454fed160 153 void GLCD::lcd_setbackgroundcolor( unsigned int color) {
clemente 0:7ad454fed160 154 BackGroundColor=color;
clemente 0:7ad454fed160 155 }
clemente 0:7ad454fed160 156
clemente 0:7ad454fed160 157 void GLCD::lcd_drawstr(char *__putstr, unsigned int xpos, unsigned int ypos, unsigned int color)
clemente 0:7ad454fed160 158 {
clemente 0:7ad454fed160 159 char __ps;
clemente 0:7ad454fed160 160 unsigned int xp,yp;
clemente 0:7ad454fed160 161
clemente 0:7ad454fed160 162 /* Set the fast SPI speed. */
clemente 0:7ad454fed160 163 _spi.frequency( SPIClkSpeed);
clemente 0:7ad454fed160 164
clemente 0:7ad454fed160 165 xp=xpos; yp=ypos;
clemente 0:7ad454fed160 166
clemente 0:7ad454fed160 167 while((__ps = *__putstr))
clemente 0:7ad454fed160 168 {
clemente 0:7ad454fed160 169 __putstr++;
clemente 0:7ad454fed160 170 if (__ps== 0) break;
clemente 0:7ad454fed160 171 lcd_drawch(__ps,xp,yp, color);
clemente 0:7ad454fed160 172 xp+=FontInfo[FontIdx].h_size; // la dimensione del font per adesso è impostata manualmente.
clemente 0:7ad454fed160 173 }
clemente 0:7ad454fed160 174 /* Reset to slow speed. */
clemente 0:7ad454fed160 175 _spi.frequency( SPISlowClkSpeed);
clemente 0:7ad454fed160 176 }
clemente 0:7ad454fed160 177
clemente 0:7ad454fed160 178 void GLCD::lcd_drawch( unsigned ch, unsigned int xpos, unsigned int ypos, unsigned int color)
clemente 0:7ad454fed160 179 {
clemente 0:7ad454fed160 180 unsigned int H_Line, H_Size, V_Size, SrcInc;
clemente 0:7ad454fed160 181 unsigned char *pSrc;
clemente 0:7ad454fed160 182 unsigned int i, j, txtcolor;
clemente 0:7ad454fed160 183
clemente 0:7ad454fed160 184 /* Set the fast SPI speed. */
clemente 0:7ad454fed160 185 _spi.frequency( SPIClkSpeed);
clemente 0:7ad454fed160 186
clemente 0:7ad454fed160 187 // per adesso imposto i valori di queste grandezze manualmente
clemente 0:7ad454fed160 188 H_Line=FontInfo[FontIdx].h_line;
clemente 0:7ad454fed160 189 H_Size=FontInfo[FontIdx].h_size;
clemente 0:7ad454fed160 190 V_Size=FontInfo[FontIdx].v_size;
clemente 0:7ad454fed160 191
clemente 0:7ad454fed160 192 //
clemente 0:7ad454fed160 193 lcd_area(xpos, ypos, (H_Size-1)+xpos, (V_Size-1)+ypos);
clemente 0:7ad454fed160 194 // printf("Programmo area: xpos=%d, ypos=%d, Hs=%d, Vs=%d\r\n", xpos,ypos,(H_Size-1)+xpos, (V_Size-1)+ypos);
clemente 0:7ad454fed160 195 // wait( 1);
clemente 0:7ad454fed160 196 //
clemente 0:7ad454fed160 197 pSrc=(unsigned char*)&FontInfo[FontIdx].pText[0]+(H_Line*V_Size*ch);
clemente 0:7ad454fed160 198 // printf("Carico il puntatore @ Text[%d]\r\n", (H_Line*V_Size*ch));
clemente 0:7ad454fed160 199 // wait( 1);
clemente 0:7ad454fed160 200
clemente 0:7ad454fed160 201 lcd_drawstart();
clemente 0:7ad454fed160 202
clemente 0:7ad454fed160 203 #if ( LCD_MODE_262K==6 )
clemente 0:7ad454fed160 204 _spi.format(6,SPIMode);
clemente 0:7ad454fed160 205 #endif
clemente 0:7ad454fed160 206
clemente 0:7ad454fed160 207 //
clemente 0:7ad454fed160 208 for ( i=0; i<V_Size; i++) {
clemente 0:7ad454fed160 209 SrcInc=H_Line;
clemente 0:7ad454fed160 210 for ( j=0; j<H_Size; j++) {
clemente 0:7ad454fed160 211 txtcolor=(*pSrc & (1UL<<(j&0x07)))?color:BackGroundColor;
clemente 0:7ad454fed160 212 #if (LCD_MODE_262K==6 )
clemente 0:7ad454fed160 213 _spi.write( (txtcolor&0x00FC0000)>>18 );
clemente 0:7ad454fed160 214 _spi.write( (txtcolor&0x0000FC00)>>10 );
clemente 0:7ad454fed160 215 _spi.write( (txtcolor&0x000000FC)>>2);
clemente 0:7ad454fed160 216 #else
clemente 0:7ad454fed160 217 lcd_draw( txtcolor);
clemente 0:7ad454fed160 218 #endif //
clemente 0:7ad454fed160 219 if ((j&0x07) == 7) {
clemente 0:7ad454fed160 220 ++pSrc;
clemente 0:7ad454fed160 221 --SrcInc;
clemente 0:7ad454fed160 222 }
clemente 0:7ad454fed160 223 }
clemente 0:7ad454fed160 224 pSrc += SrcInc;
clemente 0:7ad454fed160 225 }
clemente 0:7ad454fed160 226 //
clemente 0:7ad454fed160 227 #if ( LCD_MODE_262K==6 )
clemente 0:7ad454fed160 228 _spi.format(8,SPIMode);
clemente 0:7ad454fed160 229 #endif
clemente 0:7ad454fed160 230 lcd_drawstop();
clemente 0:7ad454fed160 231 /* Reset to the slow SPI speed. */
clemente 0:7ad454fed160 232 _spi.frequency( SPISlowClkSpeed);
clemente 0:7ad454fed160 233 }
clemente 0:7ad454fed160 234
clemente 0:7ad454fed160 235 void GLCD::lcd_draw(unsigned int color)
clemente 0:7ad454fed160 236 {
clemente 0:7ad454fed160 237 _spi.write(color>>8);
clemente 0:7ad454fed160 238 _spi.write(color);
clemente 0:7ad454fed160 239
clemente 0:7ad454fed160 240 return;
clemente 0:7ad454fed160 241 }
clemente 0:7ad454fed160 242
clemente 0:7ad454fed160 243
clemente 0:7ad454fed160 244 void GLCD::lcd_drawstop(void)
clemente 0:7ad454fed160 245 {
clemente 0:7ad454fed160 246 LCD_CS_DISABLE();
clemente 0:7ad454fed160 247
clemente 0:7ad454fed160 248 return;
clemente 0:7ad454fed160 249 }
clemente 0:7ad454fed160 250
clemente 0:7ad454fed160 251
clemente 0:7ad454fed160 252 void GLCD::lcd_drawstart(void)
clemente 0:7ad454fed160 253 {
clemente 0:7ad454fed160 254 LCD_CS_ENABLE();
clemente 0:7ad454fed160 255 _spi.write(LCD_REGISTER);
clemente 0:7ad454fed160 256 _spi.write(0x22);
clemente 0:7ad454fed160 257 LCD_CS_DISABLE();
clemente 0:7ad454fed160 258
clemente 0:7ad454fed160 259 LCD_CS_ENABLE();
clemente 0:7ad454fed160 260 _spi.write(LCD_DATA);
clemente 0:7ad454fed160 261
clemente 0:7ad454fed160 262 return;
clemente 0:7ad454fed160 263 }
clemente 0:7ad454fed160 264
clemente 0:7ad454fed160 265 inline void GLCD::lcd_cmd(unsigned int reg, unsigned int param)
clemente 0:7ad454fed160 266 {
clemente 0:7ad454fed160 267 LCD_CS_ENABLE();
clemente 0:7ad454fed160 268 _spi.write( LCD_REGISTER);
clemente 0:7ad454fed160 269 _spi.write( reg);
clemente 0:7ad454fed160 270 LCD_CS_DISABLE();
clemente 0:7ad454fed160 271
clemente 0:7ad454fed160 272 LCD_CS_ENABLE();
clemente 0:7ad454fed160 273 _spi.write( LCD_DATA);
clemente 0:7ad454fed160 274 _spi.write( param);
clemente 0:7ad454fed160 275 LCD_CS_DISABLE();
clemente 0:7ad454fed160 276
clemente 0:7ad454fed160 277 return;
clemente 0:7ad454fed160 278 }
clemente 0:7ad454fed160 279
clemente 0:7ad454fed160 280
clemente 0:7ad454fed160 281 void GLCD::lcd_data(unsigned int c)
clemente 0:7ad454fed160 282 {
clemente 0:7ad454fed160 283 LCD_CS_ENABLE();
clemente 0:7ad454fed160 284 _spi.write(LCD_DATA);
clemente 0:7ad454fed160 285 _spi.write(c>>8);
clemente 0:7ad454fed160 286 _spi.write(c);
clemente 0:7ad454fed160 287 LCD_CS_DISABLE();
clemente 0:7ad454fed160 288
clemente 0:7ad454fed160 289 return;
clemente 0:7ad454fed160 290 }
clemente 0:7ad454fed160 291
clemente 0:7ad454fed160 292 void GLCD::lcd_area(unsigned int x0, unsigned int y0, unsigned int x1, unsigned int y1)
clemente 0:7ad454fed160 293 {
clemente 0:7ad454fed160 294 lcd_cmd(0x03, (x0>>0)); //set x0
clemente 0:7ad454fed160 295 lcd_cmd(0x02, (x0>>8)); //set x0
clemente 0:7ad454fed160 296 lcd_cmd(0x05, (x1>>0)); //set x1
clemente 0:7ad454fed160 297 lcd_cmd(0x04, (x1>>8)); //set x1
clemente 0:7ad454fed160 298 lcd_cmd(0x07, (y0>>0)); //set y0
clemente 0:7ad454fed160 299 lcd_cmd(0x06, (y0>>8)); //set y0
clemente 0:7ad454fed160 300 lcd_cmd(0x09, (y1>>0)); //set y1
clemente 0:7ad454fed160 301 lcd_cmd(0x08, (y1>>8)); //set y1
clemente 0:7ad454fed160 302
clemente 0:7ad454fed160 303 return;
clemente 0:7ad454fed160 304 }
clemente 0:7ad454fed160 305
clemente 0:7ad454fed160 306 void GLCD::lcd_setverticalarea( unsigned int topf, unsigned int height, unsigned int butf)
clemente 0:7ad454fed160 307 {
clemente 0:7ad454fed160 308 if ( (topf+height+butf) > 320)
clemente 0:7ad454fed160 309 return;
clemente 0:7ad454fed160 310
clemente 0:7ad454fed160 311 lcd_cmd( 0x0F, (topf>>0));
clemente 0:7ad454fed160 312 lcd_cmd( 0x0E, (topf>>8));
clemente 0:7ad454fed160 313 lcd_cmd( 0x11, (height>>0));
clemente 0:7ad454fed160 314 lcd_cmd( 0x10, (height>>8));
clemente 0:7ad454fed160 315 lcd_cmd( 0x13, (butf>>0));
clemente 0:7ad454fed160 316 lcd_cmd( 0x12, (butf>>8));
clemente 0:7ad454fed160 317 }
clemente 0:7ad454fed160 318
clemente 0:7ad454fed160 319 void GLCD::lcd_scrollstartadd( unsigned int ssa)
clemente 0:7ad454fed160 320 {
clemente 0:7ad454fed160 321 lcd_cmd( 0x15, (ssa>>0));
clemente 0:7ad454fed160 322 lcd_cmd( 0x14, (ssa>>8));
clemente 0:7ad454fed160 323 }
clemente 0:7ad454fed160 324
clemente 0:7ad454fed160 325 void GLCD::lcd_scrollstart( void)
clemente 0:7ad454fed160 326 {
clemente 0:7ad454fed160 327 lcd_cmd( 0x01, 0x0008);
clemente 0:7ad454fed160 328 }
clemente 0:7ad454fed160 329
clemente 0:7ad454fed160 330 void GLCD::lcd_scrollstop( void)
clemente 0:7ad454fed160 331 {
clemente 0:7ad454fed160 332 lcd_cmd( 0x01, 0x0000);
clemente 0:7ad454fed160 333 }
clemente 0:7ad454fed160 334
clemente 0:7ad454fed160 335 unsigned int GLCD::lcd_RGB( unsigned int color)
clemente 0:7ad454fed160 336 {
clemente 0:7ad454fed160 337
clemente 0:7ad454fed160 338 return ( RGB( (( color&0x00FF0000)>>16), ( ( color&0x0000FF00)>>8), ( color&0x000000FF)) );
clemente 0:7ad454fed160 339
clemente 0:7ad454fed160 340 }
clemente 0:7ad454fed160 341
clemente 0:7ad454fed160 342 unsigned int GLCD::lcd_RGB( unsigned int r, unsigned int g, unsigned int b)
clemente 0:7ad454fed160 343 {
clemente 0:7ad454fed160 344 return ( RGB( r, g, b));
clemente 0:7ad454fed160 345 }
clemente 0:7ad454fed160 346
clemente 0:7ad454fed160 347
clemente 0:7ad454fed160 348 void GLCD::lcd_clear(unsigned int color)
clemente 0:7ad454fed160 349 {
clemente 0:7ad454fed160 350 unsigned int i;
clemente 0:7ad454fed160 351
clemente 0:7ad454fed160 352 /* Set the fast SPI speed. */
clemente 0:7ad454fed160 353 _spi.frequency( SPIClkSpeed);
clemente 0:7ad454fed160 354
clemente 0:7ad454fed160 355 lcd_area(0, 0, (LCD_WIDTH-1), (LCD_HEIGHT-1));
clemente 0:7ad454fed160 356
clemente 0:7ad454fed160 357 lcd_drawstart();
clemente 0:7ad454fed160 358
clemente 0:7ad454fed160 359 #if ( LCD_MODE_262K==6 )
clemente 0:7ad454fed160 360 _spi.format(6,SPIMode);
clemente 0:7ad454fed160 361 _spi.frequency( SPIClkSpeed);
clemente 0:7ad454fed160 362 #endif
clemente 0:7ad454fed160 363
clemente 0:7ad454fed160 364 for(i=(LCD_WIDTH*LCD_HEIGHT); i!=0; i--)
clemente 0:7ad454fed160 365 {
clemente 0:7ad454fed160 366 #if (LCD_MODE_262K==6 )
clemente 0:7ad454fed160 367 _spi.write( (color&0x00FC0000)>>18 );
clemente 0:7ad454fed160 368 _spi.write( (color&0x0000FC00)>>10 );
clemente 0:7ad454fed160 369 _spi.write( (color&0x000000FC)>>2);
clemente 0:7ad454fed160 370 #else
clemente 0:7ad454fed160 371 lcd_draw( color);
clemente 0:7ad454fed160 372 #endif
clemente 0:7ad454fed160 373 }
clemente 0:7ad454fed160 374 //
clemente 0:7ad454fed160 375 #if ( LCD_MODE_262K==6 )
clemente 0:7ad454fed160 376 _spi.format(8,SPIMode);
clemente 0:7ad454fed160 377 _spi.frequency( SPIClkSpeed);
clemente 0:7ad454fed160 378 #endif
clemente 0:7ad454fed160 379 lcd_drawstop();
clemente 0:7ad454fed160 380
clemente 0:7ad454fed160 381 /* Reset to the slow SPI speed. */
clemente 0:7ad454fed160 382 _spi.frequency( SPISlowClkSpeed);
clemente 0:7ad454fed160 383 return;
clemente 0:7ad454fed160 384 }
clemente 0:7ad454fed160 385
clemente 0:7ad454fed160 386 void GLCD::lcd_clear(unsigned int x0, unsigned int y0, unsigned int w, unsigned int h, unsigned int color)
clemente 0:7ad454fed160 387 {
clemente 0:7ad454fed160 388 unsigned int i;
clemente 0:7ad454fed160 389
clemente 0:7ad454fed160 390 /* Set the fast SPI speed. */
clemente 0:7ad454fed160 391 _spi.frequency( SPIClkSpeed);
clemente 0:7ad454fed160 392
clemente 0:7ad454fed160 393 lcd_area(x0, y0, (w-1)+x0, (h-1)+y0);
clemente 0:7ad454fed160 394
clemente 0:7ad454fed160 395 lcd_drawstart();
clemente 0:7ad454fed160 396
clemente 0:7ad454fed160 397 #if ( LCD_MODE_262K==6 )
clemente 0:7ad454fed160 398 _spi.format(6,SPIMode);
clemente 0:7ad454fed160 399 _spi.frequency( SPIClkSpeed);
clemente 0:7ad454fed160 400 #endif
clemente 0:7ad454fed160 401
clemente 0:7ad454fed160 402 for(i=(w*h); i!=0; i--)
clemente 0:7ad454fed160 403 {
clemente 0:7ad454fed160 404 #if (LCD_MODE_262K==6 )
clemente 0:7ad454fed160 405 _spi.write( (color&0x00FC0000)>>18 );
clemente 0:7ad454fed160 406 _spi.write( (color&0x0000FC00)>>10 );
clemente 0:7ad454fed160 407 _spi.write( (color&0x000000FC)>>2);
clemente 0:7ad454fed160 408 #else
clemente 0:7ad454fed160 409 lcd_draw( color);
clemente 0:7ad454fed160 410 #endif
clemente 0:7ad454fed160 411 }
clemente 0:7ad454fed160 412 //
clemente 0:7ad454fed160 413 #if ( LCD_MODE_262K==6 )
clemente 0:7ad454fed160 414 _spi.format(8,SPIMode);
clemente 0:7ad454fed160 415 _spi.frequency( SPIClkSpeed);
clemente 0:7ad454fed160 416 #endif
clemente 0:7ad454fed160 417 lcd_drawstop();
clemente 0:7ad454fed160 418
clemente 0:7ad454fed160 419 /* Reset to the slow SPI speed. */
clemente 0:7ad454fed160 420 _spi.frequency( SPISlowClkSpeed);
clemente 0:7ad454fed160 421 return;
clemente 0:7ad454fed160 422 }
clemente 0:7ad454fed160 423
clemente 0:7ad454fed160 424
clemente 0:7ad454fed160 425 #ifdef _USE_FILE
clemente 0:7ad454fed160 426 unsigned int GLCD::lcd_drawimage(char *fname)
clemente 0:7ad454fed160 427 {
clemente 0:7ad454fed160 428 unsigned int i;
clemente 0:7ad454fed160 429 unsigned char r, g, b;
clemente 0:7ad454fed160 430
clemente 0:7ad454fed160 431 FILE *fp;
clemente 0:7ad454fed160 432
clemente 0:7ad454fed160 433 if ( (fp=fopen( fname, "r")) == NULL ) {
clemente 0:7ad454fed160 434 return 0;
clemente 0:7ad454fed160 435 }
clemente 0:7ad454fed160 436
clemente 0:7ad454fed160 437 lcd_area(0, 0, (LCD_WIDTH-1), (LCD_HEIGHT-1));
clemente 0:7ad454fed160 438
clemente 0:7ad454fed160 439 lcd_drawstart();
clemente 0:7ad454fed160 440
clemente 0:7ad454fed160 441 #if ( LCD_MODE_262K==6 )
clemente 0:7ad454fed160 442 _spi.format(6,3);
clemente 0:7ad454fed160 443 #endif
clemente 0:7ad454fed160 444
clemente 0:7ad454fed160 445 for(i=(LCD_WIDTH*LCD_HEIGHT); i!=0; i--)
clemente 0:7ad454fed160 446 {
clemente 0:7ad454fed160 447 //
clemente 0:7ad454fed160 448 r=fgetc( fp);
clemente 0:7ad454fed160 449 g=fgetc( fp);
clemente 0:7ad454fed160 450 b=fgetc( fp);
clemente 0:7ad454fed160 451 //
clemente 0:7ad454fed160 452 #if ( LCD_MODE_262K==6 )
clemente 0:7ad454fed160 453 _spi.write( (r&0xFC)>>2 );
clemente 0:7ad454fed160 454 _spi.write( (g&0xFC)>>2 );
clemente 0:7ad454fed160 455 _spi.write( (b&0xFC)>>2 );
clemente 0:7ad454fed160 456 #else
clemente 0:7ad454fed160 457 lcd_draw( RGB( r, g, b));
clemente 0:7ad454fed160 458 #endif
clemente 0:7ad454fed160 459 //
clemente 0:7ad454fed160 460 if ( feof( fp)) {
clemente 0:7ad454fed160 461 fclose( fp);
clemente 0:7ad454fed160 462 break;
clemente 0:7ad454fed160 463 }
clemente 0:7ad454fed160 464 }
clemente 0:7ad454fed160 465 //
clemente 0:7ad454fed160 466 if ( fp)
clemente 0:7ad454fed160 467 fclose( fp);
clemente 0:7ad454fed160 468 //
clemente 0:7ad454fed160 469 #if ( LCD_MODE_262K==6 )
clemente 0:7ad454fed160 470 _spi.format(8,3);
clemente 0:7ad454fed160 471 #endif
clemente 0:7ad454fed160 472 lcd_drawstop();
clemente 0:7ad454fed160 473
clemente 0:7ad454fed160 474 return 1;
clemente 0:7ad454fed160 475 }
clemente 0:7ad454fed160 476 #endif
clemente 0:7ad454fed160 477
clemente 0:7ad454fed160 478
clemente 0:7ad454fed160 479 #ifdef _USE_FILE
clemente 0:7ad454fed160 480
clemente 0:7ad454fed160 481 unsigned int GLCD::lcd_drawimagebuff(char *fname)
clemente 0:7ad454fed160 482 {
clemente 0:7ad454fed160 483 unsigned int i;
clemente 0:7ad454fed160 484 unsigned char r, g, b;
clemente 0:7ad454fed160 485 unsigned char buffer[320*BUFFER_LINE*3];
clemente 0:7ad454fed160 486 unsigned int size, idx, y=0;
clemente 0:7ad454fed160 487
clemente 0:7ad454fed160 488 FILE *fp;
clemente 0:7ad454fed160 489
clemente 0:7ad454fed160 490 if ( (fp=fopen( fname, "r")) == NULL ) {
clemente 0:7ad454fed160 491 return 0;
clemente 0:7ad454fed160 492 }
clemente 0:7ad454fed160 493
clemente 0:7ad454fed160 494 size=fread( &buffer[0], sizeof(buffer[0]), sizeof(buffer)/sizeof(buffer[0]), fp);
clemente 0:7ad454fed160 495
clemente 0:7ad454fed160 496 /* Set the fast SPI speed. */
clemente 0:7ad454fed160 497 _spi.frequency( SPIClkSpeed);
clemente 0:7ad454fed160 498
clemente 0:7ad454fed160 499 lcd_area(0, 0, (LCD_WIDTH-1), (LCD_HEIGHT-1));
clemente 0:7ad454fed160 500
clemente 0:7ad454fed160 501 lcd_drawstart();
clemente 0:7ad454fed160 502
clemente 0:7ad454fed160 503 #if ( LCD_MODE_262K==6 )
clemente 0:7ad454fed160 504 _spi.format(6,SPIMode);
clemente 0:7ad454fed160 505 #endif
clemente 0:7ad454fed160 506
clemente 0:7ad454fed160 507 idx=0;
clemente 0:7ad454fed160 508 for(i=(LCD_WIDTH*LCD_HEIGHT); i!=0; i--)
clemente 0:7ad454fed160 509 {
clemente 0:7ad454fed160 510 //
clemente 0:7ad454fed160 511 r=buffer[idx++];
clemente 0:7ad454fed160 512 g=buffer[idx++];
clemente 0:7ad454fed160 513 b=buffer[idx++];
clemente 0:7ad454fed160 514 //
clemente 0:7ad454fed160 515 #if ( LCD_MODE_262K==6 )
clemente 0:7ad454fed160 516 _spi.write( (r&0xFC)>>2 );
clemente 0:7ad454fed160 517 _spi.write( (g&0xFC)>>2 );
clemente 0:7ad454fed160 518 _spi.write( (b&0xFC)>>2 );
clemente 0:7ad454fed160 519 #else
clemente 0:7ad454fed160 520 lcd_draw( RGB( r, g, b));
clemente 0:7ad454fed160 521 #endif
clemente 0:7ad454fed160 522 //
clemente 0:7ad454fed160 523 if ( idx>=size){
clemente 0:7ad454fed160 524 #if ( LCD_MODE_262K==6 )
clemente 0:7ad454fed160 525 _spi.format(8,SPIMode);
clemente 0:7ad454fed160 526 #endif
clemente 0:7ad454fed160 527 lcd_drawstop();
clemente 0:7ad454fed160 528 //
clemente 0:7ad454fed160 529 if ( feof( fp)) {
clemente 0:7ad454fed160 530 fclose( fp);
clemente 0:7ad454fed160 531 break;
clemente 0:7ad454fed160 532 }
clemente 0:7ad454fed160 533 //
clemente 0:7ad454fed160 534 size=fread( &buffer[0], sizeof(buffer[0]), sizeof(buffer)/sizeof(buffer[0]), fp);
clemente 0:7ad454fed160 535 idx=0;
clemente 0:7ad454fed160 536 y+=BUFFER_LINE;
clemente 0:7ad454fed160 537 lcd_area(0, y, (LCD_WIDTH-1), (LCD_HEIGHT-1));
clemente 0:7ad454fed160 538 lcd_drawstart();
clemente 0:7ad454fed160 539 #if ( LCD_MODE_262K==6 )
clemente 0:7ad454fed160 540 _spi.format(6,SPIMode);
clemente 0:7ad454fed160 541 #endif
clemente 0:7ad454fed160 542 }
clemente 0:7ad454fed160 543 }
clemente 0:7ad454fed160 544 //
clemente 0:7ad454fed160 545 #if ( LCD_MODE_262K==6 )
clemente 0:7ad454fed160 546 _spi.format(8,SPIMode);
clemente 0:7ad454fed160 547 #endif
clemente 0:7ad454fed160 548 //
clemente 0:7ad454fed160 549 lcd_drawstop();
clemente 0:7ad454fed160 550 /* Reset to the slow SPI speed. */
clemente 0:7ad454fed160 551 _spi.frequency( SPISlowClkSpeed);
clemente 0:7ad454fed160 552 //
clemente 0:7ad454fed160 553 if ( fp)
clemente 0:7ad454fed160 554 fclose( fp);
clemente 0:7ad454fed160 555
clemente 0:7ad454fed160 556 return 1;
clemente 0:7ad454fed160 557 }
clemente 0:7ad454fed160 558 #endif
clemente 0:7ad454fed160 559
clemente 0:7ad454fed160 560 #ifdef _USE_FILE
clemente 0:7ad454fed160 561 unsigned int GLCD::lcd_drawimagebyline(unsigned char *buffer, unsigned int lnum, unsigned int xstart, unsigned int ystart, unsigned int scale)
clemente 0:7ad454fed160 562 {
clemente 0:7ad454fed160 563 unsigned int i, idx;
clemente 0:7ad454fed160 564 unsigned char r, g, b;
clemente 0:7ad454fed160 565
clemente 0:7ad454fed160 566 /* Set the fast SPI speed. */
clemente 0:7ad454fed160 567 _spi.frequency( SPIClkSpeed);
clemente 0:7ad454fed160 568
clemente 0:7ad454fed160 569 lcd_area(xstart, lnum+ystart, ((LCD_WIDTH/scale)-1)+xstart, lnum+ystart);
clemente 0:7ad454fed160 570
clemente 0:7ad454fed160 571 lcd_drawstart();
clemente 0:7ad454fed160 572
clemente 0:7ad454fed160 573 #if ( LCD_MODE_262K==6 )
clemente 0:7ad454fed160 574 _spi.format(6,SPIMode);
clemente 0:7ad454fed160 575 #endif
clemente 0:7ad454fed160 576
clemente 0:7ad454fed160 577 idx=0;
clemente 0:7ad454fed160 578 for(i=LCD_WIDTH/scale; i!=0; i--)
clemente 0:7ad454fed160 579 {
clemente 0:7ad454fed160 580 //
clemente 0:7ad454fed160 581 r=buffer[idx];
clemente 0:7ad454fed160 582 g=buffer[idx+1];
clemente 0:7ad454fed160 583 b=buffer[idx+2];
clemente 0:7ad454fed160 584 //
clemente 0:7ad454fed160 585 idx+=(scale*3);
clemente 0:7ad454fed160 586 //
clemente 0:7ad454fed160 587 #if ( LCD_MODE_262K==6 )
clemente 0:7ad454fed160 588 _spi.write( (r&0xFC)>>2 );
clemente 0:7ad454fed160 589 _spi.write( (g&0xFC)>>2 );
clemente 0:7ad454fed160 590 _spi.write( (b&0xFC)>>2 );
clemente 0:7ad454fed160 591 #else
clemente 0:7ad454fed160 592 lcd_draw( RGB( r, g, b));
clemente 0:7ad454fed160 593 #endif
clemente 0:7ad454fed160 594 }
clemente 0:7ad454fed160 595 //
clemente 0:7ad454fed160 596 #if ( LCD_MODE_262K==6 )
clemente 0:7ad454fed160 597 _spi.format(8,SPIMode);
clemente 0:7ad454fed160 598 #endif
clemente 0:7ad454fed160 599 //
clemente 0:7ad454fed160 600 lcd_drawstop();
clemente 0:7ad454fed160 601 /* Reset to the slow SPI speed. */
clemente 0:7ad454fed160 602 _spi.frequency( SPISlowClkSpeed);
clemente 0:7ad454fed160 603
clemente 0:7ad454fed160 604 return 1;
clemente 0:7ad454fed160 605 }
clemente 0:7ad454fed160 606 #endif
clemente 0:7ad454fed160 607
clemente 0:7ad454fed160 608 #ifdef _USE_FILE
clemente 0:7ad454fed160 609 unsigned int GLCD::lcd_drawimagebyline(unsigned char *buffer, unsigned int lnum)
clemente 0:7ad454fed160 610 {
clemente 0:7ad454fed160 611 unsigned int i, idx;
clemente 0:7ad454fed160 612 unsigned char r, g, b;
clemente 0:7ad454fed160 613
clemente 0:7ad454fed160 614 /* Set the fast SPI speed. */
clemente 0:7ad454fed160 615 _spi.frequency( SPIClkSpeed);
clemente 0:7ad454fed160 616
clemente 0:7ad454fed160 617 lcd_area(0, lnum, (LCD_WIDTH-1), lnum);
clemente 0:7ad454fed160 618
clemente 0:7ad454fed160 619 lcd_drawstart();
clemente 0:7ad454fed160 620
clemente 0:7ad454fed160 621 #if ( LCD_MODE_262K==6 )
clemente 0:7ad454fed160 622 _spi.format(6,SPIMode);
clemente 0:7ad454fed160 623 #endif
clemente 0:7ad454fed160 624
clemente 0:7ad454fed160 625 idx=0;
clemente 0:7ad454fed160 626 for(i=LCD_WIDTH; i!=0; i--)
clemente 0:7ad454fed160 627 {
clemente 0:7ad454fed160 628 //
clemente 0:7ad454fed160 629 r=buffer[idx++];
clemente 0:7ad454fed160 630 g=buffer[idx++];
clemente 0:7ad454fed160 631 b=buffer[idx++];
clemente 0:7ad454fed160 632 //
clemente 0:7ad454fed160 633 #if ( LCD_MODE_262K==6 )
clemente 0:7ad454fed160 634 _spi.write( (r&0xFC)>>2 );
clemente 0:7ad454fed160 635 _spi.write( (g&0xFC)>>2 );
clemente 0:7ad454fed160 636 _spi.write( (b&0xFC)>>2 );
clemente 0:7ad454fed160 637 #else
clemente 0:7ad454fed160 638 lcd_draw( RGB( r, g, b));
clemente 0:7ad454fed160 639 #endif
clemente 0:7ad454fed160 640 }
clemente 0:7ad454fed160 641 //
clemente 0:7ad454fed160 642 #if ( LCD_MODE_262K==6 )
clemente 0:7ad454fed160 643 _spi.format(8,SPIMode);
clemente 0:7ad454fed160 644 #endif
clemente 0:7ad454fed160 645 //
clemente 0:7ad454fed160 646 lcd_drawstop();
clemente 0:7ad454fed160 647 /* Reset to the slow SPI speed. */
clemente 0:7ad454fed160 648 _spi.frequency( SPISlowClkSpeed);
clemente 0:7ad454fed160 649
clemente 0:7ad454fed160 650 return 1;
clemente 0:7ad454fed160 651 }
clemente 0:7ad454fed160 652 #endif
clemente 0:7ad454fed160 653
clemente 0:7ad454fed160 654 #ifdef _USE_FILE
clemente 0:7ad454fed160 655
clemente 0:7ad454fed160 656 unsigned int GLCD::lcd_drawmovie(char *fname, unsigned int x_start, unsigned int y_start)
clemente 0:7ad454fed160 657 {
clemente 0:7ad454fed160 658 unsigned int i;
clemente 0:7ad454fed160 659 unsigned char r, g, b;
clemente 0:7ad454fed160 660
clemente 0:7ad454fed160 661 FILE *fp;
clemente 0:7ad454fed160 662
clemente 0:7ad454fed160 663 if ( (fp=fopen( fname, "r")) == NULL ) {
clemente 0:7ad454fed160 664 return 0;
clemente 0:7ad454fed160 665 }
clemente 0:7ad454fed160 666
clemente 0:7ad454fed160 667 /* Set the fast SPI speed. */
clemente 0:7ad454fed160 668 _spi.frequency( SPIClkSpeed);
clemente 0:7ad454fed160 669
clemente 0:7ad454fed160 670 lcd_drawstop();
clemente 0:7ad454fed160 671 // lcd_area(0, 0, (LCD_WIDTH-1), (LCD_HEIGHT-1));
clemente 0:7ad454fed160 672 lcd_area(x_start, y_start, (80-1)+x_start, (60-1)+y_start);
clemente 0:7ad454fed160 673
clemente 0:7ad454fed160 674 lcd_drawstart();
clemente 0:7ad454fed160 675
clemente 0:7ad454fed160 676 #if ( LCD_MODE_262K==6 )
clemente 0:7ad454fed160 677 _spi.format(6,SPIMode);
clemente 0:7ad454fed160 678 #endif
clemente 0:7ad454fed160 679
clemente 0:7ad454fed160 680 while( 1)
clemente 0:7ad454fed160 681 {
clemente 0:7ad454fed160 682 //
clemente 0:7ad454fed160 683 r=fgetc( fp);
clemente 0:7ad454fed160 684 g=fgetc( fp);
clemente 0:7ad454fed160 685 b=fgetc( fp);
clemente 0:7ad454fed160 686 //
clemente 0:7ad454fed160 687 #if ( LCD_MODE_262K==6 )
clemente 0:7ad454fed160 688 _spi.write( (r&0xFC)>>2 );
clemente 0:7ad454fed160 689 _spi.write( (g&0xFC)>>2 );
clemente 0:7ad454fed160 690 _spi.write( (b&0xFC)>>2 );
clemente 0:7ad454fed160 691 #else
clemente 0:7ad454fed160 692 lcd_draw( RGB( r, g, b));
clemente 0:7ad454fed160 693 #endif
clemente 0:7ad454fed160 694 //
clemente 0:7ad454fed160 695 if ( feof( fp)) {
clemente 0:7ad454fed160 696 fclose( fp);
clemente 0:7ad454fed160 697 break;
clemente 0:7ad454fed160 698 }
clemente 0:7ad454fed160 699 }
clemente 0:7ad454fed160 700 //
clemente 0:7ad454fed160 701 if ( fp)
clemente 0:7ad454fed160 702 fclose( fp);
clemente 0:7ad454fed160 703 //
clemente 0:7ad454fed160 704 #if ( LCD_MODE_262K==6 )
clemente 0:7ad454fed160 705 _spi.format(8,SPIMode);
clemente 0:7ad454fed160 706 #endif
clemente 0:7ad454fed160 707 lcd_drawstop();
clemente 0:7ad454fed160 708
clemente 0:7ad454fed160 709 /* Reset to the slow SPI speed. */
clemente 0:7ad454fed160 710 _spi.frequency( SPISlowClkSpeed);
clemente 0:7ad454fed160 711
clemente 0:7ad454fed160 712 return 1;
clemente 0:7ad454fed160 713 }
clemente 0:7ad454fed160 714 #endif
clemente 0:7ad454fed160 715
clemente 0:7ad454fed160 716 #ifdef _USE_FILE
clemente 0:7ad454fed160 717 #if ( LCD_MODE_262K==5 )
clemente 0:7ad454fed160 718
clemente 0:7ad454fed160 719 // I will use a portion of memory proportional to a defined number of rows.
clemente 0:7ad454fed160 720 #define cLINE_NUMBER 40
clemente 0:7ad454fed160 721
clemente 0:7ad454fed160 722 // Ping-pong buffer. The buffer are proportional to the number of pixel per row (160), to the
clemente 0:7ad454fed160 723 // numeber of line I want to read and to the number of byte for each pixel. In this case I have
clemente 0:7ad454fed160 724 // a ready-made file with each pixel defined with 16bit (RGB==565bit)
clemente 0:7ad454fed160 725 unsigned char buffer[160*cLINE_NUMBER*2] __attribute((section("AHBSRAM1"),aligned));
clemente 0:7ad454fed160 726 unsigned char buffer1[160*cLINE_NUMBER*2] __attribute((section("AHBSRAM0"),aligned));
clemente 0:7ad454fed160 727
clemente 0:7ad454fed160 728 /** DMA_IRQHandler Called by DMA.
clemente 0:7ad454fed160 729 * Please to learn more read: http://mbed.org/users/AjK/programs/SOWB/lg489e/docs/flash__read_8c_source.html
clemente 0:7ad454fed160 730 */
clemente 0:7ad454fed160 731 volatile int DMA_flag;
clemente 0:7ad454fed160 732 extern "C" void DMA_IRQHandler(void) __irq {
clemente 0:7ad454fed160 733 if (LPC_GPDMA->DMACIntStat & 1) {
clemente 0:7ad454fed160 734 if (LPC_GPDMA->DMACIntTCStat & 1) {
clemente 0:7ad454fed160 735 DMA_flag=1;
clemente 0:7ad454fed160 736 LPC_GPDMA->DMACIntTCClear = 1;
clemente 0:7ad454fed160 737 }
clemente 0:7ad454fed160 738 if (LPC_GPDMA->DMACIntErrStat & 1) {
clemente 0:7ad454fed160 739 LPC_GPDMA->DMACIntErrClr = 1;
clemente 0:7ad454fed160 740 }
clemente 0:7ad454fed160 741 }
clemente 0:7ad454fed160 742 }
clemente 0:7ad454fed160 743
clemente 0:7ad454fed160 744 /** Linked List structure. I use this structure to send with one shot 3x3200 byte to the GLCD.
clemente 0:7ad454fed160 745 */
clemente 0:7ad454fed160 746 typedef struct {
clemente 0:7ad454fed160 747 uint32_t SrcAddr; /* Source Address */
clemente 0:7ad454fed160 748 uint32_t DstAddr; /* Destination address */
clemente 0:7ad454fed160 749 uint32_t NextLLI; /* Next LLI address, otherwise set to '0' */
clemente 0:7ad454fed160 750 uint32_t Control; /* GPDMA Control Register of this LLI. Reflect the content of LPC_GPDMACH0->DMACCControl */
clemente 0:7ad454fed160 751 } GPDMA_LLI;
clemente 0:7ad454fed160 752
clemente 0:7ad454fed160 753 /* Let declare the 3 linked list. The first LLI address will be programmed inside the DMA registers. */
clemente 0:7ad454fed160 754 GPDMA_LLI LLI0, LLI1, LLI2;
clemente 0:7ad454fed160 755
clemente 0:7ad454fed160 756 #define DMA_CHANNEL_ENABLE 1
clemente 0:7ad454fed160 757 #define DMA_TRANSFER_TYPE_M2P (1UL << 11)
clemente 0:7ad454fed160 758 #define DMA_CHANNEL_TCIE (1UL << 31)
clemente 0:7ad454fed160 759 #define DMA_CHANNEL_SRC_INC (1UL << 26)
clemente 0:7ad454fed160 760 #define DMA_MASK_IE (1UL << 14)
clemente 0:7ad454fed160 761 #define DMA_MASK_ITC (1UL << 15)
clemente 0:7ad454fed160 762 #define DMA_CHANNEL_SRC_PERIPHERAL_SSP0_RX (1UL << 1)
clemente 0:7ad454fed160 763 #define DMA_CHANNEL_SRC_PERIPHERAL_SSP0_TX (0UL << 1)
clemente 0:7ad454fed160 764 #define DMA_CHANNEL_DST_PERIPHERAL_SSP0_RX (1UL << 6)
clemente 0:7ad454fed160 765 #define DMA_CHANNEL_DST_PERIPHERAL_SSP0_TX (0UL << 6)
clemente 0:7ad454fed160 766
clemente 0:7ad454fed160 767 /** Display a movie file. The file is ready made to speed up the entire process.
clemente 0:7ad454fed160 768 *
clemente 0:7ad454fed160 769 * @param the name file.
clemente 0:7ad454fed160 770 *
clemente 0:7ad454fed160 771 */
clemente 0:7ad454fed160 772 unsigned int GLCD::lcd_drawmoviebuff(char *fname, unsigned int x_start, unsigned int y_start)
clemente 0:7ad454fed160 773 {
clemente 0:7ad454fed160 774 unsigned int i;
clemente 0:7ad454fed160 775 unsigned char r, g, b;
clemente 0:7ad454fed160 776 unsigned int size, idx, y=0;
clemente 0:7ad454fed160 777 unsigned char *pframe;
clemente 0:7ad454fed160 778 FILE *fp;
clemente 0:7ad454fed160 779
clemente 0:7ad454fed160 780 LPC_SSP0->DMACR=2;
clemente 0:7ad454fed160 781
clemente 0:7ad454fed160 782 /* Load the content to the LLI */
clemente 0:7ad454fed160 783 /* The LLI are chained, so I load the address to the corrispondent LLI*/
clemente 0:7ad454fed160 784 LLI0.NextLLI=(uint32_t)&LLI1;
clemente 0:7ad454fed160 785 LLI1.NextLLI=(uint32_t)&LLI2;
clemente 0:7ad454fed160 786 LLI2.NextLLI=0; // The last is NULL to stop the chain.
clemente 0:7ad454fed160 787
clemente 0:7ad454fed160 788 /* The dimension of the buffer are fixed. So each LLI have a fixed pointer to the owned block of memory */
clemente 0:7ad454fed160 789 /* Each buffer is 16KB long but I use fixed chunk following this rule: */
clemente 0:7ad454fed160 790 /* The image is 160x120x2 = 38400 byte big. I have divided this amount by three so that it can */
clemente 0:7ad454fed160 791 /* use the two memory buffer. Each chunk is now 12800 byte. But the DMA can only transfer 4KB of RAM, */
clemente 0:7ad454fed160 792 /* so I divided this amount of memory by four, 3200 byte, and use three LLI to let the DMA to send the entire buffer all at once. */
clemente 0:7ad454fed160 793 /* The LLI are three because the DMA is programmed with the first chund of buffer. At the end of this operation, the DMA load the LLI */
clemente 0:7ad454fed160 794 /* and sends the remaining buffers. */
clemente 0:7ad454fed160 795 LLI0.SrcAddr=(uint32_t)&buffer[3200];
clemente 0:7ad454fed160 796 LLI1.SrcAddr=(uint32_t)&buffer[3200+3200];
clemente 0:7ad454fed160 797 LLI2.SrcAddr=(uint32_t)&buffer[3200+3200+3200];
clemente 0:7ad454fed160 798 /* OK, the destination address is the same for all LLI. Please change if you use a different SPI. */
clemente 0:7ad454fed160 799 LLI0.DstAddr=(uint32_t)&LPC_SSP0->DR;
clemente 0:7ad454fed160 800 LLI1.DstAddr=(uint32_t)&LPC_SSP0->DR;
clemente 0:7ad454fed160 801 LLI2.DstAddr=(uint32_t)&LPC_SSP0->DR;
clemente 0:7ad454fed160 802 /* This is the control register. */
clemente 0:7ad454fed160 803 LLI0.Control= DMA_CHANNEL_TCIE | DMA_CHANNEL_SRC_INC | 3200;
clemente 0:7ad454fed160 804 LLI1.Control= DMA_CHANNEL_TCIE | DMA_CHANNEL_SRC_INC | 3200;
clemente 0:7ad454fed160 805 LLI2.Control= DMA_CHANNEL_TCIE | DMA_CHANNEL_SRC_INC | 3200;
clemente 0:7ad454fed160 806 /* ****************************************************** */
clemente 0:7ad454fed160 807
clemente 0:7ad454fed160 808 /* Power up the GPDMA. */
clemente 0:7ad454fed160 809 LPC_SC->PCONP |= (1UL << 29);
clemente 0:7ad454fed160 810 LPC_GPDMA->DMACConfig = 1;
clemente 0:7ad454fed160 811 LPC_GPDMA->DMACIntTCClear = 0x1;
clemente 0:7ad454fed160 812 // LPC_GPDMA->DMACSoftSReq = 0xC;
clemente 0:7ad454fed160 813 LPC_GPDMA->DMACSoftSReq = 0x3;
clemente 0:7ad454fed160 814
clemente 0:7ad454fed160 815 /* Enable the IRQ */
clemente 0:7ad454fed160 816 NVIC_EnableIRQ(DMA_IRQn);
clemente 0:7ad454fed160 817
clemente 0:7ad454fed160 818 /* Open the file */
clemente 0:7ad454fed160 819 if ( (fp=fopen( fname, "rb")) == NULL ) {
clemente 0:7ad454fed160 820 return 0;
clemente 0:7ad454fed160 821 }
clemente 0:7ad454fed160 822
clemente 0:7ad454fed160 823 /* Set the fast SPI speed. */
clemente 0:7ad454fed160 824 _spi.frequency( SPIClkSpeed);
clemente 0:7ad454fed160 825 _spi.format(8,SPIMode);
clemente 0:7ad454fed160 826 /* Define a fixed area to display the movie. */
clemente 0:7ad454fed160 827 lcd_area(x_start, y_start, (160-1)+x_start, (120-1)+y_start);
clemente 0:7ad454fed160 828 lcd_drawstart();
clemente 0:7ad454fed160 829
clemente 0:7ad454fed160 830 /* read the first buffer... */
clemente 0:7ad454fed160 831 size=fread( &buffer[0], sizeof(buffer[0]), sizeof(buffer)/sizeof(buffer[0]), fp);
clemente 0:7ad454fed160 832
clemente 0:7ad454fed160 833 /* Loop untile the whole file is read. */
clemente 0:7ad454fed160 834 while( 1) {
clemente 0:7ad454fed160 835 pframe=&buffer[0];
clemente 0:7ad454fed160 836 /* set the source buffer... */
clemente 0:7ad454fed160 837 LLI0.SrcAddr=(uint32_t)&pframe[3200];
clemente 0:7ad454fed160 838 LLI1.SrcAddr=(uint32_t)&pframe[3200+3200];
clemente 0:7ad454fed160 839 LLI2.SrcAddr=(uint32_t)&pframe[3200+3200+3200];
clemente 0:7ad454fed160 840
clemente 0:7ad454fed160 841 /* configure the DMA channell... */
clemente 0:7ad454fed160 842 LPC_GPDMACH0->DMACCSrcAddr = (uint32_t)pframe;
clemente 0:7ad454fed160 843 LPC_GPDMACH0->DMACCDestAddr = (uint32_t)&LPC_SSP0->DR;
clemente 0:7ad454fed160 844 LPC_GPDMACH0->DMACCLLI = (uint32_t)&LLI0;
clemente 0:7ad454fed160 845 LPC_GPDMACH0->DMACCControl = DMA_CHANNEL_TCIE | DMA_CHANNEL_SRC_INC | 3200;
clemente 0:7ad454fed160 846
clemente 0:7ad454fed160 847 DMA_flag=0;
clemente 0:7ad454fed160 848 /* Fire GPDMA Channel0 */
clemente 0:7ad454fed160 849 LPC_GPDMACH0->DMACCConfig = DMA_CHANNEL_ENABLE |
clemente 0:7ad454fed160 850 DMA_CHANNEL_DST_PERIPHERAL_SSP0_TX |
clemente 0:7ad454fed160 851 DMA_TRANSFER_TYPE_M2P |
clemente 0:7ad454fed160 852 DMA_MASK_IE |
clemente 0:7ad454fed160 853 DMA_MASK_ITC;
clemente 0:7ad454fed160 854
clemente 0:7ad454fed160 855 if ( feof( fp)) {
clemente 0:7ad454fed160 856 fclose( fp);
clemente 0:7ad454fed160 857 break;
clemente 0:7ad454fed160 858 }
clemente 0:7ad454fed160 859 /* Read the second chunk of the frame... */
clemente 0:7ad454fed160 860 size=fread( &buffer1[0], sizeof(buffer1[0]), sizeof(buffer1)/sizeof(buffer1[0]), fp);
clemente 0:7ad454fed160 861 /* OK, the buffer from the SDCar is read but now we must check if the DMA it's work... */
clemente 0:7ad454fed160 862 while( !DMA_flag);
clemente 0:7ad454fed160 863 DMA_flag=0;
clemente 0:7ad454fed160 864 /* At this point I check if I'm at end of the file. */
clemente 0:7ad454fed160 865 if ( feof( fp) || size != sizeof(buffer1)/sizeof(buffer1[0]) ) {
clemente 0:7ad454fed160 866 //
clemente 0:7ad454fed160 867 LPC_SSP0->IMSC = (1UL << 3);
clemente 0:7ad454fed160 868
clemente 0:7ad454fed160 869 LPC_GPDMACH0->DMACCConfig = 0;
clemente 0:7ad454fed160 870 LPC_GPDMA->DMACIntTCClear = 1;
clemente 0:7ad454fed160 871
clemente 0:7ad454fed160 872 fclose( fp);
clemente 0:7ad454fed160 873 while(LPC_SSP0->SR & (1UL << 2)) {
clemente 0:7ad454fed160 874 /* This loop ensures we read the last byte in the
clemente 0:7ad454fed160 875 RX FIFO and test that. */
clemente 0:7ad454fed160 876 int sr = LPC_SSP0->DR;
clemente 0:7ad454fed160 877 }
clemente 0:7ad454fed160 878
clemente 0:7ad454fed160 879 // lcd_drawstop();
clemente 0:7ad454fed160 880 NVIC_DisableIRQ(DMA_IRQn);
clemente 0:7ad454fed160 881 LPC_GPDMA->DMACIntTCClear = 1;
clemente 0:7ad454fed160 882 LPC_SSP0->DMACR=0;
clemente 0:7ad454fed160 883 LPC_GPDMA->DMACConfig = 0;
clemente 0:7ad454fed160 884 LPC_GPDMA->DMACIntTCClear = 0x1;
clemente 0:7ad454fed160 885 LPC_GPDMA->DMACSoftSReq = 0;
clemente 0:7ad454fed160 886 LPC_SC->PCONP &= ~(1UL << 29);
clemente 0:7ad454fed160 887 LPC_GPDMA->DMACIntTCClear = 1;
clemente 0:7ad454fed160 888 //
clemente 0:7ad454fed160 889 lcd_drawstop();
clemente 0:7ad454fed160 890 break;
clemente 0:7ad454fed160 891 }
clemente 0:7ad454fed160 892 /* Now I have a buffer full with new data and the DMA stopped. I can start it again. */
clemente 0:7ad454fed160 893 pframe=&buffer1[0];
clemente 0:7ad454fed160 894 /* I set the new buffer inside the LLI... */
clemente 0:7ad454fed160 895 LLI0.SrcAddr=(uint32_t)&pframe[3200];
clemente 0:7ad454fed160 896 LLI1.SrcAddr=(uint32_t)&pframe[3200+3200];
clemente 0:7ad454fed160 897 LLI2.SrcAddr=(uint32_t)&pframe[3200+3200+3200];
clemente 0:7ad454fed160 898 /* DMA configuration. */
clemente 0:7ad454fed160 899 LPC_GPDMACH0->DMACCSrcAddr = (uint32_t)pframe;
clemente 0:7ad454fed160 900 LPC_GPDMACH0->DMACCDestAddr = (uint32_t)&LPC_SSP0->DR;
clemente 0:7ad454fed160 901 LPC_GPDMACH0->DMACCLLI = (uint32_t)&LLI0;
clemente 0:7ad454fed160 902 LPC_GPDMACH0->DMACCControl = DMA_CHANNEL_TCIE | DMA_CHANNEL_SRC_INC | 3200;
clemente 0:7ad454fed160 903 /* Fire GPDMA Channel0 */
clemente 0:7ad454fed160 904 LPC_GPDMACH0->DMACCConfig = DMA_CHANNEL_ENABLE |
clemente 0:7ad454fed160 905 DMA_CHANNEL_DST_PERIPHERAL_SSP0_TX |
clemente 0:7ad454fed160 906 DMA_TRANSFER_TYPE_M2P |
clemente 0:7ad454fed160 907 DMA_MASK_IE |
clemente 0:7ad454fed160 908 DMA_MASK_ITC;
clemente 0:7ad454fed160 909
clemente 0:7ad454fed160 910 if ( feof( fp)) {
clemente 0:7ad454fed160 911 fclose( fp);
clemente 0:7ad454fed160 912 break;
clemente 0:7ad454fed160 913 }
clemente 0:7ad454fed160 914 /* A new read from the SDCad... */
clemente 0:7ad454fed160 915 size=fread( &buffer[0], sizeof(buffer[0]), sizeof(buffer)/sizeof(buffer[0]), fp);
clemente 0:7ad454fed160 916 /* just wait is the DMA it's working... */
clemente 0:7ad454fed160 917 while( !DMA_flag);
clemente 0:7ad454fed160 918 DMA_flag=0;
clemente 0:7ad454fed160 919 /* At this point I check if I'm at end of the file. */
clemente 0:7ad454fed160 920 if ( feof( fp) || size != sizeof(buffer)/sizeof(buffer[0]) ) {
clemente 0:7ad454fed160 921 fclose( fp);
clemente 0:7ad454fed160 922 break;
clemente 0:7ad454fed160 923 }
clemente 0:7ad454fed160 924 /* */
clemente 0:7ad454fed160 925 pframe=&buffer[0];
clemente 0:7ad454fed160 926 /* programmo nella LLI il nvuovo buffer... */
clemente 0:7ad454fed160 927 LLI0.SrcAddr=(uint32_t)&pframe[3200];
clemente 0:7ad454fed160 928 LLI1.SrcAddr=(uint32_t)&pframe[3200+3200];
clemente 0:7ad454fed160 929 LLI2.SrcAddr=(uint32_t)&pframe[3200+3200+3200];
clemente 0:7ad454fed160 930 /* programmo il DMA */
clemente 0:7ad454fed160 931 LPC_GPDMACH0->DMACCSrcAddr = (uint32_t)pframe;
clemente 0:7ad454fed160 932 LPC_GPDMACH0->DMACCDestAddr = (uint32_t)&LPC_SSP0->DR;
clemente 0:7ad454fed160 933 LPC_GPDMACH0->DMACCLLI = (uint32_t)&LLI0;
clemente 0:7ad454fed160 934 LPC_GPDMACH0->DMACCControl = DMA_CHANNEL_TCIE | DMA_CHANNEL_SRC_INC | 3200;
clemente 0:7ad454fed160 935 /* Fire GPDMA Channel0 */
clemente 0:7ad454fed160 936 LPC_GPDMACH0->DMACCConfig = DMA_CHANNEL_ENABLE |
clemente 0:7ad454fed160 937 DMA_CHANNEL_DST_PERIPHERAL_SSP0_TX |
clemente 0:7ad454fed160 938 DMA_TRANSFER_TYPE_M2P |
clemente 0:7ad454fed160 939 DMA_MASK_IE |
clemente 0:7ad454fed160 940 DMA_MASK_ITC;
clemente 0:7ad454fed160 941 if ( feof( fp)) {
clemente 0:7ad454fed160 942 fclose( fp);
clemente 0:7ad454fed160 943 break;
clemente 0:7ad454fed160 944 }
clemente 0:7ad454fed160 945 /* */
clemente 0:7ad454fed160 946 size=fread( &buffer1[0], sizeof(buffer1[0]), sizeof(buffer1)/sizeof(buffer1[0]), fp);
clemente 0:7ad454fed160 947 /* Aspetto che il DMA completi l'ultimo transfer... */
clemente 0:7ad454fed160 948 while( !DMA_flag);
clemente 0:7ad454fed160 949 DMA_flag=0;
clemente 0:7ad454fed160 950 /* At this point I check if I'm at end of the file. */
clemente 0:7ad454fed160 951 if ( feof( fp) || size != sizeof(buffer1)/sizeof(buffer1[0]) ) {
clemente 0:7ad454fed160 952 fclose( fp);
clemente 0:7ad454fed160 953 break;
clemente 0:7ad454fed160 954 }
clemente 0:7ad454fed160 955 /* */
clemente 0:7ad454fed160 956 pframe=&buffer1[0];
clemente 0:7ad454fed160 957 /* At this point I reset the display area resending the xy value*/
clemente 0:7ad454fed160 958 lcd_drawstop();
clemente 0:7ad454fed160 959 LPC_SSP0->DMACR=0;
clemente 0:7ad454fed160 960 /* Invio un nuovo comando di lcd_area */
clemente 0:7ad454fed160 961 lcd_area(x_start, y_start, (160-1)+x_start, (120-1)+y_start);
clemente 0:7ad454fed160 962 lcd_drawstart();
clemente 0:7ad454fed160 963 /* */
clemente 0:7ad454fed160 964 LPC_SSP0->DMACR=2;
clemente 0:7ad454fed160 965
clemente 0:7ad454fed160 966 /* programmo nella LLI il nvuovo buffer... */
clemente 0:7ad454fed160 967 LLI0.SrcAddr=(uint32_t)&pframe[3200];
clemente 0:7ad454fed160 968 LLI1.SrcAddr=(uint32_t)&pframe[3200+3200];
clemente 0:7ad454fed160 969 LLI2.SrcAddr=(uint32_t)&pframe[3200+3200+3200];
clemente 0:7ad454fed160 970 /* programmo il DMA */
clemente 0:7ad454fed160 971 LPC_GPDMACH0->DMACCSrcAddr = (uint32_t)pframe;
clemente 0:7ad454fed160 972 LPC_GPDMACH0->DMACCDestAddr = (uint32_t)&LPC_SSP0->DR;
clemente 0:7ad454fed160 973 LPC_GPDMACH0->DMACCLLI = (uint32_t)&LLI0;
clemente 0:7ad454fed160 974 LPC_GPDMACH0->DMACCControl = DMA_CHANNEL_TCIE | DMA_CHANNEL_SRC_INC | 3200;
clemente 0:7ad454fed160 975 /* Fire GPDMA Channel0 */
clemente 0:7ad454fed160 976 LPC_GPDMACH0->DMACCConfig = DMA_CHANNEL_ENABLE |
clemente 0:7ad454fed160 977 DMA_CHANNEL_DST_PERIPHERAL_SSP0_TX |
clemente 0:7ad454fed160 978 DMA_TRANSFER_TYPE_M2P |
clemente 0:7ad454fed160 979 DMA_MASK_IE |
clemente 0:7ad454fed160 980 DMA_MASK_ITC;
clemente 0:7ad454fed160 981
clemente 0:7ad454fed160 982 if ( feof( fp)) {
clemente 0:7ad454fed160 983 fclose( fp);
clemente 0:7ad454fed160 984 break;
clemente 0:7ad454fed160 985 }
clemente 0:7ad454fed160 986 /* Ultima lettura del buffer da SDCard... */
clemente 0:7ad454fed160 987 size=fread( &buffer[0], sizeof(buffer[0]), sizeof(buffer)/sizeof(buffer[0]), fp);
clemente 0:7ad454fed160 988 /* Aspetto che il DMA completi il transfer... */
clemente 0:7ad454fed160 989 while( !DMA_flag);
clemente 0:7ad454fed160 990 DMA_flag=0;
clemente 0:7ad454fed160 991 /* At this point I check if I'm at end of the file. */
clemente 0:7ad454fed160 992 if ( feof( fp) || size != sizeof(buffer)/sizeof(buffer[0]) ) {
clemente 0:7ad454fed160 993 fclose( fp);
clemente 0:7ad454fed160 994 break;
clemente 0:7ad454fed160 995 }
clemente 0:7ad454fed160 996 }
clemente 0:7ad454fed160 997 //
clemente 0:7ad454fed160 998 LPC_SSP0->IMSC = (1UL << 3);
clemente 0:7ad454fed160 999 while(LPC_SSP0->SR & (1UL << 2)) {
clemente 0:7ad454fed160 1000 /* This loop ensures we read the last byte in the
clemente 0:7ad454fed160 1001 RX FIFO and test that. */
clemente 0:7ad454fed160 1002 int sr = LPC_SSP0->DR;
clemente 0:7ad454fed160 1003 }
clemente 0:7ad454fed160 1004
clemente 0:7ad454fed160 1005 LPC_GPDMACH0->DMACCConfig = 0;
clemente 0:7ad454fed160 1006 LPC_SSP0->DMACR=0;
clemente 0:7ad454fed160 1007 LPC_GPDMA->DMACConfig = 0;
clemente 0:7ad454fed160 1008 LPC_GPDMA->DMACIntTCClear = 0x1;
clemente 0:7ad454fed160 1009 LPC_GPDMA->DMACSoftSReq = 0;
clemente 0:7ad454fed160 1010 LPC_SC->PCONP &= ~(1UL << 29);
clemente 0:7ad454fed160 1011 //
clemente 0:7ad454fed160 1012 lcd_drawstop();
clemente 0:7ad454fed160 1013 //
clemente 0:7ad454fed160 1014 LPC_SSP0->DMACR=0;
clemente 0:7ad454fed160 1015 LPC_GPDMA->DMACConfig = 0;
clemente 0:7ad454fed160 1016 LPC_GPDMA->DMACIntTCClear = 0x1;
clemente 0:7ad454fed160 1017 LPC_GPDMA->DMACSoftSReq = 0;
clemente 0:7ad454fed160 1018 LPC_SC->PCONP &= ~(1UL << 29);
clemente 0:7ad454fed160 1019 //
clemente 0:7ad454fed160 1020 /* Reset to the slow SPI speed. */
clemente 0:7ad454fed160 1021 _spi.frequency( SPISlowClkSpeed);
clemente 0:7ad454fed160 1022 _spi.format(8,SPIMode);
clemente 0:7ad454fed160 1023 //
clemente 0:7ad454fed160 1024 lcd_drawstop();
clemente 0:7ad454fed160 1025
clemente 0:7ad454fed160 1026 lcd_area(0, 0, (320-1), (240-1));
clemente 0:7ad454fed160 1027
clemente 0:7ad454fed160 1028 /* Disable the IRQ */
clemente 0:7ad454fed160 1029 NVIC_DisableIRQ(DMA_IRQn);
clemente 0:7ad454fed160 1030 return 1;
clemente 0:7ad454fed160 1031 }
clemente 0:7ad454fed160 1032 #endif // #if ( LCD_MODE_262K==5 )
clemente 0:7ad454fed160 1033 #endif // #ifdef _USE_FILE
clemente 0:7ad454fed160 1034
clemente 0:7ad454fed160 1035 void GLCD::lcd_drawicon( const unsigned char *icon, unsigned int x, unsigned int y, unsigned int size)
clemente 0:7ad454fed160 1036 {
clemente 0:7ad454fed160 1037 unsigned int i;
clemente 0:7ad454fed160 1038 unsigned char r, g, b;
clemente 0:7ad454fed160 1039
clemente 0:7ad454fed160 1040 /* Set the fast SPI speed. */
clemente 0:7ad454fed160 1041 _spi.frequency( SPIClkSpeed);
clemente 0:7ad454fed160 1042
clemente 0:7ad454fed160 1043 lcd_area(x, y, ((size-1)+x), ((size-1)+y));
clemente 0:7ad454fed160 1044
clemente 0:7ad454fed160 1045 lcd_drawstart();
clemente 0:7ad454fed160 1046
clemente 0:7ad454fed160 1047 #if ( LCD_MODE_262K==6 )
clemente 0:7ad454fed160 1048 _spi.format(6,SPIMode);
clemente 0:7ad454fed160 1049 #endif
clemente 0:7ad454fed160 1050
clemente 0:7ad454fed160 1051 for(i=(size*size); i!=0; i--)
clemente 0:7ad454fed160 1052 {
clemente 0:7ad454fed160 1053 r=*icon++;
clemente 0:7ad454fed160 1054 g=*icon++;
clemente 0:7ad454fed160 1055 b=*icon++;
clemente 0:7ad454fed160 1056
clemente 0:7ad454fed160 1057 #if ( LCD_MODE_262K==6 )
clemente 0:7ad454fed160 1058 _spi.write( (r&0xFC)>>2 );
clemente 0:7ad454fed160 1059 _spi.write( (g&0xFC)>>2 );
clemente 0:7ad454fed160 1060 _spi.write( (b&0xFC)>>2);
clemente 0:7ad454fed160 1061 #else
clemente 0:7ad454fed160 1062 lcd_draw( RGB( r, g, b ) );
clemente 0:7ad454fed160 1063 #endif
clemente 0:7ad454fed160 1064 }
clemente 0:7ad454fed160 1065 #if ( LCD_MODE_262K==6 )
clemente 0:7ad454fed160 1066 _spi.format(8,SPIMode);
clemente 0:7ad454fed160 1067 #endif
clemente 0:7ad454fed160 1068 lcd_drawstop();
clemente 0:7ad454fed160 1069 /* Reset to the slow SPI speed. */
clemente 0:7ad454fed160 1070 _spi.frequency( SPISlowClkSpeed);
clemente 0:7ad454fed160 1071 return;
clemente 0:7ad454fed160 1072 }
clemente 0:7ad454fed160 1073
clemente 0:7ad454fed160 1074 void GLCD::lcd_drawicon( const unsigned char *icon, unsigned int x, unsigned int y, unsigned int xsize, unsigned int ysize)
clemente 0:7ad454fed160 1075 {
clemente 0:7ad454fed160 1076 unsigned int i;
clemente 0:7ad454fed160 1077 unsigned char r, g, b;
clemente 0:7ad454fed160 1078
clemente 0:7ad454fed160 1079 /* Set the fast SPI speed. */
clemente 0:7ad454fed160 1080 _spi.frequency( SPIClkSpeed);
clemente 0:7ad454fed160 1081
clemente 0:7ad454fed160 1082 lcd_area(x, y, ((xsize-1)+x), ((ysize-1)+y));
clemente 0:7ad454fed160 1083
clemente 0:7ad454fed160 1084 lcd_drawstart();
clemente 0:7ad454fed160 1085
clemente 0:7ad454fed160 1086 #if ( LCD_MODE_262K==6 )
clemente 0:7ad454fed160 1087 _spi.format(6,SPIMode);
clemente 0:7ad454fed160 1088 #endif
clemente 0:7ad454fed160 1089
clemente 0:7ad454fed160 1090 for(i=(xsize*ysize); i!=0; i--)
clemente 0:7ad454fed160 1091 {
clemente 0:7ad454fed160 1092 r=*icon++;
clemente 0:7ad454fed160 1093 g=*icon++;
clemente 0:7ad454fed160 1094 b=*icon++;
clemente 0:7ad454fed160 1095
clemente 0:7ad454fed160 1096 #if ( LCD_MODE_262K==6 )
clemente 0:7ad454fed160 1097 _spi.write( (r&0xFC)>>2 );
clemente 0:7ad454fed160 1098 _spi.write( (g&0xFC)>>2 );
clemente 0:7ad454fed160 1099 _spi.write( (b&0xFC)>>2);
clemente 0:7ad454fed160 1100 #else
clemente 0:7ad454fed160 1101 lcd_draw( RGB( r, g, b ) );
clemente 0:7ad454fed160 1102 #endif
clemente 0:7ad454fed160 1103 }
clemente 0:7ad454fed160 1104 #if ( LCD_MODE_262K==6 )
clemente 0:7ad454fed160 1105 _spi.format(8,SPIMode);
clemente 0:7ad454fed160 1106 #endif
clemente 0:7ad454fed160 1107 lcd_drawstop();
clemente 0:7ad454fed160 1108 /* Reset to the slow SPI speed. */
clemente 0:7ad454fed160 1109 _spi.frequency( SPISlowClkSpeed);
clemente 0:7ad454fed160 1110 return;
clemente 0:7ad454fed160 1111 }
clemente 0:7ad454fed160 1112
clemente 0:7ad454fed160 1113
clemente 0:7ad454fed160 1114 void GLCD::lcd_drawicon( const unsigned int *icon, unsigned int x, unsigned int y, unsigned int size)
clemente 0:7ad454fed160 1115 {
clemente 0:7ad454fed160 1116 unsigned int i, tmp;
clemente 0:7ad454fed160 1117
clemente 0:7ad454fed160 1118 /* Set the fast SPI speed. */
clemente 0:7ad454fed160 1119 _spi.frequency( SPIClkSpeed);
clemente 0:7ad454fed160 1120
clemente 0:7ad454fed160 1121 lcd_area(x, y, ((size-1)+x), ((size-1)+y));
clemente 0:7ad454fed160 1122
clemente 0:7ad454fed160 1123 lcd_drawstart();
clemente 0:7ad454fed160 1124
clemente 0:7ad454fed160 1125 #if ( LCD_MODE_262K==6 )
clemente 0:7ad454fed160 1126 _spi.format(6,SPIMode);
clemente 0:7ad454fed160 1127 #endif
clemente 0:7ad454fed160 1128
clemente 0:7ad454fed160 1129 for(i=(size*size); i!=0; i--)
clemente 0:7ad454fed160 1130 {
clemente 0:7ad454fed160 1131 tmp = *icon++;
clemente 0:7ad454fed160 1132 #if ( LCD_MODE_262K==6 )
clemente 0:7ad454fed160 1133 _spi.write( (tmp&0x00FC0000)>>18 );
clemente 0:7ad454fed160 1134 _spi.write( (tmp&0x0000FC00)>>10 );
clemente 0:7ad454fed160 1135 _spi.write( (tmp&0x000000FC)>>2);
clemente 0:7ad454fed160 1136 #else
clemente 0:7ad454fed160 1137 lcd_draw( RGB( (( tmp&0x00FF0000)>>16), ( ( tmp&0x0000FF00)>>8), ( tmp&0x000000FF)) );
clemente 0:7ad454fed160 1138 #endif
clemente 0:7ad454fed160 1139 }
clemente 0:7ad454fed160 1140 #if ( LCD_MODE_262K==6 )
clemente 0:7ad454fed160 1141 _spi.format(8,SPIMode);
clemente 0:7ad454fed160 1142 #endif
clemente 0:7ad454fed160 1143 lcd_drawstop();
clemente 0:7ad454fed160 1144 /* Reset to the slow SPI speed. */
clemente 0:7ad454fed160 1145 _spi.frequency( SPISlowClkSpeed);
clemente 0:7ad454fed160 1146 return;
clemente 0:7ad454fed160 1147 }
clemente 0:7ad454fed160 1148
clemente 0:7ad454fed160 1149 void GLCD::lcd_drawpixel(unsigned int x0, unsigned int y0, unsigned int color) {
clemente 0:7ad454fed160 1150
clemente 0:7ad454fed160 1151 /* Set the fast SPI speed. */
clemente 0:7ad454fed160 1152 _spi.frequency( SPIClkSpeed);
clemente 0:7ad454fed160 1153
clemente 0:7ad454fed160 1154 lcd_area( x0, y0, x0, y0);
clemente 0:7ad454fed160 1155 lcd_drawstart();
clemente 0:7ad454fed160 1156
clemente 0:7ad454fed160 1157 #if ( LCD_MODE_262K==6 )
clemente 0:7ad454fed160 1158 _spi.format(6,SPIMode);
clemente 0:7ad454fed160 1159 _spi.write( (color&0x00FC0000)>>18 );
clemente 0:7ad454fed160 1160 _spi.write( (color&0x0000FC00)>>10 );
clemente 0:7ad454fed160 1161 _spi.write( (color&0x000000FC)>>2);
clemente 0:7ad454fed160 1162 _spi.format(8,SPIMode);
clemente 0:7ad454fed160 1163 #else
clemente 0:7ad454fed160 1164 lcd_draw(color);
clemente 0:7ad454fed160 1165 #endif
clemente 0:7ad454fed160 1166
clemente 0:7ad454fed160 1167 lcd_drawstop();
clemente 0:7ad454fed160 1168 /* Reset to the slow SPI speed. */
clemente 0:7ad454fed160 1169 _spi.frequency( SPISlowClkSpeed);
clemente 0:7ad454fed160 1170
clemente 0:7ad454fed160 1171 }
clemente 0:7ad454fed160 1172
clemente 0:7ad454fed160 1173 void GLCD::lcd_drawline(unsigned int x0, unsigned int y0, unsigned int x1, unsigned int y1, unsigned int color) {
clemente 0:7ad454fed160 1174 //
clemente 0:7ad454fed160 1175 // pInt32U pData = ((pInt32U) LCD_VRAM_BASE_ADDR) + x0 + (y0 * LCD_HEIGHT);
clemente 0:7ad454fed160 1176 // pInt32U pData = ((pInt32U) pCurrFrmBuff) + x0 + (y0 * LCD_HEIGHT);
clemente 0:7ad454fed160 1177
clemente 0:7ad454fed160 1178 int dy = y1 - y0;
clemente 0:7ad454fed160 1179 int dx = x1 - x0;
clemente 0:7ad454fed160 1180 int stepx, stepy;
clemente 0:7ad454fed160 1181
clemente 0:7ad454fed160 1182 if (dy < 0) { dy = -dy; stepy = -1; } else { stepy = 1; }
clemente 0:7ad454fed160 1183 if (dx < 0) { dx = -dx; stepx = -1; } else { stepx = 1; }
clemente 0:7ad454fed160 1184
clemente 0:7ad454fed160 1185 dy <<= 1; // dy is now 2*dy
clemente 0:7ad454fed160 1186 dx <<= 1; // dx is now 2*dx
clemente 0:7ad454fed160 1187
clemente 0:7ad454fed160 1188 /* Set the fast SPI speed. */
clemente 0:7ad454fed160 1189 _spi.frequency( SPIClkSpeed);
clemente 0:7ad454fed160 1190
clemente 0:7ad454fed160 1191 lcd_area( x0, y0, x0, y0);
clemente 0:7ad454fed160 1192 lcd_drawstart();
clemente 0:7ad454fed160 1193
clemente 0:7ad454fed160 1194 #if ( LCD_MODE_262K==6 )
clemente 0:7ad454fed160 1195 _spi.format(6,SPIMode);
clemente 0:7ad454fed160 1196 _spi.write( (color&0x00FC0000)>>18 );
clemente 0:7ad454fed160 1197 _spi.write( (color&0x0000FC00)>>10 );
clemente 0:7ad454fed160 1198 _spi.write( (color&0x000000FC)>>2);
clemente 0:7ad454fed160 1199 _spi.format(8,SPIMode);
clemente 0:7ad454fed160 1200 #else
clemente 0:7ad454fed160 1201 lcd_draw(color);
clemente 0:7ad454fed160 1202 #endif
clemente 0:7ad454fed160 1203
clemente 0:7ad454fed160 1204 lcd_drawstop();
clemente 0:7ad454fed160 1205
clemente 0:7ad454fed160 1206 // *(pData)= color;
clemente 0:7ad454fed160 1207
clemente 0:7ad454fed160 1208 if (dx > dy) {
clemente 0:7ad454fed160 1209 int fraction = dy - (dx >> 1); // same as 2*dy - dx
clemente 0:7ad454fed160 1210 while (x0 != x1) {
clemente 0:7ad454fed160 1211 if (fraction >= 0) {
clemente 0:7ad454fed160 1212 y0 += stepy;
clemente 0:7ad454fed160 1213 fraction -= dx; // same as fraction -= 2*dx
clemente 0:7ad454fed160 1214 }
clemente 0:7ad454fed160 1215 x0 += stepx;
clemente 0:7ad454fed160 1216 fraction += dy; // same as fraction -= 2*dy
clemente 0:7ad454fed160 1217 // pData = ((pInt32U) LCD_VRAM_BASE_ADDR) + x0 + (y0 * C_GLCD_H_SIZE);
clemente 0:7ad454fed160 1218 // pData = ((pInt32U) pCurrFrmBuff) + x0 + (y0 * C_GLCD_H_SIZE);
clemente 0:7ad454fed160 1219 // *(pData)= color;
clemente 0:7ad454fed160 1220 lcd_area( x0, y0, x0, y0);
clemente 0:7ad454fed160 1221 lcd_drawstart();
clemente 0:7ad454fed160 1222
clemente 0:7ad454fed160 1223 #if ( LCD_MODE_262K==6 )
clemente 0:7ad454fed160 1224 _spi.format(6,SPIMode);
clemente 0:7ad454fed160 1225 _spi.write( (color&0x00FC0000)>>18 );
clemente 0:7ad454fed160 1226 _spi.write( (color&0x0000FC00)>>10 );
clemente 0:7ad454fed160 1227 _spi.write( (color&0x000000FC)>>2);
clemente 0:7ad454fed160 1228 _spi.format(8,SPIMode);
clemente 0:7ad454fed160 1229 #else
clemente 0:7ad454fed160 1230 lcd_draw(color);
clemente 0:7ad454fed160 1231 #endif
clemente 0:7ad454fed160 1232
clemente 0:7ad454fed160 1233 lcd_drawstop();
clemente 0:7ad454fed160 1234
clemente 0:7ad454fed160 1235 }
clemente 0:7ad454fed160 1236 } else {
clemente 0:7ad454fed160 1237 int fraction = dx - (dy >> 1);
clemente 0:7ad454fed160 1238 while (y0 != y1) {
clemente 0:7ad454fed160 1239 if (fraction >= 0) {
clemente 0:7ad454fed160 1240 x0 += stepx;
clemente 0:7ad454fed160 1241 fraction -= dy;
clemente 0:7ad454fed160 1242 }
clemente 0:7ad454fed160 1243 y0 += stepy;
clemente 0:7ad454fed160 1244 fraction += dx;
clemente 0:7ad454fed160 1245 // pData = ((pInt32U) LCD_VRAM_BASE_ADDR) + x0 + (y0 * C_GLCD_H_SIZE);
clemente 0:7ad454fed160 1246 // pData = ((pInt32U) pCurrFrmBuff) + x0 + (y0 * C_GLCD_H_SIZE);
clemente 0:7ad454fed160 1247 // *(pData)= color;
clemente 0:7ad454fed160 1248 lcd_area( x0, y0, x0, y0);
clemente 0:7ad454fed160 1249 lcd_drawstart();
clemente 0:7ad454fed160 1250
clemente 0:7ad454fed160 1251 #if ( LCD_MODE_262K==6 )
clemente 0:7ad454fed160 1252 _spi.format(6,SPIMode);
clemente 0:7ad454fed160 1253 _spi.write( (color&0x00FC0000)>>18 );
clemente 0:7ad454fed160 1254 _spi.write( (color&0x0000FC00)>>10 );
clemente 0:7ad454fed160 1255 _spi.write( (color&0x000000FC)>>2);
clemente 0:7ad454fed160 1256 _spi.format(8,SPIMode);
clemente 0:7ad454fed160 1257 #else
clemente 0:7ad454fed160 1258 lcd_draw(color);
clemente 0:7ad454fed160 1259 #endif
clemente 0:7ad454fed160 1260
clemente 0:7ad454fed160 1261 lcd_drawstop();
clemente 0:7ad454fed160 1262 }
clemente 0:7ad454fed160 1263 }
clemente 0:7ad454fed160 1264 /* Reset to the slow SPI speed. */
clemente 0:7ad454fed160 1265 _spi.frequency( SPISlowClkSpeed);
clemente 0:7ad454fed160 1266 }
clemente 0:7ad454fed160 1267
clemente 0:7ad454fed160 1268 void GLCD::lcd_reset(void)
clemente 0:7ad454fed160 1269 {
clemente 0:7ad454fed160 1270 //reset
clemente 0:7ad454fed160 1271 LCD_CS_DISABLE();
clemente 0:7ad454fed160 1272 LCD_RST_ENABLE();
clemente 0:7ad454fed160 1273 wait_ms(50);
clemente 0:7ad454fed160 1274 LCD_RST_DISABLE();
clemente 0:7ad454fed160 1275 wait_ms(50);
clemente 0:7ad454fed160 1276
clemente 0:7ad454fed160 1277 //driving ability
clemente 0:7ad454fed160 1278 lcd_cmd(0xEA, 0x0000);
clemente 0:7ad454fed160 1279 lcd_cmd(0xEB, 0x0020);
clemente 0:7ad454fed160 1280 lcd_cmd(0xEC, 0x000C);
clemente 0:7ad454fed160 1281 lcd_cmd(0xED, 0x00C4);
clemente 0:7ad454fed160 1282 lcd_cmd(0xE8, 0x0040);
clemente 0:7ad454fed160 1283 lcd_cmd(0xE9, 0x0038);
clemente 0:7ad454fed160 1284 lcd_cmd(0xF1, 0x0001);
clemente 0:7ad454fed160 1285 lcd_cmd(0xF2, 0x0010);
clemente 0:7ad454fed160 1286 lcd_cmd(0x27, 0x00A3);
clemente 0:7ad454fed160 1287
clemente 0:7ad454fed160 1288 //power voltage
clemente 0:7ad454fed160 1289 lcd_cmd(0x1B, 0x001B);
clemente 0:7ad454fed160 1290 lcd_cmd(0x1A, 0x0001);
clemente 0:7ad454fed160 1291 lcd_cmd(0x24, 0x002F);
clemente 0:7ad454fed160 1292 lcd_cmd(0x25, 0x0057);
clemente 0:7ad454fed160 1293
clemente 0:7ad454fed160 1294 //VCOM offset
clemente 0:7ad454fed160 1295 lcd_cmd(0x23, 0x008D); //for flicker adjust
clemente 0:7ad454fed160 1296
clemente 0:7ad454fed160 1297 //power on
clemente 0:7ad454fed160 1298 lcd_cmd(0x18, 0x0036);
clemente 0:7ad454fed160 1299 lcd_cmd(0x19, 0x0001); //start osc
clemente 0:7ad454fed160 1300 lcd_cmd(0x01, 0x0000); //wakeup
clemente 0:7ad454fed160 1301 lcd_cmd(0x1F, 0x0088);
clemente 0:7ad454fed160 1302 wait_ms(5);
clemente 0:7ad454fed160 1303 lcd_cmd(0x1F, 0x0080);
clemente 0:7ad454fed160 1304 wait_ms(5);
clemente 0:7ad454fed160 1305 lcd_cmd(0x1F, 0x0090);
clemente 0:7ad454fed160 1306 wait_ms(5);
clemente 0:7ad454fed160 1307 lcd_cmd(0x1F, 0x00D0);
clemente 0:7ad454fed160 1308 wait_ms(5);
clemente 0:7ad454fed160 1309
clemente 0:7ad454fed160 1310 //color selection
clemente 0:7ad454fed160 1311 lcd_cmd(0x17, LCD_MODE_262K); //0x0005=65k, 0x0006=262k
clemente 0:7ad454fed160 1312
clemente 0:7ad454fed160 1313 //panel characteristic
clemente 0:7ad454fed160 1314 lcd_cmd(0x36, 0x0000);
clemente 0:7ad454fed160 1315
clemente 0:7ad454fed160 1316 //display on
clemente 0:7ad454fed160 1317 lcd_cmd(0x28, 0x0038);
clemente 0:7ad454fed160 1318 wait_ms(40);
clemente 0:7ad454fed160 1319 lcd_cmd(0x28, 0x003C);
clemente 0:7ad454fed160 1320
clemente 0:7ad454fed160 1321 //display options
clemente 0:7ad454fed160 1322 #ifdef LCD_MIRROR
clemente 0:7ad454fed160 1323 lcd_cmd(0x16, 0x0068); //MY=0 MX=1 MV=1 ML=0 BGR=1
clemente 0:7ad454fed160 1324 #else
clemente 0:7ad454fed160 1325 lcd_cmd(0x16, 0x00A8); //MY=1 MX=0 MV=1 ML=0 BGR=1
clemente 0:7ad454fed160 1326 #endif
clemente 0:7ad454fed160 1327
clemente 0:7ad454fed160 1328 lcd_area(0, 0, (LCD_WIDTH-1), (LCD_HEIGHT-1));
clemente 0:7ad454fed160 1329
clemente 0:7ad454fed160 1330 return;
clemente 0:7ad454fed160 1331 }
clemente 0:7ad454fed160 1332