yuezonghe | 824eb0c | 2024-06-27 02:32:26 -0700 | [diff] [blame^] | 1 | /***********************************************************************
|
| 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 |
|
| 75 | struct 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 | };
|
| 86 | static struct lcd_var_screeninfo var_screeninfo = {0}; /* Current var */
|
| 87 |
|
| 88 |
|
| 89 | /**************************************************************************
|
| 90 | * Types *
|
| 91 | **************************************************************************/
|
| 92 | static volatile T_ZDrvLcd_Instance g_sLcd_Instance = {false, LCD_NORMAL, LCD_XFER_POLL, LCD_DCX_CMD};
|
| 93 | static volatile T_ZDrvLcd_BacklightStatus g_sLcd_Backlight = LCD_BACKLIGHT_OFF;
|
| 94 | static volatile T_ZDrvLcd_Brightness g_sLcd_Brightness = 255;
|
| 95 |
|
| 96 | /**************************************************************************
|
| 97 | * Global Variable
|
| 98 | **************************************************************************/
|
| 99 | extern volatile T_ZDrvLcd_Info s_lcd_info;
|
| 100 | extern int zDrvLcd_Spi_WriteCmd(unsigned char cmd);
|
| 101 | extern int zDrvLcd_Spi_WriteData(unsigned char data);
|
| 102 |
|
| 103 | static unsigned char g_sLcdHalDataBuf[128 * LCD_PAGE_NUM] =
|
| 104 | {
|
| 105 | 0,
|
| 106 | };
|
| 107 |
|
| 108 | static unsigned char g_sLcdHalDataBuf_reg[128 *64] =
|
| 109 | {
|
| 110 | 0,
|
| 111 | };
|
| 112 |
|
| 113 |
|
| 114 | /**************************************************************************
|
| 115 | * Function Implementation
|
| 116 | **************************************************************************/
|
| 117 | void 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 | **************************************************************************/
|
| 165 | int 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 |
|
| 178 | uint32_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 | **************************************************************************/
|
| 211 | int 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 | **************************************************************************/
|
| 268 | int 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 |
|
| 288 | int 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 |
|
| 314 | int 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 | **************************************************************************/
|
| 592 | int 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 |
|
| 675 | int 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 |
|