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

📄 lcd_update_if.c

📁 8032底层驱动部分。因为可以移植 所以单独来拿出来
💻 C
📖 第 1 页 / 共 5 页
字号:
				lcd_para->lcm_end_y=sub_lcd_fb_update_para.lcm_end_y;
			
			if (sub_lcd_fb_update_para.roi_offset_x<lcd_para->roi_offset_x)
				lcd_para->roi_offset_x=sub_lcd_fb_update_para.roi_offset_x;
			
			if (sub_lcd_fb_update_para.roi_offset_y<lcd_para->roi_offset_y)			
				lcd_para->roi_offset_y=sub_lcd_fb_update_para.roi_offset_y;			
		}
	}
#endif /* DUAL_LCD */
   /*Begin of check lcm start/end, roi offset*/
   
	roi_width=lcd_para->lcm_end_x-lcd_para->lcm_start_x+1;
	roi_height=lcd_para->lcm_end_y-lcd_para->lcm_start_y+1;
	lcd_roi_offset_shadow=(lcd_para->roi_offset_y<<16)|lcd_para->roi_offset_x;

	if ((current_lcd_rotate_value==LCD_LAYER_ROTATE_90) ||
		 (current_lcd_rotate_value==LCD_LAYER_ROTATE_270) ||
		 (current_lcd_rotate_value==LCD_LAYER_MIRROR_ROTATE_90) ||
		 (current_lcd_rotate_value==LCD_LAYER_MIRROR_ROTATE_270))
	{
		lcd_roi_size_shadow= (roi_width<<16)|roi_height;
   	roi_mem_out_width=roi_height;
   	roi_mem_out_height=roi_width;
   }
   else
   {
		lcd_roi_size_shadow= (roi_height<<16)|roi_width;
   	roi_mem_out_width=roi_width;
   	roi_mem_out_height=roi_height;
   }

   lcd_roi_ctrl_shadow &= ~LCD_ROI_CTRL_LAYER_MASK;
   lcd_roi_ctrl_shadow |= lcd_para->update_layer;
	#if (defined(MT6226)||defined(MT6226M)||defined(MT6227))
	REG_LCD_ROI_BACKGROUND_COLOR=(kal_uint16) lcd_para->roi_background_color;
	#elif (defined(MT6228)||defined(MT6229)||defined(MT6230))
	REG_LCD_ROI_BACKGROUND_COLOR=lcd_para->roi_background_color;
	#endif
   /*Beginning of memory out configuration*/
	#if (defined(MT6226)||defined(MT6226M)||defined(MT6227)||defined(MT6228)||defined(MT6229)||defined(MT6230))
	if ((lcd_para->module_id==LCD_UPDATE_MODULE_MMI)&&(lcd_para->memory_output==KAL_TRUE))
	{
		#if (defined(MT6228)||defined(MT6229)||defined(MT6230))
		if (lcd_para->memory_data_format==LCD_WMEM_RGB565)
		{
			lcd_mem_out_ctrl_shadow &= ~LCD_ROI_WMEM_CTRL_FORMAT;
		}
		else if (lcd_para->memory_data_format==LCD_WMEM_RGB888)
		{
			lcd_mem_out_ctrl_shadow |= LCD_ROI_WMEM_CTRL_FORMAT;
		}
		#endif
		if (lcd_para->block_mode==LCD_WM_BLOCK_MODE)
		{
		#if (defined(MT6228)||defined(MT6229)||defined(MT6230))
			if (lcd_para->memory_data_format==LCD_WMEM_RGB565)
			{
				if ((lcd_para->memory_output_buffer_size)<((lcd_para->memory_block_width * roi_mem_out_height)<<1))				
					ASSERT(0);

			}
			else if (lcd_para->memory_data_format==LCD_WMEM_RGB888)
			{
				if ((lcd_para->memory_output_buffer_size)<((lcd_para->memory_block_width * roi_mem_out_height)*3))
					ASSERT(0);
			}
		#else
			if ((lcd_para->memory_output_buffer_size)<((lcd_para->memory_block_width * roi_mem_out_height)<<1))
				ASSERT(0);
		#endif
			lcd_mem_out_ctrl_shadow |= LCD_ROI_WMEM_CONT_BIT;

			SET_LCD_MAIN_WINDOW_SIZE(lcd_para->memory_block_width,roi_height+lcd_para->roi_offset_y);
		}
		else if (lcd_para->block_mode==LCD_WM_CONT_MODE)
		{
		#if (defined(MT6228)||defined(MT6229)||defined(MT6230))
			if (lcd_para->memory_data_format==LCD_WMEM_RGB565)
			{
				if ((lcd_para->memory_output_buffer_size)<((roi_width * roi_height)<<1))
					ASSERT(0);
			}
			else if (lcd_para->memory_data_format==LCD_WMEM_RGB888)
			{
				if ((lcd_para->memory_output_buffer_size)<((roi_width * roi_height)*3))
					ASSERT(0);
			}
		#else
			if ((lcd_para->memory_output_buffer_size)<((roi_width * roi_height)<<1))
				ASSERT(0);
		#endif
			lcd_mem_out_ctrl_shadow &= ~LCD_ROI_WMEM_CONT_BIT;
		}
		lcd_mem_out_address_shadow = lcd_para->memory_output_buffer_address;
		lcd_roi_ctrl_shadow |= LCD_ROI_CTRL_W2MEM_BIT;

		if (lcd_para->lcd_id==MAIN_LCD)
		{
			if ((lcd_output_mode==KAL_TRUE) && (main_lcd_hw_trigger_output_mode==KAL_TRUE)&&
				 (main_lcd_operation_state!=LCD_SLEEP_STATE))
			{
				lcd_mem_out_ctrl_shadow |= LCD_ROI_WMEM_CTRL_TO_LCM;
	}
			else
			{
				lcd_mem_out_ctrl_shadow &= ~LCD_ROI_WMEM_CTRL_TO_LCM;
			}
		}
		#ifdef DUAL_LCD
		else if (lcd_para->lcd_id==SUB_LCD)
		{
			if ((lcd_output_mode==KAL_TRUE) && (sub_lcd_hw_trigger_output_mode==KAL_TRUE)&&
				 (sub_lcd_operation_state!=LCD_SLEEP_STATE))
			{
				lcd_mem_out_ctrl_shadow |= LCD_ROI_WMEM_CTRL_TO_LCM;
	      }
			else
			{
				lcd_mem_out_ctrl_shadow &= ~LCD_ROI_WMEM_CTRL_TO_LCM;
			}
		}
		#endif
	}
	#endif
	/*End of memory out configuration*/
	
	/*Beginning of TV out configuration*/
	#if (defined(MT6228)||defined(MT6229))
	if ((lcd_para->module_id!=LCD_UPDATE_MODULE_MMI)&&(lcd_para->tv_output==KAL_TRUE))
	{
		if ((lcd_para->tv_output_frame_buffer_size)<(roi_width*roi_height*2))
			ASSERT(0);

		#if ((!defined(__MAUI_BASIC__))&& (!defined(__L1_STANDALONE__)))
		if ((lcd_para->tv_output==KAL_TRUE)&&(tv_output_config_data.tv_output_mode==TV_OUTPUT_MODE4))
		{
			current_g2d_tv_output_bitblt_buffer=0;
			g2d_begin(G2D_OWNER_LCD,preview_tv_buffer_rotate_cb);
			g2d_tv_output_dest_buff.base_address=camera_preview_config_data.tv_rotate_buffer1_address;
			g2d_tv_output_dest_buff.x=0;
			g2d_tv_output_dest_buff.y=0;
			g2d_tv_output_dest_buff.pitch=lcd_para->tv_output_width;
			g2d_tv_output_dest_buff.width=lcd_para->tv_output_width;
			g2d_tv_output_dest_buff.height=lcd_para->tv_output_height;
			g2d_tv_output_dest_buff.color_mode=FIRE_DEST_COLOR_16BPP_RGB565;
			g2d_tv_output_dest_buff.clip_x1=0;
			g2d_tv_output_dest_buff.clip_x2=lcd_para->tv_output_width-1;
			g2d_tv_output_dest_buff.clip_y1=0;
			g2d_tv_output_dest_buff.clip_y2=lcd_para->tv_output_height-1;

			g2d_tv_output_src_buff.base_address=lcd_para->tv_output_frame_buffer1_address;
			g2d_tv_output_src_buff.x=0;
			g2d_tv_output_src_buff.y=0;
			g2d_tv_output_src_buff.pitch=lcd_para->tv_output_height;
			g2d_tv_output_src_buff.width=lcd_para->tv_output_height;
			g2d_tv_output_src_buff.height=lcd_para->tv_output_width;
			g2d_tv_output_src_buff.color_mode=FIRE_SRC_COLOR_16BPP_RGB565;
			g2d_tv_output_src_buff.clip_x1=0;
			g2d_tv_output_src_buff.clip_x2=lcd_para->tv_output_height-1;
			g2d_tv_output_src_buff.clip_y1=0;
			g2d_tv_output_src_buff.clip_y2=lcd_para->tv_output_width-1;

			g2d_tv_output_bitblt.tilt_mode=KAL_FALSE;
			g2d_tv_output_bitblt.src_key_mode = KAL_FALSE;
			g2d_tv_output_bitblt.blt_direction = BITBLT_TRANSFORM_DIRECTION_LT_CORNER;
			g2d_tv_output_bitblt.src_key_color= 0;
			g2d_tv_output_bitblt.alpha_blending_mode=KAL_FALSE;
			g2d_tv_output_bitblt.rop_mode=KAL_FALSE;
			g2d_tv_output_bitblt.transform_value = BITBLT_TRANSFORM_ROTATE_270;
			g2d_tv_output_bitblt.src_list=&g2d_tv_output_src_buff;
			g2d_tv_output_bitblt.list_count=1;
			g2d_set_dest_buffer(G2D_OWNER_LCD,&g2d_tv_output_dest_buff);
		}

		tv_output_buffer_base_address1=lcd_para->tv_output_frame_buffer1_address;
		tv_output_buffer_base_address2=lcd_para->tv_output_frame_buffer2_address;
		main_lcd_fb_update_para.tv_output_frame_buffer1_address=lcd_para->tv_output_frame_buffer1_address +
																				  (lcd_para->tv_output_offset_y*lcd_para->tv_output_width+
																				   lcd_para->tv_output_offset_x)*2;
		main_lcd_fb_update_para.tv_output_frame_buffer2_address=lcd_para->tv_output_frame_buffer2_address+
																				  (lcd_para->tv_output_offset_y*lcd_para->tv_output_width+
																				   lcd_para->tv_output_offset_x)*2;
		
		tv_output_owner = TV_OUT_OWNER_LCD;
		tv_out_current_fb=0;
		set_tv_src_size(TV_OUT_OWNER_LCD,lcd_para->tv_output_width,lcd_para->tv_output_height);

		lcd_mem_out_ctrl_shadow &= ~LCD_ROI_WMEM_CTRL_FORMAT;

		if (tv_output_config_data.tv_output_mode==TV_OUTPUT_MODE4)
		{
			if (roi_width==lcd_para->tv_output_height)
			{
				lcd_mem_out_ctrl_shadow &= ~LCD_ROI_WMEM_CONT_BIT;
			}
			else if (roi_width<lcd_para->tv_output_height)
			{
				lcd_mem_out_ctrl_shadow |= LCD_ROI_WMEM_CONT_BIT;
				SET_LCD_MAIN_WINDOW_SIZE(lcd_para->tv_output_height,roi_height+lcd_para->roi_offset_y);
			}
			else
				ASSERT(0);
		}
		else
		{
			if (roi_width==lcd_para->tv_output_width)
			{
				lcd_mem_out_ctrl_shadow &= ~LCD_ROI_WMEM_CONT_BIT;
			}
			else if (roi_width<lcd_para->tv_output_width)
			{
				lcd_mem_out_ctrl_shadow |= LCD_ROI_WMEM_CONT_BIT;
				SET_LCD_MAIN_WINDOW_SIZE(lcd_para->tv_output_width,roi_height+lcd_para->roi_offset_y);
			}
			else
				ASSERT(0);
		}
		#else
			lcd_mem_out_ctrl_shadow &= ~LCD_ROI_WMEM_CTRL_FORMAT;
			if (roi_width==lcd_para->tv_output_width)
			{
				lcd_mem_out_ctrl_shadow &= ~LCD_ROI_WMEM_CONT_BIT;
			}
			else if (roi_width<lcd_para->tv_output_width)
			{
				lcd_mem_out_ctrl_shadow |= LCD_ROI_WMEM_CONT_BIT;
				SET_LCD_MAIN_WINDOW_SIZE(lcd_para->tv_output_width,roi_height+lcd_para->roi_offset_y);
			}
			else
				ASSERT(0);			
		#endif
		lcd_mem_out_address_shadow = main_lcd_fb_update_para.tv_output_frame_buffer1_address;
		lcd_roi_ctrl_shadow |= LCD_ROI_CTRL_W2MEM_BIT;

		if (lcd_para->lcd_id==MAIN_LCD)
		{
			if ((lcd_output_mode==KAL_TRUE) && (main_lcd_hw_trigger_output_mode==KAL_TRUE))
			{
				lcd_mem_out_ctrl_shadow |= LCD_ROI_WMEM_CTRL_TO_LCM;
			}
			else
			{
				lcd_mem_out_ctrl_shadow &= ~LCD_ROI_WMEM_CTRL_TO_LCM;
			}
		}
		#ifdef DUAL_LCD
		else if (lcd_para->lcd_id==SUB_LCD)
		{
			if ((lcd_output_mode==KAL_TRUE) && (sub_lcd_hw_trigger_output_mode==KAL_TRUE))
			{
				lcd_mem_out_ctrl_shadow |= LCD_ROI_WMEM_CTRL_TO_LCM;
			}
			else
			{
				lcd_mem_out_ctrl_shadow &= ~LCD_ROI_WMEM_CTRL_TO_LCM;
			}
		}
		#endif
	}
	#endif
   /*End of TV out configuration*/
   
   switch (lcd_para->lcd_id)
   {
      case MAIN_LCD:
         if ((main_lcd_operation_state==LCD_STANDBY_STATE)||
         	 (main_lcd_operation_state==LCD_SLEEP_STATE))
         {                                                            
         	lcd_roi_ctrl_shadow &= ~LCD_ROI_CTRL_DATA_FORMAT_MASK;
         	lcd_roi_ctrl_shadow |= MAIN_LCD_OUTPUT_FORMAT;

            DRV_WriteReg32(LCD_ROI_CMD_ADDR_REG,MAIN_LCD_CMD_ADDR);
            DRV_WriteReg32(LCD_ROI_DATA_ADDR_REG,MAIN_LCD_DATA_ADDR);
            switch (lcd_para->fb_update_mode)
            {
               case LCD_SW_TRIGGER_MODE:/*MMI*/
                  /*to prevent MED preempt*/
                  save_irq_mask=SaveAndSetIRQMask();      
                  if (main_lcd_operation_state==LCD_STANDBY_STATE)
                  {
                     main_lcd_operation_state=LCD_SW_UPDATE_STATE;
                     DISABLE_LCD_HW_TRIGGER_UPDATE;
                  }   
                  else
                  	lcd_roi_ctrl_shadow &= ~LCD_ROI_CTRL_CMD_ENABLE_BIT;/*not output to LCD*/                  	
                  RestoreIRQMask(save_irq_mask);      	
                  
	            	if (lcd_para->block_mode_flag==KAL_FALSE)
	            	{
							lcd_block_cb=lcd_para->lcd_block_mode_cb;
							IRQMask(IRQ_LCD_CODE);
							wait_lcd_update_flag=KAL_TRUE;
							IRQUnmask(IRQ_LCD_CODE);
	            	}
	            	else
	            	{
							IRQMask(IRQ_LCD_CODE);
							wait_lcd_update_flag=KAL_FALSE;
							IRQUnmask(IRQ_LCD_CODE);
	            	}
               break;
               case LCD_HW_TRIGGER_MODE:/*MED*/
               #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);
               	}
               	if (main_lcd_operation_state==LCD_SLEEP_STATE)
                  	main_lcd_operation_state=LCD_HW_UPDATE_SLEEP_STATE;
                  else if (main_lcd_operation_state==LCD_STANDBY_STATE)
                  	main_lcd_operation_state=LCD_HW_UPDATE_STATE;
               #else
                  main_lcd_operation_state=LCD_HW_UPDATE_STATE;
               #endif
                  SET_LCD_HW_TRIGGER_LAYER(lcd_para->hw_update_layer);
                  ENABLE_LCD_HW_TRIGGER_UPDATE;
                  lcd_para->update_layer|=lcd_para->hw_update_layer;
               break;
               case LCD_DIRECT_COUPLE_MODE:/*MED*/
               #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);
               	if (main_lcd_operation_state==LCD_SLEEP_STATE)
                  	main_lcd_operation_state=LCD_DC_UPDATE_SLEEP_STATE;
                  else if (main_lcd_operation_state==LCD_STANDBY_STATE)
                  	main_lcd_operation_state=LCD_DC_UPDATE_STATE;
               #else
                  main_lcd_operation_state=LCD_DC_UPDATE_STATE;
               #endif
                  SET_LCD_DIRECT_COUPLE_LAYER((lcd_para->hw_update_layer));
                  ENABLE_LCD_HW_TRIGGER_UPDATE;

⌨️ 快捷键说明

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