⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcd.c

📁 MTK平台的多种LCD驱动
💻 C
📖 第 1 页 / 共 5 页
字号:
#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(2);
   	SET_LCD_PARALLEL_CE2WR_HOLD_TIME(2);
   	SET_LCD_PARALLEL_CE2RD_SETUP_TIME(0);
   	SET_LCD_PARALLEL_WRITE_WAIT_STATE(10);
   	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 */

/***********************S6B33B0A********************************/ 
/*Tienma, 65k Color LCD, Parallel Interface, Butterfly development board*/ 

void LCD_EnterSleep_S6B33B0A(void) 
{ 
       LCD_CtrlWrite_S6B33B0A(LCD_DISPLAY_OFF_S6B33B0A);
       LCD_CtrlWrite_S6B33B0A(LCD_STANDBY_MODE_ON_S6B33B0A);
} 

void LCD_ExitSleep_S6B33B0A(void) 
{ 
   kal_uint8 delay;
   LCD_CtrlWrite_S6B33B0A(LCD_STANDBY_MODE_OFF_S6B33B0A);
   LCD_CtrlWrite_S6B33B0A(LCD_OSC_MODE_SET_S6B33B0A);
   LCD_CtrlWrite_S6B33B0A(0x01);	/* internal clock mode, internal OSC on */
   for (delay =0;delay <50;delay++);
   LCD_CtrlWrite_S6B33B0A(LCD_DISPLAY_ON_S6B33B0A);
} 

void LCD_Partial_On_S6B33B0A(kal_uint16 start_page,kal_uint16 end_page) 
{ 
	LCD_CtrlWrite_S6B33B0A(LCD_PARTIAL_DISPLAY_START_LINE_S6B33B0A);
	LCD_CtrlWrite_S6B33B0A(start_page);
	LCD_CtrlWrite_S6B33B0A(LCD_PARTIAL_DISPLAY_END_LINE_S6B33B0A);
	LCD_CtrlWrite_S6B33B0A(end_page);
	LCD_CtrlWrite_S6B33B0A(LCD_PARTIAL_DISPLAY_MODE_SET_S6B33B0A);
	LCD_CtrlWrite_S6B33B0A(0x01);
} 

void LCD_Partial_Off_S6B33B0A(void) 
{
	LCD_CtrlWrite_S6B33B0A(LCD_PARTIAL_DISPLAY_MODE_SET_S6B33B0A); 
	LCD_CtrlWrite_S6B33B0A(0x00); 
}

kal_uint8 LCD_Partial_line_S6B33B0A(void)
{
	return 1;		/* partial display in 1 line alignment */
} 

void LCD_Set_Y_Addr_S6B33B0A(kal_uint16 start_row, kal_uint16 end_row) 
{ 

   LCD_CtrlWrite_S6B33B0A(LCD_X_ADDRESS_SET_S6B33B0A);
   LCD_CtrlWrite_S6B33B0A(start_row);
   LCD_CtrlWrite_S6B33B0A(end_row);
} 

void LCD_Set_X_Addr_S6B33B0A(kal_uint16 start_column, kal_uint16 end_column) 
{ 
   LCD_CtrlWrite_S6B33B0A(LCD_Y_ADDRESS_SET_S6B33B0A);
   LCD_CtrlWrite_S6B33B0A(start_column);
   LCD_CtrlWrite_S6B33B0A(end_column);
} 

void LCD_blockClear_S6B33B0A(kal_uint16 x1,kal_uint16 y1,kal_uint16 x2,kal_uint16 y2,kal_uint16 data) 
{ 
	kal_uint16 LCD_x;
	kal_uint16 LCD_y;
	volatile kal_uint16 delay;
	
	LCD_Set_Y_Addr_S6B33B0A(y1, y2);
	LCD_Set_X_Addr_S6B33B0A(x1, x2);
	
	for(LCD_x=x1;LCD_x<=x2;LCD_x++)
	{
	   for(LCD_y=y1;LCD_y<=y2;LCD_y++)
	   {
	   	LCD_RAMWrite_S6B33B0A(data);
	   }
	} 
}

void LCD_ClearAll_S6B33B0A(kal_uint16 data) 
{ 
   LCD_blockClear_S6B33B0A(0,0,LCD_WIDTH-1,LCD_HEIGHT-1,data); 
} 

void LCD_Init_S6B33B0A(kal_uint32 bkground, void **buf_addr) 
{ 
   kal_uint16 background = (kal_uint16)bkground; 
   kal_uint16 delay; 

#if (!(defined(MT6218B)||defined(MT6219)||defined(MT6218)|| defined(MT6217))) //20050413 yguangyong added 6217 option
   if(buf_addr)
       *buf_addr = &lcd_shadow_buffer[0][0];
#endif

#ifdef MT6208
   #ifdef MCU_13M
      *EMI_CON3 = 0xe003;  /*MT6208*/
   #endif   /*MCU_13M*/
   #ifdef MCU_26M
      *EMI_CON3 = 0xe104;  /*MT6208*/
   #endif   /*MCU_26M*/
   #ifdef MCU_39M
      *EMI_CON3 = 0xe205;  /*MT6208*/
   #endif   /*MCU_39M*/
   #ifdef MCU_52M
      *EMI_CON3 = 0xe306;  /*MT6208*/
   #endif   /*MCU_52M*/
#endif   /*MT6208*/

#ifdef MT6218
   #ifdef MCU_13M
      *EMI_COND0 = 0xe003;  /*MT6218*/
   #endif   /*MCU_13M*/
   #ifdef MCU_26M
      *EMI_COND0 = 0xe104;  /*MT6218*/
   #endif   /*MCU_26M*/
   #ifdef MCU_39M
      *EMI_COND0 = 0xe205;  /*MT6218*/
   #endif   /*MCU_39M*/
   #ifdef MCU_52M
      *EMI_COND0 = 0xe306;  /*MT6218*/
   #endif   /*MCU_52M*/
#endif   /*MT6218*/

#ifdef MT6205B
   #ifdef MCU_13M
      *EMI_CON3 = 0xc001;  /*MT6205B*/
   #endif   /*MCU_13M*/

   #ifdef MCU_26M

      *EMI_CON3 = 0xC203;   /* temporary use for driver development 8bit mode*/
   #endif   /*MCU_26M*/
#endif   /*MT6205B*/

#if ( (defined(MT6205)) || (defined(FPGA)) )
   *EMI_CON2 = 0xc003;  /*MT6205,FPGA*/
#endif   /*(MT6205,FPGA)*/

   /************ System Power On ***************************/ 
 	LCD_EnterSleep_S6B33B0A();
	
	LCD_CtrlWrite_S6B33B0A(LCD_STANDBY_MODE_OFF_S6B33B0A);
	while ((*(volatile unsigned char *) LCD_S6B33B0A_CTRL_ADDR) & 0x80);	/* wait until it is not busy */

	LCD_CtrlWrite_S6B33B0A(LCD_OSC_MODE_SET_S6B33B0A);
	LCD_CtrlWrite_S6B33B0A(0x01);	/* internal clock mode, internal OSC on */

	LCD_CtrlWrite_S6B33B0A(LCD_DRIVER_OUTPUT_MODE_SET_S6B33B0A);
    //LCD_CtrlWrite_S6B33B0A(0x00);	/* 1/128 duty, SDIR=0, SWP=0 */
	LCD_CtrlWrite_S6B33B0A(0x02);	/* 1/128 duty, SDIR=0, SWP=1 */
	//LCD_CtrlWrite_S6B33B0A(0x04);	/* 1/128 duty, SDIR=1, SWP=0 */
	//LCD_CtrlWrite_S6B33B0A(0x06);	/* 1/128 duty, SDIR=1, SWP=1 */
		
	LCD_CtrlWrite_S6B33B0A(LCD_DC2DC_AMP_SET_S6B33B0A);
	LCD_CtrlWrite_S6B33B0A(0x0F);	/* DCDC1 on, OP AMP on, DCDC2 on, DCDC3 on */
	//LCD_Delay(10);
	LCD_Delay(100);

	LCD_CtrlWrite_S6B33B0A(LCD_DC2DC_SELECT_S6B33B0A);
	LCD_CtrlWrite_S6B33B0A(0x05);	/* DC-DC x1.5 */
//	LCD_CtrlWrite_S6B33B0A(0x0A);	/* DC-DC x2.0 */
	
	LCD_CtrlWrite_S6B33B0A(LCD_BIAS_SET_S6B33B0A);
	LCD_CtrlWrite_S6B33B0A(0x11);	/* Bias 1/5 */
//	LCD_CtrlWrite_S6B33B0A(0x22);	/* Bias 1/4 */
	//LCD_CtrlWrite_S6B33B0A(0x33);	/* Bias 1/4 */
	
	LCD_CtrlWrite_S6B33B0A(LCD_CONTRAST_CTRL1_S6B33B0A);
	//LCD_CtrlWrite_S6B33B0A(0xA5);
	//LCD_CtrlWrite_S6B33B0A(0xC0);
	LCD_CtrlWrite_S6B33B0A(210);
	
   LCD_CtrlWrite_S6B33B0A(LCD_BIAS_SET_S6B33B0A);
   LCD_CtrlWrite_S6B33B0A(9);  /*BIAS*/

	//LCD_CtrlWrite_S6B33B0A(LCD_DC2DC_CLK_DIV_SET_S6B33B0A);
	//LCD_CtrlWrite_S6B33B0A(0x00);	/* fPCK = fOSC/4 */

	LCD_CtrlWrite_S6B33B0A(LCD_X_ADDRESS_SET_S6B33B0A);
   	LCD_CtrlWrite_S6B33B0A(0x00);
   	LCD_CtrlWrite_S6B33B0A(0x7F);
   	
   	LCD_CtrlWrite_S6B33B0A(LCD_Y_ADDRESS_SET_S6B33B0A);
   	LCD_CtrlWrite_S6B33B0A(0x00);
   	LCD_CtrlWrite_S6B33B0A(0x7F);
   	
   	LCD_CtrlWrite_S6B33B0A(LCD_NLINE_INVERSION_SET_S6B33B0A);
	LCD_CtrlWrite_S6B33B0A(0x1F);	/* FIM Off,  PIP: every 15 blocks */

	LCD_CtrlWrite_S6B33B0A(LCD_ADDRESS_MODE_SET_S6B33B0A);
	//LCD_CtrlWrite_S6B33B0A(0x00);	/* 64K color... */
	LCD_CtrlWrite_S6B33B0A(0x09);	/* 64K color,DSG=0,SGF=1,SGP=10,SGM=1 */
	
	LCD_CtrlWrite_S6B33B0A(LCD_ROW_VECTOR_MODE_SET_S6B33B0A);
	LCD_CtrlWrite_S6B33B0A(0x0F);	/* INC = 111 (Every subframe) , VEC = 0 (R1->R2->R3->R4 */

	//LCD_ClearAll_S6B33B0A(0xFFFF);
	LCD_ClearAll_S6B33B0A(background);
	LCD_CtrlWrite_S6B33B0A(LCD_DISPLAY_ON_S6B33B0A);

#ifdef LCD_DMAENABLE 
      DRV_WriteReg(LCD_REFR,0x0000); 
      DRV_WriteReg(LCD_PCON,0x0001); 
#endif /*LCD_DMAENABLE*/ 
#if (defined(FIREFLY_BB)||defined(FIREFLY_856_BB)||defined(BUTTERFLY_833_BB)||defined(BUTTERFLY_836_BB)) 
      //GPIO_WriteIO(1,0);   
      //GPIO_WriteIO(1,1); 
      //PWM_level(5);       /*LCD power supply*/ 
#endif 
} 

