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

📄 lcd.c.bak

📁 MTK平台LCD驱动
💻 BAK
📖 第 1 页 / 共 2 页
字号:
		#elif (defined(LCD_16BIT_MODE))
		#elif (defined(LCD_18BIT_MODE))
			SET_LCD_CMD_PARAMETER(0,LCD_CMD,((0x0044&0xFF00)<<2)|((0x0044&0xFF)<<1));
			SET_LCD_CMD_PARAMETER(1,LCD_DATA,((x2&0xFF)<<10)|((x1&0xFF)<<1));

			SET_LCD_CMD_PARAMETER(2,LCD_CMD,((0x0045&0xFF00)<<2)|((0x0045&0xFF)<<1));
			SET_LCD_CMD_PARAMETER(3,LCD_DATA,((y2&0xFF)<<10)|((y1&0xFF)<<1));

			SET_LCD_CMD_PARAMETER(4,LCD_CMD,((0x0021&0xFF00)<<2)|((0x0021&0xFF)<<1));
			SET_LCD_CMD_PARAMETER(5,LCD_DATA,((y1&0xFF)<<10)|((x1&0xFF)<<1));

			SET_LCD_CMD_PARAMETER(6,LCD_CMD,((0x0022&0xFF00)<<2)|((0x0022&0xFF)<<1));

			LCD_SEND_DMA_CMD(7);
		#endif
	#else
		LCD_CtrlWrite_HX8306A(0x0044);
		LCD_DataWrite_HX8306A((((x2&0xFF)<<8)|(x1&0xFF)));
		LCD_CtrlWrite_HX8306A(0x0045);
		LCD_DataWrite_HX8306A((((y2&0xFF)<<8)|(y1&0xFF)));
		LCD_CtrlWrite_HX8306A(0x0021);
		LCD_DataWrite_HX8306A((((y1&0xFF)<<8)|(x1&0xFF)));
		LCD_CtrlWrite_HX8306A(0x0022);
	#endif

	for(LCD_y=y1;LCD_y<=y2;LCD_y++)
	{
		for(LCD_x=x1;LCD_x<=x2;LCD_x++)
		{
		#if (defined(LCD_8BIT_MODE))
			*((volatile unsigned char *) LCD_HX8306A_DATA_ADDR)=(kal_uint8)((data&0xFF00)>>8);
			*((volatile unsigned char *) LCD_HX8306A_DATA_ADDR)=(kal_uint8)(data&0xFF);
		#elif (defined(LCD_16BIT_MODE))
			*((volatile unsigned short *) LCD_HX8306A_DATA_ADDR)=data;
		#elif (defined(LCD_18BIT_MODE))
			*((volatile unsigned int *) LCD_HX8306A_DATA_ADDR)=(r_color<<12)|(g_color<<6)|b_color;
//				*((volatile unsigned int *) LCD_HX8306A_DATA_ADDR)=(kal_uint16) data;
		#elif (defined(LCD_9BIT_MODE))
			*((volatile unsigned short *) LCD_HX8306A_DATA_ADDR)=(r_color<<6)|(g_color>>3);
			*((volatile unsigned short *) LCD_HX8306A_DATA_ADDR)=((g_color&0x07)<<6)|b_color;
		#endif
		}
	}
}

void LCD_ClearAll_HX8306A(kal_uint16 data)
{
   LCD_blockClear_HX8306A(0,0,LCD_WIDTH-1,LCD_HEIGHT-1,data);
}

void LCD_set_reg(kal_uint16 reg_index, kal_uint16 reg_data)
{
	LCD_CtrlWrite_HX8306A(reg_index);
	LCD_DataWrite_HX8306A(reg_data);
}

void LCD_Init_HX8306A(kal_uint32 bkground, void **buf_addr)
{
	volatile kal_uint32 i;
	kal_uint16 background = (kal_uint16)bkground;
	kal_uint16 read_data;


    lcd_check = 0;
   
   
	CLEAR_LCD_CTRL_RESET_PIN;
	LCD_Delay(0x1000);
	SET_LCD_CTRL_RESET_PIN;
	LCD_Delay(0x1000);

	LCD_set_reg(0x0000,0x0001);
	
	LCD_Delay(0x200);				/* delay 10ms */

	LCD_set_reg(0x0001,0x011B);
	LCD_set_reg(0x0002,0x0700);
	LCD_set_reg(0x0003,0x1230);
//	LCD_set_reg(0x0003,0x1030);

	LCD_set_reg(0x0004,0x0000);
	LCD_set_reg(0x0005,0x0000);
//	LCD_set_reg(0x0007,0x0003);
	LCD_set_reg(0x0007,0x0007);
	LCD_set_reg(0x0008,0x0202);
	LCD_set_reg(0x0009,0x0000);
	LCD_set_reg(0x000B,0x0000);
	LCD_set_reg(0x000C,0x0003);
	LCD_set_reg(0x0040,0x0000);
	LCD_set_reg(0x0041,0x00EF);
	LCD_set_reg(0x0042,0xDB00);
	LCD_set_reg(0x0043,0xDB00);
	LCD_set_reg(0x0044,0xAF00);
	LCD_set_reg(0x0045,0xDB00);

	LCD_set_reg(0x0010,0x0000);
	LCD_set_reg(0x0011,0x0000);
	LCD_set_reg(0x0012,0x0000);
	LCD_set_reg(0x0013,0x0000);
	LCD_set_reg(0x0013,0x1611);
	LCD_set_reg(0x0012,0x0003);
	
	LCD_Delay(0x800);
	LCD_set_reg(0x0010,0x4140);
	LCD_set_reg(0x0012,0x0013);
	
	LCD_Delay(0x800);
	LCD_set_reg(0x0010,0x4140);
	
	LCD_Delay(0x800);
	LCD_set_reg(0x0013,0x3611);
	
	LCD_Delay(0x800);

	LCD_set_reg(0x0030,0x0005);
	LCD_set_reg(0x0031,0x0607);
	LCD_set_reg(0x0032,0x0107);
	LCD_set_reg(0x0033,0x0506);
	LCD_set_reg(0x0034,0x0304);
	LCD_set_reg(0x0035,0x0003);
	LCD_set_reg(0x0036,0x0707);
	LCD_set_reg(0x0037,0x0402);
	LCD_set_reg(0x0038,0x0100);
	LCD_set_reg(0x0039,0x0400);

	LCD_set_reg(0x0007,0x0005);
	
	LCD_Delay(0x800);
	LCD_set_reg(0x0007,0x0025);
	LCD_set_reg(0x0007,0x0027);
	
	LCD_Delay(0x800);
	LCD_set_reg(0x0007,0x0037);
	
	LCD_Delay(0x800);

   //readreg_HX8306A(0x0039);	

	LCD_ClearAll_HX8306A(0xFFFF);

	lcd_power_ctrl_shadow1=0x4140;
	lcd_power_ctrl_shadow3=0x0013;
	lcd_power_ctrl_shadow4=0x3611;
	
	LCD_Delay(0x80000);
	/* turn on backlight */
//	*((volatile unsigned short *) 0x80120150) &= 0xF3FF;
//	*((volatile unsigned short *) 0x80120000) |= 0x20;
//	*((volatile unsigned short *) 0x801200C0) |= 0x20;
    lcd_check = 1;
    

}

void LCD_PWRON_HX8306A(kal_bool on)
{
}

void LCD_SetContrast_HX8306A(kal_uint8 level)
{
}

void LCD_ON_HX8306A(kal_bool on)
{
}

