📄 drvscaler.c
字号:
////////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 2006-2007 MStar Semiconductor, Inc.
// All rights reserved.
//
// Unless otherwise stipulated in writing, any and all information contained
// herein regardless in any format shall remain the sole proprietary of
// MStar Semiconductor Inc. and be kept in strict confidence
// (¨MStar Confidential Information〃) by the recipient.
// Any unauthorized act including without limitation unauthorized disclosure,
// copying, use, reproduction, sale, distribution, modification, disassembling,
// reverse engineering and compiling of the contents of MStar Confidential
// Information is unlawful and strictly prohibited. MStar hereby reserves the
// rights to any and all damages, losses, costs and expenses resulting therefrom.
//
///
///@file drvScaler.h
///@brief Scaler
///@author MStarSemi Inc.
///
///Scaler Control Scaler up or down to display
///Scaler include
///
///Features:
///- Analog RGB Compliant Input ports
///- Auto-Configuration/Auto Detection
///- High Performace Scaling Engine
///- Video Processing & Conversion
///- Output interface
///
///
///@par Example:
///@code
/// //detect if sync is active
/// BOOLEAN msAPI_Scaler_DetectSyncActive ( void )
/// {
/// U8 u8TempSyncStatus;
/// BOOLEAN bResult = FALSE;
///
/// u8TempSyncStatus = MDrv_Scaler_GetInputStatus();
/// if ( !( u8TempSyncStatus & MD_SYNC_LOSS ) ) // check if there is signal or not
/// {
/// bResult = TRUE;
/// }
///
/// return bResult;
/// }
///@endcode
#define DRV_SCALER_C
/******************************************************************************/
/* Header Files */
/* ****************************************************************************/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "chip/compat.h"
#include "board.h"
#include "drvVD.h"
#include "drvMode.h"
#include "drvScaler.h"
#include "panel.h"
#include "drvglobal.h"
#include "drvtimer.h"
#include "drvmiu.h"
#include "hwreg.h"
#include "drvvop.h"
#include "drvsys.h"
#include "drvACE.h"
#include "drvDLC.h"
#include "drvADC.h"
#include "drvScalerTbl.c"
#include "drvAuto.h"
#include "drvAnalog_inline.h"
#include "mreg51.h"
#include "color.h"
#include "msGPIO.h"
#include "drvGPIO.h"
/********************************************************************************/
/* Macro */
/********************************************************************************/
/********************************************************************************/
/* Constant */
/********************************************************************************/
#define MST_H_PERIOD_MASK 0x1FFF
#define MST_V_TOTAL_MASK 0x07FF
#define INPUT_HSYNC_PERIOD_DETECT_MODE 8
#define V_DE_SHIFT_FOR_GARBAGE 1//4
#ifndef MST_LINE_BFF_MAX
#define MST_LINE_BFF_MAX SC_LINE_BUFFER_SIZE
#endif
#define FPLL_SHFIT 4
#define MAIN_FRAME_DELTA 8
// test only, remove later
#define HANDLE_F2_WRITE_BY_DNR 0
#define HANDLE_F2_WRITE_BY_INTERLACE 1
#define HANDLE_F2_WRITE_BY_FREEZE 2
#define HANDLE_F2_WRITE_METHOD HANDLE_F2_WRITE_BY_FREEZE
#define ALGINMENT_SCALER_H_CAP_SIZE(x) ((x+2)&~1)
#define ALGINMENT_SCALER_V_CAP_SIZE(x) (x+2)// kevin 071112_2 //(x+1)
//------------------------
#define NONLINEAR_IP2 0
#define NONLINEAR_OP1 1
#define NONLINEAR_SEL NONLINEAR_IP2
//------------------------
#define DRVSC_DBG(x) //x
#define DRVPORTMSG(x) //x
#define DRVSC_MEM(x) //x
#define DRVSC_RATIO(x) //x
#define MEM_MAP(x) //x
/******************************************************************************/
/* Enum */
/******************************************************************************/
typedef enum
{
NONLINEAR_SCALING_NONE = 0x00,
NONLINEAR_SCALING_480,
NONLINEAR_SCALING_800,
NONLINEAR_SCALING_NUM,
} EN_NONLINEAR_SCALING;
/******************************************************************************/
/* Global Variables */
/******************************************************************************/
static U8 u8IPVsBeforeEnableF2Write = 0;
/******************************************************************************/
/* Local Variables */
/******************************************************************************/
#if (NONLINEAR_SEL == NONLINEAR_IP2)// kevin
code U8 u8HNonLinearPara_TBL[NONLINEAR_SCALING_NUM][6] =
{
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // None
{0x78, 0x50, 0x70, 0x0B, 0x0B, 0x09}, // 480
{0x64, 0x87, 0x64, 0x12, 0x0E, 0x0F}, // 800
};
#else
code U8 u8HNonLinearPara_TBL[NONLINEAR_SCALING_NUM][6] =
{
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // None
{0x1E, 0x1E, 0x3C, 0x90, 0x20, 0x0F}, // 480
{0x32, 0x32, 0x64, 0x92, 0x21, 0x10}, // 800
};
#endif
/******************************************************************************/
/* P r i v a t e F u n c t i o n s */
/******************************************************************************/
/* init */
void MDrv_Scaler_InitVariable(void);
/* MOD */
void MDrv_MOD_PowerOn(void);
void MDrv_MOD_PowerOff(void);
/* DAC */
void MDrv_DAC_PowerOn(void);
void MDrv_DAC_PowerOff(void);
/* panel */
void MDrv_Scaler_SetPanelVCC(BOOLEAN bEnable);
void MDrv_Scaler_SetPanelBacklight(BOOLEAN bEnable);
void MDrv_Scaler_SetPanelOnOff(BOOLEAN bPanelOn);
#if (KEEP_UNUSED_FUNC)
/* gamma */
void MDrv_Scaler_SetGammaTbl(U8 *pGammaR, U8 *pGammaG, U8 *pGammaB);
void MDrv_Scaler_GetGammaTbl(void);
void MDrv_Scaler_SetGamma(BOOLEAN bEnable);
#endif
/* scaling */
void MDrv_Scaler_SetFetchNumberLimit(MS_DISPLAYWINDOW_TYPE *pstDisplayWindow, U16 u16V_Length);
/* window */
/* FPLL */
void MDrv_Scaler_SetFPLL(BOOLEAN bEnable);
/* LPLL */
void MDrv_Scaler_InitLPLL(void);
void MDrv_Scaler_SetOutputDclk(U16 u16OutputVFreq);
/* IP1 control */
//BOOLEAN MDrv_Scaler_DVIClockMissingDetected(void);
/* OP1 control */
void MDrv_Scaler_SetNonLinearScaling(BOOLEAN bCtl);
void MDrv_Scaler_SetDirectionScaling(MS_DISPLAYWINDOW_TYPE *pstDisplayWindow);
/* OP1 scaling ram code*/
void MDrv_Scaler_Get_FilterTbl(MS_SCALING_DRAM dram);
/* PQ */
void MDrv_Scaler_SetDeFlicker(MS_INPUT_SOURCE_TYPE enInputSourceType, BOOLEAN bIsHDTV);
//-----------------------------------------------------------------------------
// init
//-----------------------------------------------------------------------------
void MDrv_Scaler_Init(void)
{
U8 u8Bank;
// SW Rest
MDrv_Scaler_SoftwareResetEx(RST_SCALER_ALL);
// printf essential info
MEM_MAP(printf("\r\n==============================="));
MEM_MAP(printf("\r\n MEM Size: 0x%08lX", MEMOEY_SIZE));
MEM_MAP(printf("\r\n xdata, S=0x%08lX, E=0x%08lX, L=0x%08lX",XD_MAP_BASE_ADR,XD_MAP_LEN,XD_MAP_LEN);)
MEM_MAP(printf("\r\n GE, S=0x%08lX, E=0x%08lX, L=0x%08lX",GE_FRAMEBUFFER_ADR,(GE_FRAMEBUFFER_ADR+GE_FRAMEBUFFER_LEN),GE_FRAMEBUFFER_LEN));
MEM_MAP(printf("\r\n GOP, S=0x%08lX, E=0x%08lX, L=0x%08lX",GOP_GWIN_RB_BASE_ADR,(GOP_GWIN_RB_BASE_ADR+GOP_GWIN_RB_BASE_LEN),GOP_GWIN_RB_BASE_LEN));
MEM_MAP(printf("\r\n FontI, S=0x%08lX, E=0x%08lX, L=0x%08lX",FONT_INFO_POOL_ADR,(FONT_INFO_POOL_ADR+FONT_INFO_POOL_LEN),FONT_INFO_POOL_LEN));
MEM_MAP(printf("\r\n Font, S=0x%08lX, E=0x%08lX, L=0x%08lX",FONT_START_ADR,(FONT_START_ADR+FONT_LEN),FONT_LEN));
MEM_MAP(printf("\r\n BMPI, S=0x%08lX, E=0x%08lX, L=0x%08lX",BMP_INFO_POOL_ADR,(BMP_INFO_POOL_ADR+BMP_INFO_POOL_LEN),BMP_INFO_POOL_LEN));
MEM_MAP(printf("\r\n BMP, S=0x%08lX, E=0x%08lX, L=0x%08lX",BMP_START_ADR,(BMP_START_ADR+BMP_LEN),BMP_LEN));
MEM_MAP(printf("\r\n FBuff, S=0x%08lX, E=0x%08lX, L=0x%08lX",SCALER_DNR_BUF_ADR,(SCALER_DNR_BUF_ADR+SCALER_DNR_BUF_LEN),SCALER_DNR_BUF_LEN));
MEM_MAP(printf("\r\n==============================="));
// Initial varibale
MDrv_Scaler_InitVariable();
u8Bank = MDrv_ReadByte(BK_SELECT_00);
// initiate register
MDrv_WriteRegTbl2(astScalerRegInit);
MDrv_WriteRegTbl(g_SC_DLC_TBL);
// init NR
MDrv_Scaler_InitNR();
// MOD register initiate: control display data
MDrv_MOD_PowerOn();
/* control display clock */
// LPLL register initiate: control display clock
MDrv_Scaler_InitLPLL();
//
// Display Panel Info
//
MDrv_WriteByte(BK_SELECT_00, REG_BANK_VOP);
// output Sync timing
MDrv_Write2Byte(BK_SC_VOP_0C_L, devPanel_HTOTAL() - 1); // output htotal
MDrv_Write2Byte(BK_SC_VOP_0D_L, devPanel_VTOTAL() - 1); // output vtotal
//MDrv_WriteByte(BK_SC_VOP_01_L, pnlGetHSyncWidth()-1); // hsync width
// display timing
// output DE size
MDrv_Write2Byte(BK_SC_VOP_04_L, devPanel_HSTART()); // DE H start
MDrv_Write2Byte(BK_SC_VOP_05_L, devPanel_HSTART() + devPanel_WIDTH() - 1); // DE H end
MDrv_Write2Byte(BK_SC_VOP_06_L, 0); // DE V start
MDrv_Write2Byte(BK_SC_VOP_07_L, 0 + devPanel_HEIGHT() - 1); // DE V end
#if ENABLE_NEW_VSYNC_MODE// kevi 071112_2
MDrv_WriteRegBit(BK_SC_VOP_45_L, 1, _BIT0);// new Vsync mode enable
MDrv_WriteRegBit(BK_OP2_PIP_01_H, 0xC0, 0xC0);// BK_1D01[15:13] = x, x >= 5
#else
MDrv_WriteRegBit(BK_SC_VOP_45_L, 0, _BIT0);
#endif
// main display Window size
MDrv_Write2Byte(BK_SC_VOP_08_L, devPanel_HSTART()); //64
MDrv_Write2Byte(BK_SC_VOP_09_L, devPanel_HSTART() + devPanel_WIDTH() - 1); //863
MDrv_Write2Byte(BK_SC_VOP_0A_L, devPanel_DE_VSTART()); //0
MDrv_Write2Byte(BK_SC_VOP_0B_L, devPanel_DE_VSTART() + devPanel_HEIGHT() - 1); //599
// select clock source
MDrv_WriteByte(BK_CHIPTOP_1A_H, 0x04); // fclk -> MIU
MDrv_WriteByte(BK_CHIPTOP_1B_L, 0x00); // fmclk -> MIU
MDrv_WriteByte(BK_CHIPTOP_1B_H, 0x1C); // odclk -> LPLL
MDrv_WriteByte(BK_CHIPTOP_1C_H, 0x24); // fice clk -> 54 MHz
// output control
MDrv_Write2Byte(BK_SC_VOP_21_L, devPanel_OCTRL());
MDrv_Write2Byte(BK_SC_VOP_46_L, devPanel_OSTRL());
// output driving current
MDrv_WriteByte(BK_SC_VOP_47_L, devPanel_ODRV());
// dither control
MDrv_Write2Byte(BK_SC_VOP_1B_L, devPanel_DITHCTRL());
/* TCON registers are removed from scaler */
#if 0
// TCON register initiate
_MDrv_Scaler_Init_TCON();
#endif
// Init Scaling SRAM code
#if 0// kevin 20070910
MDrv_Scaler_InitFilterTbl(MST_SCALING_SRAM1, SCALING_121);
MDrv_Scaler_InitFilterTbl(MST_SCALING_SRAM2, SCALING_2121);
#else
MDrv_Scaler_InitFilterTbl(MST_SCALING_SRAM1, SCALING_BS_G11);
MDrv_Scaler_InitFilterTbl(MST_SCALING_SRAM2, SCALING_SYNC);
#endif
// ADC register initiate
MDrv_ADC_Init();
// ADC init, ICE & IHC table
MDrv_ACE_Init();
#if ENABLE_DLC
MDrv_DLC_Init(devPanel_WIDTH(), devPanel_HEIGHT(), tDefaultDlcCurveTbl);
#endif
#if 0
// F2 DNR write limit
MDrv_WriteByte(BK_SELECT_00, REG_BANK_DNR);
if (SC_W_LIMIT_TYPE == SC_W_LIMIT_UNIT_16BYTE)
{
MDrv_Write4Byte(BK_SC_DNR_7C_L, (((SCALER_DNR_BUF_ADR + SCALER_DNR_BUF_LEN) / 16) - 2) | 0x2000000);
}
else
{
MDrv_Write4Byte(BK_SC_DNR_7C_L, ((SCALER_DNR_W_BARRIER_ADR / 64) - 1) | 0x800000);
}
#endif
// for Bandwidth
MDrv_WriteByte(BK_SELECT_00, REG_BANK_OPM);
MDrv_Write2Byte(BK_SC_OPM_51_L, 0x1F1F);
MDrv_Write2Byte(BK_SC_OPM_52_L, 0x001F);
// Enable test mode to measure output vsync
//MDrv_WriteByte(BK_MOD_45_L, 0x38);
//MDrv_WriteByte(BK_MOD_46_L, 0x38);
if (devPanel_IsTCON()||(devPanel_Is_ANALOG_TCON()))
{
DRVSC_DBG(printf("\r\nInitial TCON register..."));
MDrv_WriteByte(BK_LPLL_01_H, 0x04);
//MDrv_WriteByte(BK_TCON_01_L, 0x01);
MDrv_WriteByte(BK_TCON_1E_H, SET_OEV2_WIDTH);
MDrv_WriteByte(BK_TCON_1F_L, SET_OEV3_WIDTH);
MDrv_WriteByte(BK_TCON_1F_H, SET_OEV_DELTA);
MDrv_WriteByte(BK_TCON_20_L, SET_PTC_MODE1);
#if ENABLE_NEW_VSYNC_MODE// kevin 071112_2
MDrv_WriteRegBit(BK_TCON_20_L, 0, _BIT2);
#endif
MDrv_WriteByte(BK_TCON_20_H, SET_PTC_MODE2);
MDrv_WriteByte(BK_TCON_21_L, SET_PTC_MODE3);
MDrv_WriteByte(BK_TCON_26_L, SET_FRP_TRAN);
MDrv_WriteByte(BK_TCON_26_H, SET_STH_START);
MDrv_WriteByte(BK_TCON_27_L, SET_STH_WIDTH);
MDrv_WriteByte(BK_TCON_27_H, SET_OEH_START);
MDrv_WriteByte(BK_TCON_28_L, SET_OEH_WIDTH);
MDrv_WriteByte(BK_TCON_28_H, SET_OEV_START);
MDrv_WriteByte(BK_TCON_29_L, SET_OEV_WIDTH);
MDrv_WriteByte(BK_TCON_29_H, SET_CKV_START);
MDrv_WriteByte(BK_TCON_2A_L, SET_CKV_START2);
MDrv_WriteByte(BK_TCON_2A_H, SET_CKV_WIDTH);
MDrv_WriteByte(BK_TCON_2B_L, SET_STV_LINE_TH);
MDrv_WriteByte(BK_TCON_2B_H, SET_STV_START);
MDrv_WriteByte(BK_TCON_2C_L, SET_STV_WIDTH);
MDrv_WriteByte(BK_TCON_2C_H, SET_OEV2_START);
MDrv_WriteByte(BK_TCON_2D_L, SET_OEV3_START);
MDrv_WriteByte(BK_TCON_2D_H, SET_H_ST_DLY_L);
MDrv_WriteByte(BK_TCON_2E_L, SET_H_ST_DLY_H);
MDrv_WriteByte(BK_TCON_2E_H, SET_CLK_DLY_SYNC_OUT);
MDrv_WriteByte(BK_TCON_2F_L, SET_CKV_END2);
MDrv_WriteByte(BK_TCON_2F_H, SET_Q1H);
#if PANEL_ATCON
MDrv_WriteByte(BK_TCON_32_L, 0x01);
#else
MDrv_WriteByte(BK_TCON_32_L, 0x00);
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -