⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 drvscaler.c

📁 mstar 776 开发的车载dvd
💻 C
📖 第 1 页 / 共 5 页
字号:
////////////////////////////////////////////////////////////////////////////////
//
// 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 + -