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

📄 lcd_if.c

📁 8032底层驱动部分。因为可以移植 所以单独来拿出来
💻 C
📖 第 1 页 / 共 5 页
字号:
#endif
   return KAL_TRUE;
}  /* config_lcd_roi_window() */
/*************************************************************************
* FUNCTION
*  config_lcd_output
*
* DESCRIPTION
*  This function is to set LCD output or not
*
* CALLS
*
* PARAMETERS
*  output or not
*
* RETURNS
*  None
*
* GLOBALS AFFECTED
*   none
**************************************************************************/
void config_lcd_output(kal_bool lcd_output)
{
#if (defined(MT6228)||defined(MT6229)||defined(MT6230))
	if (lcd_output==KAL_TRUE)
		lcd_output_mode=KAL_TRUE;
	else if (lcd_output==KAL_FALSE)
		lcd_output_mode=KAL_FALSE;
	else
		ASSERT(0);
#endif
}
/*************************************************************************
* FUNCTION
*  set_lcd_color_palette
*
* DESCRIPTION
*     This function set the color palette of LCD interface.
*
* CALLS
*
* PARAMETERS
*	color_palette_select	: choose LCD color palette 0 or color palette 1
*	color_palette_addr_ptr : the address ptr that points to the color with offset
*									 (start_index) from the 0th color in color palette
*  start_index : the offset from the 0th color in color palette
*  number_of_color : number of colors in color palette will be set.
*
* RETURNS
*  return KAL_TRUE if configure successful
*
* GLOBALS AFFECTED
*   none
**************************************************************************/
void set_lcd_color_palette(kal_uint8 color_palette_select,kal_uint32 *color_palette_addr_ptr,
								   kal_uint8 start_index, kal_uint8 number_of_color)
{
#if (defined(MT6217)||defined(MT6218B)||defined(MT6219)||defined(MT6226)||defined(MT6226M)||defined(MT6227)||defined(MT6228)||defined(MT6229)||defined(MT6230))
	kal_uint16 i;

	lcd_power_up();
	#if (defined(MT6217)||defined(MT6218B)||defined(MT6219))
	if (color_palette_select==LCD_COLOR_PALETTE0)
	{
		for (i=start_index;i<(start_index+number_of_color);i++)
		{
			SET_LUT0_COLOR(i,*(color_palette_addr_ptr+i));
		}
	}
	else if (color_palette_select==LCD_COLOR_PALETTE1)
	{
		for (i=start_index;i<(start_index+number_of_color);i++)
		{
			SET_LUT1_COLOR(i,*(color_palette_addr_ptr+i));
		}
	}
	#elif (defined(MT6226)||defined(MT6226M)||defined(MT6227)||defined(MT6228)||defined(MT6229)||defined(MT6230))
	for (i=start_index;i<(start_index+number_of_color);i++)
	{
		SET_LUT0_COLOR(i,*(color_palette_addr_ptr+i));
	}
	#endif
	lcd_power_down();
#endif /* MT6218B, MT6219 */
}	/* set_lcd_color_palette() */

