nt9856x/code/hdal/ext_devices/panel/display_panel/dispdev_panlcomn.c
2023-03-28 15:07:53 +08:00

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