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

📄 lcd_update_if.c

📁 8032底层驱动部分。因为可以移植 所以单独来拿出来
💻 C
📖 第 1 页 / 共 5 页
字号:
                  lcd_para->update_layer|=lcd_para->hw_update_layer;
               break;
            }
				lcd_roi_ctrl_shadow &= ~LCD_ROI_CTRL_LAYER_MASK;
				lcd_roi_ctrl_shadow |= lcd_para->update_layer;

				lcd_hard_trigger_flag=0;/*XXXXX remove ?*/
				save_irq_mask=SaveAndSetIRQMask();
				#if (defined(MT6226)||defined(MT6226M)||defined(MT6227)||defined(MT6228)||defined(MT6229)||defined(MT6230))
				DRV_WriteReg32(LCD_ROI_WMEM_CTRL_REG,lcd_mem_out_ctrl_shadow);
				DRV_WriteReg32(LCD_ROI_WMEM_ADDR_REG,lcd_mem_out_address_shadow);
				#endif
				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);

				if (main_lcd_operation_state!=LCD_SLEEP_STATE)
				{
               MainLCD->BlockWrite(lcd_para->lcm_start_x,lcd_para->lcm_start_y,
                                lcd_para->lcm_end_x,lcd_para->lcm_end_y);
	         }
	         else
	         {
	         	START_LCD_TRANSFER;
	         }
            lcd_hard_trigger_flag=1;/*XXXXX remove ?*/
				for (j=0;j<10;j++);
            if ((lcd_para->fb_update_mode==LCD_HW_TRIGGER_MODE)||
            	 (lcd_para->fb_update_mode==LCD_DIRECT_COUPLE_MODE))
           	{
           		lcd_hw_trigger_layer=lcd_para->hw_update_layer;
               lcd_hw_trigger_roi_offset=DRV_Reg32(LCD_ROI_OFFSET_REG);
               lcd_hw_trigger_roi_size=DRV_Reg32(LCD_ROI_SIZE_REG);
               lcd_hw_trigger_roi_ctrl=DRV_Reg32(LCD_ROI_CTRL_REG);
               lcd_hw_trigger_flag=KAL_FALSE;
					for (i=0;i<LCD_CMD_QUEUE_LENGTH;i++)
						lcd_hw_trigger_para[i]=DRV_Reg32(LCD_CMD_PARAMETER_ADDR+(i<<2));
					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;
            }

            current_update_lcd=lcd_para->lcd_id;
            if ((main_lcd_operation_state==LCD_SW_UPDATE_STATE)||(main_lcd_operation_state==LCD_SLEEP_STATE))
            {
            	if (lcd_para->block_mode_flag==KAL_TRUE)
            	{                  
                  while (LCD_IS_RUNNING) {};
                  for (j=0;j<10;j++);
   				   temp_reg=DRV_Reg(LCD_INT_STATUS_REG);
   				   for (j=0;j<10;j++);
                  
	               if (main_lcd_operation_state==LCD_SW_UPDATE_STATE)
                     main_lcd_operation_state=LCD_STANDBY_STATE;
	               DISABLE_LCD_ROI_CTRL_W2MEM;
               }
            }
         }
         else if ((main_lcd_operation_state==LCD_HW_UPDATE_STATE)||
         			(main_lcd_operation_state==LCD_DC_UPDATE_STATE))
         {  /* in LCD_HW_UPDATE_STATE or LCD_DC_UPDATE_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 */
				lcd_roi_ctrl_shadow &= ~LCD_ROI_CTRL_LAYER_MASK;
				lcd_roi_ctrl_shadow |= (lcd_para->update_layer | lcd_hw_trigger_layer);

            lcd_cmd_latch_complete=KAL_FALSE;
            ENABLE_LCD_CMD_COMPLETE_INT;

				current_update_lcd=lcd_para->lcd_id;
            lcd_hw_trigger_flag=KAL_TRUE;
            #if ((defined(MT6228)||defined(MT6229))&& (!defined(__MAUI_BASIC__))&& (!defined(__L1_STANDALONE__)))
            IRQMask(IRQ_LCD_CODE);
				if (tv_output_owner == TV_OUT_OWNER_LCD)
            {
            	if ((roi_mem_out_width>(lcd_para->tv_output_width-lcd_para->tv_output_offset_x))||
            		 (roi_mem_out_height>(lcd_para->tv_output_height-lcd_para->tv_output_offset_y)))
            		ASSERT(0);
            	tv_output_buffer_offset_address1=tv_output_buffer_base_address1 +
            												(lcd_para->tv_output_offset_y*lcd_para->tv_output_width +
            												 lcd_para->tv_output_offset_x) * 2;
            	tv_output_buffer_offset_address2=tv_output_buffer_base_address2 +
            												(lcd_para->tv_output_offset_y*lcd_para->tv_output_width +
            												 lcd_para->tv_output_offset_x) * 2;
  		      	if (tv_out_current_fb==0)
  		      	{
						lcd_mem_out_address_shadow = tv_output_buffer_offset_address1;
	      			*((volatile unsigned int *) tv_output_buffer_offset_address1)=0x55555555;
					}
					else
					{
						lcd_mem_out_address_shadow = tv_output_buffer_offset_address2;
	      			*((volatile unsigned int *) tv_output_buffer_offset_address2)=0x55555555;
					}
            	tv_output_buffer_count = 0;
	            tv_full_screen=2;
            }
            else
            {
	            tv_output_buffer_count = 2;
	            tv_full_screen=0;
            }
            #endif 

				save_irq_mask=SaveAndSetIRQMask();
            if (main_lcd_operation_state==LCD_HW_UPDATE_STATE)
               main_lcd_operation_state=LCD_HW_CMD_QUEUE_STATE;
            else if (main_lcd_operation_state==LCD_DC_UPDATE_STATE)
               main_lcd_operation_state=LCD_DC_CMD_QUEUE_STATE;
				#if (defined(MT6226)||defined(MT6226M)||defined(MT6227)||defined(MT6228)||defined(MT6229)||defined(MT6230))
				DRV_WriteReg32(LCD_ROI_WMEM_CTRL_REG,lcd_mem_out_ctrl_shadow);
				DRV_WriteReg32(LCD_ROI_WMEM_ADDR_REG,lcd_mem_out_address_shadow);
				#endif
				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);

            MainLCD->BlockWrite(lcd_para->lcm_start_x,lcd_para->lcm_start_y,
                                lcd_para->lcm_end_x,lcd_para->lcm_end_y);
				IRQUnmask(IRQ_LCD_CODE);
				for (j=0;j<20;j++);
            kal_retrieve_eg_events(lcd_event_id,LCD_CMD_COMPLETE_EVENT,
                                   KAL_OR_CONSUME,&event_group,KAL_SUSPEND);
            if (main_lcd_operation_state==LCD_HW_CMD_QUEUE_STATE)
               main_lcd_operation_state=LCD_HW_UPDATE_STATE;
            else if (main_lcd_operation_state==LCD_DC_CMD_QUEUE_STATE)
               main_lcd_operation_state=LCD_DC_UPDATE_STATE;
               
            ENABLE_LCD_TRANSFER_COMPLETE_INT;
            
		#if ((defined(MT6228)||defined(MT6229))&& (!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))&& (!defined(__MAUI_BASIC__))&& (!defined(__L1_STANDALONE__)))
      	else if ((main_lcd_operation_state==LCD_HW_UPDATE_SLEEP_STATE)||
         			(main_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)
					ASSERT(0);

				if (tv_output_owner == TV_OUT_OWNER_LCD)
				{
					lcd_roi_ctrl_shadow &= ~LCD_ROI_CTRL_LAYER_MASK;
					lcd_roi_ctrl_shadow |= (lcd_para->update_layer | lcd_hw_trigger_layer);

	            lcd_cmd_latch_complete=KAL_FALSE;
	            ENABLE_LCD_CMD_COMPLETE_INT;

					current_update_lcd=lcd_para->lcd_id;
	            lcd_hw_trigger_flag=KAL_TRUE;	            
	            IRQMask(IRQ_LCD_CODE);
	           	tv_output_buffer_offset_address1=tv_output_buffer_base_address1;
	           	tv_output_buffer_offset_address2=tv_output_buffer_base_address2;
		      	if (tv_out_current_fb==0)
            	{
						lcd_mem_out_address_shadow = tv_output_buffer_offset_address1;
	      			*((volatile unsigned int *) tv_output_buffer_offset_address1)=0x55555555;
					}
					else
            	{
						lcd_mem_out_address_shadow = tv_output_buffer_offset_address2;
		     			*((volatile unsigned int *) tv_output_buffer_offset_address2)=0x55555555;
					}
	           	tv_output_buffer_count = 0;
		         tv_full_screen=2;
					lcd_roi_ctrl_shadow &= ~LCD_ROI_CTRL_CMD_ENABLE_BIT;/*not output to LCD*/

					save_irq_mask=SaveAndSetIRQMask();
	            if (main_lcd_operation_state==LCD_HW_UPDATE_SLEEP_STATE)
	               main_lcd_operation_state=LCD_HW_SLEEP_CMD_QUEUE_STATE;
	            else if (main_lcd_operation_state==LCD_DC_UPDATE_SLEEP_STATE)
	               main_lcd_operation_state=LCD_DC_SLEEP_CMD_QUEUE_STATE;
					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;
					IRQUnmask(IRQ_LCD_CODE);
					while (tv_full_screen!=0) {};
	            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
      break;
   #ifdef DUAL_LCD
      case SUB_LCD:
         if (sub_lcd_operation_state==LCD_STANDBY_STATE)
         {
         	lcd_roi_ctrl_shadow &= ~LCD_ROI_CTRL_DATA_FORMAT_MASK;
         	lcd_roi_ctrl_shadow |= SUB_LCD_OUTPUT_FORMAT;

            DRV_WriteReg32(LCD_ROI_CMD_ADDR_REG,SUB_LCD_CMD_ADDR);
            DRV_WriteReg32(LCD_ROI_DATA_ADDR_REG,SUB_LCD_DATA_ADDR);
            switch (lcd_para->fb_update_mode)
            {
               case LCD_SW_TRIGGER_MODE:
                  DISABLE_LCD_HW_TRIGGER_UPDATE;
                  sub_lcd_operation_state=LCD_SW_UPDATE_STATE;
	            	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:
               #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 (sub_lcd_operation_state==LCD_SLEEP_STATE)
                  	sub_lcd_operation_state=LCD_HW_UPDATE_SLEEP_STATE;
                  else if (sub_lcd_operation_state==LCD_STANDBY_STATE)
                  	sub_lcd_operation_state=LCD_HW_UPDATE_STATE;
               #else
                  sub_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:
               #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 (sub_lcd_operation_state==LCD_SLEEP_STATE)
                  	sub_lcd_operation_state=LCD_DC_UPDATE_SLEEP_STATE;
                  else if (sub_lcd_operation_state==LCD_STANDBY_STATE)
                  	sub_lcd_operation_state=LCD_DC_UPDATE_STATE;
               #else
                  sub_lcd_operation_state=LCD_DC_UPDATE_STATE;
               #endif
                  SET_LCD_DIRECT_COUPLE_LAYER((lcd_para->hw_update_layer));
                  ENABLE_LCD_HW_TRIGGER_UPDATE;
                  lcd_para->update_layer|=lcd_para->hw_update_layer;
               break;
            }
				lcd_roi_ctrl_shadow &= ~LCD_ROI_CTRL_LAYER_MASK;
				lcd_roi_ctrl_shadow |= lcd_para->update_layer;

				save_irq_mask=SaveAndSetIRQMask();
				#if (defined(MT6226)||defined(MT6226M)||defined(MT6227)||defined(MT6228)||defined(MT6229)||defined(MT6230))
				DRV_WriteReg32(LCD_ROI_WMEM_CTRL_REG,lcd_mem_out_ctrl_shadow);
				DRV_WriteReg32(LCD_ROI_WMEM_ADDR_REG,lcd_mem_out_address_shadow);
				#endif
				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);
            SubLCD->BlockWrite(lcd_para->lcm_start_x,lcd_para->lcm_start_y,
                                lcd_para->lcm_end_x,lcd_para->lcm_end_y);
            if ((lcd_para->fb_update_mode==LCD_HW_TRIGGER_MODE)||
            	 (lcd_para->fb_update_mode==LCD_DIRECT_COUPLE_MODE))
           	{
           		lcd_hw_trigger_layer=lcd_para->hw_update_layer;
               lcd_hw_trigger_roi_offset=DRV_Reg32(LCD_ROI_OFFSET_REG);
               lcd_hw_trigger_roi_size=DRV_Reg32(LCD_ROI_SIZE_REG);
               lcd_hw_trigger_roi_ctrl=DRV_Reg32(LCD_ROI_CTRL_REG);
               lcd_hw_trigger_flag=KAL_FALSE;
					for (i=0;i<LCD_CMD_QUEUE_LENGTH;i++)
						lcd_hw_trigger_para[i]=DRV_Reg32(LCD_CMD_PARAMETER_ADDR+(i<<2));
            }
				current_update_lcd=lcd_para->lcd_id;
            if (sub_lcd_operation_state==LCD_SW_UPDATE_STATE)
            {
            	if (lcd_para->block_mode_flag==KAL_TRUE)
            	{		            
	               while (LCD_IS_RUNNING) {};
	   				temp_reg=DRV_Reg(LCD_INT_STATUS_REG);	            
   	           	sub_lcd_operation_state=LCD_STANDBY_STATE;
	               DISABLE_LCD_ROI_CTRL_W2MEM;
      	      }
	        	}
         }
         else if ((sub_lcd_operation_state==LCD_HW_UPDATE_STATE)||
         			(sub_lcd_operation_state==LCD_DC_UPDATE_STATE))
         {  /* in LCD_HW_UPDATE_STATE or LCD_DC_UPDATE_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 */
				lcd_roi_ctrl_shadow &= ~LCD_ROI_CTRL_LAYER_MASK;
				lcd_roi_ctrl_shadow |= (lcd_para->update_layer | lcd_hw_trigger_layer);

            lcd_cmd_latch_complete=KAL_FALSE;
            ENABLE_LCD_CMD_COMPLETE_INT;
            if (sub_lcd_operation_state==LCD_HW_UPDATE_STATE)
               sub_lcd_operation_state=LCD_HW_CMD_QUEUE_STATE;
            else if (sub_lcd_operation_state==LCD_DC_UPDATE_STATE)
               sub_lcd_operation_state=LCD_DC_CMD_QUEUE_STATE;
				current_update_lcd=lcd_para->lcd_id;

				save_irq_mask=SaveAndSetIRQMask();
				#if (defined(MT6226)||defined(MT6226M)||defined(MT6227)||defined(MT6228)||defined(MT6229)||defined(MT6230))
				DRV_WriteReg32(LCD_ROI_WMEM_CTRL_REG,lcd_mem_out_ctrl_shadow);
				DRV_WriteReg32(LCD_ROI_WMEM_ADDR_REG,lcd_mem_out_address_shadow);
				#endif
				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);

⌨️ 快捷键说明

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