/*************************************************************************
* FUNCTION
*     lcd_system_init
*
* DESCRIPTION
*     This function is used to initialize the system correlated parameters of
*     LCD interface
*
* PARAMETERS
*     None
*
* RETURNS
*     None
*
* GLOBALS AFFECTED
*
*************************************************************************/
void lcd_system_init(void)
{
#if (defined(MT6217)||defined(MT6218B) || defined(MT6219)||defined(MT6226)||defined(MT6226M)||defined(MT6227)||defined(MT6228)||defined(MT6229)||defined(MT6230))
	kal_uint32 temp_reg;
#endif /* MT6218B, MT6219 */

   LCD_FunConfig();
	lcd_power_up();
#if (defined(MT6217)||defined(MT6218B) || defined(MT6219)||defined(MT6226)||defined(MT6226M)||defined(MT6227)||defined(MT6228)||defined(MT6229)||defined(MT6230))
  init_lcd_interface();
#endif /* MT6218B, MT6219 */

#ifndef __MAUI_BASIC__
	if (lcd_sleep_mode_handler==0xFF)
		lcd_sleep_mode_handler = L1SM_GetHandle();
#endif /* __MAUI_BASIC__ */

#if (defined(MT6217)||defined(MT6218B) || defined(MT6219)||defined(MT6226)||defined(MT6226M)||defined(MT6227)||defined(MT6228)||defined(MT6229)||defined(MT6230))
   if (lcd_event_id==NULL)
      lcd_event_id=kal_create_event_group("LCD_EVT");

	IRQ_Register_LISR(IRQ_LCD_CODE, lcd_LISR,"LCD ISR");

	IRQSensitivity(IRQ_LCD_CODE,LEVEL_SENSITIVE);
	if (INT_QueryExceptionStatus()!=KAL_TRUE)
		IRQUnmask(IRQ_LCD_CODE);
   temp_reg=DRV_Reg(LCD_INT_STATUS_REG);	/* remove LCD int status */

	DRV_Register_HISR(DRV_LCD_HISR_ID,lcd_HISR);
#endif	/* MT6217, MT6218B, MT6219 */
#if (defined(MT6217)||defined(MT6218B) || defined(MT6219)||defined(MT6226)||defined(MT6226M)||defined(MT6227)||defined(MT6228)||defined(MT6229)||defined(MT6230))
	wait_lcd_update_flag=KAL_FALSE;
	lcd_block_cb=NULL;
#endif
#if ((defined(MT6228)||defined(MT6229))&& (!defined(__MAUI_BASIC__))&& (!defined(__L1_STANDALONE__)))
	tv_output_owner=TV_OUT_OWNER_MMI;
#endif
	lcd_power_down();
}  /* lcd_system_init() */

/*************************************************************************
* FUNCTION
*     lcd_init
*
* DESCRIPTION
*     This function is used to initialize the LCD interface and LCD module
*
* PARAMETERS
*     lcd_id   : selection MAIN_LCD or SUB_LCD
*     background_color  :  RGB565 color that LCM will display after initial
*
* RETURNS
*     None
*
* GLOBALS AFFECTED
*
*************************************************************************/
void lcd_init(kal_uint8 lcd_id, kal_uint16 background_color)
{
#if (defined(MT6217)||defined(MT6218B)||defined(MT6219)||defined(MT6226)||defined(MT6226M)||defined(MT6227)||defined(MT6228)||defined(MT6229)||defined(MT6230))
	kal_uint8 i;
#endif	/* MT6218B, MT6219 */

#ifndef DUAL_LCD
   if (main_lcd_operation_state==LCD_IDLE_STATE)
      lcd_system_init();
#else
   if ((main_lcd_operation_state==LCD_IDLE_STATE)&&(sub_lcd_operation_state==LCD_IDLE_STATE))
      lcd_system_init();
#endif

#if (defined(MT6217)||defined(MT6218B)||defined(MT6219)||defined(MT6226)||defined(MT6226M)||defined(MT6227)||defined(MT6228)||defined(MT6229)||defined(MT6230))
	for (i=0;i<LCD_TOTAL_LAYER;i++)
		lcd_layer_data[i].layer_update_queue=KAL_FALSE;

	#if (defined(CAMERA_MODULE))
   /* for AIT102N module, since the LCD interface is use the same bus with AIT102N
      camera module. we should set the reset pin high and power pin low to disable AIT102N
      brfore LCD interface init */
	cam_module_func_config();
	ext_cam_func->cam_module_power_off();
	#endif /* CAMERA_MODULE */

	main_lcd_fb_update_para.block_mode_flag=KAL_TRUE;
	main_lcd_fb_update_para.lcd_block_mode_cb=NULL;
	#ifdef DUAL_LCD
	sub_lcd_fb_update_para.block_mode_flag=KAL_TRUE;
	sub_lcd_fb_update_para.lcd_block_mode_cb=NULL;
	#endif
	lcd_power_up();
	#if (defined(MT6226)||defined(MT6226M)||defined(MT6227))
	main_lcd_fb_update_para.memory_output=KAL_FALSE;
		#ifdef DUAL_LCD
	sub_lcd_fb_update_para.memory_output=KAL_FALSE;
		#endif
	SET_LCD_ROI_WMEM_OFFSET(0,0);
	#elif (defined(MT6228)||defined(MT6229)||defined(MT6230))
	main_lcd_fb_update_para.memory_output=KAL_FALSE;
	main_lcd_fb_update_para.tv_output=KAL_FALSE;
		#ifdef DUAL_LCD
	sub_lcd_fb_update_para.memory_output=KAL_FALSE;
	sub_lcd_fb_update_para.tv_output=KAL_FALSE;
		#endif
	SET_LCD_ROI_WMEM_OFFSET(0,0);
	#endif
	#if (defined(MT6226)||defined(MT6226M)||defined(MT6227)||defined(MT6229)||defined(MT6230))
	SET_LCD_CMD_QUEUE1;
	#endif
	DISABLE_LCD_ROI_CTRL_W2MEM;
   switch (lcd_id)
   {
      case MAIN_LCD:
         main_lcd_operation_state=LCD_INITIAL_STATE;
         DRV_WriteReg32(LCD_ROI_CMD_ADDR_REG,MAIN_LCD_CMD_ADDR);
         DRV_WriteReg32(LCD_ROI_DATA_ADDR_REG,MAIN_LCD_DATA_ADDR);
         SET_LCD_ROI_CTRL_OUTPUT_FORMAT(MAIN_LCD_OUTPUT_FORMAT);
         MainLCD->Init(background_color,0);
         main_lcd_operation_state=LCD_STANDBY_STATE;
      break;
#ifdef DUAL_LCD
      case SUB_LCD:
         sub_lcd_operation_state=LCD_INITIAL_STATE;
         DRV_WriteReg32(LCD_ROI_CMD_ADDR_REG,SUB_LCD_CMD_ADDR);
         DRV_WriteReg32(LCD_ROI_DATA_ADDR_REG,SUB_LCD_DATA_ADDR);
         SET_LCD_ROI_CTRL_OUTPUT_FORMAT(SUB_LCD_OUTPUT_FORMAT);
         SubLCD->Init(background_color,0);
         sub_lcd_operation_state=LCD_STANDBY_STATE;
      break;
#endif   /* DUAL_LCD */
      default:
         ASSERT(0);
      break;
   }
   lcd_power_down();
#elif (defined(MT6205B)||defined(MT6208))
	lcd_power_up();
   switch (lcd_id)
   {
      case MAIN_LCD:
         main_lcd_operation_state=LCD_INITIAL_STATE;
         MainLCD->Init(background_color,0);
         main_lcd_operation_state=LCD_STANDBY_STATE;
      break;
#ifdef DUAL_LCD
      case SUB_LCD:
         sub_lcd_operation_state=LCD_INITIAL_STATE;
         SubLCD->Init(background_color,0);
         sub_lcd_operation_state=LCD_STANDBY_STATE;
      break;
#endif   /* DUAL_LCD */
      default:
         ASSERT(0);
      break;
   }
#endif	/* MT6218B, MT6219 */
}  /* lcd_init() */
/*************************************************************************
* FUNCTION
*     save_lcd_register
*
* DESCRIPTION
*     This function is to save ROI configuration and command parameter
*
* PARAMETERS
*     None
*
* RETURNS
*     None
*
* GLOBALS AFFECTED
*
*************************************************************************/
void save_lcd_register()
{
#if (defined(MT6228)||defined(MT6229)||defined(MT6230))
	kal_uint8 i;

	lcd_hw_trigger_reg = REG_LCD_ROI_HW_CTRL;
	lcd_roi_size_reg=REG_LCD_ROI_SIZE;
	lcd_ctrl_reg=REG_LCD_ROI_CTRL;
	for (i=0;i<LCD_CMD_QUEUE_LENGTH;i++)
		lcd_cmq_para[i]=DRV_Reg32(LCD_CMD_PARAMETER_ADDR+(i<<2));
#endif
}	/* save_lcd_register() */
/*************************************************************************
* FUNCTION
*     restore_lcd_register
*
* DESCRIPTION
*     This function is to restore ROI configuration and command parameter
*
* PARAMETERS
*     None
*
* RETURNS
*     None
*
* GLOBALS AFFECTED
*
*************************************************************************/
void restore_lcd_register()
{
#if (defined(MT6228)||defined(MT6229)||defined(MT6230))
	kal_uint8 i;

	REG_LCD_ROI_HW_CTRL=lcd_hw_trigger_reg;
	REG_LCD_ROI_SIZE=lcd_roi_size_reg;
	REG_LCD_ROI_CTRL=lcd_ctrl_reg;
	for (i=0;i<LCD_CMD_QUEUE_LENGTH;i++)
		DRV_WriteReg32(LCD_CMD_PARAMETER_ADDR+(i<<2),lcd_cmq_para[i]);
	START_LCD_TRANSFER;
#endif
}	/* restore_lcd_register() */

