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

📄 lcd.c

📁 mtk LCD驱动程序文件! 可以了解mtk的lcd驱动程序架构!
💻 C
📖 第 1 页 / 共 4 页
字号:
	if (lcd_reg_index > 2) {
        lcd_reg_index = 0;
	}
   
	while (LCD_IS_RUNNING);   

    if (lcd_reg_index == 0) {
      reg_start_idx = 0;
      reg_end_idx = 7;
   }else if (lcd_reg_index == 1) {
      reg_start_idx = 8;
      reg_end_idx = 14;
   }else{
      reg_start_idx = 15;
      reg_end_idx = N_lcd_reg - 1;
   }   

    for (i = reg_start_idx; i <= reg_end_idx; i++) {
        if (lcd_check == 1) {
            data_addr = lcd_check_reg.reg[i].addr;
            data_value = readreg_HX8306A(data_addr);	   
            kal_prompt_trace(MOD_ENG, "--read %x as %x", data_addr, data_value);
            if (data_value != lcd_check_reg.reg[i].para) {
                kal_prompt_trace(MOD_ENG, "ESD FAIL read %x as %x", data_addr, data_value);
                return KAL_FALSE;
            }
	    }
    }

    lcd_reg_index++;
    while (LCD_IS_RUNNING);
   
    return KAL_TRUE;
}

/*===================The above is LCD dependent==========*/
#if ( (defined(MT6205B)) || (defined(MT6218)) )
void LCD_memcpy(void *dst /*s1*/, const void *src /*s2*/, kal_uint16 size)
{
   #ifdef LCD_DMAENABLE
      kal_uint32 srcaddr=(kal_uint32)src;
      kal_uint32 dstaddr=(kal_uint32)dst;
      kal_uint16 size_MSB = (kal_uint16)(size >> 9);
      kal_uint16 size_LSB = (kal_uint16)(size & 0x01ff);

      ASSERT(lcd_assert_fail==KAL_FALSE);
      lcd_assert_fail = KAL_TRUE;
      ASSERT(DRV_Reg(LCD_REFR)==0x00);
      if(size_MSB)
      {
         DRV_WriteReg(LCD_MSBSRC,(kal_uint16)(srcaddr >> 16));
         DRV_WriteReg(LCD_LSBSRC,(kal_uint16)srcaddr);

         DRV_WriteReg(LCD_REFR,0x0000);
         DRV_WriteReg(LCD_MSBDST,(kal_uint16)(dstaddr >> 16));
         DRV_WriteReg(LCD_LSBDST,(kal_uint16)(dstaddr));

         DRV_WriteReg(LCD_CADDRSET,512);
         DRV_WriteReg(LCD_PADDRSET,size_MSB);
         DRV_WriteReg(LCD_CHOP,0);

         DRV_WriteReg(LCD_PCON,LCD_PCON_DINC);

         DRV_WriteReg(LCD_START,LCD_START_BIT);
         while(DRV_Reg(LCD_GSTA)&LCD_GSTA_PRUN);
         DRV_WriteReg(LCD_START,LCD_STOP_BIT);
      }

      if (size_LSB)
      {
         srcaddr = (srcaddr + size - size_LSB);
         dstaddr = (dstaddr + size - size_LSB);

         DRV_WriteReg(LCD_MSBSRC,(kal_uint16)(srcaddr >> 16));
         DRV_WriteReg(LCD_LSBSRC,(kal_uint16)srcaddr);

         DRV_WriteReg(LCD_REFR,0x0000);
         DRV_WriteReg(LCD_MSBDST,(kal_uint16)(dstaddr >> 16));
         DRV_WriteReg(LCD_LSBDST,(kal_uint16)(dstaddr));

         DRV_WriteReg(LCD_CADDRSET,size_LSB);
         DRV_WriteReg(LCD_PADDRSET,1);
         DRV_WriteReg(LCD_CHOP,0);

         DRV_WriteReg(LCD_PCON,LCD_PCON_DINC);

         DRV_WriteReg(LCD_START,LCD_START_BIT);
         while(DRV_Reg(LCD_GSTA)&LCD_GSTA_PRUN);
         DRV_WriteReg(LCD_START,LCD_STOP_BIT);
      }

      lcd_assert_fail = KAL_FALSE;
   #else /*!LCD_DMAENABLE*/
      kal_mem_cpy(dst,src,size);
   #endif   /*LCD_DMAENABLE*/
}
#else /*!(MT6205B,MT6218)*/
void LCD_memcpy(void *dst /*s1*/, const void *src /*s2*/, kal_uint16 size)
{
   kal_mem_cpy(dst,src,size);
}
#endif   /*(MT6205B,MT6218)*/

