313 lines
12 KiB
C
Executable File
313 lines
12 KiB
C
Executable File
/*
|
|
panel device open/close Common control.
|
|
|
|
@file dispdev_panlcomn.c
|
|
@ingroup
|
|
@note Nothing
|
|
|
|
Copyright Novatek Microelectronics Corp. 2011. All rights reserved.
|
|
*/
|
|
#include "dispdev_panlcomn.h"
|
|
|
|
|
|
/*
|
|
Set Display open
|
|
|
|
Open the specified display engine with the specified engine parameters.
|
|
*/
|
|
ER dispdev_set_display(DISPDEV_IOCTRL p_disp_dev_control, T_LCD_INF lcd_inf, T_LCD_PARAM *p_mode, PINMUX_FUNC_ID pin_func_id)
|
|
{
|
|
UINT32 pinmux_value;
|
|
T_IDE_PARAM *p_ide = &p_mode->ide;
|
|
T_PANEL_PARAM *p_panel = &p_mode->panel;
|
|
//UINT32 ui_src_clk_freq;
|
|
DISPDEV_IOCTRL_PARAM dev_io_ctrl;
|
|
BOOL b_ycc8bit;
|
|
|
|
//DBG_IND("dispdev_set_display START 1 [0x%08x] 0x%08x\r\n", p_ide->pinmux_select_lcd, *(UINT32 *)0xF0010008);
|
|
|
|
dispdev_platform_set_pinmux(pin_func_id, p_ide->pinmux_select_lcd);
|
|
|
|
//DBG_IND("dispdev_set_display START 2 [0x%08x] 0x%08x\r\n", p_ide->pinmux_select_lcd, *(UINT32 *)0xF0010008);
|
|
|
|
p_disp_dev_control(DISPDEV_IOCTRL_GET_SRCCLK, &dev_io_ctrl);
|
|
/*if( dev_io_ctrl.SEL.GET_SRCCLK.src_clk == DISPCTRL_SRCCLK_MI_ENGINE)
|
|
{
|
|
// This path is for MI engine DRAM direct path display object
|
|
dev_io_ctrl.SEL.SET_DISPSIZE.ui_buf_width = p_panel->ui_buffer_width;
|
|
dev_io_ctrl.SEL.SET_DISPSIZE.ui_buf_height = p_panel->ui_buffer_height;
|
|
dev_io_ctrl.SEL.SET_DISPSIZE.ui_win_width = p_panel->ui_window_width;
|
|
dev_io_ctrl.SEL.SET_DISPSIZE.ui_win_height = p_panel->ui_window_height;
|
|
p_disp_dev_control(DISPDEV_IOCTRL_SET_DISPSIZE, &dev_io_ctrl);
|
|
return E_OK;
|
|
}*/
|
|
|
|
// Make sure ide Disable
|
|
p_disp_dev_control(DISPDEV_IOCTRL_GET_ENABLE, &dev_io_ctrl);
|
|
if (dev_io_ctrl.SEL.GET_ENABLE.b_en == TRUE) {
|
|
UINT32 logo_en=0;
|
|
p_disp_dev_control(DISPDEV_IOCTRL_GET_LOGOMODE, &dev_io_ctrl);
|
|
logo_en = (int) dev_io_ctrl.SEL.GET_LOGOMODE.b_en_logo;
|
|
if(logo_en==0)
|
|
{
|
|
dev_io_ctrl.SEL.SET_ENABLE.b_en = FALSE;
|
|
p_disp_dev_control(DISPDEV_IOCTRL_SET_ENABLE, &dev_io_ctrl);
|
|
p_disp_dev_control(DISPDEV_IOCTRL_WAIT_FRAMEEND, NULL);
|
|
}
|
|
else
|
|
p_disp_dev_control(DISPDEV_IOCTRL_KEEP_LOGO_SETTING, &dev_io_ctrl);
|
|
}
|
|
|
|
if (lcd_inf == T_LCD_INF_SERIAL_8BITS) {
|
|
switch (p_panel->lcd_mode) {
|
|
case PINMUX_LCDMODE_RGB_SERIAL:
|
|
dev_io_ctrl.SEL.SET_DEVICE.disp_dev_type = DISPDEV_TYPE_RGB_SERIAL;
|
|
break;
|
|
case PINMUX_LCDMODE_YUV640:
|
|
case PINMUX_LCDMODE_YUV720:
|
|
dev_io_ctrl.SEL.SET_DEVICE.disp_dev_type = DISPDEV_TYPE_YUV;
|
|
break;
|
|
case PINMUX_LCDMODE_RGBD360:
|
|
case PINMUX_LCDMODE_RGBD320:
|
|
dev_io_ctrl.SEL.SET_DEVICE.disp_dev_type = DISPDEV_TYPE_RGBD;
|
|
break;
|
|
case PINMUX_LCDMODE_RGB_THROUGH:
|
|
dev_io_ctrl.SEL.SET_DEVICE.disp_dev_type = DISPDEV_TYPE_RGB_THROUGH;
|
|
break;
|
|
case PINMUX_LCDMODE_CCIR601:
|
|
dev_io_ctrl.SEL.SET_DEVICE.disp_dev_type = DISPDEV_TYPE_CCIR601_8BIT;
|
|
break;
|
|
case PINMUX_LCDMODE_CCIR656:
|
|
dev_io_ctrl.SEL.SET_DEVICE.disp_dev_type = DISPDEV_TYPE_CCIR656_8BIT;
|
|
break;
|
|
default:
|
|
DBG_ERR("Invalid lcd_mode %d lcd_inf %d\r\n", (int)p_panel->lcd_mode, (int)lcd_inf);
|
|
return E_NOSPT;
|
|
}
|
|
p_disp_dev_control(DISPDEV_IOCTRL_SET_DEVICE, &dev_io_ctrl);
|
|
|
|
} else if (lcd_inf == T_LCD_INF_MI) {
|
|
if ((p_panel->lcd_mode >= PINMUX_LCDMODE_MI_FMT0) && (p_panel->lcd_mode <= PINMUX_LCDMODE_MI_SERIAL_SEP)) {
|
|
dev_io_ctrl.SEL.SET_DEVICE.disp_dev_type = DISPDEV_TYPE_MI;
|
|
p_disp_dev_control(DISPDEV_IOCTRL_SET_DEVICE, &dev_io_ctrl);
|
|
} else {
|
|
DBG_ERR("Invalid lcd_mode %d lcd_inf %d\r\n", (int)p_panel->lcd_mode, (int)lcd_inf);
|
|
}
|
|
} else if (lcd_inf == T_LCD_INF_MIPI_DSI) {
|
|
dev_io_ctrl.SEL.SET_DEVICE.disp_dev_type = DISPDEV_TYPE_EMBD_MIPIDSI;
|
|
p_disp_dev_control(DISPDEV_IOCTRL_SET_DEVICE, &dev_io_ctrl);
|
|
} else if (lcd_inf == T_LCD_INF_PARALLEL_16BITS) {
|
|
switch (p_panel->lcd_mode) {
|
|
case PINMUX_LCDMODE_RGB_PARALL:
|
|
dev_io_ctrl.SEL.SET_DEVICE.disp_dev_type = DISPDEV_TYPE_RGB_PARALL;
|
|
break;
|
|
case PINMUX_LCDMODE_RGB_PARALL666:
|
|
dev_io_ctrl.SEL.SET_DEVICE.disp_dev_type = DISPDEV_TYPE_RGB_PARALL;
|
|
break;
|
|
case PINMUX_LCDMODE_RGB_PARALL565:
|
|
dev_io_ctrl.SEL.SET_DEVICE.disp_dev_type = DISPDEV_TYPE_RGB_PARALL;
|
|
break;
|
|
case PINMUX_LCDMODE_RGB_PARALL_DELTA:
|
|
dev_io_ctrl.SEL.SET_DEVICE.disp_dev_type = DISPDEV_TYPE_RGBDELTA_16BIT;
|
|
break;
|
|
case PINMUX_LCDMODE_CCIR601:
|
|
dev_io_ctrl.SEL.SET_DEVICE.disp_dev_type = DISPDEV_TYPE_CCIR601_16BIT;
|
|
break;
|
|
case PINMUX_LCDMODE_CCIR656:
|
|
dev_io_ctrl.SEL.SET_DEVICE.disp_dev_type = DISPDEV_TYPE_CCIR656_16BIT;
|
|
break;
|
|
case PINMUX_LCDMODE_RGB_THROUGH:
|
|
dev_io_ctrl.SEL.SET_DEVICE.disp_dev_type = DISPDEV_TYPE_RGB_THROUGH;
|
|
break;
|
|
default:
|
|
DBG_ERR("Invalid lcd_mode %d lcd_inf %d\r\n", (int)p_panel->lcd_mode, (int)lcd_inf);
|
|
return E_NOSPT;
|
|
}
|
|
p_disp_dev_control(DISPDEV_IOCTRL_SET_DEVICE, &dev_io_ctrl);
|
|
|
|
} else {
|
|
DBG_ERR("lcd_inf Has not implemented!(%d)\r\n", (int)lcd_inf);
|
|
return E_NOSPT;
|
|
}
|
|
|
|
DBG_IND("YCbCrFormat %d pinmux_select_lcd = 0x%08x\r\n", (int)p_panel->b_ycbcr_format, (unsigned int)p_ide->pinmux_select_lcd);
|
|
|
|
if (p_panel->b_ycbcr_format) {
|
|
pinmux_value = p_ide->pinmux_select_lcd & ~(PINMUX_LCD_SEL_FEATURE_MSK);
|
|
if ((pinmux_value == PINMUX_LCD_SEL_CCIR601_16BITS) || (pinmux_value == PINMUX_LCD_SEL_CCIR656_16BITS)) {
|
|
b_ycc8bit = FALSE;
|
|
} else {
|
|
b_ycc8bit = TRUE;
|
|
}
|
|
// set ICST
|
|
dev_io_ctrl.SEL.SET_ICST_EN.b_en = FALSE;
|
|
dev_io_ctrl.SEL.SET_ICST_EN.select = CST_RGB2YCBCR;
|
|
p_disp_dev_control(DISPDEV_IOCTRL_SET_ICST_EN, &dev_io_ctrl);
|
|
} else {
|
|
b_ycc8bit = FALSE;
|
|
// set ICST
|
|
dev_io_ctrl.SEL.SET_ICST_EN.b_en = TRUE;
|
|
dev_io_ctrl.SEL.SET_ICST_EN.select = CST_YCBCR2RGB;
|
|
p_disp_dev_control(DISPDEV_IOCTRL_SET_ICST_EN, &dev_io_ctrl);
|
|
}
|
|
|
|
// set clock rate
|
|
DBG_IND("set clock rate = %d Hz\r\n", (int)p_panel->fd_clk);
|
|
dev_io_ctrl.SEL.SET_CLK_FREQ.ui_freq = p_panel->fd_clk;
|
|
dev_io_ctrl.SEL.SET_CLK_FREQ.b_ycc8bit = b_ycc8bit;
|
|
DBG_IND("dev_io_ctrl.SEL.SET_CLK_FREQ.b_ycc8bit = %d\r\n", (int)dev_io_ctrl.SEL.SET_CLK_FREQ.b_ycc8bit);
|
|
p_disp_dev_control(DISPDEV_IOCTRL_SET_CLK_FREQ, &dev_io_ctrl);
|
|
|
|
// enable clock
|
|
dev_io_ctrl.SEL.SET_CLK_EN.b_clk_en = TRUE;
|
|
p_disp_dev_control(DISPDEV_IOCTRL_SET_CLK_EN, &dev_io_ctrl);
|
|
|
|
|
|
dev_io_ctrl.SEL.SET_SRGB_OUTORDER.pix_order = p_ide->pdir;
|
|
dev_io_ctrl.SEL.SET_SRGB_OUTORDER.odd_start = p_ide->odd;
|
|
dev_io_ctrl.SEL.SET_SRGB_OUTORDER.even_start = p_ide->even;
|
|
p_disp_dev_control(DISPDEV_IOCTRL_SET_SRGB_OUTORDER, &dev_io_ctrl);
|
|
|
|
dev_io_ctrl.SEL.SET_DITHER_EN.b_en = p_ide->dithering[0];
|
|
dev_io_ctrl.SEL.SET_DITHER_EN.b_free_run = p_ide->dithering[1];
|
|
dev_io_ctrl.SEL.SET_DITHER_EN.r_bits = p_ide->dither_bits[0];
|
|
dev_io_ctrl.SEL.SET_DITHER_EN.g_bits = p_ide->dither_bits[1];
|
|
dev_io_ctrl.SEL.SET_DITHER_EN.b_bits = p_ide->dither_bits[2];
|
|
p_disp_dev_control(DISPDEV_IOCTRL_SET_DITHER_EN, &dev_io_ctrl);
|
|
|
|
|
|
dev_io_ctrl.SEL.SET_SYNC_INVERT.b_hs_inv = p_ide->hsinv;
|
|
dev_io_ctrl.SEL.SET_SYNC_INVERT.b_vs_inv = p_ide->vsinv;
|
|
dev_io_ctrl.SEL.SET_SYNC_INVERT.b_clk_inv = p_ide->clkinv;
|
|
p_disp_dev_control(DISPDEV_IOCTRL_SET_SYNC_INVERT, &dev_io_ctrl);
|
|
|
|
|
|
dev_io_ctrl.SEL.SET_VLD_INVERT.b_hvld_inv = p_ide->hvldinv;
|
|
dev_io_ctrl.SEL.SET_VLD_INVERT.b_vvld_inv = p_ide->vvldinv;
|
|
dev_io_ctrl.SEL.SET_VLD_INVERT.b_field_inv = p_ide->fieldinv;
|
|
dev_io_ctrl.SEL.SET_VLD_INVERT.b_de_inv = FALSE;
|
|
p_disp_dev_control(DISPDEV_IOCTRL_SET_VLD_INVERT, &dev_io_ctrl);
|
|
|
|
|
|
if (p_panel->b_ycbcr_format) {
|
|
if ((p_ide->pinmux_select_lcd == PINMUX_LCD_SEL_CCIR601_16BITS) || (p_ide->pinmux_select_lcd == PINMUX_LCD_SEL_CCIR656_16BITS)) {
|
|
dev_io_ctrl.SEL.SET_WINDOW_H_TIMING.ui_hsync = p_panel->ui_hsync_sync_width;
|
|
dev_io_ctrl.SEL.SET_WINDOW_H_TIMING.ui_htotal = p_panel->ui_hsync_total_period - 1;
|
|
dev_io_ctrl.SEL.SET_WINDOW_H_TIMING.ui_hvld_start = p_panel->ui_hsync_back_porch;
|
|
dev_io_ctrl.SEL.SET_WINDOW_H_TIMING.ui_hvld_end = (p_panel->ui_hsync_active_period + p_panel->ui_hsync_back_porch) - 1;
|
|
p_disp_dev_control(DISPDEV_IOCTRL_SET_WINDOW_H_TIMING, &dev_io_ctrl);
|
|
} else {
|
|
dev_io_ctrl.SEL.SET_WINDOW_H_TIMING.ui_hsync = p_panel->ui_hsync_sync_width;
|
|
dev_io_ctrl.SEL.SET_WINDOW_H_TIMING.ui_htotal = (p_panel->ui_hsync_total_period >> 1) - 1;
|
|
dev_io_ctrl.SEL.SET_WINDOW_H_TIMING.ui_hvld_start = p_panel->ui_hsync_back_porch >> 1;
|
|
dev_io_ctrl.SEL.SET_WINDOW_H_TIMING.ui_hvld_end = ((p_panel->ui_hsync_active_period + p_panel->ui_hsync_back_porch) >> 1) - 1;
|
|
p_disp_dev_control(DISPDEV_IOCTRL_SET_WINDOW_H_TIMING, &dev_io_ctrl);
|
|
}
|
|
|
|
dev_io_ctrl.SEL.SET_CLK1_2.b_clk1_2 = FALSE;
|
|
p_disp_dev_control(DISPDEV_IOCTRL_SET_CLK1_2, &dev_io_ctrl);
|
|
} else {
|
|
dev_io_ctrl.SEL.SET_WINDOW_H_TIMING.ui_hsync = p_panel->ui_hsync_sync_width;
|
|
dev_io_ctrl.SEL.SET_WINDOW_H_TIMING.ui_htotal = p_panel->ui_hsync_total_period - 1;
|
|
dev_io_ctrl.SEL.SET_WINDOW_H_TIMING.ui_hvld_start = p_panel->ui_hsync_back_porch;
|
|
dev_io_ctrl.SEL.SET_WINDOW_H_TIMING.ui_hvld_end = (p_panel->ui_hsync_active_period + p_panel->ui_hsync_back_porch) - 1;
|
|
p_disp_dev_control(DISPDEV_IOCTRL_SET_WINDOW_H_TIMING, &dev_io_ctrl);
|
|
|
|
if ((p_ide->pinmux_select_lcd == PINMUX_LCD_SEL_RGB_16BITS)) {
|
|
dev_io_ctrl.SEL.SET_CLK1_2.b_clk1_2 = p_ide->clk1_2;
|
|
p_disp_dev_control(DISPDEV_IOCTRL_SET_CLK1_2, &dev_io_ctrl);
|
|
} else {
|
|
dev_io_ctrl.SEL.SET_CLK1_2.b_clk1_2 = FALSE;
|
|
p_disp_dev_control(DISPDEV_IOCTRL_SET_CLK1_2, &dev_io_ctrl);
|
|
}
|
|
}
|
|
|
|
|
|
dev_io_ctrl.SEL.SET_WINDOW_V_TIMING.ui_vsync = p_panel->ui_vsync_sync_width;
|
|
dev_io_ctrl.SEL.SET_WINDOW_V_TIMING.ui_vtotal = p_panel->ui_vsync_total_period - 1;
|
|
dev_io_ctrl.SEL.SET_WINDOW_V_TIMING.ui_vvld_odd_start = p_panel->ui_vsync_back_porch_odd;
|
|
dev_io_ctrl.SEL.SET_WINDOW_V_TIMING.ui_vvld_odd_end = (p_panel->ui_vsync_active_period + p_panel->ui_vsync_back_porch_odd) - 1;
|
|
dev_io_ctrl.SEL.SET_WINDOW_V_TIMING.ui_vvld_even_start = p_panel->ui_vsync_back_porch_even;
|
|
dev_io_ctrl.SEL.SET_WINDOW_V_TIMING.ui_vvld_even_end = (p_panel->ui_vsync_active_period + p_panel->ui_vsync_back_porch_even) - 1;
|
|
p_disp_dev_control(DISPDEV_IOCTRL_SET_WINDOW_V_TIMING, &dev_io_ctrl);
|
|
|
|
|
|
dev_io_ctrl.SEL.SET_WINDOW_OUT_TYPE.b_interlaced = p_ide->interlace;
|
|
dev_io_ctrl.SEL.SET_WINDOW_OUT_TYPE.b_field_odd_st = TRUE;
|
|
p_disp_dev_control(DISPDEV_IOCTRL_SET_WINDOW_OUT_TYPE, &dev_io_ctrl);
|
|
|
|
|
|
dev_io_ctrl.SEL.SET_CSB_EN.b_en = TRUE;
|
|
dev_io_ctrl.SEL.SET_CSB_EN.ui_contrast = p_ide->ctrst;
|
|
dev_io_ctrl.SEL.SET_CSB_EN.ui_saturation = p_ide->cmults;
|
|
dev_io_ctrl.SEL.SET_CSB_EN.ui_brightness = p_ide->brt;
|
|
p_disp_dev_control(DISPDEV_IOCTRL_SET_CSB_EN, &dev_io_ctrl);
|
|
|
|
|
|
dev_io_ctrl.SEL.SET_YC_EXCHG.b_cbcr_exchg = p_ide->cex;
|
|
dev_io_ctrl.SEL.SET_YC_EXCHG.b_yc_exchg = p_ide->yc_ex;
|
|
p_disp_dev_control(DISPDEV_IOCTRL_SET_YC_EXCHG, &dev_io_ctrl);
|
|
|
|
dev_io_ctrl.SEL.SET_CLAMP.ui_clamp = p_ide->clamp;
|
|
p_disp_dev_control(DISPDEV_IOCTRL_SET_CLAMP, &dev_io_ctrl);
|
|
|
|
//ide_set_tv_power_down(p_ide->tv_powerdown);
|
|
|
|
dev_io_ctrl.SEL.SET_DISPSIZE.ui_buf_width = p_panel->ui_buffer_width;
|
|
dev_io_ctrl.SEL.SET_DISPSIZE.ui_buf_height = p_panel->ui_buffer_height;
|
|
dev_io_ctrl.SEL.SET_DISPSIZE.ui_win_width = p_panel->ui_window_width;
|
|
dev_io_ctrl.SEL.SET_DISPSIZE.ui_win_height = p_panel->ui_window_height;
|
|
p_disp_dev_control(DISPDEV_IOCTRL_SET_DISPSIZE, &dev_io_ctrl);
|
|
|
|
dev_io_ctrl.SEL.SET_ENABLE.b_en = TRUE;
|
|
p_disp_dev_control(DISPDEV_IOCTRL_SET_ENABLE, &dev_io_ctrl);
|
|
dispanl_debug(("dispdev_set_display Config Done\r\n"));
|
|
#if 0 //for speed up ,wait in kdrv_vddo_trigger
|
|
//#NT#2012/03/22#Steven Wang -begin
|
|
//#NT#Temp add for DSI
|
|
if (lcd_inf != T_LCD_INF_MIPI_DSI) {
|
|
p_disp_dev_control(DISPDEV_IOCTRL_WAIT_FRAMEEND, NULL);
|
|
}
|
|
//#NT#2012/03/22#Temp add for DSI
|
|
#endif
|
|
dispanl_debug(("dispdev_set_display ide GO\r\n"));
|
|
return E_OK;
|
|
}
|
|
#if defined __KERNEL__
|
|
EXPORT_SYMBOL(dispdev_set_display);
|
|
#endif
|
|
#if 0
|
|
/*
|
|
Display close
|
|
|
|
Close the specified display engine.
|
|
*/
|
|
ER dispdev_close_display(DISPDEV_IOCTRL p_disp_dev_control)
|
|
{
|
|
DISPDEV_IOCTRL_PARAM dev_io_ctrl;
|
|
|
|
dispanl_debug(("DispDevClose\r\n"));
|
|
|
|
dev_io_ctrl.SEL.SET_ENABLE.b_en = FALSE;
|
|
p_disp_dev_control(DISPDEV_IOCTRL_SET_ENABLE, &dev_io_ctrl);
|
|
p_disp_dev_control(DISPDEV_IOCTRL_WAIT_FRAMEEND, NULL);
|
|
|
|
/*
|
|
// Disable ide
|
|
if(p_devif->disp_id == DISP_1)
|
|
{
|
|
p_devif->wait_frm_end();
|
|
pll_disableClock(IDE1_CLK);
|
|
pll_disableClock(IDE2_CLK);
|
|
}
|
|
else if (p_devif->disp_id == DISP_2)
|
|
{
|
|
dispdev_platform_delay_ms(40);
|
|
}
|
|
*/
|
|
|
|
return E_OK;
|
|
}
|
|
#endif
|
|
|