void LCD_BlockWrite_HX8306A(kal_uint16 startx,kal_uint16 starty,kal_uint16 endx,kal_uint16 endy)
{
   kal_uint16 roi_offset_x,roi_offset_y;
	kal_uint16 roi_width,roi_height;

	while (LCD_IS_RUNNING){};

//   ASSERT(lcd_assert_fail==KAL_FALSE);
   lcd_assert_fail = KAL_TRUE;
   
   
   
   roi_offset_x=GET_LCD_ROI_WINDOW_OFFSET_X;
	roi_offset_y=GET_LCD_ROI_WINDOW_OFFSET_Y;
	roi_width=GET_LCD_ROI_WINDOW_SIZE_X;
	roi_height=GET_LCD_ROI_WINDOW_SIZE_Y;

	roi_offset_x -= (startx&0x03);
	roi_width+= (startx&0x03);
	roi_width+= (3-(endx&0x03));
	SET_LCD_ROI_WINDOW_SIZE(roi_width,roi_height);
	SET_LCD_ROI_WINDOW_OFFSET(roi_offset_x,roi_offset_y);
	startx -=(startx&0x03);
	endx += (3-(endx&0x03));

	#ifdef LCD_CMD_DMA_MODE
		#if (defined(LCD_8BIT_MODE))
		#elif (defined(LCD_9BIT_MODE))
		#elif (defined(LCD_16BIT_MODE))
		#elif (defined(LCD_18BIT_MODE))

			SET_LCD_CMD_PARAMETER(0,LCD_CMD,((0x0044&0xFF00)<<2)|((0x0044&0xFF)<<1));
			SET_LCD_CMD_PARAMETER(1,LCD_DATA,((endx&0xFF)<<10)|((startx&0xFF)<<1));

			SET_LCD_CMD_PARAMETER(2,LCD_CMD,((0x0045&0xFF00)<<2)|((0x0045&0xFF)<<1));
			SET_LCD_CMD_PARAMETER(3,LCD_DATA,((endy&0xFF)<<10)|((starty&0xFF)<<1));

			SET_LCD_CMD_PARAMETER(4,LCD_CMD,((0x0021&0xFF00)<<2)|((0x0021&0xFF)<<1));
			SET_LCD_CMD_PARAMETER(5,LCD_DATA,((starty&0xFF)<<10)|((startx&0xFF)<<1));

			SET_LCD_CMD_PARAMETER(6,LCD_CMD,((0x0022&0xFF00)<<2)|((0x0022&0xFF)<<1));
		#endif
		ENABLE_LCD_TRANSFER_COMPLETE_INT;
		ENABLE_LCD_ROI_CTRL_CMD_FIRST;
		SET_LCD_ROI_CTRL_NUMBER_OF_CMD(7);
		START_LCD_TRANSFER;
	#else
		LCD_CtrlWrite_HX8306A(0x0044);
		LCD_DataWrite_HX8306A((((endx&0xFF)<<8)|(startx&0xFF)));
		LCD_CtrlWrite_HX8306A(0x0045);
		LCD_DataWrite_HX8306A((((endy&0xFF)<<8)|(starty&0xFF)));
		LCD_CtrlWrite_HX8306A(0x0021);
		LCD_DataWrite_HX8306A((((starty&0xFF)<<8)|(startx&0xFF)));
		LCD_CtrlWrite_HX8306A(0x0022);

		DISABLE_LCD_TRANSFER_COMPLETE_INT;
		DISABLE_LCD_ROI_CTRL_CMD_FIRST;
		START_LCD_TRANSFER;
	#endif /* MT6218B, MT6219 */

   lcd_assert_fail = KAL_FALSE;
}

void LCD_Size_HX8306A(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_HX8306A(lcd_func_type type)
{
   switch(type)
   {
      case lcd_Bais_func:
         return 1;
      case lcd_Contrast_func:
         return 1;
      case lcd_LineRate_func:
         return 4;
      case lcd_Temperature_Compensation_func:
         return 4;
      default:
         ASSERT(0);
         return 100;
   }
}

void LCD_SetBias_HX8306A(kal_uint8 *bias)
{
   volatile  kal_uint16 data_value = 0;
	   kal_uint16 data_addr = 0;
	
        lcd_power_up();
	      data_addr = *bias;
	      data_value = readreg_HX8306A(data_addr);	   
	      kal_prompt_trace(MOD_ENG,"ENG read %x as %x",data_addr,data_value);
	   lcd_power_down();

}

void LCD_Contrast_HX8306A(kal_uint8 *contrast)
{
}

void LCD_LineRate_HX8306A(kal_uint8 *linerate)
{
}

void LCD_Temp_Compensate_HX8306A(kal_uint8 *compensate)
{
}
kal_bool LCD_ESD_check_HX8306A(){
     volatile  kal_uint16 data_value = 0;
     volatile  kal_uint32 ram_data_value = 0;
	kal_uint16 data_addr = 0;
	kal_uint32 lcd_draw_data;
	kal_uint8 i,reg_start_idx, reg_end_idx;
	kal_uint16 x1,x2,y1,y2;
	kal_uint32 temp_r, temp_g, temp_b;
	
	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;
}


⌨️ 快捷键说明

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