📄 lcd_update_if.c
字号:
/*****************************************************************************
* 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 + -