LCD_Funcs LCD_func_HX8306A = {
   LCD_Init_HX8306A,
   LCD_PWRON_HX8306A,
   LCD_SetContrast_HX8306A,
   LCD_ON_HX8306A,
   LCD_BlockWrite_HX8306A,
   LCD_Size_HX8306A,
   LCD_EnterSleep_HX8306A,
   LCD_ExitSleep_HX8306A,
   LCD_Partial_On_HX8306A,
   LCD_Partial_Off_HX8306A,
   LCD_Partial_line_HX8306A,
   /*Engineering mode*/
   LCD_GetParm_HX8306A,
   LCD_SetBias_HX8306A,
   LCD_Contrast_HX8306A,
   LCD_LineRate_HX8306A,
   LCD_Temp_Compensate_HX8306A
   #ifdef __LCD_ESD_RECOVERY__   
   ,LCD_ESD_check_HX8306A
   #endif 
};

void LCD_FunConfig(void)
{
    MainLCD = &LCD_func_HX8306A;
}
#else
void LCD_Delay(kal_uint16 time)
{
	volatile kal_uint32 delay;
	for (delay =0;delay <time*800;delay++) {} // 85us
}

void spi_ini(void)
{
	SET_LCD_SERIAL_CS0_POLARITY_LOW;
	SET_LCD_SERIAL_8_BIT_MODE;
	SET_LCD_SERIAL_DIVIDER(0);
	SET_LCD_SERIAL_CLOCK_26M;
	SET_LCD_SERIAL_GAMMA_TABLE(0);
	SET_LCD_SERIAL_CLOCK_PHASE_LOW;
	SET_LCD_SERIAL_CLOCK_POLARITY_HIGH;
	GPIO_ModeSetup(29, 1);
	GPIO_ModeSetup(30, 1);
	GPIO_ModeSetup(31, 1);
	GPIO_ModeSetup(32, 1);
	
}
void init_lcd_interface(void)
{
	kal_uint32 i;
	REG_LCD_ROI_CTRL=0;
	CLEAR_LCD_CTRL_RESET_PIN;
		for(i=0;i<62;i++)
			SET_GAMMA_TABLE(LCD_GAMMA_TABLE0, i, i);
		SET_GAMMA_TABLE(LCD_GAMMA_TABLE0, 62, 61);
		SET_GAMMA_TABLE(LCD_GAMMA_TABLE0, 63, 61);
	LCD_Delay(100);		

	SET_LCD_CTRL_RESET_PIN;
}	/* init_lcd_interface() */
void LCD_EnterSleep_HX8309A(void)
{
}

void LCD_ExitSleep_HX8309A(void)
{
}

void LCD_Partial_On_HX8309A(kal_uint16 start_page,kal_uint16 end_page)
{

}

void LCD_Partial_Off_HX8309A(void)
{

}

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

void LCD_Set_Y_Addr_HX8309A(kal_uint16 start_row, kal_uint16 end_row)
{

//tony
//vertical RAM address position
LCD_IndexWrite_HX8309A(0x0045);
LCD_DataWrite_HX8309A((kal_uint16)(((end_row&0x00FF)<<8)|(start_row&0x00FF)));


}

void LCD_Set_X_Addr_HX8309A(kal_uint16 start_column, kal_uint16 end_column)
{


//tony	
//horizontal RAM address position
LCD_IndexWrite_HX8309A(0x0044);
LCD_DataWrite_HX8309A((kal_uint16)(((end_column&0x00FF)<<8)|(start_column&0x00FF)));
	


}

void LCD_blockClear_HX8309A(kal_uint16 x1,kal_uint16 y1,kal_uint16 x2,kal_uint16 y2,kal_uint16 data)
{

   kal_uint16 LCD_x;
   kal_uint16 LCD_y;
   
 
   kal_uint16 l_startx=x1, l_starty=y1, l_endx=x2, l_endy=y2;
   volatile kal_uint16 delay;


   l_startx -= (l_startx&0x03);
	l_endx += (3-(l_endx&0x03));

		//cylin avoids camera preview, video play or video recorder screen display in disorder 20060207
          //tony esd 0123
          LCD_IndexWrite_HX8309A(0x0000);
          LCD_DataWrite_HX8309A(0x00ff);	 
          LCD_IndexWrite_HX8309A(0x0000);
          LCD_IndexWrite_HX8309A(0x0000);
          LCD_IndexWrite_HX8309A(0x0000);
          LCD_IndexWrite_HX8309A(0x0000);         
          //tony esd 0123			  
  
   LCD_Set_X_Addr_HX8309A(x1, x2);
   LCD_Set_Y_Addr_HX8309A(y1, y2);
   
   LCD_IndexWrite_HX8309A(0x0021);
   LCD_DataWrite_HX8309A((kal_uint16)(((l_starty)<<8)|(l_startx&0x00FF)));
   LCD_IndexWrite_HX8309A(0x0022);


   for(LCD_x=l_startx;LCD_x<=l_endx;LCD_x++)
   {
         for(LCD_y=y1;LCD_y<=y2;LCD_y++)
        {
			LCD_DataWrite_HX8309A(data);
        }
    }
}