void LCD_PWRON_S6B33B0A(kal_bool on) 
{ 
   if(on) 
   { 
      LCD_ExitSleep_S6B33B0A(); 
   } 
   else 
   { 
      LCD_EnterSleep_S6B33B0A(); 
   } 
}

void LCD_SetContrast_S6B33B0A(kal_uint8 level) 
{ 
   LCD_CtrlWrite_S6B33B0A(LCD_CONTRAST_CTRL1_S6B33B0A); 
   LCD_CtrlWrite_S6B33B0A(level); 
} 

void LCD_SetNBlockInv_S6B33B0A(kal_uint8 level) 
{ 
       LCD_CtrlWrite_S6B33B0A(LCD_NLINE_INVERSION_SET_S6B33B0A); 
       LCD_CtrlWrite_S6B33B0A(level);        /* Forcing Inversion On, Foring Inversionperiod : 1 Frame */ 
                                                                /* Polarity Inversion period: every frame */ 
} 

void LCD_ON_S6B33B0A(kal_bool on) 
{ 
   if (on) 
   { 
      LCD_CtrlWrite_S6B33B0A(LCD_DISPLAY_ON_S6B33B0A); 
   } 
   else 
   { 
      LCD_CtrlWrite_S6B33B0A(LCD_DISPLAY_OFF_S6B33B0A); 
   } 
} 

void LCD_BlockWrite_S6B33B0A(kal_uint16 startx,kal_uint16 starty,kal_uint16 endx,kal_uint16 endy) 
{ 
   kal_uint16 l_startx=startx, l_starty=starty, l_endx=endx, l_endy=endy;

#if (defined(MT6218B)||defined(MT6219)|| defined(MT6217))   //20050413 yguangyong added 6217 option

    	#ifdef LCD_CMD_DMA_MODE
		SET_LCD_CMD_PARAMETER(0,LCD_CMD,LCD_Y_ADDRESS_SET_S6B33B0A);
		SET_LCD_CMD_PARAMETER(1,LCD_CMD,startx);
		SET_LCD_CMD_PARAMETER(2,LCD_CMD,endx);

		SET_LCD_CMD_PARAMETER(3,LCD_CMD,LCD_X_ADDRESS_SET_S6B33B0A);
		SET_LCD_CMD_PARAMETER(4,LCD_CMD,starty);
		SET_LCD_CMD_PARAMETER(5,LCD_CMD,endy);
		
		ENABLE_LCD_TRANSFER_COMPLETE_INT;
		SET_LCD_ROI_CTRL_NUMBER_OF_CMD(6);
		ENABLE_LCD_ROI_CTRL_CMD_FIRST; 
                while (LCD_IS_RUNNING) {}; 
                START_LCD_TRANSFER; 
	#else
		//LCD_Set_COLUMN_Addr_S6B33B0A(l_starty, l_endy);
		//LCD_Set_PAGE_Addr_S6B33B0A(l_startx, l_endx);
		LCD_Set_X_Addr_S6B33B0A(l_startx, l_endx);
		LCD_Set_Y_Addr_S6B33B0A(l_starty, l_endy);
		
		ENABLE_LCD_TRANSFER_COMPLETE_INT; 
                ENABLE_LCD_ROI_CTRL_CMD_FIRST; 
                while (LCD_IS_RUNNING) {}; 
                START_LCD_TRANSFER; 
	#endif
#endif	/* MT6218B, MT6219 */
} 

void LCD_Size_S6B33B0A(kal_uint16 *out_LCD_width,kal_uint16 *out_LCD_height) 
{ 
   *out_LCD_width = LCD_WIDTH; 
        *out_LCD_height = LCD_HEIGHT; 
}
/*Engineering mode*/ 
kal_uint8 LCD_GetParm_S6B33B0A(lcd_func_type type) 
{ 
   switch(type) 
   { 
      case lcd_Bais_func: 
         return 1; 
      case lcd_Contrast_func: 
         return 1; 
      case lcd_LineRate_func: 
         return 1; 
      case lcd_Temperature_Compensation_func: 
         return 1; 
      default: 
         ASSERT(0); 
         return 100; 
   } 
} 

void LCD_SetBias_S6B33B0A(kal_uint8 *bias)
{
   LCD_CtrlWrite_S6B33B0A(LCD_BIAS_SET_S6B33B0A);
   LCD_CtrlWrite_S6B33B0A(*bias);  /*BIAS*/
}

void LCD_Contrast_S6B33B0A(kal_uint8 *contrast)
{
   LCD_CtrlWrite_S6B33B0A(LCD_CONTRAST_CTRL1_S6B33B0A);
   LCD_CtrlWrite_S6B33B0A(*contrast);
}

void LCD_LineRate_S6B33B0A(kal_uint8 *linerate)
{
	LCD_CtrlWrite_S6B33B0A(LCD_NLINE_INVERSION_SET_S6B33B0A);
	LCD_CtrlWrite_S6B33B0A(*linerate);	/* Forcing Inversion On, Foring Inversionperiod : 1 Frame */	
}

void LCD_Temp_Compensate_S6B33B0A(kal_uint8 *compensate)
{
   LCD_CtrlWrite_S6B33B0A(LCD_TEMP_COMP_SET_S6B33B0A);
   LCD_CtrlWrite_S6B33B0A(*compensate);
}


LCD_Funcs LCD_func_S6B33B0A = {
   LCD_Init_S6B33B0A,
   LCD_PWRON_S6B33B0A,
   LCD_SetContrast_S6B33B0A,
   LCD_ON_S6B33B0A,
   LCD_BlockWrite_S6B33B0A,
   LCD_Size_S6B33B0A,
   LCD_EnterSleep_S6B33B0A,
   LCD_ExitSleep_S6B33B0A,
   0,
   0,
   0,
   /*Engineering mode*/
   LCD_GetParm_S6B33B0A,
   LCD_SetBias_S6B33B0A,
   LCD_Contrast_S6B33B0A,
   LCD_LineRate_S6B33B0A,
   LCD_Temp_Compensate_S6B33B0A
};

#endif  //#if (defined (__GD85_TCL_DRV_LCD_S6B33B0A_SAMSUNG__))


/* END TCL-xjinming modified for GD85 LCD_MAIN..... */









/* BEGIN 2005-07-07 TCL-xjinming added for GD85-2 LCD_MAIN..... */
/* WINTEK S1D15G27 OR TRULY S1D15G27******************************************/
/* 128x128(65K), Parallel i/o, COG Type   Epson chip  S1D15G27              */
/***************************************************************************/

#if (defined(__GD85_TCL_DRV_LCD_S1D15G27_WINTEK__) || defined(__GD85_TCL_DRV_LCD_S1D15G27_TRULY__))

#if (defined(MT6218B)||defined(MT6219)||defined(MT6217))
void init_lcd_interface(void)
{

	DRV_Reg(DRVPDN_CON1) &= (~DRVPDN_CON1_LCD);	/* Power on LCD */
	
	REG_LCD_ROI_CTRL=0;
	CLEAR_LCD_CTRL_RESET_PIN;
   #if (defined(MT6218B))
   
   #if defined(MBK_MB2X68B)				
   	SET_LCD_PARALLEL_CE2WR_SETUP_TIME(0);
   	SET_LCD_PARALLEL_CE2WR_HOLD_TIME(0);
   	SET_LCD_PARALLEL_CE2RD_SETUP_TIME(0);
   	SET_LCD_PARALLEL_WRITE_WAIT_STATE(10);
   	SET_LCD_PARALLEL_READ_LATENCY_TIME(14);
    SET_LCD_ROI_CTRL_CMD_LATENCY(8);
	#else  /* MBK_MB2X68B */
   	SET_LCD_PARALLEL_CE2WR_SETUP_TIME(0);
   	SET_LCD_PARALLEL_CE2WR_HOLD_TIME(0);
   	SET_LCD_PARALLEL_CE2RD_SETUP_TIME(0);
   	SET_LCD_PARALLEL_WRITE_WAIT_STATE(8);
   	SET_LCD_PARALLEL_READ_LATENCY_TIME(8);
   	SET_LCD_ROI_CTRL_CMD_LATENCY(4);
	#endif /* MBK_MB2X68B */

   		
   	
   	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))

//20050707 yguanyong added for 6217
#if defined(MBK_MB2X68B)				
   	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(10);//16//12
	SET_LCD_PARALLEL_READ_LATENCY_TIME(1

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -