?? lcd_if.c
字號:
hpi_power_on=KAL_TRUE;
lcd_power_up();
old_lcd_cmd_period_count=lcd_cmd_period_count;
if (hpi_cmd_period_count>old_lcd_cmd_period_count)
{
save_irq_mask=SaveAndSetIRQMask();
SET_LCD_ROI_CTRL_CMD_LATENCY(hpi_cmd_period_count);
RestoreIRQMask(save_irq_mask);
}
}
else if (on==KAL_FALSE)
{
hpi_power_on=KAL_FALSE;
if (hpi_cmd_period_count > old_lcd_cmd_period_count)
{
save_irq_mask=SaveAndSetIRQMask();
SET_LCD_ROI_CTRL_CMD_LATENCY(old_lcd_cmd_period_count);
RestoreIRQMask(save_irq_mask);
}
lcd_power_down();
}
#endif
} /* hpi_power_ctrl() */
void set_hpi_low_period_count(kal_uint8 low_period)
{
#if (defined(MT6226)||defined(MT6226M)||defined(MT6227)||defined(MT6228)||defined(MT6229))
hpi_cmd_period_count=low_period;
#endif
} /* set_hpi_low_period_count() */
void swap_lcd_layer_window(kal_uint32 swap_layer)
{
#if (defined(MT6217)||defined(MT6219)||defined(MT6226)||defined(MT6226M)||defined(MT6227)||defined(MT6228)||defined(MT6229))
kal_uint16 width,height;
lcd_power_up();
switch (swap_layer)
{
case LCD_LAYER0_ENABLE:
width=GET_LCD_LAYER0_WINDOW_WIDTH;
height=GET_LCD_LAYER0_WINDOW_HEIGHT;
SET_LCD_LAYER0_WINDOW_SIZE(height,width);
break;
case LCD_LAYER1_ENABLE:
width=GET_LCD_LAYER1_WINDOW_WIDTH;
height=GET_LCD_LAYER1_WINDOW_HEIGHT;
SET_LCD_LAYER1_WINDOW_SIZE(height,width);
break;
case LCD_LAYER2_ENABLE:
width=GET_LCD_LAYER2_WINDOW_WIDTH;
height=GET_LCD_LAYER2_WINDOW_HEIGHT;
SET_LCD_LAYER2_WINDOW_SIZE(height,width);
break;
case LCD_LAYER3_ENABLE:
width=GET_LCD_LAYER3_WINDOW_WIDTH;
height=GET_LCD_LAYER3_WINDOW_HEIGHT;
SET_LCD_LAYER3_WINDOW_SIZE(height,width);
break;
#if (defined(MT6228)||defined(MT6229))
case LCD_LAYER4_ENABLE:
width=GET_LCD_LAYER4_WINDOW_WIDTH;
height=GET_LCD_LAYER4_WINDOW_HEIGHT;
SET_LCD_LAYER4_WINDOW_SIZE(height,width);
break;
case LCD_LAYER5_ENABLE:
width=GET_LCD_LAYER5_WINDOW_WIDTH;
height=GET_LCD_LAYER5_WINDOW_HEIGHT;
SET_LCD_LAYER5_WINDOW_SIZE(height,width);
break;
#endif
}
#endif
}
void set_lcd_layer_roate(kal_uint32 rotate_layer,kal_uint8 rotate_value)
{
#if (defined(MT6217)||defined(MT6219)||defined(MT6226)||defined(MT6226M)||defined(MT6227)||defined(MT6228)||defined(MT6229))
lcd_power_up();
if (rotate_value<=LCD_LAYER_MIRROR_ROTATE_270)
{
current_lcd_hw_update_layer=rotate_layer;
switch (rotate_layer)
{
case LCD_LAYER0_ENABLE:
lcd_rotate_value=GET_LCD_LAYER0_ROTATE;
SET_LCD_LAYER0_ROTATE(rotate_value);
break;
case LCD_LAYER1_ENABLE:
lcd_rotate_value=GET_LCD_LAYER1_ROTATE;
SET_LCD_LAYER1_ROTATE(rotate_value);
break;
case LCD_LAYER2_ENABLE:
lcd_rotate_value=GET_LCD_LAYER2_ROTATE;
SET_LCD_LAYER2_ROTATE(rotate_value);
break;
case LCD_LAYER3_ENABLE:
lcd_rotate_value=GET_LCD_LAYER3_ROTATE;
SET_LCD_LAYER3_ROTATE(rotate_value);
break;
#if (defined(MT6228)||defined(MT6229))
case LCD_LAYER4_ENABLE:
lcd_rotate_value=GET_LCD_LAYER4_ROTATE;
SET_LCD_LAYER4_ROTATE(rotate_value);
break;
case LCD_LAYER5_ENABLE:
lcd_rotate_value=GET_LCD_LAYER5_ROTATE;
SET_LCD_LAYER5_ROTATE(rotate_value);
break;
#endif
}
}
#endif
} /* set_lcd_layer_roate() */
void resume_lcd_layer_rotate(void)
{
#if (defined(MT6217)||defined(MT6219)||defined(MT6226)||defined(MT6226M)||defined(MT6227)||defined(MT6228)||defined(MT6229))
lcd_power_up();
switch (current_lcd_hw_update_layer)
{
case LCD_LAYER0_ENABLE:
SET_LCD_LAYER0_ROTATE(lcd_rotate_value);
break;
case LCD_LAYER1_ENABLE:
SET_LCD_LAYER1_ROTATE(lcd_rotate_value);
break;
case LCD_LAYER2_ENABLE:
SET_LCD_LAYER2_ROTATE(lcd_rotate_value);
break;
case LCD_LAYER3_ENABLE:
SET_LCD_LAYER3_ROTATE(lcd_rotate_value);
break;
#if (defined(MT6228)||defined(MT6229))
case LCD_LAYER4_ENABLE:
SET_LCD_LAYER4_ROTATE(lcd_rotate_value);
break;
case LCD_LAYER5_ENABLE:
SET_LCD_LAYER5_ROTATE(lcd_rotate_value);
break;
#endif
}
current_lcd_hw_update_layer=0;
lcd_rotate_value=0;
#endif
} /* resume_lcd_layer_rotate() */
/*************************************************************************
* FUNCTION
* config_lcd_layer_window_queue
*
* DESCRIPTION
* This function is to configure the layer parameters in the layer parameter queue
* for LCD multi-layer structure.
*
* CALLS
*
* PARAMETERS
* None
*
* RETURNS
*
*
* GLOBALS AFFECTED
* lcd_layer_data[].layer_update_queue will be set as KAL_FALSE
**************************************************************************/
void config_lcd_layer_window_queue(void)
{
#if (defined(MT6217)||defined(MT6218B)||defined(MT6219)||defined(MT6226)||defined(MT6226M)||defined(MT6227)||defined(MT6228)||defined(MT6229))
kal_uint8 i;
kal_uint32 lcd_layer_base_addr=LCD_LAYER0_BASE_ADDR;
kal_uint32 lcd_layer_ctrl_reg;
lcd_power_up();
for (i=0;i<LCD_TOTAL_LAYER;i++)
{
if (lcd_layer_data[i].layer_update_queue==KAL_TRUE)
{
lcd_layer_base_addr+=i*LCD_LAYER_ADDR_OFFSET;
#if (defined(MT6217)||defined(MT6218B)||defined(MT6219)||defined(MT6226)||defined(MT6226M)||defined(MT6227))
lcd_layer_ctrl_reg=((lcd_layer_data[i].source_key&0xFFFF)<< 16);
lcd_layer_ctrl_reg |= ((lcd_layer_data[i].opacity_value)<<3);
if (lcd_layer_data[i].color_palette_enable)
lcd_layer_ctrl_reg |= LCD_LAYER_CTRL_LUT_ENABLE_BIT;
#elif (defined(MT6228)||defined(MT6229))
lcd_layer_ctrl_reg = (lcd_layer_data[i].opacity_value);
#endif
#if (!defined(MT6218B))
lcd_layer_ctrl_reg |= (lcd_layer_data[i].rotate_value<<11);
#endif
#if (defined(MT6217)||defined(MT6218B)||defined(MT6219))
if (lcd_layer_data[i].color_palette_select)
lcd_layer_ctrl_reg |= LCD_LAYER_CTRL_LUT1_SELECT_BIT;
#endif
if (lcd_layer_data[i].source_key_enable)
lcd_layer_ctrl_reg |= LCD_LAYER_CTRL_SOURCE_KEY_ENABLE_BIT;
if (lcd_layer_data[i].opacity_enable)
lcd_layer_ctrl_reg |= LCD_LAYER_CTRL_OPACITY_ENABLE_BIT;
#if (defined(MT6217)||defined(MT6218B)||defined(MT6219)||defined(MT6226)||defined(MT6226M)||defined(MT6227))
DRV_WriteReg32(lcd_layer_base_addr+0x04,(lcd_layer_data[i].x_offset)|(lcd_layer_data[i].y_offset<<16));
DRV_WriteReg32(lcd_layer_base_addr+0x08,lcd_layer_data[i].frame_buffer_address);
DRV_WriteReg32(lcd_layer_base_addr+0x0C,(lcd_layer_data[i].column_number)|(lcd_layer_data[i].row_number<<16));
#elif (defined(MT6228)||defined(MT6229))
lcd_layer_ctrl_reg |= (lcd_layer_data[i].source_color_format << 9);
DRV_WriteReg32(lcd_layer_base_addr+0x04,(lcd_layer_data[i].source_key));
DRV_WriteReg32(lcd_layer_base_addr+0x08,(lcd_layer_data[i].x_offset)|(lcd_layer_data[i].y_offset<<16));
DRV_WriteReg32(lcd_layer_base_addr+0xC,lcd_layer_data[i].frame_buffer_address);
DRV_WriteReg32(lcd_layer_base_addr+0x10,(lcd_layer_data[i].column_number)|(lcd_layer_data[i].row_number<<16));
#endif
DRV_WriteReg32(lcd_layer_base_addr,lcd_layer_ctrl_reg);
lcd_layer_data[i].layer_update_queue=KAL_FALSE;
}
}
lcd_power_down();
#endif
} /* config_lcd_layer_window_queue() */
/*************************************************************************
* FUNCTION
* config_lcd_layer_window
*
* DESCRIPTION
* This function is to configure the layer parameters for LCD multi-layer structure.
*
* CALLS
*
* PARAMETERS
* lcd_layer : configured layer (from LCD_LAYER0 to LCD_LAYER3)
* layer_data : the parameters for lcd_layer
*
* RETURNS
* return KAL_TRUE if configure successful
*
* GLOBALS AFFECTED
* none
**************************************************************************/
kal_bool config_lcd_layer_window(kal_uint8 lcd_layer,lcd_layer_struct *layer_data)
{ /* LCM independent */
#if (defined(MT6217)||defined(MT6218B)||defined(MT6219)||defined(MT6226)||defined(MT6226M)||defined(MT6227)||defined(MT6228)||defined(MT6229))
kal_uint32 lcd_layer_base_addr=LCD_LAYER0_BASE_ADDR;
kal_uint32 lcd_layer_ctrl_reg;
if (lcd_layer>=LCD_TOTAL_LAYER)
ASSERT(0);
if (layer_data->opacity_enable)
{
if (layer_data->opacity_value>LCD_MAX_OPACITY)
ASSERT(0);
}
#if (defined(MT6217)||defined(MT6218B)||defined(MT6219)||defined(MT6226)||defined(MT6226M)||defined(MT6227))
if (layer_data->color_palette_enable)
{
#if (defined(MT6226)||defined(MT6226M)||defined(MT6227))
if (layer_data->color_palette_select>LCD_COLOR_PALETTE0)
ASSERT(0);
#else
if (layer_data->color_palette_select>LCD_COLOR_PALETTE1)
ASSERT(0);
#endif
}
#endif /* for MT6226,MT6227, MT6228 and MT6229, only support one color palette */
#if (defined(MT6217)||defined(MT6218B))
if (LCD_IS_RUNNING)
{
IRQMask(IRQ_LCD_CODE);
lcd_layer_data[lcd_layer].layer_update_queue=KAL_TRUE;
lcd_layer_data[lcd_layer].source_key_enable=layer_data->source_key_enable;
lcd_layer_data[lcd_layer].color_palette_enable=layer_data->color_palette_enable;
lcd_layer_data[lcd_layer].opacity_enable=layer_data->opacity_enable;
lcd_layer_data[lcd_layer].color_palette_select=layer_data->color_palette_select;
lcd_layer_data[lcd_layer].opacity_value=layer_data->opacity_value;
lcd_layer_data[lcd_layer].rotate_value=layer_data->rotate_value;
lcd_layer_data[lcd_layer].source_key=layer_data->source_key;
lcd_layer_data[lcd_layer].x_offset=layer_data->x_offset;
lcd_layer_data[lcd_layer].y_offset=layer_data->y_offset;
lcd_layer_data[lcd_layer].row_number=layer_data->row_number;
lcd_layer_data[lcd_layer].column_number=layer_data->column_number;
lcd_layer_data[lcd_layer].frame_buffer_address=layer_data->frame_buffer_address;
IRQUnmask(IRQ_LCD_CODE);
return KAL_TRUE;
}
#elif (defined(MT6219)||defined(MT6226)||defined(MT6226M)||defined(MT6227))
#ifndef DUAL_LCD
if ((main_lcd_operation_state!=LCD_STANDBY_STATE)&&
(main_lcd_operation_state!=LCD_SW_UPDATE_STATE)&&
(main_lcd_operation_state!=LCD_HW_UPDATE_STATE)&&
(main_lcd_operation_state!=LCD_DC_UPDATE_STATE)&&
(main_lcd_operation_state!=LCD_SLEEP_STATE))
ASSERT(0);
#else
if (current_update_lcd==MAIN_LCD)
{
if ((main_lcd_operation_state!=LCD_STANDBY_STATE)&&
(main_lcd_operation_state!=LCD_SW_UPDATE_STATE)&&
(main_lcd_operation_state!=LCD_HW_UPDATE_STATE)&&
(main_lcd_operation_state!=LCD_DC_UPDATE_STATE)&&
(main_lcd_operation_state!=LCD_SLEEP_STATE))
ASSERT(0);
}
else
{
if ((sub_lcd_operation_state!=LCD_STANDBY_STATE)&&
(sub_lcd_operation_state!=LCD_SW_UPDATE_STATE)&&
(sub_lcd_operation_state!=LCD_HW_UPDATE_STATE)&&
(sub_lcd_operation_state!=LCD_DC_UPDATE_STATE)&&
(sub_lcd_operation_state!=LCD_SLEEP_STATE))
ASSERT(0);
}
#endif /* DUAL_LCD */
#elif (defined(MT6228)||defined(MT6229))
#ifndef DUAL_LCD
if ((main_lcd_operation_state!=LCD_STANDBY_STATE)&&
(main_lcd_operation_state!=LCD_SW_UPDATE_STATE)&&
(main_lcd_operation_state!=LCD_HW_UPDATE_STATE)&&
(main_lcd_operation_state!=LCD_DC_UPDATE_STATE)&&
(main_lcd_operation_state!=LCD_SLEEP_STATE)&&
(main_lcd_operation_state!=LCD_DC_UPDATE_SLEEP_STATE)&&
(main_lcd_operation_state!=LCD_HW_UPDATE_SLEEP_STATE))
ASSERT(0);
#else
if (current_update_lcd==MAIN_LCD)
{
if ((main_lcd_operation_state!=LCD_STANDBY_STATE)&&
(main_lcd_operation_state!=LCD_SW_UPDATE_STATE)&&
(main_lcd_operation_state!=LCD_HW_UPDATE_STATE)&&
(main_lcd_operation_state!=LCD_DC_UPDATE_STATE)&&
(main_lcd_operation_state!=LCD_SLEEP_STATE)&&
(main_lcd_operation_state!=LCD_DC_UPDATE_SLEEP_STATE)&&
(main_lcd_operation_state!=LCD_HW_UPDATE_SLEEP_STATE))
ASSERT(0);
}
else
{
if ((sub_lcd_operation_state!=LCD_STANDBY_STATE)&&
(sub_lcd_operation_state!=LCD_SW_UPDATE_STATE)&&
(sub_lcd_operation_state!=LCD_HW_UPDATE_STATE)&&
(sub_lcd_operation_state!=LCD_DC_UPDATE_STATE)&&
(sub_lcd_operation_state!=LCD_SLEEP_STATE)&&
(sub_lcd_operation_state!=LCD_DC_UPDATE_SLEEP_STATE)&&
(sub_lcd_operation_state!=LCD_HW_UPDATE_SLEEP_STATE))
ASSERT(0);
}
#endif /* DUAL_LCD */
#endif
lcd_power_up();
lcd_layer_base_addr+=lcd_layer*LCD_LAYER_ADDR_OFFSET;
#if (defined(MT6217)||defined(MT6218B)||defined(MT6219)||defined(MT6226)||defined(MT6226M)||defined(MT6227))
lcd_layer_ctrl_reg=(layer_data->source_key << 16);
#else
lcd_layer_ctrl_reg=0;
#endif
if (layer_data->source_key_enable)
lcd_layer_ctrl_reg |= LCD_LAYER_CTRL_SOURCE_KEY_ENABLE_BIT;
#if (defined(MT6217)||defined(MT6218B)||defined(MT6219)||defined(MT6226)||defined(MT6226M)||defined(MT6227))
if (layer_data->color_palette_enable)
lcd_layer_ctrl_reg |= LCD_LAYER_CTRL_LUT_ENABLE_BIT;
if (layer_data->color_palette_select)
lcd_layer_ctrl_reg |= LCD_LAYER_CTRL_LUT1_SELECT_BIT;
#endif
if (layer_data->opacity_enable)
lcd_layer_ctrl_reg |= LCD_LAYER_CTRL_OPACITY_ENABLE_BIT;
#if (defined(MT6217)||defined(MT6218B)||defined(MT6219)||defined(MT6226)||defined(MT6226M)||defined(MT6227))
lcd_layer_ctrl_reg |= ((layer_data->opacity_value)<<3);
#else
lcd_layer_ctrl_reg |= (layer_data->opacity_value);
#endif
#if (defined(MT6217)||defined(MT6219)||defined(MT6226)||defined(MT6226M)||defined(MT6227)||defined(MT6228)||defined(MT6229))
if (layer_data->rotate_value>LCD_LAYER_MIRROR_ROTATE_270)
ASSERT(0);
lcd_layer_ctrl_reg |= ((layer_data->rotate_value)<<11);
#endif
#if (defined(MT6228)||defined(MT6229))
if (layer_data->source_color_format>LCD_LAYER_SOURCE_MONO)
ASSERT(0);
#ifdef DUAL_LCD
if ((main_lcd_operation_state==LCD_DC_UPDATE_STATE)||
(main_lcd_operation_state==LCD_DC_UPDATE_SLEEP_STATE)||
(sub_lcd_operation_state==LCD_DC_UPDATE_STATE)||
(sub_lcd_operation_state==LCD_DC_UPDATE_SLEEP_STATE))
#else
if ((main_lcd_operation_state==LCD_DC_UPDATE_STATE)||
(main_lcd_operation_state==LCD_DC_UPDATE_SLEEP_STATE))
#endif
{
if ((LCD_LAYER0_ENABLE>>lcd_layer)!=GET_LCD_DIRECT_COUPLE_LAYER)
{
if (layer_data->source_color_format!=LCD_LAYER_SOURCE_MONO)
lcd_layer_ctrl_reg |= (layer_data->source_color_format<<9);
}
else
lcd_layer_ctrl_reg |= (DRV_Reg(lcd_layer_base_addr) & LCD_LAYER_CTRL_COLOR_FORMAT_MASK);
}
else
{
if (layer_data->source_color_format!=LCD_LAYER_SOURCE_MONO)
lcd_layer_ctrl_reg |= (layer_data->source_color_format<<9);
}
#endif
DRV_WriteReg32(lcd_layer_base_addr,lcd_layer_ctrl_reg);
#if (defined(MT6217)||defined(MT6218B)||defined(MT6219)||defined(MT6226)||defined(MT6226M)||defined(MT6227))
DRV_WriteReg32(lcd_layer_base_addr+4,(layer_data->x_offset)|(layer_data->y_offset<<16));
DRV_WriteReg32(lcd_layer_base_addr+8,layer_data->frame_buffer_address);
DRV_WriteReg32(lcd_layer_base_addr+0x0C,(layer_data->column_number)|(layer_data->row_number<<16));
#elif (defined(MT6228)||defined(MT6229))
DRV_WriteReg32(lcd_layer_base_addr+0x04,layer_data->source_key);
DRV_WriteReg32(lcd_layer_base_addr+0x08,(layer_data->x_offset)|(layer_data->y_offset<<16));
DRV_WriteReg32(lcd_layer_base_addr+0x0C,layer_data->frame_buffer_address);
DRV_WriteReg32(lcd_layer_base_addr+0x10,(layer_data->column_number)|(layer_data->row_number<<16));
#endif
lcd_power_down();
return KAL_TRUE;
#elif (defined(MT6205B)||defined(MT6208))
lcd_frame_buffer_address=layer_data->frame_buffer_address;
#endif /* MT6218B, MT6219 */
} /* config_lcd_layer_window() */
void config_lcd_layer_offset(kal_uint8 lcd_layer, kal_uint16 layer_offset_x, kal_uint16 layer_offset_y)
{
#if (defined(MT6217)||defined(MT6218B)||defined(MT6219)||defined(MT6226)||defined(MT6226M)||defined(MT6227)||defined(MT6228)||defined(MT6229))
switch (lcd_layer)
{
case LCD_LAYER0:
SET_LCD_LAYER0_WINDOW_OFFSET(layer_offset_x,layer_offset_y);
break;
case LCD_LAYER1:
SET_LCD_LAYER1_WINDOW_OFFSET(layer_offset_x,layer_offset_y);
break;
case LCD_LAYER2:
SET_LCD_LAYER2_WINDOW_OFFSET(layer_offset_x,layer_offset_y);
break;
case LCD_LAYER3:
SET_LCD_LAYER3_WINDOW_OFFSET(layer_offset_x,layer_offset_y);
break;
#if (defined(MT6228)||defined(MT6229))
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -