📄 lcd.c
字号:
/*****************************************************************************
* Copyright Statement:
* --------------------
* This software is protected by Copyright and the information contained
* herein is confidential. The software may not be copied and the information
* contained herein may not be used or disclosed except with the written
* permission of MediaTek Inc. (C) 2001
*
*****************************************************************************/
/*****************************************************************************
*
* Filename:
* ---------
* lcd.c
*
* Project:
* --------
* Maui_Software
*
* Description:
* ------------
* This Module defines the LCD driver.
*
* Author:
* -------
* -------
*
*============================================================================
* HISTORY
* Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
*------------------------------------------------------------------------------
*
*------------------------------------------------------------------------------
* Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
*============================================================================
****************************************************************************/
/******************************/
/* Header file include */
/******************************/
#include "drv_comm.h"
#include "reg_base.h"
#include "lcd_sw_inc.h"
#include "lcd_sw.h"
#include "lcd_hw.h"
// Serial interface
#include "lcd_if.h"
#include "eint.h"
extern void GPIO_ModeSetup(kal_uint16 pin, kal_uint16 conf_dada);
extern void GPIO_WriteIO(char data, char port);
//ericlee start
//extern kal_bool DUMMY_MP4_ID_SECSET;
kal_bool lcd_assert_fail=KAL_FALSE;
static unsigned char addrmx;
unsigned char getaddrmx();
#ifdef DUAL_LCD
#ifndef COLOR_SUBLCD
const kal_uint8 SubLCDSetArray[]=
{
0x01, // 0000 0001
0x02, // 0000 0010
0x04, // 0000 0100
0x08, // 0000 1000
0x10, // 0001 0000
0x20, // 0010 0000
0x40, // 0100 0000
0x80 // 1000 0000
};
const kal_uint8 SubLCDReSetArray[]=
{
0xFE, // 1111 1110
0xFD, // 1111 1101
0xFB, // 1111 1011
0xF7, // 1111 0111
0xEF, // 1110 1111
0xDF, // 1101 1111
0xBF, // 1011 1111
0x7F // 0111 1111
};
#endif
#endif
/******************************/
/* Local function definition */
/******************************/
/****************************************************************************
FUNCTION NAME : spi_ini
PURPOSE : This function is to initialize SPI
INPUT PARAMETERS : void
OUTPUT PARAMETERS : void
*****************************************************************************/
void write_init(kal_uint16 CMD,kal_uint16 Data)//Start Oscillation
{
LCD_CtrlWrite_SSD1779(CMD);
LCD_DataWrite_SSD1779(Data);
}
void spi_ini(void)
{
#if ( (defined(MT6205B)) || (defined(MT6218)) )
/* Data size = 8bits, SPO = 1 and SPH = 1, SCR = LCD_CTRL0_SCRDiv16 */
DRV_WriteReg(LCD_SCON,(LCD_SCON_SPH|LCD_SCON_SPO));
DRV_Reg(DRVPDN_CON1) &= (~DRVPDN_CON1_LCD);
#endif /*MT6205B,MT6218*/
#if (defined(MT6218B) || defined(MT6219) || defined(MT6217))
REG_LCD_SERIAL_CONFIG = (LCD_SERIAL_CONFIG_CLOCK_PHASE_BIT | LCD_SERIAL_CONFIG_CLOCK_POLARITY_BIT);
#endif /* MT6218B, MT6219 */
#if ( (defined(MT6208)) || (defined(MT6205)) || (defined(FPGA)))
/* Data size = 8bits, SPO = 1 and SPH = 1, SCR = LCD_CTRL0_SCRDiv16 */
DRV_WriteReg(LCD_CTRL0,LCD_CTRL0_Normal);
/* continuous mode enable, DSB0,DSB1 = 1,1 , CS0PO,CS1PO = LOW enable */
DRV_WriteReg(LCD_CTRL1,LCD_CTRL1_Normal);
DRV_Reg(DRVPDN_CON1) &= (~DRVPDN_CON1_LCD);
#endif
}
#if (defined(MT6218B)||defined(MT6219)||defined(MT6217))
void init_lcd_interface(void)
{
#ifdef DUAL_LCD
GPIO_ModeSetup(24, 1);
#endif
DRV_Reg(DRVPDN_CON1) &= (~DRVPDN_CON1_LCD); /* Power on LCD */
REG_LCD_ROI_CTRL=0;
CLEAR_LCD_CTRL_RESET_PIN;
#if (defined(MT6218B))
SET_LCD_PARALLEL_CE2WR_SETUP_TIME((kal_uint32)2);
SET_LCD_PARALLEL_CE2WR_HOLD_TIME(2);
SET_LCD_PARALLEL_CE2RD_SETUP_TIME(0);
SET_LCD_PARALLEL_WRITE_WAIT_STATE(4);
SET_LCD_PARALLEL_READ_LATENCY_TIME(0);
SET_LCD_ROI_CTRL_CMD_LATENCY(10);
DISABLE_LCD_PARALLEL_SYNC;
#elif (defined(MT6219))
SET_LCD_PARALLEL_CE2WR_SETUP_TIME((kal_uint32)0);
SET_LCD_PARALLEL_CE2WR_HOLD_TIME(0);
SET_LCD_PARALLEL_CE2RD_SETUP_TIME(0);
SET_LCD_PARALLEL_WRITE_WAIT_STATE(4);
SET_LCD_PARALLEL_READ_LATENCY_TIME(2);
SET_LCD_ROI_CTRL_CMD_LATENCY(2);
DISABLE_LCD_PARALLEL_SYNC;
#elif (defined(MT6217))
SET_LCD_PARALLEL_CE2WR_SETUP_TIME((kal_uint32)0);
SET_LCD_PARALLEL_CE2WR_HOLD_TIME(0);
SET_LCD_PARALLEL_CE2RD_SETUP_TIME(0);
SET_LCD_PARALLEL_WRITE_WAIT_STATE(4);
SET_LCD_PARALLEL_READ_LATENCY_TIME(2);
SET_LCD_ROI_CTRL_CMD_LATENCY(2);
SET_LCD_PARALLEL_8BIT_DATA_BUS;
SET_LCD_PARALLEL_CLOCK_52M;
#ifdef DUAL_LCD
SET_LCD_PARALLEL1_CE2WR_SETUP_TIME((kal_uint32)0);
SET_LCD_PARALLEL1_CE2WR_HOLD_TIME(0);
SET_LCD_PARALLEL1_CE2RD_SETUP_TIME(0);
SET_LCD_PARALLEL1_WRITE_WAIT_STATE(4);
SET_LCD_PARALLEL1_READ_LATENCY_TIME(2);
SET_LCD_ROI_CTRL_CMD_LATENCY(2);
#endif
#endif
LCD_Delay(15);
SET_LCD_CTRL_RESET_PIN;
} /* init_lcd_interface() */
#endif /* MT6217, MT6218B, MT6219 */
void LCD_Partial_On_SSD1789(kal_uint16 start_page,kal_uint16 end_page)
{
LCD_CtrlWrite_SSD1779(LCD_ENTER_PARTIAL_DISPLAY_SSD1789);
LCD_DataWrite_SSD1779(start_page);
LCD_CtrlWrite_SSD1779(end_page);
}
void LCD_Partial_Off_SSD1789(void)
{
LCD_CtrlWrite_SSD1779(LCD_EXIT_PARTIAL_DISPLAY_SSD1789);
}
kal_uint8 LCD_Partial_line_SSD1789(void)
{
return 1; /* partial display in 1 line alignment */
}
/****************************************************************************
FUNCTION NAME : LCD_Delay
PURPOSE : This function is to delay 10 for loops.
INPUT PARAMETERS : void
OUTPUT PARAMETERS : void
*****************************************************************************/
void LCD_Delay(kal_uint8 time)
{
volatile kal_uint16 delay;
for (delay =0;delay <time*400;delay++) {} // 85us
}
/****************************************************************************
FUNCTION NAME : LCD_Set_Y_Addr_SSD1779
PURPOSE : This function is to
INPUT PARAMETERS : kal_uint16
OUTPUT PARAMETERS : void
*****************************************************************************/
void LCD_Set_Y_Addr_SSD1779(kal_uint16 start_row, kal_uint16 end_row)
{
LCD_CtrlWrite_SSD1779(LCD_PAGE_ADDRESS_SET_SSD1779);
LCD_DataWrite_SSD1779(start_row);
LCD_DataWrite_SSD1779(end_row);
}
/****************************************************************************
FUNCTION NAME : LCD_Set_X_Addr_SSD1779
PURPOSE : This function is to
INPUT PARAMETERS : kal_uint16
OUTPUT PARAMETERS : void
*****************************************************************************/
void LCD_Set_X_Addr_SSD1779(kal_uint16 start_column, kal_uint16 end_column)
{
LCD_CtrlWrite_SSD1779(LCD_COLUMN_ADDRESS_SET_SSD1779);
LCD_DataWrite_SSD1779(start_column);
LCD_DataWrite_SSD1779(end_column);
}
/****************************************************************************
FUNCTION NAME : LCD_blockClear_SSD1779
PURPOSE : This function is to
INPUT PARAMETERS : kal_uint16
OUTPUT PARAMETERS : void
*****************************************************************************/
void LCD_blockClear_SSD1779(kal_uint16 x1,kal_uint16 y1,kal_uint16 x2,kal_uint16 y2,kal_uint16 data)
{
kal_uint16 LCD_x;
kal_uint16 LCD_y;
LCD_Set_Y_Addr_SSD1779(y1, y2);
LCD_Set_X_Addr_SSD1779(x1+4, x2+4);
LCD_CtrlWrite_SSD1779(LCD_WRITE_DATA_SSD1779);
for(LCD_x=x1;LCD_x<=x2;LCD_x++)
for(LCD_y=y1;LCD_y<=y2;LCD_y++)
LCD_RAMWrite_SSD1779(data);
}
/****************************************************************************
FUNCTION NAME : LCD_ClearAll_SSD1779
PURPOSE : This function is to
INPUT PARAMETERS : kal_uint16
OUTPUT PARAMETERS : void
*****************************************************************************/
void LCD_ClearAll_SSD1779(kal_uint16 data)
{
LCD_blockClear_SSD1779(0,0,LCD_WIDTH-1,LCD_HEIGHT-1,data);
// LCD_blockClear_SSD1779(0,0,30,60,data);
}
/****************************************************************************
FUNCTION NAME : LCD_EnterSleep
PURPOSE : This function is to make LCD enter sleep mode.
INPUT PARAMETERS : void
OUTPUT PARAMETERS : void
*****************************************************************************/
void LCD_EnterSleep_SSD1779(void)
{
//LCD_CtrlWrite_SSD1779(LCD_ENTER_SLEEP_SSD1779); // 0x95
LCD_CtrlWrite_SSD1779(LCD_DISPLAY_OFF_SSD1779);
}
/****************************************************************************
FUNCTION NAME : LCD_ExitSleep
PURPOSE : This function is to make LCD exit sleep mode.
INPUT PARAMETERS : void
OUTPUT PARAMETERS : void
*****************************************************************************/
void LCD_ExitSleep_SSD1779(void)
{
//LCD_CtrlWrite_SSD1779(LCD_EXIT_SLEEP_SSD1779); // 0x94
//LCD_CtrlWrite_SSD1779(LCD_DISPLAY_ON_SSD1779);
LCD_CtrlWrite_SSD1779(LCD_DISPLAY_ON_SSD1779);
}
void LCD_Size_SSD1779(kal_uint16 *out_LCD_width,kal_uint16 *out_LCD_height)
{
*out_LCD_width = LCD_WIDTH;
*out_LCD_height = LCD_HEIGHT;
}
#define pap1302_BYPASS_PIN 21
void LCD_Init_SSD1779(kal_uint32 bkground, void **buf_addr)
{
kal_uint32 delay;
kal_uint16 background = (kal_uint16)bkground;
#ifdef MCU_26M
*EMI_CON3 = 0xE708;
#endif /*MCU_26M*/
GPIO_ModeSetup(pap1302_BYPASS_PIN, 0);
GPIO_InitIO(1, pap1302_BYPASS_PIN);
GPIO_WriteIO(1, pap1302_BYPASS_PIN);
LCD_Delay(10);
/* Oscillator On */
LCD_CtrlWrite_SSD1779(LCD_OSC_ON_SSD1779); // 0xD1
LCD_Delay(10);
/* Exit Sleep Mode */
LCD_CtrlWrite_SSD1779(LCD_EXIT_SLEEP_SSD1779); // 0x94
LCD_Delay(10);
/* Display On */
LCD_CtrlWrite_SSD1779(LCD_DISPLAY_ON_SSD1779); // 0xAF
LCD_Delay(10);
LCD_CtrlWrite_SSD1779(LCD_POW_CTRL_SSD1779); // 0x20
LCD_DataWrite_SSD1779(0x01);
LCD_Delay(10);
LCD_CtrlWrite_SSD1779(LCD_POW_CTRL_SSD1779); // 0x20
LCD_DataWrite_SSD1779(0x03); //ericlee 0f
LCD_Delay(10);
//LCD_Delay(10);
//LCD_Delay(10);
LCD_CtrlWrite_SSD1779(LCD_POW_CTRL_SSD1779); // 0x20
LCD_DataWrite_SSD1779(0x0f); //ericlee 07
#if 1
LCD_Delay(10);
LCD_CtrlWrite_SSD1779(0xF3);
LCD_DataWrite_SSD1779(0x90);
LCD_DataWrite_SSD1779(0x05);
LCD_DataWrite_SSD1779(0x60);
LCD_DataWrite_SSD1779(0x84);
LCD_Delay(10);
LCD_CtrlWrite_SSD1779(0x82); //Set Temperature compensation coefficient
LCD_DataWrite_SSD1779(0x01); //-0.13
#endif
/* Select LCD Bias */
LCD_CtrlWrite_SSD1779(LCD_BIAS_CTRL_SSD1779); // 0xFB
LCD_DataWrite_SSD1779(0x02);//0x01 // 0x00~0x07 1/7~1/14
LCD_Delay(10);
/* unknown */
// LCD_CtrlWrite_SSD1779(0xE8);
/* Select PWM/FRC */
LCD_CtrlWrite_SSD1779(LCD_PWM_FRC_SSD1779); // 0xF7
LCD_DataWrite_SSD1779(0x28);
LCD_DataWrite_SSD1779(0x0E);
LCD_DataWrite_SSD1779(0x05);
LCD_Delay(10);
/* Set Display Control */
LCD_CtrlWrite_SSD1779(LCD_DUTY_CTRL_SSD1779); // 0xCA
LCD_DataWrite_SSD1779(0x00);
LCD_DataWrite_SSD1779(0x20);
LCD_DataWrite_SSD1779(0x00);
LCD_Delay(10);
/* Set Contrast Level */
LCD_CtrlWrite_SSD1779(LCD_CONTRAST_CTRL_SSD1779); // 0x81
LCD_DataWrite_SSD1779(0x14); // 0x1a
LCD_DataWrite_SSD1779(0x06);
LCD_Delay(10);
// LCD_CtrlWrite_SSD1779(LCD_NORMAL_DISPLAY_SSD1779); // A6
LCD_Delay(10);
/* Set DATA/COM Output Scan Direction */
LCD_CtrlWrite_SSD1779(LCD_DATA_OUTPUT_SCAN_SSD1779);// 0xBC
LCD_DataWrite_SSD1779(0x03); //ericlee for change
LCD_DataWrite_SSD1779(0x00);
LCD_DataWrite_SSD1779(0x00);
/* Gray scaleselection
00b 16 bit/pixel
01b 8 bit/pixel
10b 12 bit/pixel
11b 18 bit/pixel
*/
LCD_Delay(10);
LCD_CtrlWrite_SSD1779(LCD_COM_OUTPUT_SCAN_SSD1779);// 0xBB
LCD_DataWrite_SSD1779(0x02);
LCD_Delay(10);
/* Set color look up table */
LCD_CtrlWrite_SSD1779 (0xce);
LCD_DataWrite_SSD1779(0x02);
LCD_DataWrite_SSD1779 (0x05);
LCD_DataWrite_SSD1779 (0x07);
LCD_DataWrite_SSD1779 (0x0a);
LCD_DataWrite_SSD1779 (0x0d);
LCD_DataWrite_SSD1779 (0x10);
LCD_DataWrite_SSD1779 (0x12);
LCD_DataWrite_SSD1779 (0x14);
LCD_DataWrite_SSD1779 (0x16);
LCD_DataWrite_SSD1779 (0x18);
LCD_DataWrite_SSD1779 (0x19);
LCD_DataWrite_SSD1779 (0x1a);
LCD_DataWrite_SSD1779 (0x1b);
LCD_DataWrite_SSD1779 (0x1c);
LCD_DataWrite_SSD1779 (0x1e);
LCD_DataWrite_SSD1779 (0x1f);
LCD_DataWrite_SSD1779 (0x20);
LCD_DataWrite_SSD1779 (0x21);
LCD_DataWrite_SSD1779 (0x22);
LCD_DataWrite_SSD1779 (0x24);
LCD_DataWrite_SSD1779 (0x25);
LCD_DataWrite_SSD1779 (0x27);
LCD_DataWrite_SSD1779 (0x28);
LCD_DataWrite_SSD1779 (0x2a);
LCD_DataWrite_SSD1779 (0x2b);
LCD_DataWrite_SSD1779 (0x2d);
LCD_DataWrite_SSD1779 (0x2f);
LCD_DataWrite_SSD1779 (0x31);
LCD_DataWrite_SSD1779 (0x33);
LCD_DataWrite_SSD1779 (0x36);
LCD_DataWrite_SSD1779 (0x3a);
LCD_DataWrite_SSD1779 (0x3f);
LCD_Delay(10);
/* Set X/Y Address */
LCD_CtrlWrite_SSD1779(LCD_COLUMN_ADDRESS_SET_SSD1779); // 0x15
LCD_DataWrite_SSD1779(0x04);
LCD_DataWrite_SSD1779(0x83);
LCD_Delay(10);
LCD_CtrlWrite_SSD1779(LCD_PAGE_ADDRESS_SET_SSD1779); // 0x75
LCD_DataWrite_SSD1779(0x28);
LCD_DataWrite_SSD1779(0xA7);
LCD_Delay(10);
LCD_CtrlWrite_SSD1779(0xf1); //COM SEQUENCE
LCD_DataWrite_SSD1779(0xc0);
LCD_DataWrite_SSD1779(0x00);
LCD_DataWrite_SSD1779(0x00);
LCD_Delay(10);
LCD_CtrlWrite_SSD1779(0xf7); //Pwm Frc
LCD_DataWrite_SSD1779(0x28);
LCD_DataWrite_SSD1779(0x0e);
LCD_DataWrite_SSD1779(0x05);
LCD_Delay(10);
/* Display On */
LCD_CtrlWrite_SSD1779(LCD_DISPLAY_ON_SSD1779); // 0xAF
LCD_Delay(10);
LCD_CtrlWrite_SSD1779(LCD_INVERSE_DISPLAY_SSD1779);// 0xA7
/* Set N-line Inversion Register */
LCD_CtrlWrite_SSD1779(LCD_NLINE_INVERSION_CTRL_SSD1779); // 0xF2
LCD_DataWrite_SSD1779(0x07); //5);
LCD_DataWrite_SSD1779(0x52); //0x15);
// LCD_CtrlWrite_SSD1779(LCD_TEMP_COMPENSATION_CTRL_SSD1779); //0xf4
// LCD_DataWrite_SSD1779(0x08)
//LCD_DataWrite_SSD1779(0x00)
// LCD_DataWrite_SSD1779(0x58)
// LCD_DataWrite_SSD1779(0x03)
LCD_Delay(10);
// LCD_blockClear_SSD1779(0,4,LCD_WIDTH-1,LCD_HEIGHT-1+4,background);
LCD_Delay(10);
/* Display On */
LCD_CtrlWrite_SSD1779(LCD_DISPLAY_ON_SSD1779); // 0xAF
LCD_Delay(10);
/* Data Write Control */
LCD_CtrlWrite_SSD1779(LCD_WRITE_DATA_SSD1779); // 0x5C
LCD_Delay(10);
LCD_ClearAll_SSD1779(background);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -