blob: 513165495f278a6c4b44f4c17cfe7be73557be9f [file] [log] [blame]
yuezonghe824eb0c2024-06-27 02:32:26 -07001/***********************************************************************
2 * Copyright (C) 2014, ZTE Corporation.
3 *
4 * File Name: lcd_comm.c
5 * File Mark:
6 * Description: Lcd function implementation. Adapted to LCM MODEL - LEAD T15DS26.
7 * Others: this file is in BOOTLOADER procedure.
8 * This LCM MODEL uses SPI-4.
9 * NOTE: 4-lines-spi uses CS, CLK, D/CX and SDI. Do not using SDO instead of D/CX.
10 * Version: V1.0
11 * Author: qihongfang
12 * Date: 2017-9-18
13 *
14 * History 1:
15 * Date: 2015-1-16
16 * Version:
17 * Author: YinWenguan
18 * Modification: Add brightness setting.
19 *
20***********************************************************************/
21
22/*************************************************************************
23 * Include files
24 *************************************************************************/
25#include "../include/board.h"
26
27#include <common.h>
28#include <malloc.h>
29#include <asm/io.h>
30#include "../include/spi.h"
31#include "../include/ssp.h"
32#include <lcd.h>
33#include <drvs_gpio.h>
34#include <peripheral.h>
35
36/*************************************************************************
37 * Macro
38 *************************************************************************/
39 /* debug switch */
40
41//static unsigned char g_lcd_id=0;
42#define LCM_ID_LEAD 0x7C /*Öйâµçst7735s\ÈýÁúst7735s*/
43
44/* LCD Features */
45#define LCD_WIDTH 128
46#define LCD_HEIGHT 64
47
48#define ZSP_LCDINFO_PATH "/LCDINFO.bin"
49#define LCD_BITS_PER_PIXEL (5 + 6 + 5)
50#define LCD_PAGE_HEIGHT 8
51#define LCD_PAGE_NUM 8
52#define LCD_BPP (2)
53
54#define START_LINE_BIT 0x40
55#define START_PAGE 0xB0
56#define START_HIGH_BIT 0x10
57#define START_LOW_BIT 0x00
58#define START_LOW_PY 1
59
60/* rotate display */
61//#define LCD_ROTATE_180
62
63#define LCD_XS 0x02
64#define LCD_XE ((LCD_WIDTH)+(LCD_XS)-1)
65#ifdef LCD_ROTATE_180
66#define LCD_MXMYRGB 0x1C
67#define LCD_YS 0x01
68#else
69#define LCD_MXMYRGB 0xC8
70#define LCD_YS 0x03
71#endif
72
73#define LCD_YE ((LCD_HEIGHT)+(LCD_YS)-1)
74
75struct lcd_var_screeninfo {
76 unsigned int xs; //xs_offset
77 unsigned int ys; //ys_offset
78 unsigned int width; //128 240
79 unsigned int height; //128 240
80 unsigned int xe; //width + xs - 1
81 unsigned int ye; //height + ys - 1
82 unsigned int xs_offset; //0x02 0x00
83 unsigned int ys_offset; //0x03 0x00
84 //unsigned int bits_per_pixel;
85};
86static struct lcd_var_screeninfo var_screeninfo = {0}; /* Current var */
87
88
89/**************************************************************************
90 * Types *
91 **************************************************************************/
92static volatile T_ZDrvLcd_Instance g_sLcd_Instance = {false, LCD_NORMAL, LCD_XFER_POLL, LCD_DCX_CMD};
93static volatile T_ZDrvLcd_BacklightStatus g_sLcd_Backlight = LCD_BACKLIGHT_OFF;
94static volatile T_ZDrvLcd_Brightness g_sLcd_Brightness = 255;
95
96/**************************************************************************
97 * Global Variable
98 **************************************************************************/
99extern volatile T_ZDrvLcd_Info s_lcd_info;
100extern int zDrvLcd_Spi_WriteCmd(unsigned char cmd);
101extern int zDrvLcd_Spi_WriteData(unsigned char data);
102
103static unsigned char g_sLcdHalDataBuf[128 * LCD_PAGE_NUM] =
104{
105 0,
106};
107
108static unsigned char g_sLcdHalDataBuf_reg[128 *64] =
109{
110 0,
111};
112
113
114/**************************************************************************
115 * Function Implementation
116 **************************************************************************/
117void lcd_gpio_define(struct T_ZDrvLcd_gpio_define* config)
118{
119
120 config->spi_cs_gpio = GPIO25;
121 config->spi_scl_gpio = GPIO26;
122 config->spi_sda_gpio = GPIO28;
123 config->spi_dcx_gpio = GPIO27;
124
125 config->spi_cs_func_sel = GPIO25_SSP0_CS;
126 config->spi_scl_func_sel = GPIO26_SSP0_CLK;
127 config->spi_sda_func_sel = GPIO28_SSP0_TXD;
128 config->spi_dcx_func_sel = GPIO27_SSP0_RXD;
129
130 config->spi_cs_gpio_sel = GPIO25_GPIO25;
131 config->spi_scl_gpio_sel = GPIO26_GPIO26;
132 config->spi_sda_gpio_sel = GPIO28_GPIO28;
133 config->spi_dcx_gpio_sel = GPIO27_GPIO27;
134
135#ifdef CONFIG_ZX297520V3E_FWP
136 config->lcd_reset_gpio =GPIO125;
137 config->lcd_reset_gpio_sel =GPIO125_GPIO125;
138 config->lcd_blg_gpio =GPIO53;
139 config->lcd_blg_gpio_sel =GPIO53_GPIO53;
140#else
141 config->lcd_reset_gpio = GPIO120;
142 config->lcd_reset_gpio_sel = GPIO120_GPIO120;
143 config->lcd_blg_gpio = GPIO119;
144 config->lcd_blg_gpio_sel = GPIO119_GPIO119;
145#endif
146
147}
148
149//#if KLOCWORK_BOOT
150/**************************************************************************
151* Function: zDrvLcd_SetRamAddr
152* Description: used to set specified start point of DISPLAY RAM for updating laterly
153* Parameters:
154* (IN)
155* uiLeft left postion
156* uiTop top postion
157* (OUT)
158* None.
159* Returns:
160* DRV_SUCCESS: successed.
161* DRV_ERROR: others error code. For more details, please refer to the source code.
162* Others:
163* None.
164**************************************************************************/
165int set_ram_addr_bw(unsigned short uiLeft, unsigned short uiTop)
166{
167 signed int ret = 0;
168
169 /*set column address*/
170 zDrvLcd_Spi_WriteCmd(START_HIGH_BIT |((uiLeft>>4) & 0x0F)); // ?4?
171 zDrvLcd_Spi_WriteCmd((START_LOW_BIT | (uiLeft & 0x0F))+START_LOW_PY); // ?4?
172
173 /*set page address*/
174 zDrvLcd_Spi_WriteCmd(START_PAGE | (uiTop & 0x0F));
175 return ret ;
176}
177
178uint32_t lcd_WritePixel(unsigned short rgb565, unsigned short uiRow, unsigned short uiCol)
179{
180 unsigned short page_index = uiRow / LCD_PAGE_HEIGHT;
181
182 unsigned short ram_offset = page_index * var_screeninfo.width + uiCol;
183
184 unsigned short bit_shift = uiRow % LCD_PAGE_HEIGHT;
185
186 if (rgb565 != 0 )
187 *(g_sLcdHalDataBuf + ram_offset) &= ~(0x01 << bit_shift);
188 else
189 *(g_sLcdHalDataBuf + ram_offset) |= (0x01 << bit_shift);
190
191 return 0;
192}
193/**************************************************************************
194* Function: zDrvLcd_UpdateRect
195* Description: used to update a specified rectangle area of the LCD device opened previously.
196* Parameters:
197* (IN)
198* pBuf data buffer
199* uiLeft left postion
200* uiTop top postion
201* uiWidth rectangle width
202* uiHeight rectangle height
203* (OUT)
204* None.
205* Returns:
206* DRV_SUCCESS: successed.
207* DRV_ERROR: others error code. For more details, please refer to the source code.
208* Others:
209* None.
210**************************************************************************/
211int update_rect_bw(unsigned char *pBuf, unsigned short uiLeft, unsigned short uiTop, unsigned short uiWidth, unsigned short uiHeight)
212{
213
214 unsigned short *pSrcBuf = (unsigned short *)pBuf;
215 unsigned short row,row_reg, col,col_reg, pixel_value;
216 unsigned short cur_page;
217
218 if((pBuf==NULL)|(var_screeninfo.width <=uiLeft)|(var_screeninfo.height <=uiTop)|(var_screeninfo.width < uiLeft + uiWidth)| (var_screeninfo.height < uiTop + uiHeight))
219 { return -1;}
220
221 for (row = uiTop,row_reg = 0; row <(uiTop + uiHeight); row++,row_reg++)
222 {
223 for (col = uiLeft,col_reg = 0; col < (uiLeft + uiWidth); col++,col_reg++)
224 {
225 g_sLcdHalDataBuf_reg[row * var_screeninfo.width + col] = *(pSrcBuf + row_reg * uiWidth + col_reg);
226 }
227 }
228
229 /* ???????RGB565??????,??RAM */
230
231 for (row = 0; row <var_screeninfo.height; row++)
232 {
233 for (col = 0; col < var_screeninfo.width; col++)
234 {
235 pixel_value = g_sLcdHalDataBuf_reg[row * var_screeninfo.width + col];
236
237 lcd_WritePixel(pixel_value, row , col );
238 }
239 }
240
241
242 /* ??,?????,??RAM???,????page */
243
244 for ( cur_page =0; cur_page <LCD_PAGE_NUM; cur_page++ )
245 {
246 set_ram_addr_bw( 0, cur_page );
247 zDrvLcd_Spi_WriteDataBlock(g_sLcdHalDataBuf + cur_page* var_screeninfo.width, var_screeninfo.width);
248 }
249
250 return 0;
251
252}
253//#endif
254
255/**************************************************************************
256* Function: zDrvLcd_Gpio_Init
257* Description: used to initialize GPIO usage.
258* Parameters:
259* (IN)
260*
261* (OUT)
262*
263* Returns:
264* DRV_SUCCESS: successed.
265* DRV_ERROR: others error code. For more details, please refer to the source code.
266* Others:
267**************************************************************************/
268int set_ram_addr_color(unsigned short uiLeft, unsigned short uiTop)
269{
270 int ret = DRV_SUCCESS;
271
272 ret |= zDrvLcd_Spi_WriteCmd(0x2A);
273 ret |= zDrvLcd_Spi_WriteData(0x00);
274 ret |= zDrvLcd_Spi_WriteData(var_screeninfo.xs);
275 ret |= zDrvLcd_Spi_WriteData((var_screeninfo.xe >> 8));
276 ret |= zDrvLcd_Spi_WriteData((var_screeninfo.xe &0xff));
277
278
279 ret |= zDrvLcd_Spi_WriteCmd(0x2B);
280 ret |= zDrvLcd_Spi_WriteData(0x00);
281 ret |= zDrvLcd_Spi_WriteData(var_screeninfo.ys);
282 ret |= zDrvLcd_Spi_WriteData((var_screeninfo.ye >> 8));
283 ret |= zDrvLcd_Spi_WriteData((var_screeninfo.ye & 0xff));
284
285 return ret;
286}
287
288int update_rect_color(unsigned char *pBuf, unsigned short uiLeft, unsigned short uiTop, unsigned short uiWidth, unsigned short uiHeight)
289{
290 int ret = DRV_SUCCESS;
291
292 ret |= set_ram_addr_color(uiLeft, uiTop); // Ö¸¶¨Ë¢ÐÂµÄÆðʼµØÖ·
293
294 ret |= zDrvLcd_Spi_WriteCmd(0x2c);
295 ret = zDrvLcd_Spi_WriteDataBlock((unsigned char *) pBuf, uiWidth * uiHeight * 2);
296
297 return ret;
298}
299
300/**************************************************************************
301* Function: prj_lcm_init
302* Description: used to initialize SPI usage.
303* Parameters:
304* (IN)
305*
306* (OUT)
307*
308* Returns:
309* DRV_SUCCESS: successed.
310* DRV_ERROR: others error code. For more details, please refer to the source code.
311* Others:
312**************************************************************************/
313
314int prj_lcm_init(void)
315{
316 int ret = DRV_SUCCESS;
317 unsigned long uiRow, uiCol;
318 uint8_t page_number,column_number;
319#ifdef CONFIG_ZX297520V3E_FWP
320 if (s_lcd_info.lcm_info.lcd_item == ST7567_128x64) {
321
322 #if 1
323 zDrvLcd_Spi_WriteCmd(0xe2); // soft reset
324 zDrvLcd_Spi_WriteCmd(0xa3); // Select bias setting(0xa2:1/9, 0xa3:1/7)
325 zDrvLcd_Spi_WriteCmd(0xa0); // Set scan direction of SEG(0xa0:normal direction, 0xa1:reverse direction)
326 zDrvLcd_Spi_WriteCmd(0xc8); // Set output direction of COM(0xc8:reverse direction, 0xc0:normal direction)
327 zDrvLcd_Spi_WriteCmd(0xa6); // Inverse Display(0xa6:normal display, 0xa7:inverse display)
328 zDrvLcd_Spi_WriteCmd(0x2f); // Power Control(0x28~0x2f, Built-in Booster ON, Built-in Regulator ON, Built-in Follower ON)
329 zDrvLcd_Spi_WriteCmd(0x23); // Select regulation resistor ratio(0x20~0x27)
330 zDrvLcd_Spi_WriteCmd(0x81); // Setelectronic volume (EV) level
331 zDrvLcd_Spi_WriteCmd(0x2e); // level
332 zDrvLcd_Spi_WriteCmd(START_LINE_BIT + 0x20); // set start line
333 //zDrvLcd_Spi_WriteCmd(0xa1); // Set scan direction of SEG(0xa0:normal direction, 0xa1:reverse direction)
334 #else
335 zDrvLcd_Spi_WriteCmd(0xe2); // soft reset
336 zDrvLcd_Spi_WriteCmd(0xa3); // Select bias setting(0xa2:1/9, 0xa3:1/7)
337 //zDrvLcd_Spi_WriteCmd(0xa0); // Set scan direction of SEG(0xa0:normal direction, 0xa1:reverse direction)
338 zDrvLcd_Spi_WriteCmd(0xc8); // Set output direction of COM(0xc8:reverse direction, 0xc0:normal direction)
339 zDrvLcd_Spi_WriteCmd(0xa6); // Inverse Display(0xa6:normal display, 0xa7:inverse display)
340 zDrvLcd_Spi_WriteCmd(0x2f); // Power Control(0x28~0x2f, Built-in Booster ON, Built-in Regulator ON, Built-in Follower ON)
341 zDrvLcd_Spi_WriteCmd(0x23); // Select regulation resistor ratio(0x20~0x27)
342 zDrvLcd_Spi_WriteCmd(0x81); // Setelectronic volume (EV) level
343 zDrvLcd_Spi_WriteCmd(0x2e); // level
344 zDrvLcd_Spi_WriteCmd(START_LINE_BIT); // set start line
345 zDrvLcd_Spi_WriteCmd(0xa1); // Set scan direction of SEG(0xa0:normal direction, 0xa1:reverse direction)
346 #endif
347
348 for( page_number = 0; page_number < LCD_PAGE_NUM; page_number++)
349 {
350 set_ram_addr_bw(0x00, page_number );
351 //printf( " page_number = d% ...\n",page_number);
352 for(column_number = 0;column_number < LCD_WIDTH; column_number++)
353 {
354 zDrvLcd_Spi_WriteData(0x00);
355 }
356 }
357
358 zDrvLcd_Spi_WriteCmd(0xaf); // Display On
359 printf("display on show back ...\n");
360 //zDrvLcd_DelayMs(120);
361 //return ret;
362 }
363#else
364
365 if(s_lcd_info.lcm_info.lcd_item != LCM_ID_LEAD)//s93521a
366 {
367 zDrvLcd_Spi_WriteCmd(0x11); //Exit Sleep
368 zDrvLcd_DelayMs(150);
369
370 zDrvLcd_Spi_WriteCmd(0x26); //Set Default Gamma
371 zDrvLcd_Spi_WriteData(0x04);
372
373 zDrvLcd_Spi_WriteCmd(0xB1);
374 zDrvLcd_Spi_WriteData(0x0B);
375 zDrvLcd_Spi_WriteData(0x14);
376
377 zDrvLcd_Spi_WriteCmd(0xC0); //Set VRH1[4:0] & VC[2:0] for VCI1 & GVDD
378 zDrvLcd_Spi_WriteData(0x10);
379 zDrvLcd_Spi_WriteData(0x00);
380
381 zDrvLcd_Spi_WriteCmd(0xC1); //Set BT[2:0] for AVDD & VCL & VGH & VGL
382 zDrvLcd_Spi_WriteData(0x05);
383
384 zDrvLcd_Spi_WriteCmd(0xC5); //Set VMH[6:0] & VML[6:0] for VOMH & VCOML
385 zDrvLcd_Spi_WriteData(0x46);
386 zDrvLcd_Spi_WriteData(0x40);
387
388 zDrvLcd_Spi_WriteCmd(0xC7);
389 zDrvLcd_Spi_WriteData(0xBD);
390
391 zDrvLcd_Spi_WriteCmd(0xEC);
392 zDrvLcd_Spi_WriteData(0x0C);
393
394 zDrvLcd_Spi_WriteCmd(0x3a); //Set Color Format
395 zDrvLcd_Spi_WriteData(0x05);
396
397 zDrvLcd_Spi_WriteCmd(0x2A); //Set Column Address
398 zDrvLcd_Spi_WriteData(0x00);
399 zDrvLcd_Spi_WriteData(0x00);
400 zDrvLcd_Spi_WriteData(0x00);
401 zDrvLcd_Spi_WriteData(0x7F);
402
403 zDrvLcd_Spi_WriteCmd(0x2B); //Set Page Address
404 zDrvLcd_Spi_WriteData(0x00);
405 zDrvLcd_Spi_WriteData(0x00);
406 zDrvLcd_Spi_WriteData(0x00);
407 zDrvLcd_Spi_WriteData(0x9F);
408
409 zDrvLcd_Spi_WriteCmd(0x36); //Set Scanning Direction
410 zDrvLcd_Spi_WriteData(LCD_MXMYRGB);
411
412 zDrvLcd_Spi_WriteCmd(0xB7); //Set Source Output Direction
413 zDrvLcd_Spi_WriteData(0x00);
414
415 zDrvLcd_Spi_WriteCmd(0xf2); //Enable Gamma bit
416 zDrvLcd_Spi_WriteData(0x01);
417
418 zDrvLcd_Spi_WriteCmd(0xE0);
419 zDrvLcd_Spi_WriteData(0x3F);//p1
420 zDrvLcd_Spi_WriteData(0x29);//p2
421 zDrvLcd_Spi_WriteData(0x26);//p3
422 zDrvLcd_Spi_WriteData(0x26);//p4
423 zDrvLcd_Spi_WriteData(0x26);//p5
424 zDrvLcd_Spi_WriteData(0x0C);//p6
425 zDrvLcd_Spi_WriteData(0x51);//p7
426 zDrvLcd_Spi_WriteData(0xB8);//p8
427 zDrvLcd_Spi_WriteData(0x39);//p9
428 zDrvLcd_Spi_WriteData(0x17);//p10
429 zDrvLcd_Spi_WriteData(0x00);//p11
430 zDrvLcd_Spi_WriteData(0x00);//p12
431 zDrvLcd_Spi_WriteData(0x00);//p13
432 zDrvLcd_Spi_WriteData(0x00);//p14
433 zDrvLcd_Spi_WriteData(0x00);//p15
434
435 zDrvLcd_Spi_WriteCmd(0xE1);
436 zDrvLcd_Spi_WriteData(0x00);//p1
437 zDrvLcd_Spi_WriteData(0x16);//p2
438 zDrvLcd_Spi_WriteData(0x19);//p3
439 zDrvLcd_Spi_WriteData(0x19);//p4
440 zDrvLcd_Spi_WriteData(0x19);//p5
441 zDrvLcd_Spi_WriteData(0x13);//p6
442 zDrvLcd_Spi_WriteData(0x2E);//p7
443 zDrvLcd_Spi_WriteData(0x47);//p8
444 zDrvLcd_Spi_WriteData(0x46);//p9
445 zDrvLcd_Spi_WriteData(0x08);//p10
446 zDrvLcd_Spi_WriteData(0x3F);//p11
447 zDrvLcd_Spi_WriteData(0x3F);//p12
448 zDrvLcd_Spi_WriteData(0x3F);//p13
449 zDrvLcd_Spi_WriteData(0x3F);//p14
450 zDrvLcd_Spi_WriteData(0x3F);//p15
451
452 zDrvLcd_Spi_WriteCmd(0x29); // Display On
453
454 zDrvLcd_Spi_WriteCmd(0x2C);
455 }
456 else
457 {
458 ret |= zDrvLcd_Spi_WriteCmd(0x11); //Sleep out
459 zDrvLcd_DelayMs(120); //Delay 120ms
460
461 ret |= zDrvLcd_Spi_WriteCmd(0xB1);
462 ret |= zDrvLcd_Spi_WriteData(0x00);
463 ret |= zDrvLcd_Spi_WriteData(0x08);
464 ret |= zDrvLcd_Spi_WriteData(0x05);
465
466 ret |= zDrvLcd_Spi_WriteCmd(0xB2);
467 ret |= zDrvLcd_Spi_WriteData(0x00);
468 ret |= zDrvLcd_Spi_WriteData(0x08);
469 ret |= zDrvLcd_Spi_WriteData(0x05);
470
471 ret |= zDrvLcd_Spi_WriteCmd(0xB3);
472 ret |= zDrvLcd_Spi_WriteData(0x00);
473 ret |= zDrvLcd_Spi_WriteData(0x08);
474 ret |= zDrvLcd_Spi_WriteData(0x05);
475 ret |= zDrvLcd_Spi_WriteData(0x00);
476 ret |= zDrvLcd_Spi_WriteData(0x08);
477 ret |= zDrvLcd_Spi_WriteData(0x05);
478
479 ret |= zDrvLcd_Spi_WriteCmd(0xB4); //Column inversion
480 ret |= zDrvLcd_Spi_WriteData(0x00); // Dot inversion in Normal mode
481
482 ret |= zDrvLcd_Spi_WriteCmd(0xC0);
483 ret |= zDrvLcd_Spi_WriteData(0xA2);//a2
484 ret |= zDrvLcd_Spi_WriteData(0x02);
485 ret |= zDrvLcd_Spi_WriteData(0x84);
486
487 ret |= zDrvLcd_Spi_WriteCmd(0xC1);
488 ret |= zDrvLcd_Spi_WriteData(0xC5);//c5
489
490 ret |= zDrvLcd_Spi_WriteCmd(0xC2);
491 ret |= zDrvLcd_Spi_WriteData(0x0A);
492 ret |= zDrvLcd_Spi_WriteData(0x00);
493
494 ret |= zDrvLcd_Spi_WriteCmd(0xC3);
495 ret |= zDrvLcd_Spi_WriteData(0x8A);
496 ret |= zDrvLcd_Spi_WriteData(0x2A);
497
498 ret |= zDrvLcd_Spi_WriteCmd(0xC4);
499 ret |= zDrvLcd_Spi_WriteData(0x8A);
500 ret |= zDrvLcd_Spi_WriteData(0xEE);
501
502 ret |= zDrvLcd_Spi_WriteCmd(0xC5); //VCOM
503 ret |= zDrvLcd_Spi_WriteData(0x0E);
504
505 ret |= zDrvLcd_Spi_WriteCmd(0x36); //MX, MY, RGB mode
506 ret |= zDrvLcd_Spi_WriteData(LCD_MXMYRGB);
507
508 ret |= zDrvLcd_Spi_WriteCmd(0xE0);
509 ret |= zDrvLcd_Spi_WriteData(0x12);
510 ret |= zDrvLcd_Spi_WriteData(0x18);
511 ret |= zDrvLcd_Spi_WriteData(0x10);
512 ret |= zDrvLcd_Spi_WriteData(0x18);
513 ret |= zDrvLcd_Spi_WriteData(0x33);
514 ret |= zDrvLcd_Spi_WriteData(0x2c);
515 ret |= zDrvLcd_Spi_WriteData(0x25);
516 ret |= zDrvLcd_Spi_WriteData(0x28);
517 ret |= zDrvLcd_Spi_WriteData(0x28);
518 ret |= zDrvLcd_Spi_WriteData(0x27);
519 ret |= zDrvLcd_Spi_WriteData(0x2f);
520 ret |= zDrvLcd_Spi_WriteData(0x3c);
521 ret |= zDrvLcd_Spi_WriteData(0x00);
522 ret |= zDrvLcd_Spi_WriteData(0x03);
523 ret |= zDrvLcd_Spi_WriteData(0x03);
524 ret |= zDrvLcd_Spi_WriteData(0x10);
525
526 ret |= zDrvLcd_Spi_WriteCmd(0xE1);
527 ret |= zDrvLcd_Spi_WriteData(0x12);
528 ret |= zDrvLcd_Spi_WriteData(0x18);
529 ret |= zDrvLcd_Spi_WriteData(0x10);
530 ret |= zDrvLcd_Spi_WriteData(0x18);
531 ret |= zDrvLcd_Spi_WriteData(0x2d);
532 ret |= zDrvLcd_Spi_WriteData(0x28);
533 ret |= zDrvLcd_Spi_WriteData(0x23);
534 ret |= zDrvLcd_Spi_WriteData(0x28);
535 ret |= zDrvLcd_Spi_WriteData(0x28);
536 ret |= zDrvLcd_Spi_WriteData(0x26);
537 ret |= zDrvLcd_Spi_WriteData(0x2f);
538 ret |= zDrvLcd_Spi_WriteData(0x3b);
539 ret |= zDrvLcd_Spi_WriteData(0x00);
540 ret |= zDrvLcd_Spi_WriteData(0x03);
541 ret |= zDrvLcd_Spi_WriteData(0x03);
542 ret |= zDrvLcd_Spi_WriteData(0x10);
543
544 ret |= zDrvLcd_Spi_WriteCmd(0x2A);
545 ret |= zDrvLcd_Spi_WriteData(0x00);
546 ret |= zDrvLcd_Spi_WriteData(var_screeninfo.xs);
547 ret |= zDrvLcd_Spi_WriteData(0x00);
548 ret |= zDrvLcd_Spi_WriteData(var_screeninfo.xe);
549
550 ret |= zDrvLcd_Spi_WriteCmd(0x2B);
551 ret |= zDrvLcd_Spi_WriteData(0x00);
552 ret |= zDrvLcd_Spi_WriteData(var_screeninfo.ys);
553 ret |= zDrvLcd_Spi_WriteData(0x00);
554 ret |= zDrvLcd_Spi_WriteData(var_screeninfo.ye);
555
556 ret |= zDrvLcd_Spi_WriteCmd(0x3A); //65k mode
557 ret |= zDrvLcd_Spi_WriteData(0x05);
558
559 ret |= zDrvLcd_Spi_WriteCmd(0x29); //Display on
560 zDrvLcd_DelayMs(200); //Delay 200ms
561
562 ret |= zDrvLcd_Spi_WriteCmd(0x2C);
563 }
564
565 // Ë¢³ÉºÚÉ«
566 for (uiRow = 0; uiRow < var_screeninfo.width; uiRow++)
567 {
568 for (uiCol = 0; uiCol < var_screeninfo.height; uiCol++)
569 {
570 ret |= zDrvLcd_Spi_WriteData(0x00);
571 ret |= zDrvLcd_Spi_WriteData(0x00);
572 }
573 }
574#endif
575
576 return ret;
577}
578
579/**************************************************************************
580* Function: prj_lcd_get_info
581* Description: used to get the LCD device information.
582* Parameters:
583* (IN)
584* pInfo the pointer of LCD device information to store into
585* (OUT)
586* pInfo the pointer of LCD device information allready stored into
587* Returns:
588* DRV_SUCCESS: succeeded.
589* Others:
590* None.
591**************************************************************************/
592int prj_lcd_get_info(T_ZDrvLcd_Info* pInfo)
593{
594 unsigned char tmp;
595 char cmd[64] = {0};
596 unsigned char lcd_info[16] = {0};
597
598 sprintf(cmd, "fsload resource 0x%x %s", (ulong)(&lcd_info), ZSP_LCDINFO_PATH);
599 run_command(cmd, 0);
600 pInfo->width = lcd_info[0]<< 8 | lcd_info[1];//LCD_WIDTH;
601 pInfo->height = lcd_info[2]<< 8 | lcd_info[3];//LCD_HEIGHT;
602 printf("[LCD]fsload LCDINFO.bin sucess (%d %d)\n",pInfo->width,pInfo->height);
603
604 if(pInfo->width == 0 || pInfo->height == 0)
605 {
606 printf("[LCD]fsload LCDINFO.bin failed!!!!\n");
607 }
608
609 pInfo->bitsPerPixel = LCD_BITS_PER_PIXEL;
610 pInfo->rMask = 0xF800;
611 pInfo->gMask = 0x07E0;
612 pInfo->bMask = 0x001F;
613 pInfo->instance = g_sLcd_Instance;
614 pInfo->backlight = g_sLcd_Backlight;
615 pInfo->brightness = g_sLcd_Brightness;
616
617 tmp = read_st(0xda);//lcd module's manufacturer ID
618 pInfo->lcm_info.man_id = tmp;
619 tmp = read_st(0xdb);//lcd module's ID
620 pInfo->lcm_info.dev_id = tmp<<8;
621 tmp = read_st(0xdc);//lcd module's ID
622 pInfo->lcm_info.dev_id |= tmp;
623 if((pInfo->width == 128 && pInfo->height == 128) &&
624 (pInfo->lcm_info.man_id == LCM_ID_LEAD))
625 {
626 var_screeninfo.xs_offset = 0x02;
627 var_screeninfo.ys_offset = 0x03;
628 var_screeninfo.xs = var_screeninfo.xs_offset;
629 var_screeninfo.ys = var_screeninfo.ys_offset;
630 var_screeninfo.width = 128;
631 var_screeninfo.height = 128;
632 var_screeninfo.xe = var_screeninfo.width + var_screeninfo.xs - 1;
633 var_screeninfo.ye = var_screeninfo.height + var_screeninfo.ys - 1;
634 pInfo->lcm_info.lcd_item = LEAD_ST7735_128x128;
635 pInfo->lcm_info.name = "LEAD_ST7735_128x128";
636 }
637 else if(pInfo->width == 128 && pInfo->height == 64)
638 {
639 var_screeninfo.xs_offset = 0;
640 var_screeninfo.ys_offset = 0;
641 var_screeninfo.xs = var_screeninfo.xs_offset;
642 var_screeninfo.ys = var_screeninfo.ys_offset;
643 var_screeninfo.width = 128;
644 var_screeninfo.height = 64;
645 var_screeninfo.xe = var_screeninfo.width + var_screeninfo.xs - 1;
646 var_screeninfo.ye = var_screeninfo.height + var_screeninfo.ys - 1;
647
648 pInfo->width = 128;
649 pInfo->height = 64;
650 pInfo->lcm_info.lcd_item = ST7567_128x64;
651 pInfo->lcm_info.name = "ST7567_128x64";
652
653 }
654 else //default s93521a 128*160
655 {
656 var_screeninfo.xs_offset = 0;
657 var_screeninfo.ys_offset = 0;
658 var_screeninfo.xs = var_screeninfo.xs_offset;
659 var_screeninfo.ys = var_screeninfo.ys_offset;
660 var_screeninfo.width = 128;
661 var_screeninfo.height = 160;
662 var_screeninfo.xe = var_screeninfo.width + var_screeninfo.xs - 1;
663 var_screeninfo.ye = var_screeninfo.height + var_screeninfo.ys - 1;
664
665 pInfo->width = 128;
666 pInfo->height = 160;
667 pInfo->lcm_info.lcd_item = S93521A_128x128;
668 pInfo->lcm_info.name = "128*128 lcd no found,default S93521A";
669 }
670
671 BOOT_PRINTF(UBOOT_NOTICE, "%s init: lcd man_id = 0x%x, dev_id=0x%x\n", pInfo->lcm_info.name, pInfo->lcm_info.man_id,pInfo->lcm_info.dev_id);
672 return 0;
673}
674
675int update_rect(unsigned char *pBuf, unsigned short uiLeft, unsigned short uiTop, unsigned short uiWidth, unsigned short uiHeight)
676{
677#ifdef CONFIG_ZX297520V3E_FWP
678 return update_rect_bw(pBuf,uiLeft,uiTop,uiWidth,uiHeight);
679#else
680 return update_rect_color(pBuf,uiLeft,uiTop,uiWidth,uiHeight);
681#endif
682}
683