zte's code,first commit
Change-Id: I9a04da59e459a9bc0d67f101f700d9d7dc8d681b
diff --git a/boot/common/src/uboot/drivers/lcd/lcd_prj.c b/boot/common/src/uboot/drivers/lcd/lcd_prj.c
new file mode 100644
index 0000000..5131654
--- /dev/null
+++ b/boot/common/src/uboot/drivers/lcd/lcd_prj.c
@@ -0,0 +1,683 @@
+/***********************************************************************
+ * Copyright (C) 2014, ZTE Corporation.
+ *
+ * File Name: lcd_comm.c
+ * File Mark:
+ * Description: Lcd function implementation. Adapted to LCM MODEL - LEAD T15DS26.
+ * Others: this file is in BOOTLOADER procedure.
+ * This LCM MODEL uses SPI-4.
+ * NOTE: 4-lines-spi uses CS, CLK, D/CX and SDI. Do not using SDO instead of D/CX.
+ * Version: V1.0
+ * Author: qihongfang
+ * Date: 2017-9-18
+ *
+ * History 1:
+ * Date: 2015-1-16
+ * Version:
+ * Author: YinWenguan
+ * Modification: Add brightness setting.
+ *
+***********************************************************************/
+
+/*************************************************************************
+ * Include files
+ *************************************************************************/
+#include "../include/board.h"
+
+#include <common.h>
+#include <malloc.h>
+#include <asm/io.h>
+#include "../include/spi.h"
+#include "../include/ssp.h"
+#include <lcd.h>
+#include <drvs_gpio.h>
+#include <peripheral.h>
+
+/*************************************************************************
+ * Macro
+ *************************************************************************/
+ /* debug switch */
+
+//static unsigned char g_lcd_id=0;
+#define LCM_ID_LEAD 0x7C /*Öйâµçst7735s\ÈýÁúst7735s*/
+
+/* LCD Features */
+#define LCD_WIDTH 128
+#define LCD_HEIGHT 64
+
+#define ZSP_LCDINFO_PATH "/LCDINFO.bin"
+#define LCD_BITS_PER_PIXEL (5 + 6 + 5)
+#define LCD_PAGE_HEIGHT 8
+#define LCD_PAGE_NUM 8
+#define LCD_BPP (2)
+
+#define START_LINE_BIT 0x40
+#define START_PAGE 0xB0
+#define START_HIGH_BIT 0x10
+#define START_LOW_BIT 0x00
+#define START_LOW_PY 1
+
+/* rotate display */
+//#define LCD_ROTATE_180
+
+#define LCD_XS 0x02
+#define LCD_XE ((LCD_WIDTH)+(LCD_XS)-1)
+#ifdef LCD_ROTATE_180
+#define LCD_MXMYRGB 0x1C
+#define LCD_YS 0x01
+#else
+#define LCD_MXMYRGB 0xC8
+#define LCD_YS 0x03
+#endif
+
+#define LCD_YE ((LCD_HEIGHT)+(LCD_YS)-1)
+
+struct lcd_var_screeninfo {
+ unsigned int xs; //xs_offset
+ unsigned int ys; //ys_offset
+ unsigned int width; //128 240
+ unsigned int height; //128 240
+ unsigned int xe; //width + xs - 1
+ unsigned int ye; //height + ys - 1
+ unsigned int xs_offset; //0x02 0x00
+ unsigned int ys_offset; //0x03 0x00
+ //unsigned int bits_per_pixel;
+};
+static struct lcd_var_screeninfo var_screeninfo = {0}; /* Current var */
+
+
+/**************************************************************************
+ * Types *
+ **************************************************************************/
+static volatile T_ZDrvLcd_Instance g_sLcd_Instance = {false, LCD_NORMAL, LCD_XFER_POLL, LCD_DCX_CMD};
+static volatile T_ZDrvLcd_BacklightStatus g_sLcd_Backlight = LCD_BACKLIGHT_OFF;
+static volatile T_ZDrvLcd_Brightness g_sLcd_Brightness = 255;
+
+/**************************************************************************
+ * Global Variable
+ **************************************************************************/
+extern volatile T_ZDrvLcd_Info s_lcd_info;
+extern int zDrvLcd_Spi_WriteCmd(unsigned char cmd);
+extern int zDrvLcd_Spi_WriteData(unsigned char data);
+
+static unsigned char g_sLcdHalDataBuf[128 * LCD_PAGE_NUM] =
+{
+ 0,
+};
+
+static unsigned char g_sLcdHalDataBuf_reg[128 *64] =
+{
+ 0,
+};
+
+
+/**************************************************************************
+ * Function Implementation
+ **************************************************************************/
+void lcd_gpio_define(struct T_ZDrvLcd_gpio_define* config)
+{
+
+ config->spi_cs_gpio = GPIO25;
+ config->spi_scl_gpio = GPIO26;
+ config->spi_sda_gpio = GPIO28;
+ config->spi_dcx_gpio = GPIO27;
+
+ config->spi_cs_func_sel = GPIO25_SSP0_CS;
+ config->spi_scl_func_sel = GPIO26_SSP0_CLK;
+ config->spi_sda_func_sel = GPIO28_SSP0_TXD;
+ config->spi_dcx_func_sel = GPIO27_SSP0_RXD;
+
+ config->spi_cs_gpio_sel = GPIO25_GPIO25;
+ config->spi_scl_gpio_sel = GPIO26_GPIO26;
+ config->spi_sda_gpio_sel = GPIO28_GPIO28;
+ config->spi_dcx_gpio_sel = GPIO27_GPIO27;
+
+#ifdef CONFIG_ZX297520V3E_FWP
+ config->lcd_reset_gpio =GPIO125;
+ config->lcd_reset_gpio_sel =GPIO125_GPIO125;
+ config->lcd_blg_gpio =GPIO53;
+ config->lcd_blg_gpio_sel =GPIO53_GPIO53;
+#else
+ config->lcd_reset_gpio = GPIO120;
+ config->lcd_reset_gpio_sel = GPIO120_GPIO120;
+ config->lcd_blg_gpio = GPIO119;
+ config->lcd_blg_gpio_sel = GPIO119_GPIO119;
+#endif
+
+}
+
+//#if KLOCWORK_BOOT
+/**************************************************************************
+* Function: zDrvLcd_SetRamAddr
+* Description: used to set specified start point of DISPLAY RAM for updating laterly
+* Parameters:
+* (IN)
+* uiLeft left postion
+* uiTop top postion
+* (OUT)
+* None.
+* Returns:
+* DRV_SUCCESS: successed.
+* DRV_ERROR: others error code. For more details, please refer to the source code.
+* Others:
+* None.
+**************************************************************************/
+int set_ram_addr_bw(unsigned short uiLeft, unsigned short uiTop)
+{
+ signed int ret = 0;
+
+ /*set column address*/
+ zDrvLcd_Spi_WriteCmd(START_HIGH_BIT |((uiLeft>>4) & 0x0F)); // ?4?
+ zDrvLcd_Spi_WriteCmd((START_LOW_BIT | (uiLeft & 0x0F))+START_LOW_PY); // ?4?
+
+ /*set page address*/
+ zDrvLcd_Spi_WriteCmd(START_PAGE | (uiTop & 0x0F));
+ return ret ;
+}
+
+uint32_t lcd_WritePixel(unsigned short rgb565, unsigned short uiRow, unsigned short uiCol)
+{
+ unsigned short page_index = uiRow / LCD_PAGE_HEIGHT;
+
+ unsigned short ram_offset = page_index * var_screeninfo.width + uiCol;
+
+ unsigned short bit_shift = uiRow % LCD_PAGE_HEIGHT;
+
+ if (rgb565 != 0 )
+ *(g_sLcdHalDataBuf + ram_offset) &= ~(0x01 << bit_shift);
+ else
+ *(g_sLcdHalDataBuf + ram_offset) |= (0x01 << bit_shift);
+
+ return 0;
+}
+/**************************************************************************
+* Function: zDrvLcd_UpdateRect
+* Description: used to update a specified rectangle area of the LCD device opened previously.
+* Parameters:
+* (IN)
+* pBuf data buffer
+* uiLeft left postion
+* uiTop top postion
+* uiWidth rectangle width
+* uiHeight rectangle height
+* (OUT)
+* None.
+* Returns:
+* DRV_SUCCESS: successed.
+* DRV_ERROR: others error code. For more details, please refer to the source code.
+* Others:
+* None.
+**************************************************************************/
+int update_rect_bw(unsigned char *pBuf, unsigned short uiLeft, unsigned short uiTop, unsigned short uiWidth, unsigned short uiHeight)
+{
+
+ unsigned short *pSrcBuf = (unsigned short *)pBuf;
+ unsigned short row,row_reg, col,col_reg, pixel_value;
+ unsigned short cur_page;
+
+ if((pBuf==NULL)|(var_screeninfo.width <=uiLeft)|(var_screeninfo.height <=uiTop)|(var_screeninfo.width < uiLeft + uiWidth)| (var_screeninfo.height < uiTop + uiHeight))
+ { return -1;}
+
+ for (row = uiTop,row_reg = 0; row <(uiTop + uiHeight); row++,row_reg++)
+ {
+ for (col = uiLeft,col_reg = 0; col < (uiLeft + uiWidth); col++,col_reg++)
+ {
+ g_sLcdHalDataBuf_reg[row * var_screeninfo.width + col] = *(pSrcBuf + row_reg * uiWidth + col_reg);
+ }
+ }
+
+ /* ???????RGB565??????,??RAM */
+
+ for (row = 0; row <var_screeninfo.height; row++)
+ {
+ for (col = 0; col < var_screeninfo.width; col++)
+ {
+ pixel_value = g_sLcdHalDataBuf_reg[row * var_screeninfo.width + col];
+
+ lcd_WritePixel(pixel_value, row , col );
+ }
+ }
+
+
+ /* ??,?????,??RAM???,????page */
+
+ for ( cur_page =0; cur_page <LCD_PAGE_NUM; cur_page++ )
+ {
+ set_ram_addr_bw( 0, cur_page );
+ zDrvLcd_Spi_WriteDataBlock(g_sLcdHalDataBuf + cur_page* var_screeninfo.width, var_screeninfo.width);
+ }
+
+ return 0;
+
+}
+//#endif
+
+/**************************************************************************
+* Function: zDrvLcd_Gpio_Init
+* Description: used to initialize GPIO usage.
+* Parameters:
+* (IN)
+*
+* (OUT)
+*
+* Returns:
+* DRV_SUCCESS: successed.
+* DRV_ERROR: others error code. For more details, please refer to the source code.
+* Others:
+**************************************************************************/
+int set_ram_addr_color(unsigned short uiLeft, unsigned short uiTop)
+{
+ int ret = DRV_SUCCESS;
+
+ ret |= zDrvLcd_Spi_WriteCmd(0x2A);
+ ret |= zDrvLcd_Spi_WriteData(0x00);
+ ret |= zDrvLcd_Spi_WriteData(var_screeninfo.xs);
+ ret |= zDrvLcd_Spi_WriteData((var_screeninfo.xe >> 8));
+ ret |= zDrvLcd_Spi_WriteData((var_screeninfo.xe &0xff));
+
+
+ ret |= zDrvLcd_Spi_WriteCmd(0x2B);
+ ret |= zDrvLcd_Spi_WriteData(0x00);
+ ret |= zDrvLcd_Spi_WriteData(var_screeninfo.ys);
+ ret |= zDrvLcd_Spi_WriteData((var_screeninfo.ye >> 8));
+ ret |= zDrvLcd_Spi_WriteData((var_screeninfo.ye & 0xff));
+
+ return ret;
+}
+
+int update_rect_color(unsigned char *pBuf, unsigned short uiLeft, unsigned short uiTop, unsigned short uiWidth, unsigned short uiHeight)
+{
+ int ret = DRV_SUCCESS;
+
+ ret |= set_ram_addr_color(uiLeft, uiTop); // Ö¸¶¨Ë¢ÐÂµÄÆðʼµØÖ·
+
+ ret |= zDrvLcd_Spi_WriteCmd(0x2c);
+ ret = zDrvLcd_Spi_WriteDataBlock((unsigned char *) pBuf, uiWidth * uiHeight * 2);
+
+ return ret;
+}
+
+/**************************************************************************
+* Function: prj_lcm_init
+* Description: used to initialize SPI usage.
+* Parameters:
+* (IN)
+*
+* (OUT)
+*
+* Returns:
+* DRV_SUCCESS: successed.
+* DRV_ERROR: others error code. For more details, please refer to the source code.
+* Others:
+**************************************************************************/
+
+int prj_lcm_init(void)
+{
+ int ret = DRV_SUCCESS;
+ unsigned long uiRow, uiCol;
+ uint8_t page_number,column_number;
+#ifdef CONFIG_ZX297520V3E_FWP
+ if (s_lcd_info.lcm_info.lcd_item == ST7567_128x64) {
+
+ #if 1
+ zDrvLcd_Spi_WriteCmd(0xe2); // soft reset
+ zDrvLcd_Spi_WriteCmd(0xa3); // Select bias setting(0xa2:1/9, 0xa3:1/7)
+ zDrvLcd_Spi_WriteCmd(0xa0); // Set scan direction of SEG(0xa0:normal direction, 0xa1:reverse direction)
+ zDrvLcd_Spi_WriteCmd(0xc8); // Set output direction of COM(0xc8:reverse direction, 0xc0:normal direction)
+ zDrvLcd_Spi_WriteCmd(0xa6); // Inverse Display(0xa6:normal display, 0xa7:inverse display)
+ zDrvLcd_Spi_WriteCmd(0x2f); // Power Control(0x28~0x2f, Built-in Booster ON, Built-in Regulator ON, Built-in Follower ON)
+ zDrvLcd_Spi_WriteCmd(0x23); // Select regulation resistor ratio(0x20~0x27)
+ zDrvLcd_Spi_WriteCmd(0x81); // Setelectronic volume (EV) level
+ zDrvLcd_Spi_WriteCmd(0x2e); // level
+ zDrvLcd_Spi_WriteCmd(START_LINE_BIT + 0x20); // set start line
+ //zDrvLcd_Spi_WriteCmd(0xa1); // Set scan direction of SEG(0xa0:normal direction, 0xa1:reverse direction)
+ #else
+ zDrvLcd_Spi_WriteCmd(0xe2); // soft reset
+ zDrvLcd_Spi_WriteCmd(0xa3); // Select bias setting(0xa2:1/9, 0xa3:1/7)
+ //zDrvLcd_Spi_WriteCmd(0xa0); // Set scan direction of SEG(0xa0:normal direction, 0xa1:reverse direction)
+ zDrvLcd_Spi_WriteCmd(0xc8); // Set output direction of COM(0xc8:reverse direction, 0xc0:normal direction)
+ zDrvLcd_Spi_WriteCmd(0xa6); // Inverse Display(0xa6:normal display, 0xa7:inverse display)
+ zDrvLcd_Spi_WriteCmd(0x2f); // Power Control(0x28~0x2f, Built-in Booster ON, Built-in Regulator ON, Built-in Follower ON)
+ zDrvLcd_Spi_WriteCmd(0x23); // Select regulation resistor ratio(0x20~0x27)
+ zDrvLcd_Spi_WriteCmd(0x81); // Setelectronic volume (EV) level
+ zDrvLcd_Spi_WriteCmd(0x2e); // level
+ zDrvLcd_Spi_WriteCmd(START_LINE_BIT); // set start line
+ zDrvLcd_Spi_WriteCmd(0xa1); // Set scan direction of SEG(0xa0:normal direction, 0xa1:reverse direction)
+ #endif
+
+ for( page_number = 0; page_number < LCD_PAGE_NUM; page_number++)
+ {
+ set_ram_addr_bw(0x00, page_number );
+ //printf( " page_number = d% ...\n",page_number);
+ for(column_number = 0;column_number < LCD_WIDTH; column_number++)
+ {
+ zDrvLcd_Spi_WriteData(0x00);
+ }
+ }
+
+ zDrvLcd_Spi_WriteCmd(0xaf); // Display On
+ printf("display on show back ...\n");
+ //zDrvLcd_DelayMs(120);
+ //return ret;
+ }
+#else
+
+ if(s_lcd_info.lcm_info.lcd_item != LCM_ID_LEAD)//s93521a
+ {
+ zDrvLcd_Spi_WriteCmd(0x11); //Exit Sleep
+ zDrvLcd_DelayMs(150);
+
+ zDrvLcd_Spi_WriteCmd(0x26); //Set Default Gamma
+ zDrvLcd_Spi_WriteData(0x04);
+
+ zDrvLcd_Spi_WriteCmd(0xB1);
+ zDrvLcd_Spi_WriteData(0x0B);
+ zDrvLcd_Spi_WriteData(0x14);
+
+ zDrvLcd_Spi_WriteCmd(0xC0); //Set VRH1[4:0] & VC[2:0] for VCI1 & GVDD
+ zDrvLcd_Spi_WriteData(0x10);
+ zDrvLcd_Spi_WriteData(0x00);
+
+ zDrvLcd_Spi_WriteCmd(0xC1); //Set BT[2:0] for AVDD & VCL & VGH & VGL
+ zDrvLcd_Spi_WriteData(0x05);
+
+ zDrvLcd_Spi_WriteCmd(0xC5); //Set VMH[6:0] & VML[6:0] for VOMH & VCOML
+ zDrvLcd_Spi_WriteData(0x46);
+ zDrvLcd_Spi_WriteData(0x40);
+
+ zDrvLcd_Spi_WriteCmd(0xC7);
+ zDrvLcd_Spi_WriteData(0xBD);
+
+ zDrvLcd_Spi_WriteCmd(0xEC);
+ zDrvLcd_Spi_WriteData(0x0C);
+
+ zDrvLcd_Spi_WriteCmd(0x3a); //Set Color Format
+ zDrvLcd_Spi_WriteData(0x05);
+
+ zDrvLcd_Spi_WriteCmd(0x2A); //Set Column Address
+ zDrvLcd_Spi_WriteData(0x00);
+ zDrvLcd_Spi_WriteData(0x00);
+ zDrvLcd_Spi_WriteData(0x00);
+ zDrvLcd_Spi_WriteData(0x7F);
+
+ zDrvLcd_Spi_WriteCmd(0x2B); //Set Page Address
+ zDrvLcd_Spi_WriteData(0x00);
+ zDrvLcd_Spi_WriteData(0x00);
+ zDrvLcd_Spi_WriteData(0x00);
+ zDrvLcd_Spi_WriteData(0x9F);
+
+ zDrvLcd_Spi_WriteCmd(0x36); //Set Scanning Direction
+ zDrvLcd_Spi_WriteData(LCD_MXMYRGB);
+
+ zDrvLcd_Spi_WriteCmd(0xB7); //Set Source Output Direction
+ zDrvLcd_Spi_WriteData(0x00);
+
+ zDrvLcd_Spi_WriteCmd(0xf2); //Enable Gamma bit
+ zDrvLcd_Spi_WriteData(0x01);
+
+ zDrvLcd_Spi_WriteCmd(0xE0);
+ zDrvLcd_Spi_WriteData(0x3F);//p1
+ zDrvLcd_Spi_WriteData(0x29);//p2
+ zDrvLcd_Spi_WriteData(0x26);//p3
+ zDrvLcd_Spi_WriteData(0x26);//p4
+ zDrvLcd_Spi_WriteData(0x26);//p5
+ zDrvLcd_Spi_WriteData(0x0C);//p6
+ zDrvLcd_Spi_WriteData(0x51);//p7
+ zDrvLcd_Spi_WriteData(0xB8);//p8
+ zDrvLcd_Spi_WriteData(0x39);//p9
+ zDrvLcd_Spi_WriteData(0x17);//p10
+ zDrvLcd_Spi_WriteData(0x00);//p11
+ zDrvLcd_Spi_WriteData(0x00);//p12
+ zDrvLcd_Spi_WriteData(0x00);//p13
+ zDrvLcd_Spi_WriteData(0x00);//p14
+ zDrvLcd_Spi_WriteData(0x00);//p15
+
+ zDrvLcd_Spi_WriteCmd(0xE1);
+ zDrvLcd_Spi_WriteData(0x00);//p1
+ zDrvLcd_Spi_WriteData(0x16);//p2
+ zDrvLcd_Spi_WriteData(0x19);//p3
+ zDrvLcd_Spi_WriteData(0x19);//p4
+ zDrvLcd_Spi_WriteData(0x19);//p5
+ zDrvLcd_Spi_WriteData(0x13);//p6
+ zDrvLcd_Spi_WriteData(0x2E);//p7
+ zDrvLcd_Spi_WriteData(0x47);//p8
+ zDrvLcd_Spi_WriteData(0x46);//p9
+ zDrvLcd_Spi_WriteData(0x08);//p10
+ zDrvLcd_Spi_WriteData(0x3F);//p11
+ zDrvLcd_Spi_WriteData(0x3F);//p12
+ zDrvLcd_Spi_WriteData(0x3F);//p13
+ zDrvLcd_Spi_WriteData(0x3F);//p14
+ zDrvLcd_Spi_WriteData(0x3F);//p15
+
+ zDrvLcd_Spi_WriteCmd(0x29); // Display On
+
+ zDrvLcd_Spi_WriteCmd(0x2C);
+ }
+ else
+ {
+ ret |= zDrvLcd_Spi_WriteCmd(0x11); //Sleep out
+ zDrvLcd_DelayMs(120); //Delay 120ms
+
+ ret |= zDrvLcd_Spi_WriteCmd(0xB1);
+ ret |= zDrvLcd_Spi_WriteData(0x00);
+ ret |= zDrvLcd_Spi_WriteData(0x08);
+ ret |= zDrvLcd_Spi_WriteData(0x05);
+
+ ret |= zDrvLcd_Spi_WriteCmd(0xB2);
+ ret |= zDrvLcd_Spi_WriteData(0x00);
+ ret |= zDrvLcd_Spi_WriteData(0x08);
+ ret |= zDrvLcd_Spi_WriteData(0x05);
+
+ ret |= zDrvLcd_Spi_WriteCmd(0xB3);
+ ret |= zDrvLcd_Spi_WriteData(0x00);
+ ret |= zDrvLcd_Spi_WriteData(0x08);
+ ret |= zDrvLcd_Spi_WriteData(0x05);
+ ret |= zDrvLcd_Spi_WriteData(0x00);
+ ret |= zDrvLcd_Spi_WriteData(0x08);
+ ret |= zDrvLcd_Spi_WriteData(0x05);
+
+ ret |= zDrvLcd_Spi_WriteCmd(0xB4); //Column inversion
+ ret |= zDrvLcd_Spi_WriteData(0x00); // Dot inversion in Normal mode
+
+ ret |= zDrvLcd_Spi_WriteCmd(0xC0);
+ ret |= zDrvLcd_Spi_WriteData(0xA2);//a2
+ ret |= zDrvLcd_Spi_WriteData(0x02);
+ ret |= zDrvLcd_Spi_WriteData(0x84);
+
+ ret |= zDrvLcd_Spi_WriteCmd(0xC1);
+ ret |= zDrvLcd_Spi_WriteData(0xC5);//c5
+
+ ret |= zDrvLcd_Spi_WriteCmd(0xC2);
+ ret |= zDrvLcd_Spi_WriteData(0x0A);
+ ret |= zDrvLcd_Spi_WriteData(0x00);
+
+ ret |= zDrvLcd_Spi_WriteCmd(0xC3);
+ ret |= zDrvLcd_Spi_WriteData(0x8A);
+ ret |= zDrvLcd_Spi_WriteData(0x2A);
+
+ ret |= zDrvLcd_Spi_WriteCmd(0xC4);
+ ret |= zDrvLcd_Spi_WriteData(0x8A);
+ ret |= zDrvLcd_Spi_WriteData(0xEE);
+
+ ret |= zDrvLcd_Spi_WriteCmd(0xC5); //VCOM
+ ret |= zDrvLcd_Spi_WriteData(0x0E);
+
+ ret |= zDrvLcd_Spi_WriteCmd(0x36); //MX, MY, RGB mode
+ ret |= zDrvLcd_Spi_WriteData(LCD_MXMYRGB);
+
+ ret |= zDrvLcd_Spi_WriteCmd(0xE0);
+ ret |= zDrvLcd_Spi_WriteData(0x12);
+ ret |= zDrvLcd_Spi_WriteData(0x18);
+ ret |= zDrvLcd_Spi_WriteData(0x10);
+ ret |= zDrvLcd_Spi_WriteData(0x18);
+ ret |= zDrvLcd_Spi_WriteData(0x33);
+ ret |= zDrvLcd_Spi_WriteData(0x2c);
+ ret |= zDrvLcd_Spi_WriteData(0x25);
+ ret |= zDrvLcd_Spi_WriteData(0x28);
+ ret |= zDrvLcd_Spi_WriteData(0x28);
+ ret |= zDrvLcd_Spi_WriteData(0x27);
+ ret |= zDrvLcd_Spi_WriteData(0x2f);
+ ret |= zDrvLcd_Spi_WriteData(0x3c);
+ ret |= zDrvLcd_Spi_WriteData(0x00);
+ ret |= zDrvLcd_Spi_WriteData(0x03);
+ ret |= zDrvLcd_Spi_WriteData(0x03);
+ ret |= zDrvLcd_Spi_WriteData(0x10);
+
+ ret |= zDrvLcd_Spi_WriteCmd(0xE1);
+ ret |= zDrvLcd_Spi_WriteData(0x12);
+ ret |= zDrvLcd_Spi_WriteData(0x18);
+ ret |= zDrvLcd_Spi_WriteData(0x10);
+ ret |= zDrvLcd_Spi_WriteData(0x18);
+ ret |= zDrvLcd_Spi_WriteData(0x2d);
+ ret |= zDrvLcd_Spi_WriteData(0x28);
+ ret |= zDrvLcd_Spi_WriteData(0x23);
+ ret |= zDrvLcd_Spi_WriteData(0x28);
+ ret |= zDrvLcd_Spi_WriteData(0x28);
+ ret |= zDrvLcd_Spi_WriteData(0x26);
+ ret |= zDrvLcd_Spi_WriteData(0x2f);
+ ret |= zDrvLcd_Spi_WriteData(0x3b);
+ ret |= zDrvLcd_Spi_WriteData(0x00);
+ ret |= zDrvLcd_Spi_WriteData(0x03);
+ ret |= zDrvLcd_Spi_WriteData(0x03);
+ ret |= zDrvLcd_Spi_WriteData(0x10);
+
+ ret |= zDrvLcd_Spi_WriteCmd(0x2A);
+ ret |= zDrvLcd_Spi_WriteData(0x00);
+ ret |= zDrvLcd_Spi_WriteData(var_screeninfo.xs);
+ ret |= zDrvLcd_Spi_WriteData(0x00);
+ ret |= zDrvLcd_Spi_WriteData(var_screeninfo.xe);
+
+ ret |= zDrvLcd_Spi_WriteCmd(0x2B);
+ ret |= zDrvLcd_Spi_WriteData(0x00);
+ ret |= zDrvLcd_Spi_WriteData(var_screeninfo.ys);
+ ret |= zDrvLcd_Spi_WriteData(0x00);
+ ret |= zDrvLcd_Spi_WriteData(var_screeninfo.ye);
+
+ ret |= zDrvLcd_Spi_WriteCmd(0x3A); //65k mode
+ ret |= zDrvLcd_Spi_WriteData(0x05);
+
+ ret |= zDrvLcd_Spi_WriteCmd(0x29); //Display on
+ zDrvLcd_DelayMs(200); //Delay 200ms
+
+ ret |= zDrvLcd_Spi_WriteCmd(0x2C);
+ }
+
+ // Ë¢³ÉºÚÉ«
+ for (uiRow = 0; uiRow < var_screeninfo.width; uiRow++)
+ {
+ for (uiCol = 0; uiCol < var_screeninfo.height; uiCol++)
+ {
+ ret |= zDrvLcd_Spi_WriteData(0x00);
+ ret |= zDrvLcd_Spi_WriteData(0x00);
+ }
+ }
+#endif
+
+ return ret;
+}
+
+/**************************************************************************
+* Function: prj_lcd_get_info
+* Description: used to get the LCD device information.
+* Parameters:
+* (IN)
+* pInfo the pointer of LCD device information to store into
+* (OUT)
+* pInfo the pointer of LCD device information allready stored into
+* Returns:
+* DRV_SUCCESS: succeeded.
+* Others:
+* None.
+**************************************************************************/
+int prj_lcd_get_info(T_ZDrvLcd_Info* pInfo)
+{
+ unsigned char tmp;
+ char cmd[64] = {0};
+ unsigned char lcd_info[16] = {0};
+
+ sprintf(cmd, "fsload resource 0x%x %s", (ulong)(&lcd_info), ZSP_LCDINFO_PATH);
+ run_command(cmd, 0);
+ pInfo->width = lcd_info[0]<< 8 | lcd_info[1];//LCD_WIDTH;
+ pInfo->height = lcd_info[2]<< 8 | lcd_info[3];//LCD_HEIGHT;
+ printf("[LCD]fsload LCDINFO.bin sucess (%d %d)\n",pInfo->width,pInfo->height);
+
+ if(pInfo->width == 0 || pInfo->height == 0)
+ {
+ printf("[LCD]fsload LCDINFO.bin failed!!!!\n");
+ }
+
+ pInfo->bitsPerPixel = LCD_BITS_PER_PIXEL;
+ pInfo->rMask = 0xF800;
+ pInfo->gMask = 0x07E0;
+ pInfo->bMask = 0x001F;
+ pInfo->instance = g_sLcd_Instance;
+ pInfo->backlight = g_sLcd_Backlight;
+ pInfo->brightness = g_sLcd_Brightness;
+
+ tmp = read_st(0xda);//lcd module's manufacturer ID
+ pInfo->lcm_info.man_id = tmp;
+ tmp = read_st(0xdb);//lcd module's ID
+ pInfo->lcm_info.dev_id = tmp<<8;
+ tmp = read_st(0xdc);//lcd module's ID
+ pInfo->lcm_info.dev_id |= tmp;
+ if((pInfo->width == 128 && pInfo->height == 128) &&
+ (pInfo->lcm_info.man_id == LCM_ID_LEAD))
+ {
+ var_screeninfo.xs_offset = 0x02;
+ var_screeninfo.ys_offset = 0x03;
+ var_screeninfo.xs = var_screeninfo.xs_offset;
+ var_screeninfo.ys = var_screeninfo.ys_offset;
+ var_screeninfo.width = 128;
+ var_screeninfo.height = 128;
+ var_screeninfo.xe = var_screeninfo.width + var_screeninfo.xs - 1;
+ var_screeninfo.ye = var_screeninfo.height + var_screeninfo.ys - 1;
+ pInfo->lcm_info.lcd_item = LEAD_ST7735_128x128;
+ pInfo->lcm_info.name = "LEAD_ST7735_128x128";
+ }
+ else if(pInfo->width == 128 && pInfo->height == 64)
+ {
+ var_screeninfo.xs_offset = 0;
+ var_screeninfo.ys_offset = 0;
+ var_screeninfo.xs = var_screeninfo.xs_offset;
+ var_screeninfo.ys = var_screeninfo.ys_offset;
+ var_screeninfo.width = 128;
+ var_screeninfo.height = 64;
+ var_screeninfo.xe = var_screeninfo.width + var_screeninfo.xs - 1;
+ var_screeninfo.ye = var_screeninfo.height + var_screeninfo.ys - 1;
+
+ pInfo->width = 128;
+ pInfo->height = 64;
+ pInfo->lcm_info.lcd_item = ST7567_128x64;
+ pInfo->lcm_info.name = "ST7567_128x64";
+
+ }
+ else //default s93521a 128*160
+ {
+ var_screeninfo.xs_offset = 0;
+ var_screeninfo.ys_offset = 0;
+ var_screeninfo.xs = var_screeninfo.xs_offset;
+ var_screeninfo.ys = var_screeninfo.ys_offset;
+ var_screeninfo.width = 128;
+ var_screeninfo.height = 160;
+ var_screeninfo.xe = var_screeninfo.width + var_screeninfo.xs - 1;
+ var_screeninfo.ye = var_screeninfo.height + var_screeninfo.ys - 1;
+
+ pInfo->width = 128;
+ pInfo->height = 160;
+ pInfo->lcm_info.lcd_item = S93521A_128x128;
+ pInfo->lcm_info.name = "128*128 lcd no found,default S93521A";
+ }
+
+ 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);
+ return 0;
+}
+
+int update_rect(unsigned char *pBuf, unsigned short uiLeft, unsigned short uiTop, unsigned short uiWidth, unsigned short uiHeight)
+{
+#ifdef CONFIG_ZX297520V3E_FWP
+ return update_rect_bw(pBuf,uiLeft,uiTop,uiWidth,uiHeight);
+#else
+ return update_rect_color(pBuf,uiLeft,uiTop,uiWidth,uiHeight);
+#endif
+}
+