void LCD_ClearAll_HX8309A(kal_uint16 data)
{
   LCD_blockClear_HX8309A(0,0,LCD_WIDTH-1,LCD_HEIGHT-1,data);
}

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

#if 0
	      	GPIO_InitIO(1, 29);
      		GPIO_ModeSetup(29, 0);
	      	GPIO_WriteIO(1, 29);
	      	GPIO_InitIO(1, 30);
      		GPIO_ModeSetup(30, 0);
	      	GPIO_WriteIO(1, 30);
	      	GPIO_InitIO(1, 31);
      		GPIO_ModeSetup(31, 0);
	      	GPIO_WriteIO(1, 31);
	      	GPIO_InitIO(1, 32);
      		GPIO_ModeSetup(32, 0);
	      	GPIO_WriteIO(1, 32);
	while(1)
		{
	      	GPIO_WriteIO(1, 29);
	      	GPIO_WriteIO(1, 30);
	      	GPIO_WriteIO(1, 31);
	      	GPIO_WriteIO(1, 32);
	kal_sleep_task(5);
	      	GPIO_WriteIO(0, 29);
	      	GPIO_WriteIO(0, 30);
	      	GPIO_WriteIO(0, 31);
	      	GPIO_WriteIO(0, 32);
	kal_sleep_task(5);
		}

#endif

          LCD_IndexWrite_HX8309A(0xfd);

          LCD_IndexWrite_HX8309A(0xfd);
          LCD_IndexWrite_HX8309A(0xfd);
          LCD_IndexWrite_HX8309A(0xfd);
   


	LCD_IndexWrite_HX8309A(0xef);

	LCD_IndexWrite_HX8309A(0x00);

	LCD_IndexWrite_HX8309A(0xee);

	LCD_IndexWrite_HX8309A(0x04);

	LCD_IndexWrite_HX8309A(0x1b);

	LCD_IndexWrite_HX8309A(0x04);

	LCD_IndexWrite_HX8309A(0xfe);

	LCD_IndexWrite_HX8309A(0xfe);

	LCD_IndexWrite_HX8309A(0xfe);

	LCD_IndexWrite_HX8309A(0xfe);

	LCD_IndexWrite_HX8309A(0xef);

	LCD_IndexWrite_HX8309A(0x90);

	LCD_IndexWrite_HX8309A(0x4a);

	LCD_IndexWrite_HX8309A(0x04);

	LCD_IndexWrite_HX8309A(0x7f);

	LCD_IndexWrite_HX8309A(0x3f);

	LCD_IndexWrite_HX8309A(0xee);

	LCD_IndexWrite_HX8309A(0x04);


	LCD_IndexWrite_HX8309A(0x43);

	LCD_IndexWrite_HX8309A(0x06);
	LCD_Delay(85);


	LCD_IndexWrite_HX8309A(0xef);

	LCD_IndexWrite_HX8309A(0x90);


	LCD_IndexWrite_HX8309A(0x09);

	LCD_IndexWrite_HX8309A(0x83);

	LCD_IndexWrite_HX8309A(0x08);

	LCD_IndexWrite_HX8309A(0x00);


	LCD_IndexWrite_HX8309A(0x0b);


	LCD_IndexWrite_HX8309A(0xaf);

	//gamma function
	LCD_IndexWrite_HX8309A(0x0a);

	LCD_IndexWrite_HX8309A(0x00);

	LCD_IndexWrite_HX8309A(0x05);

	LCD_IndexWrite_HX8309A(0x00);

	LCD_IndexWrite_HX8309A(0x06);

	LCD_IndexWrite_HX8309A(0x00);

	LCD_IndexWrite_HX8309A(0x07);

	LCD_IndexWrite_HX8309A(0x00);

	LCD_IndexWrite_HX8309A(0xef);


	LCD_IndexWrite_HX8309A(0x00);

	LCD_IndexWrite_HX8309A(0xee);

	LCD_IndexWrite_HX8309A(0x0c);


	LCD_IndexWrite_HX8309A(0xef);

	LCD_IndexWrite_HX8309A(0x90);

	LCD_IndexWrite_HX8309A(0x00);

	LCD_IndexWrite_HX8309A(0x80);

⌨️ 快捷键说明

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