📄 lcd_if.c
字号:
*
* 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)||defined(MT6230))
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)||defined(MT6230))
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)||defined(MT6230))
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)||defined(MT6230))
kal_uint32 lcd_layer_base_addr=LCD_LAYER0_BASE_ADDR;
kal_uint32 lcd_layer_ctrl_reg;
/*For excetpion, we dont need to do the following */
#ifdef __MTK_TARGET__
if(!INT_QueryExceptionStatus())
#endif
{
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 , MT6230, 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)||defined(MT6228)||defined(MT6229)||defined(MT6230)
#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)&&
#if (defined(MT6228)||defined(MT6229)||defined(MT6230))
(main_lcd_operation_state!=LCD_DC_UPDATE_SLEEP_STATE)&&
(main_lcd_operation_state!=LCD_HW_UPDATE_SLEEP_STATE)&&
#endif
(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)&&
#if (defined(MT6228)||defined(MT6229)||defined(MT6230))
(main_lcd_operation_state!=LCD_DC_UPDATE_SLEEP_STATE)&&
(main_lcd_operation_state!=LCD_HW_UPDATE_SLEEP_STATE)&&
#endif
(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)&&
#if (defined(MT6228)||defined(MT6229)||defined(MT6230))
(main_lcd_operation_state!=LCD_DC_UPDATE_SLEEP_STATE)&&
(main_lcd_operation_state!=LCD_HW_UPDATE_SLEEP_STATE)&&
#endif
(sub_lcd_operation_state!=LCD_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)||defined(MT6230))
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)||defined(MT6230))
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)||defined(MT6230))
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() */
/*************************************************************************
* FUNCTION
* config_lcd_layer_offset(
*
* DESCRIPTION
* This function is to layer offset
*
* CALLS
*
* PARAMETERS
* lcd_layer: layer
* layer_offset_x: x offset
* layer_offset_y: y offset
*
* RETURNS
* rotate value
*
* GLOBALS AFFECTED
* none
**************************************************************************/
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)||defined(MT6230))
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)||defined(MT6230))
case LCD_LAYER4:
SET_LCD_LAYER4_WINDOW_OFFSET(layer_offset_x,layer_offset_y);
break;
case LCD_LAYER5:
SET_LCD_LAYER5_WINDOW_OFFSET(layer_offset_x,layer_offset_y);
break;
#endif
}
#endif
} /* config_lcd_layer_offset() */
#if (defined(MT6219)||defined(MT6226)||defined(MT6226M)||defined(MT6227)||defined(MT6228)||defined(MT6229)||defined(MT6230))
void config_lcd_hw_layer(kal_uint32 hw_layer,kal_uint16 layer_offset_x,kal_uint16 layer_offset_y,
kal_uint16 layer_width, kal_uint16 layer_height)
{
} /* config_lcd_hw_layer() */
/*************************************************************************
* FUNCTION
* get_lcd_hw_layer_rotate_value(
*
* DESCRIPTION
* This function is to get hw layer rotate value
*
* CALLS
*
* PARAMETERS
* hw_layer: hw layer
*
* RETURNS
* rotate value
*
* GLOBALS AFFECTED
* none
**************************************************************************/
kal_uint8 get_lcd_hw_layer_rotate_value(kal_uint32 hw_layer)
{
kal_uint8 rotate_value=0;
lcd_power_up();
switch (hw_layer)
{
case LCD_LAYER0_ENABLE:
rotate_value=GET_LCD_LAYER0_ROTATE;
break;
case LCD_LAYER1_ENABLE:
rotate_value=GET_LCD_LAYER1_ROTATE;
break;
case LCD_LAYER2_ENABLE:
rotate_value=GET_LCD_LAYER2_ROTATE;
break;
case LCD_LAYER3_ENABLE:
rotate_value=GET_LCD_LAYER3_ROTATE;
break;
#if (defined(MT6228)||defined(MT6229)||defined(MT6230))
case LCD_LAYER4_ENABLE:
rotate_value=GET_LCD_LAYER4_ROTATE;
break;
case LCD_LAYER5_ENABLE:
rotate_value=GET_LCD_LAYER5_ROTATE;
break;
#endif
}
lcd_power_down();
return rotate_value;
}
#endif
/*************************************************************************
* FUNCTION
* config_lcd_roi_window
*
* DESCRIPTION
* This function configures the ROI window offset and size of LCD interface.
*
* CALLS
*
* PARAMETERS
* roi_x_offset : ROI X offset
* roi_y_offset : ROI Y offset
* roi_column : ROI width
* roi_row : ROI height
*
* RETURNS
* return KAL_TRUE if configure successful
*
* GLOBALS AFFECTED
* none
**************************************************************************/
kal_bool config_lcd_roi_window(kal_uint16 roi_offset_x, kal_uint16 roi_offset_y, kal_uint16 roi_column,
kal_uint16 roi_row)
{ /* LCM independent */
#if (defined(MT6217)||defined(MT6218B)||defined(MT6219)||defined(MT6226)||defined(MT6226M)||defined(MT6227)||defined(MT6228)||defined(MT6229)||defined(MT6230))
#if (defined(MT6217)||defined(MT6218B))
ASSERT(!LCD_IS_RUNNING);
#elif defined(MT6219)||defined(MT6226)||defined(MT6226M)||defined(MT6227)||(defined(MT6228)||defined(MT6229)||defined(MT6230))
#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)&&
#if (defined(MT6228)||defined(MT6229)||defined(MT6230))
(main_lcd_operation_state!=LCD_DC_UPDATE_SLEEP_STATE)&&
(main_lcd_operation_state!=LCD_HW_UPDATE_SLEEP_STATE)&&
#endif
(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)&&
#if (defined(MT6228)||defined(MT6229)||defined(MT6230))
(main_lcd_operation_state!=LCD_DC_UPDATE_SLEEP_STATE)&&
(main_lcd_operation_state!=LCD_HW_UPDATE_SLEEP_STATE)&&
#endif
(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)&&
#if (defined(MT6228)||defined(MT6229)||defined(MT6230))
(main_lcd_operation_state!=LCD_DC_UPDATE_SLEEP_STATE)&&
(main_lcd_operation_state!=LCD_HW_UPDATE_SLEEP_STATE)&&
#endif
(sub_lcd_operation_state!=LCD_SLEEP_STATE))
ASSERT(0);
}
#endif /* DUAL_LCD */
#endif
lcd_power_up();
SET_LCD_ROI_WINDOW_OFFSET(roi_offset_x,roi_offset_y);
SET_LCD_ROI_WINDOW_SIZE(roi_column,roi_row);
lcd_power_down();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -