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

📄 lcd_update_if.c

📁 8032底层驱动部分。因为可以移植 所以单独来拿出来
💻 C
📖 第 1 页 / 共 5 页
字号:
				RestoreIRQMask(save_irq_mask);                               

            SubLCD->BlockWrite(lcd_para->lcm_start_x,lcd_para->lcm_start_y,
                                lcd_para->lcm_end_x,lcd_para->lcm_end_y);
            lcd_hw_trigger_flag=KAL_TRUE;
            kal_retrieve_eg_events(lcd_event_id,LCD_CMD_COMPLETE_EVENT,
                                   KAL_OR_CONSUME,&event_group,KAL_SUSPEND);
            if (sub_lcd_operation_state==LCD_HW_CMD_QUEUE_STATE)
               sub_lcd_operation_state=LCD_HW_UPDATE_STATE;

            else if (sub_lcd_operation_state==LCD_DC_CMD_QUEUE_STATE)
               sub_lcd_operation_state=LCD_DC_UPDATE_STATE;

            ENABLE_LCD_TRANSFER_COMPLETE_INT;

		#if ((defined(MT6228)||defined(MT6229)||defined(MT6230))&& (!defined(__MAUI_BASIC__))&& (!defined(__L1_STANDALONE__)))
				if (tv_output_owner!=TV_OUT_OWNER_LCD)
				{
            	DISABLE_LCD_CMD_COMPLETE_INT;
            }
            else
            {
            	ENABLE_LCD_CMD_COMPLETE_INT;
            }
   	#else
            DISABLE_LCD_CMD_COMPLETE_INT;
   	#endif
         }
      #if (defined(MT6228)||defined(MT6229)||defined(MT6230))
      	else if ((sub_lcd_operation_state==LCD_HW_UPDATE_SLEEP_STATE)||
         			(sub_lcd_operation_state==LCD_DC_UPDATE_SLEEP_STATE))
         {
            if (lcd_para->fb_update_mode!=LCD_SW_TRIGGER_MODE)
               ASSERT(0);  /* make sure that HW mode will not occur in LCD_HW_UPDATE_STATE
                              and LCD_DC_UPDATE_STATE */
            if ((lcd_para->module_id==LCD_UPDATE_MODULE_MMI)&&((lcd_para->tv_output==KAL_TRUE)||
            	 (lcd_para->memory_output==KAL_TRUE)))
           	{
					lcd_roi_ctrl_shadow &= ~LCD_ROI_CTRL_LAYER_MASK;
					lcd_roi_ctrl_shadow |= (lcd_para->update_layer | lcd_hw_trigger_layer);

					lcd_roi_ctrl_shadow &= ~LCD_ROI_CTRL_CMD_ENABLE_BIT;/*not output to LCD*/

					save_irq_mask=SaveAndSetIRQMask();
					DRV_WriteReg32(LCD_ROI_WMEM_CTRL_REG,lcd_mem_out_ctrl_shadow);
					DRV_WriteReg32(LCD_ROI_WMEM_ADDR_REG,lcd_mem_out_address_shadow);
					DRV_WriteReg32(LCD_ROI_CTRL_REG,lcd_roi_ctrl_shadow);
					DRV_WriteReg32(LCD_ROI_OFFSET_REG,lcd_roi_offset_shadow);
					DRV_WriteReg32(LCD_ROI_SIZE_REG,lcd_roi_size_shadow);
					RestoreIRQMask(save_irq_mask);
      	   	START_LCD_TRANSFER;
      	   }
         }
      #endif
      break;
   #endif   /* DUAL_LCD */
      default:
         ASSERT(0);
      break;
   }
   lcd_power_down();
#elif (defined(MT6205B)||defined(MT6208))
	lcd_power_up();
	if (lcd_para->lcd_id==MAIN_LCD)
	{
		MainLCD->BlockWrite(lcd_para->lcm_start_x,lcd_para->lcm_start_y,
								  lcd_para->lcm_end_x,lcd_para->lcm_end_y);
	}
#ifdef DUAL_LCD
	else if (lcd_para->lcd_id==SUB_LCD)
	{
		SubLCD->BlockWrite(lcd_para->lcm_start_x,lcd_para->lcm_start_y,
								  lcd_para->lcm_end_x,lcd_para->lcm_end_y);
	}
#endif	/* DUAL_LCD */
   lcd_power_down();
#endif 	/* MT6217, MT6218B, MT6219, MT6205B, MT6226, MT6227, MT6228, MT6229, MT6230 */
}  /* lcd_fb_update() */

/*************************************************************************
* FUNCTION
*     lcd_fb_update_to_memory
*
* DESCRIPTION
*     This function trigger LCD interface to output the MMI screen to one buffer
*
* PARAMETERS
*   *lcd_para : the parameters for lcd frame buffer update to memory
*
* RETURNS
*     none
*
* GLOBALS AFFECTED
*
*************************************************************************/
#if (defined(MT6217)||defined(MT6218B)||defined(MT6219)||defined(MT6226)||defined(MT6226M)||defined(MT6227)||defined(MT6228)||defined(MT6229)||defined(MT6230))
void lcd_fb_update_to_memory(lcd_frame_update_to_mem_struct *lcd_para)
{
	kal_uint16 temp_reg;
	volatile kal_uint16 i;
	kal_uint8 temp_lcd_state;

   #ifdef __MTK_TARGET__
   if(INT_QueryExceptionStatus())
      return;   
   #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 */

	temp_lcd_state=main_lcd_operation_state;
#if (defined(CAMERA_MODULE))
	if ((main_lcd_operation_state!=LCD_STANDBY_STATE) &&
		 (main_lcd_operation_state!=LCD_SLEEP_STATE)&&
		 (main_lcd_operation_state!=LCD_CAMERA_UPDATE_STATE)&&
		 (main_lcd_operation_state!=LCD_CAMERA_CMD_QUEUE_STATE)&&
		 (main_lcd_operation_state!=LCD_CAMERA_ACTIVE_STATE)&&
		 (main_lcd_operation_state!=LCD_CAMERA_ACTIVE_UPDATE_STATE))
		ASSERT(0);
#ifdef DUAL_LCD
	if ((sub_lcd_operation_state!=LCD_STANDBY_STATE) &&
		 (sub_lcd_operation_state!=LCD_SLEEP_STATE)&&
		 (sub_lcd_operation_state!=LCD_CAMERA_UPDATE_STATE)&&
		 (sub_lcd_operation_state!=LCD_CAMERA_CMD_QUEUE_STATE)&&
		 (sub_lcd_operation_state!=LCD_CAMERA_ACTIVE_STATE)&&
		 (sub_lcd_operation_state!=LCD_CAMERA_ACTIVE_UPDATE_STATE))
		ASSERT(0);
#endif
#else
	if ((main_lcd_operation_state!=LCD_STANDBY_STATE) &&
		 (main_lcd_operation_state!=LCD_SLEEP_STATE))
		ASSERT(0);
#ifdef DUAL_LCD
	if ((sub_lcd_operation_state!=LCD_STANDBY_STATE) &&
		 (sub_lcd_operation_state!=LCD_SLEEP_STATE))
		ASSERT(0);
#endif
#endif
	if (lcd_para->block_mode>LCD_WM_BLOCK_MODE)
		ASSERT(0);

	if (lcd_para->block_mode==LCD_WM_CONT_MODE)
	{
		if ((lcd_para->dest_buffer_size)<((lcd_para->roi_width * lcd_para->roi_height)<<1))
		ASSERT(0);
	}
	else
	{
		if ((lcd_para->dest_buffer_size)<((lcd_para->dest_block_width * lcd_para->roi_height)<<1))
			ASSERT(0);
	}

	if ((lcd_para->update_layer & (~LCD_LAYER_MASK))!=0)
		ASSERT(0);
	if ((lcd_para->hw_update_layer & (~LCD_LAYER_MASK))!=0)
		ASSERT(0);

	lcd_power_up();

	#if (defined(MT6217)||defined(MT6218B)||defined(MT6219))
	SET_LCD_ROI_CTRL_OUTPUT_FORMAT(LCM_16BIT_16_BPP_RGB565_1);
	#elif (defined(MT6226)||defined(MT6226M)||defined(MT6227)||defined(MT6228)||defined(MT6229)||defined(MT6230))
	LCD_WRITE_MEM_ONLY;
		#if (defined(MT6228)||defined(MT6229)||defined(MT6230))
	REG_LCD_ROI_BACKGROUND_COLOR=lcd_para->roi_background_color;
	if (lcd_para->memory_data_format==LCD_WMEM_RGB565)
	{
		LCD_WRITE_MEM_RGB565;
	}
	else if (lcd_para->memory_data_format==LCD_WMEM_RGB888)
	{
		LCD_WRITE_MEM_RGB888;
	}
		#else
	REG_LCD_ROI_BACKGROUND_COLOR=(kal_uint16) lcd_para->roi_background_color;
		#endif
	#endif
	SET_LCD_MAIN_WINDOW_SIZE(lcd_para->dest_block_width,lcd_para->roi_height+lcd_para->roi_offset_y);
   SET_LCD_ROI_WINDOW_OFFSET(lcd_para->roi_offset_x,lcd_para->roi_offset_y);
   SET_LCD_ROI_WINDOW_SIZE(lcd_para->roi_width,lcd_para->roi_height);
   SET_LCD_ENABLE_LAYER(lcd_para->update_layer);
	ENABLE_LCD_ROI_CTRL_W2MEM;
	

	#if (defined(MT6226)||defined(MT6226M)||defined(MT6227)||defined(MT6228)||defined(MT6229)||defined(MT6230))
		FIX_LCD_ROI_CTRL_W2MEM_BUG;
		LCD_WRITE_MEM_ONLY;
		DRV_WriteReg32(LCD_ROI_WMEM_ADDR_REG,lcd_para->dest_buffer_address);
	#else
		DRV_WriteReg32(LCD_ROI_DATA_ADDR_REG,lcd_para->dest_buffer_address);
	#endif

	DISABLE_LCD_ROI_CTRL_CMD_FIRST;
	if (lcd_para->block_mode==LCD_WM_BLOCK_MODE)
	{
		SET_LCD_ROI_CTRL_W2MEM_DISCONT;
	}
	else if (lcd_para->block_mode==LCD_WM_CONT_MODE)
	{
		SET_LCD_ROI_CTRL_W2MEM_CONT;
	}

	#if (defined(MT6219)||defined(MT6226)||defined(MT6226M)||defined(MT6227)||defined(MT6228)||defined(MT6229)||defined(MT6230))
	kal_set_eg_events(lcd_event_id,0,KAL_AND);
	ENABLE_LCD_CMD_COMPLETE_INT;
	ENABLE_LCD_TRANSFER_COMPLETE_INT;
#endif
	switch (lcd_para->fb_update_mode)
	{
		case LCD_SW_TRIGGER_MODE:
#if (defined(CAMERA_MODULE))
			START_LCD_TRANSFER;
			for (i=0;i<10;i++) {};
			while (LCD_IS_RUNNING){};
   		temp_reg=DRV_Reg(LCD_INT_STATUS_REG);
#else
		#if (defined(MT6219)||defined(MT6226)||defined(MT6226M)||defined(MT6227)||defined(MT6228)||defined(MT6229)||defined(MT6230))
			DISABLE_LCD_HW_TRIGGER_UPDATE;
		#endif
			START_LCD_TRANSFER;
			main_lcd_operation_state=LCD_MEM_UPDATE_STATE;
			for (i=0;i<10;i++);
			while (LCD_IS_RUNNING){};
   		temp_reg=DRV_Reg(LCD_INT_STATUS_REG);
#endif
			DISABLE_LCD_ROI_CTRL_W2MEM;
			main_lcd_operation_state=temp_lcd_state;
		break;
	#if (defined(MT6219)||defined(MT6226)||defined(MT6226M)||defined(MT6227)||defined(MT6228)||defined(MT6229)||defined(MT6230))
		case LCD_HW_TRIGGER_MODE:
      #if (defined(MT6228)||defined(MT6229)||defined(MT6230))
      	if (lcd_para->hw_trigger_src==LCD_HW_TRIGGER_IBW2)
      	{
      		SET_LCD_IBW2_TRIGGER_LAYER(lcd_para->hw_update_layer);
      	}
      	else
      	{
      		SET_LCD_IBW1_TRIGGER_LAYER(lcd_para->hw_update_layer);
      	}
      #endif
         SET_LCD_HW_TRIGGER_LAYER(lcd_para->hw_update_layer);
			ENABLE_LCD_HW_TRIGGER_UPDATE;
			main_lcd_operation_state=LCD_MEM_UPDATE_STATE;
			START_LCD_TRANSFER;	/* latch the command */
			for (i=0;i<10;i++);
		break;
		case LCD_DIRECT_COUPLE_MODE:
      #if (defined(MT6228)||defined(MT6229)||defined(MT6230))
      	if (lcd_para->hw_trigger_src==LCD_HW_TRIGGER_IBW2)
      	{
      		SET_LCD_IBW2_TRIGGER_LAYER(lcd_para->hw_update_layer);
      	}
      	else
      	{
      		SET_LCD_IBW1_TRIGGER_LAYER(lcd_para->hw_update_layer);
      	}
			set_lcd_dc_layer_format(lcd_para->hw_update_layer,KAL_TRUE);
      #endif
			SET_LCD_DIRECT_COUPLE_LAYER((lcd_para->hw_update_layer));
			ENABLE_LCD_HW_TRIGGER_UPDATE;
			main_lcd_operation_state=LCD_MEM_UPDATE_STATE;
			START_LCD_TRANSFER;	/* latch the command */
			for (i=0;i<10;i++);
		break;
#endif
	}
	lcd_power_down();
}	/* lcd_fb_update_to_memory() */
#endif	/* MT6217, MT6218B, MT6219 */

/*************************************************************************
* FUNCTION
*     lcd_stop_hw_update
*
* DESCRIPTION
*     This function stops the hardware trigger LCD update operation
*
* PARAMETERS
*     lcd_id   : selection MAIN_LCD or SUB_LCD
*
* RETURNS
*     none
*
* GLOBALS AFFECTED
*
*************************************************************************/
#if (defined(MT6219)||defined(MT6226)||defined(MT6226M)||defined(MT6227)||defined(MT6228)||defined(MT6229)||defined(MT6230))
void lcd_stop_hw_update(kal_uint8 lcd_id)
{
	kal_uint16 temp_reg;
	kal_uint32 hw_layer;
	volatile kal_uint16 i;
	kal_uint32 save_irq_mask;

#if ((defined(MT6228)||defined(MT6229)||defined(MT6230))&&((!defined(__MAUI_BASIC__))&& (!defined(__L1_STANDALONE__))))
	if (((main_lcd_operation_state==LCD_HW_CMD_QUEUE_STATE)||(main_lcd_operation_state==LCD_DC_CMD_QUEUE_STATE)||
		  (main_lcd_operation_state==LCD_DC_SLEEP_CMD_QUEUE_STATE)||(main_lcd_operation_state==LCD_HW_SLEEP_CMD_QUEUE_STATE))&&
		 (lcd_hard_trigger_flag==1))
	{
		while (tv_full_screen>0)
		{
			if ((current_image_data_path_owner==SCENARIO_MPEG_ENCODE_ID)||
				 (current_image_data_path_owner==SCENARIO_MPEG_DECODE_ID))
			{
				STOP_IBW2;
				STOP_IMGDMA_VIDEO_DECODE;
				START_IBW2;
				START_IMGDMA_VIDEO_DECODE;
				for (i=0;i<10000;i++);
				while (LCD_IS_RUNNING) {};
				save_irq_mask=SaveAndSetIRQMask();
				if (tv_full_screen>0)
					tv_full_screen--;
				RestoreIRQMask(save_irq_mask);
			}
			else
				break;
		}
      if (main_lcd_operation_state==LCD_HW_SLEEP_CMD_QUEUE_STATE)
         main_lcd_operation_state=LCD_HW_UPDATE_SLEEP_STATE;
      else if (main_lcd_operation_state==LCD_DC_SLEEP_CMD_QUEUE_STATE)
         main_lcd_operation_state=LCD_DC_UPDATE_SLEEP_STATE;
	}
#endif

⌨️ 快捷键说明

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