/*************************************************************************
* FUNCTION
*     lcd_sleep_in
*
* DESCRIPTION
*     This function is used to let LCD module enter sleep mode
*
* PARAMETERS
*     lcd_id   : selection MAIN_LCD or SUB_LCD
*
* RETURNS
*     None
*
* GLOBALS AFFECTED
*
*************************************************************************/
void lcd_sleep_in(kal_uint8 lcd_id)
{
	kal_uint32 save_irq_mask;

	lcd_power_up();
   switch (lcd_id)
   {
      case MAIN_LCD:
#if (defined(MT6217)||defined(MT6218B)||defined(MT6219)||defined(MT6226)||defined(MT6226M)||defined(MT6227)||defined(MT6228)||defined(MT6229)||defined(MT6230))
         DRV_WriteReg32(LCD_ROI_CMD_ADDR_REG,MAIN_LCD_CMD_ADDR);
         DRV_WriteReg32(LCD_ROI_DATA_ADDR_REG,MAIN_LCD_DATA_ADDR);
#endif /* MT6218B, MT6219 */
		#if (defined(MT6228)||defined(MT6229)||defined(MT6230))
			if((main_lcd_operation_state==LCD_DC_UPDATE_STATE)||
			   (main_lcd_operation_state==LCD_HW_UPDATE_STATE))
			{
   			save_irq_mask=SaveAndSetIRQMask();
				lcd_sleeping_state=KAL_TRUE;
   			RestoreIRQMask(save_irq_mask);
				while (IMGDMA_IBW2_IS_BUSY) {};
				
				IRQMask(IRQ_LCD_CODE);
				save_lcd_register();
				REG_LCD_ROI_HW_CTRL = 0;
         	MainLCD->SleepIn();
         	restore_lcd_register();
         	ENABLE_LCD_TRANSFER_COMPLETE_INT;
         	LCD_WRITE_MEM_ONLY;
         	DISABLE_LCD_ROI_CTRL_CMD_FIRST;
         	lcd_hw_trigger_roi_ctrl &= ~LCD_ROI_CTRL_CMD_ENABLE_BIT;         	
         	IRQUnmask(IRQ_LCD_CODE);
         	save_irq_mask=SaveAndSetIRQMask();
   		#if ((!defined(__MAUI_BASIC__))&& (!defined(__L1_STANDALONE__)))
				if (tv_output_owner == TV_OUT_OWNER_LCD)
			#endif				
				lcd_sleeping_state=KAL_FALSE;
   			RestoreIRQMask(save_irq_mask);
   			if (main_lcd_operation_state==LCD_HW_UPDATE_STATE)
   			{
				   main_lcd_operation_state=LCD_HW_UPDATE_SLEEP_STATE;/*xxx*/
				   main_lcd_hw_trigger_output_mode=KAL_FALSE;/*xxx*/
				}
				else if (main_lcd_operation_state==LCD_DC_UPDATE_STATE)
				   main_lcd_operation_state=LCD_DC_UPDATE_SLEEP_STATE;
   			
			}
			else if ((main_lcd_operation_state==LCD_DC_CMD_QUEUE_STATE)||
						(main_lcd_operation_state==LCD_HW_CMD_QUEUE_STATE))
			{
				ASSERT(0);
			}
			else
			{
	         MainLCD->SleepIn();
	         main_lcd_operation_state=LCD_SLEEP_STATE;
         }
      #else
         MainLCD->SleepIn();      
      	main_lcd_operation_state=LCD_SLEEP_STATE;
      #endif
      break;
#ifdef DUAL_LCD
      case SUB_LCD:
	#if (defined(MT6217)||defined(MT6218B)||defined(MT6219)||defined(MT6226)||defined(MT6226M)||defined(MT6227)||defined(MT6228)||defined(MT6229)||defined(MT6230))
         DRV_WriteReg32(LCD_ROI_CMD_ADDR_REG,SUB_LCD_CMD_ADDR);
         DRV_WriteReg32(LCD_ROI_DATA_ADDR_REG,SUB_LCD_DATA_ADDR);
	#endif /* MT6218B, MT6219 */
		#if (defined(MT6228)||defined(MT6229)||defined(MT6230))		
			if((sub_lcd_operation_state==LCD_DC_UPDATE_STATE)||
			   (sub_lcd_operation_state==LCD_HW_UPDATE_STATE))
			{
   			save_irq_mask=SaveAndSetIRQMask();
				lcd_sleeping_state=KAL_TRUE;
   			RestoreIRQMask(save_irq_mask);
				while (IMGDMA_IBW2_IS_BUSY) {};				
				save_lcd_register();
				REG_LCD_ROI_HW_CTRL = 0;
         	SubLCD->SleepIn();
         	restore_lcd_register();
         	LCD_WRITE_MEM_ONLY;
         	DISABLE_LCD_ROI_CTRL_CMD_FIRST;
         	lcd_hw_trigger_roi_ctrl &= ~LCD_ROI_CTRL_CMD_ENABLE_BIT;
         	ENABLE_LCD_TRANSFER_COMPLETE_INT;				
   			save_irq_mask=SaveAndSetIRQMask();
   		#if ((!defined(__MAUI_BASIC__))&& (!defined(__L1_STANDALONE__)))
				if (tv_output_owner == TV_OUT_OWNER_LCD)
			#endif
					lcd_sleeping_state=KAL_FALSE;
   			RestoreIRQMask(save_irq_mask);
   			
   			if (sub_lcd_operation_state==LCD_HW_UPDATE_STATE)
   			{
				   sub_lcd_operation_state=LCD_HW_UPDATE_SLEEP_STATE;/*xxx*/
				   main_lcd_hw_trigger_output_mode=KAL_FALSE;/*xxx*/
				}
				else if (sub_lcd_operation_state==LCD_DC_UPDATE_STATE)
				   sub_lcd_operation_state=LCD_DC_UPDATE_SLEEP_STATE;   			   			
			}
			else if ((sub_lcd_operation_state==LCD_DC_CMD_QUEUE_STATE)||
						(sub_lcd_operation_state==LCD_HW_CMD_QUEUE_STATE))
			{
				ASSERT(0);
			}
			else
			{
	         SubLCD->SleepIn();
	         sub_lcd_operation_state=LCD_SLEEP_STATE;
         }
      #else
         SubLCD->SleepIn();
         sub_lcd_operation_state=LCD_SLEEP_STATE;

⌨️ 快捷键说明

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