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

📄 lcd_update_if.c

📁 8032底层驱动部分。因为可以移植 所以单独来拿出来
💻 C
📖 第 1 页 / 共 5 页
字号:
/*****************************************************************************
*  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) 2003
*
*****************************************************************************/

/*****************************************************************************
 *
 * Filename:
 * ---------
 *   lcd_update_if.c
 *
 * Project:
 * --------
 *   Maui
 *
 * Description:
 * ------------
 *   Lcd update interface
 *
 * 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!!
 *============================================================================
 ****************************************************************************/
#include "kal_release.h"
#include "stack_common.h"
#include "stack_msgs.h"
#include "app_ltlcom.h"       /* Task message communiction */
#include "syscomp_config.h"
#include "task_config.h"
#include "stacklib.h"
#include "stack_timer.h"      /*stack_timer_struct....definitions*/
#include "drv_comm.h"
#include "reg_base.h"
#include "gpt_sw.h"
#include "intrCtrl.h"
#include "gpio_sw.h"
#include "lcd_sw_inc.h"
#include "lcd_hw.h"
#include "lcd_sw.h"
#include "lcd_if.h"
#include "visual_comm.h"
#include "drv_hisr.h"
#if (defined(CAMERA_MODULE))
#include "ext_camera.h"
#endif /* CAMERA_MODULE */
#if (defined(MT6219)||defined(MT6226)||defined(MT6226M)||defined(MT6227)||defined(MT6228)||defined(MT6229)||defined(MT6230))
	#include "visual_comm.h"
	#include "img_comm.h"
	#include "imgproc.h"
	#include "imgdma.h"
	#if (defined(ISP_SUPPORT))
		#include "isp_if.h"
	#endif
	#if (defined(MT6228)||defined(MT6229))
		#include "tv_out.h"
		#include "2d_engine.h"
	#endif
#endif
extern kal_bool lcd_assert_fail;
   
#if (defined(MT6228)||defined(MT6229)||defined(MT6230))
   extern g2d_buffer_struct g2d_tv_output_dest_buff;
   extern g2d_buffer_struct g2d_tv_output_src_buff;
   extern g2d_bitblt_struct g2d_tv_output_bitblt;
   extern kal_uint8 current_g2d_tv_output_bitblt_buffer;
#endif   
extern kal_eventgrpid lcd_event_id;
extern lcd_layer_struct lcd_layer_data[LCD_TOTAL_LAYER];	
#ifdef __MTK_TARGET__
extern int INT_QueryExceptionStatus(void);
#endif
/*************************************************************************
* FUNCTION
*     lcd_fb_update
*
* DESCRIPTION
*     This function trigger LCD interface to update the display RAM of LCM in
*     specified area
*
* PARAMETERS
*   *lcd_para : the parameters for lcd frame buffer update
*
* RETURNS
*     none
*
* GLOBALS AFFECTED
*
*************************************************************************/
void lcd_fb_update(lcd_frame_update_struct *lcd_para)
{
#if (defined(MT6217)||defined(MT6218B)||defined(MT6219)||defined(MT6226)||defined(MT6226M)||defined(MT6227)||defined(MT6228)||defined(MT6229)||defined(MT6230))
	kal_uint8 lcd_update_layer;
	kal_uint16 temp_reg;
   kal_uint32 event_group;
	volatile kal_uint16 j;
	kal_uint16 roi_mem_out_width,roi_mem_out_height;
	kal_uint32 save_irq_mask;
	#if (defined(MT6219)||defined(MT6226)||defined(MT6226M)||defined(MT6227)||defined(MT6228)||defined(MT6229)||defined(MT6230))
	kal_uint8 i;
   kal_uint16 roi_width,roi_height;
	#endif
   #ifdef __MTK_TARGET__
   if(INT_QueryExceptionStatus())
      return;   
   #endif   
	if (lcd_para->module_id!=LCD_UPDATE_MODULE_MMI)
	{
		lcd_para->block_mode_flag=KAL_TRUE;
		lcd_para->lcd_block_mode_cb=NULL;
	}
	else
	{
		if (lcd_para->block_mode_flag==KAL_FALSE)
		{
			if (lcd_para->lcd_block_mode_cb==NULL)
				ASSERT(0);
		}
	}

	if ((lcd_para->roi_offset_x>=1024)||(lcd_para->roi_offset_y>=1024))
		ASSERT(0);

#if (defined(MT6226)||defined(MT6226M)||defined(MT6227)||defined(MT6228)||defined(MT6229)||defined(MT6230))
	if (lcd_para->module_id==LCD_UPDATE_MODULE_MMI)
	{
	#if (defined(MT6228)||defined(MT6229))
		if (lcd_para->tv_output!=KAL_FALSE)
			ASSERT(0);
	#endif
		if ((lcd_para->memory_output!=KAL_TRUE) && (lcd_para->memory_output!=KAL_FALSE))
			ASSERT(0);
	}
	else
	{
		lcd_para->memory_output=KAL_FALSE;		

	#if (defined(MT6228)||defined(MT6229))
		if ((lcd_para->tv_output!=KAL_TRUE) && (lcd_para->tv_output!=KAL_FALSE))
			ASSERT(0);
	#endif
	}
#endif

	if (wait_lcd_update_flag==KAL_TRUE)
	{
		while (LCD_IS_RUNNING) {};
		IRQMask(IRQ_LCD_CODE);
		if (wait_lcd_update_flag==KAL_TRUE)
		{
			wait_lcd_update_flag=KAL_FALSE;
   	if (main_lcd_operation_state==LCD_SW_UPDATE_STATE)
   		main_lcd_operation_state=LCD_STANDBY_STATE;
   #ifdef DUAL_LCD
   	if (sub_lcd_operation_state==LCD_SW_UPDATE_STATE)
   		sub_lcd_operation_state=LCD_STANDBY_STATE;
   #endif
	   	config_lcd_layer_window_queue();
	   	if (lcd_block_cb!=NULL)
	   		lcd_block_cb();
		}
		IRQUnmask(IRQ_LCD_CODE);
	};	/* wait until LCD complete */

	lcd_update_internal_ram=KAL_TRUE;

	lcd_update_layer=lcd_para->update_layer;
	lcd_update_layer &= ~lcd_para->hw_update_layer;

	if (lcd_para->update_layer & LCD_LAYER0_ENABLE)
	{
		if (!(REG_LCD_LAYER0_BUFF_ADDR & 0x40000000))
			lcd_update_internal_ram=KAL_FALSE;
	}
	if (lcd_para->update_layer & LCD_LAYER1_ENABLE)
	{
		if (!(REG_LCD_LAYER1_BUFF_ADDR & 0x40000000))
			lcd_update_internal_ram=KAL_FALSE;
	}
	if (lcd_para->update_layer & LCD_LAYER2_ENABLE)
	{
		if (!(REG_LCD_LAYER2_BUFF_ADDR & 0x40000000))
			lcd_update_internal_ram=KAL_FALSE;
	}
	if (lcd_para->update_layer & LCD_LAYER3_ENABLE)
	{
		if (!(REG_LCD_LAYER3_BUFF_ADDR & 0x40000000))
			lcd_update_internal_ram=KAL_FALSE;
	}
	#if (defined(MT6228)||defined(MT6229)||defined(MT6230))
	if (lcd_para->update_layer & LCD_LAYER4_ENABLE)
	{
		if (!(REG_LCD_LAYER4_BUFF_ADDR & 0x40000000))
			lcd_update_internal_ram=KAL_FALSE;
	}
	if (lcd_para->update_layer & LCD_LAYER5_ENABLE)
	{
		if (!(REG_LCD_LAYER5_BUFF_ADDR & 0x40000000)) 
			lcd_update_internal_ram=KAL_FALSE;
	}
	#endif
#endif


	if (lcd_para->lcd_id==MAIN_LCD)
	{
		if ((lcd_para->lcm_start_x>=LCD_WIDTH) || (lcd_para->lcm_end_x>=LCD_WIDTH)||
   	    (lcd_para->lcm_start_y>=LCD_HEIGHT) || (lcd_para->lcm_end_y>=LCD_HEIGHT))
      	 ASSERT(0);
	}
#if (defined(DUAL_LCD))	
	else
	{
		if ((lcd_para->lcm_start_x>=SUBLCD_WIDTH) || (lcd_para->lcm_end_x>=SUBLCD_WIDTH)||
   	    (lcd_para->lcm_start_y>=SUBLCD_HEIGHT) || (lcd_para->lcm_end_y>=SUBLCD_HEIGHT))
      	 ASSERT(0);
	}
#endif

#if (defined(MT6217)||defined(MT6218B))
	if (lcd_para->module_id==LCD_UPDATE_MODULE_MMI)
	{
	   save_irq_mask=SaveAndSetIRQMask();
#ifndef DUAL_LCD
		if ((main_lcd_operation_state==LCD_JPEG_VIDEO_UPDATE_STATE)||
			 (main_lcd_operation_state==LCD_JPEG_VIDEO_CMD_QUEUE_STATE))
#else
		if ((main_lcd_operation_state==LCD_JPEG_VIDEO_UPDATE_STATE)||
			 (main_lcd_operation_state==LCD_JPEG_VIDEO_CMD_QUEUE_STATE)||
			 (sub_lcd_operation_state==LCD_JPEG_VIDEO_UPDATE_STATE)||
			 (sub_lcd_operation_state==LCD_JPEG_VIDEO_CMD_QUEUE_STATE))
#endif	/* DUAL_LCD */
		{			
			if (jpeg_video_play_lcd_id==MAIN_LCD)
			{
				if (lcd_para->lcd_id==SUB_LCD)
					ASSERT(0);
	  			//save_irq_mask=SaveAndSetIRQMask();
	  			main_lcd_fb_update_para.lcd_id=MAIN_LCD;
				main_lcd_fb_update_para.module_id=lcd_para->module_id;
				main_lcd_fb_update_para.fb_update_mode=lcd_para->fb_update_mode;
				main_lcd_fb_update_para.lcm_start_x=lcd_para->lcm_start_x;
				main_lcd_fb_update_para.lcm_start_y=lcd_para->lcm_start_y;
				main_lcd_fb_update_para.lcm_end_x=lcd_para->lcm_end_x;
				main_lcd_fb_update_para.lcm_end_y=lcd_para->lcm_end_y;
				main_lcd_fb_update_para.roi_offset_x=lcd_para->roi_offset_x;
				main_lcd_fb_update_para.roi_offset_y=lcd_para->roi_offset_y;
				main_lcd_fb_update_para.update_layer=lcd_para->update_layer;
				main_lcd_operation_state=LCD_JPEG_VIDEO_CMD_QUEUE_STATE;
  				RestoreIRQMask(save_irq_mask);
			}
	#ifdef DUAL_LCD
			else if (jpeg_video_play_lcd_id==SUB_LCD)
			{
				if (lcd_para->lcd_id==MAIN_LCD)
				ASSERT(0);
	  			//save_irq_mask=SaveAndSetIRQMask();
	  			sub_lcd_fb_update_para.lcd_id=SUB_LCD;
				sub_lcd_fb_update_para.module_id=lcd_para->module_id;
				sub_lcd_fb_update_para.fb_update_mode=lcd_para->fb_update_mode;
				sub_lcd_fb_update_para.lcm_start_x=lcd_para->lcm_start_x;
				sub_lcd_fb_update_para.lcm_start_y=lcd_para->lcm_start_y;
				sub_lcd_fb_update_para.lcm_end_x=lcd_para->lcm_end_x;
				sub_lcd_fb_update_para.lcm_end_y=lcd_para->lcm_end_y;
				sub_lcd_fb_update_para.roi_offset_x=lcd_para->roi_offset_x;
				sub_lcd_fb_update_para.roi_offset_y=lcd_para->roi_offset_y;
				sub_lcd_fb_update_para.update_layer=lcd_para->update_layer;
				sub_lcd_operation_state=LCD_JPEG_VIDEO_CMD_QUEUE_STATE;
  				RestoreIRQMask(save_irq_mask);
			}
	#endif	/* DUAL_LCD */
	      else
	         RestoreIRQMask(save_irq_mask);
	      
	      kal_set_eg_events(lcd_event_id,0,KAL_AND);	      
		   kal_retrieve_eg_events(lcd_event_id,LCD_CMD_COMPLETE_EVENT,KAL_OR_CONSUME,
      		                    &event_group,KAL_SUSPEND);
			return;
		}
		else
		   RestoreIRQMask(save_irq_mask);
	}

#if (defined(CAMERA_MODULE))
	if (lcd_para->module_id==LCD_UPDATE_MODULE_MMI)
	{
#ifdef CAMERA_MODULE_WITH_LCD
	  	save_irq_mask=SaveAndSetIRQMask();
		if (main_lcd_operation_state==LCD_CAMERA_ACTIVE_STATE)
		{
  			RestoreIRQMask(save_irq_mask);
			ext_camera_update_backend_lcd_buffer(lcd_para);
			return;
		}
		else
		{
  			RestoreIRQMask(save_irq_mask);
		}
#endif
		kal_set_eg_events(lcd_event_id,0,KAL_AND);
		save_irq_mask=SaveAndSetIRQMask();
#ifndef DUAL_LCD
		if ((main_lcd_operation_state==LCD_CAMERA_UPDATE_STATE)||
			 (main_lcd_operation_state==LCD_CAMERA_CMD_QUEUE_STATE))
#else
		if ((main_lcd_operation_state==LCD_CAMERA_UPDATE_STATE)||
			 (main_lcd_operation_state==LCD_CAMERA_CMD_QUEUE_STATE)||
			 (sub_lcd_operation_state==LCD_CAMERA_UPDATE_STATE)||
			 (sub_lcd_operation_state==LCD_CAMERA_CMD_QUEUE_STATE))
#endif	/* DUAL_LCD */
		{
			if (current_update_lcd==MAIN_LCD)
			{
#ifndef CAMERA_MODULE_WITH_LCD	/* do not check while LCD is mount on external camera */
				if (lcd_para->lcd_id==SUB_LCD)
					ASSERT(0);
#endif
	  			main_lcd_fb_update_para.lcd_id=MAIN_LCD;
				main_lcd_fb_update_para.module_id=lcd_para->module_id;
				main_lcd_fb_update_para.fb_update_mode=lcd_para->fb_update_mode;
				main_lcd_fb_update_para.lcm_start_x=lcd_para->lcm_start_x;
				main_lcd_fb_update_para.lcm_start_y=lcd_para->lcm_start_y;
				main_lcd_fb_update_para.lcm_end_x=lcd_para->lcm_end_x;
				main_lcd_fb_update_para.lcm_end_y=lcd_para->lcm_end_y;
				main_lcd_fb_update_para.roi_offset_x=lcd_para->roi_offset_x;
				main_lcd_fb_update_para.roi_offset_y=lcd_para->roi_offset_y;
				main_lcd_fb_update_para.update_layer=lcd_para->update_layer;
				main_lcd_operation_state=LCD_CAMERA_CMD_QUEUE_STATE;
			}
	#ifdef DUAL_LCD

⌨️ 快捷键说明

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