www.pudn.com > Bit1611_demo_code.rar > VP.C


/* ********************************************************************** 
 
         Copyright (c) 2002-2006 Beyond Innovation Technology Co., Ltd 
 
        All rights are reserved. Reproduction in whole or in parts is 
    prohibited without the prior written consent of the copyright owner. 
   ---------------------------------------------------------------------- 
 
    Module: VP.C - Video Processor. 
 
    Purpose: Implementation of VP module. 
 
    Version: 0.01                                   11:24AM  2005/11/17 
 
    Compiler: Keil 8051 C Compiler v8.01 
 
    Reference: 
    [1] BIT1611B Data Sheet Version 1.0, 2005-11-10, 
        Beyond Innovation Technology 
 
   ---------------------------------------------------------------------- 
    Modification: 
 
    R0.01 11:24AM  2005/11/17 Jeffrey Chang 
    Reason: 
        1. Original. 
    Solution: 
 
   ********************************************************************** */ 
 
#define  _VP_C_ 
 
 
/* ------------------------------------ 
    Header Files 
   ------------------------------------ */ 
#include "bitek.h" 
#include "led.h" 
#include "timer.h" 
#include "vp.h" 
#include "yuv.h" 
 
#if (PROJECT == DMO04041000)    ||  \ 
    (PROJECT == DMO04042500)    ||  \ 
    (PROJECT == DMO04052500) 
    #include "i2c.h" 
#endif 
 
#if (PROJECT == DMO04015800) 
    #include "spi.h" 
#endif 
 
/* ------------------------------------ 
    Macro Definitions 
   ------------------------------------ */ 
// in MS 
#define COLORSTD_STABLE_TIME        30 
 
// in MS 
#define COLORSTD_SETUP_TIME         320 
 
// For Loop Index 
#define COLORSTD_DETECT_TIME        255 
 
/* ------------------------------------ 
    Type Definitions 
   ------------------------------------ */ 
 
/* ------------------------------------ 
    Variables Definitions 
   ------------------------------------ */ 
 
 
/* ------------------------------------ 
    Function Prototypes 
   ------------------------------------ */ 
 
 
/* ------------------------------------------------------------------- 
    Name: VP_BlankColor - 
    Purpose: To enable/disable FREE-RUN blank color feature. 
    Passed: 
        BOOL   fOn      Enable (TRUE) or Disable (FALSE). 
    Returns: None. 
    Notes: [1]40 
   ------------------------------------------------------------------- */ 
void VP_BlankColor (BOOL fOn) 
{ 
    UB8     b40; 
 
 
    b40 = BITEK_RxByte(VP_MAD, VP_040_TESTPAT_ATTR); 
 
    if (fOn) 
        b40 |= VP_MASK_FREERUN_EN;       // Free Run ! 
    else 
        b40 &= (~VP_MASK_FREERUN_EN); 
 
    BITEK_TxByte(VP_MAD, VP_040_TESTPAT_ATTR, b40); 
} /* VP_BlankColor */ 
 
 
#if (VP_DISPLAYMODE) 
/* ------------------------------------------------------------------- 
    Name: VP_DisplayMode (YUV_01_BIT1611B) - 
    Purpose: To set display mode. 
    Passed: 
        UB8 bDisplayMode    DISPLAY_MODE_BYPASS or DISPLAY_MODE_LINEAR 
    Returns: None. 
    Notes: 
   ------------------------------------------------------------------- */ 
void VP_DisplayMode (UB8 bDisplayMode) 
{ 
    // [V00041] Added by JC 05:17PM  2006/03/05 
    BITEK_TxByte(VP_MAD, VP_005_INT_ATTR, 0x20); 
 
    bDisplayMode = bDisplayMode; 
 
    BITEK_TxByte(VP_MAD, VP_005_INT_ATTR, 0x30); 
} /* VP_DisplayMode */ 
#endif 
 
 
/* ------------------------------------------------------------------- 
    Name: VP_HardwareReset - 
    Purpose: To Reset VP hardware. 
    Passed: 
    Returns: 
    Notes: [1]17 
   ------------------------------------------------------------------- */ 
void VP_HardwareReset (void) 
{ 
    VP_RESET_OFF; 
    TIMER_DelayMS(50); 
 
    VP_RESET_ON;                // Reset ! 
    TIMER_DelayMS(100);         // At least 4 XCLK cycles ! 
 
    VP_RESET_OFF; 
    TIMER_DelayMS(50); 
} /* VP_HardwareReset */ 
 
 
 
/* ------------------------------------------------------------------- 
    Name: VP_Init - 
    Purpose: To initiate VP module. 
    Passed: None. 
    Returns: None. 
    Notes: 
   ------------------------------------------------------------------- */ 
void VP_Init (void) 
{ 
    switch (tsEYD.bYUV_ID) 
    { 
        case YUV_ID_CVBS_11: 
        case YUV_ID_CVBS_21: 
        case YUV_ID_YC_Y12C22: 
            // Defaul Values ! 
            BITEK_TxBurst(VP_MAD, VP_007_PORT_ATTR, sizeof(abVP_007_0A7_DEFAULT), abVP_007_0A7_DEFAULT); 
 
            break; 
    } 
 
 
 
    #ifdef NOT_JUNK 
 
    /* .................................... 
        [1]73 Gamma LUT 
       .................................... */ 
    { 
        UB8 bA2; 
 
 
        bA2 = BITEK_RxByte(VP_MAD, VP_0A2_GAMMA_ATTR) & ~VP_MASK_GAMMA_LUT_EN; 
 
        // To disable RGB Gamma Tables 
        BITEK_TxByte(VP_MAD, VP_0A2_GAMMA_ATTR, bA2); 
 
        // To set RGB Gamma Tables 
        BITEK_TxBurst(VP_MAD, VP_0200_02FF_GAMMA_LUT_R + 0  ,  sizeof(abGammaR)/2, &abGammaR[   0 ]); 
        BITEK_TxBurst(VP_MAD, VP_0200_02FF_GAMMA_LUT_R + 128,  sizeof(abGammaR)/2, &abGammaR[ 128 ]); 
        BITEK_TxBurst(VP_MAD, VP_0300_03FF_GAMMA_LUT_G + 0  ,  sizeof(abGammaR)/2, &abGammaG[   0 ]); 
        BITEK_TxBurst(VP_MAD, VP_0300_03FF_GAMMA_LUT_G + 128,  sizeof(abGammaR)/2, &abGammaG[ 128 ]); 
        BITEK_TxBurst(VP_MAD, VP_0400_04FF_GAMMA_LUT_B + 0  ,  sizeof(abGammaR)/2, &abGammaB[   0 ]); 
        BITEK_TxBurst(VP_MAD, VP_0400_04FF_GAMMA_LUT_B + 128,  sizeof(abGammaR)/2, &abGammaB[ 128 ]); 
 
        // To enable RGB Gamma Tables 
        BITEK_TxByte(VP_MAD, VP_0A2_GAMMA_ATTR, (bA2 | VP_MASK_GAMMA_LUT_EN)); 
    } 
 
    /* .................................... 
        [1]71 Gamma Adjust-Curve 
       .................................... */ 
    #endif 
 
 
    /* .................................... 
        Video Processor 
       .................................... */ 
    VP_SetBlackLevel(tsEGD.bBlackLevel, 
                     tsEGD.bWhiteSlope, 
                     tsEGD.bBlackSlope, 
                     tsEGD.bWhiteStart, 
                     tsEGD.bBlackStart 
                    ); 
 
    VP_SetBrightness(tsEGD.bBrightness); 
    VP_SetContrast(tsEGD.bContrast); 
 
    // To adjust VP 
    VP_SetImageFilter(tsEGD.bImage_Filter); 
 
    // To restore VP TCON mode ! 
    VP_SetTCON_Mode(tsEGD.bTCON_Mode); 
} /* VP_Init */ 
 
 
#if (VP_INT_CFG != EXT_INT_NONE) 
/* ------------------------------------------------------------------- 
    Name: VP_ISR - 
    Purpose: . 
    Passed: None 
    Returns: None. 
    Notes: 
    Reference: [2]19 
   ------------------------------------------------------------------- */ 
void VP_ISR (void) interrupt VP_INT     using VP_USING 
{ 
    fVP_IntReady = TRUE; 
} /* VP_ISR */ 
#endif 
 
 
#if (VP_SET_BLACKLEVEL) 
/* ------------------------------------------------------------------- 
    Name: VP_SetBlackLevel - 
    Purpose: This function sets the VP BlackLevel. 
    Passed: 
        UB8 bBlackLevel 
    Returns: None. 
    Notes: [1]65 
   ------------------------------------------------------------------- */ 
void VP_SetBlackLevel ( 
UB8 bBlackLevel, 
UB8 bWhiteSlope, 
UB8 bBlackSlope, 
UB8 bWhiteStart, 
UB8 bBlackStart 
) 
{ 
    BITEK_TxByte(VP_MAD, VP_082_BLACK_LEVEL, bBlackLevel ^ 0x80); 
    BITEK_TxByte(VP_MAD, VP_083_WHITE_SLOPE, bWhiteSlope); 
    BITEK_TxByte(VP_MAD, VP_084_BLACK_SLOPE, bBlackSlope); 
    BITEK_TxByte(VP_MAD, VP_085_WHITE_START, bWhiteStart); 
    BITEK_TxByte(VP_MAD, VP_086_BLACK_START, bBlackStart); 
} // VP_SetBlackLevel 
#endif 
 
 
 
 
#if (VP_SET_COLORSTANDARD) 
/* ------------------------------------------------------------------- 
    Name: VP_SetColorStandard - (YUV_01_BIT1611B) 
    Purpose: To adjust Video Processor register settings according to 
        Color Standard mode. 
    Passed: 
        UB8 bMode   YUV_CS_NTSC         or 
                    YUV_CS_PAL_BGDHI    or 
                    YUV_CS_SECAM_L 
    Returns: 
    Notes: 
   ------------------------------------------------------------------- */ 
void VP_SetColorStandard (UB8 bMode) 
{ 
    //UB8     b615; 
 
 
    return; 
    ///////////////////////////////////////////// 
 
    switch (tsEYD.bYUV_ID) 
    { 
        case YUV_ID_CVBS_11: 
        case YUV_ID_CVBS_21: 
        case YUV_ID_YC_Y12C22: 
        case YUV_ID_YC_Y11C21: 
            switch (bMode) 
            { 
                // 50Hz 
                case YUV_CS_PAL: 
                case YUV_CS_PAL_N: 
                case YUV_CS_SECAM: 
                case YUV_CS_NTSC_443_50: 
                    break; 
 
                // 60Hz 
                case YUV_CS_NTSC: 
                case YUV_CS_PAL_M: 
                case YUV_CS_NTSC_M: 
                case YUV_CS_NTSC_443_60: 
                case YUV_CS_PAL_60: 
                default: 
                    break; 
            } // switch bMode 
 
            //BITEK_TxByte(YUV_MAD, VP_615_CHROMA_ATTR4, b615); 
 
            /* .................................... 
                Video Decoder 
               .................................... */ 
            YUV_SetBrightness(tsEYD.bBrightness); 
            YUV_SetContrast(tsEYD.bContrast); 
            YUV_SetSaturation(tsEYD.bSaturation); 
            YUV_SetHue(tsEYD.bHue); 
            break; 
    } /* tsEYD.bYUV_ID */ 
 
    /* .................................... 
        Video Decoder 
       .................................... */ 
    YUV_SetBrightness(tsEYD.bBrightness); 
    YUV_SetContrast(tsEYD.bContrast); 
    YUV_SetSaturation(tsEYD.bSaturation); 
    YUV_SetHue(tsEYD.bHue); 
    YUV_SetSharpness(tsEYD.bSharpness); 
 
    /* .................................... 
        Video Processor 
       .................................... */ 
    VP_SetBlackLevel(tsEGD.bBlackLevel); 
    VP_SetBrightness(tsEGD.bBrightness); 
    VP_SetContrast(tsEGD.bContrast); 
 
    // To adjust VP 
    VP_SetImageFilter(tsEGD.bImage_Filter); 
 
    // To restore VP TCON mode ! 
    VP_SetTCON_Mode(tsEGD.bTCON_Mode); 
} // VP_SetColorStandard 
#endif 
 
 
#if (VP_SET_BRIGHTNESS) 
/* ------------------------------------------------------------------- 
    Name: VP_SetBrightness - 
    Purpose: This function sets the VP Brightness. 
    Passed: 0x00..0xFF 
    Returns: None. 
    Notes: [1]63 
   ------------------------------------------------------------------- */ 
void VP_SetBrightness (UB8 bBrightness) 
{ 
    BITEK_TxByte(VP_MAD, VP_07C_BRIGHTNESS_R, bBrightness); 
    BITEK_TxByte(VP_MAD, VP_07D_BRIGHTNESS_G, bBrightness); 
    BITEK_TxByte(VP_MAD, VP_07E_BRIGHTNESS_B, bBrightness); 
} // VP_SetBrightness 
#endif 
 
 
#if (VP_SET_CONTRAST) 
/* ------------------------------------------------------------------- 
    Name: VP_SetContrast - 
    Purpose: This function sets the VP Contrast. 
    Passed: 0x00..0xFF 
    Returns: None. 
    Notes: [1]63 
   ------------------------------------------------------------------- */ 
void VP_SetContrast (UB8 bContrast) 
{ 
    BITEK_TxByte(VP_MAD, VP_07F_CONTRAST_R, bContrast); 
    BITEK_TxByte(VP_MAD, VP_080_CONTRAST_G, bContrast); 
    BITEK_TxByte(VP_MAD, VP_081_CONTRAST_B, bContrast); 
} // VP_SetContrast 
#endif 
 
 
#if (VP_SET_IMAGE_FILTER) 
/* ------------------------------------------------------------------- 
    Name: VP_SetImageFilter - 
    Purpose: To set Image Filter. 
    Passed:  
        0..8 (High smoothness..Low smoothness, Bypass, Low sharpness,..High sharpness) 
        0..3    = Smoothness 
        4       = Bypass 
        5..8    = Sharpness 
    Returns: 
    Notes: [1]67 
   ------------------------------------------------------------------- */ 
void VP_SetImageFilter (UB8 bImageFilter) 
{ 
    UB8 bData; 
 
 
    if (bImageFilter == IMAGE_FILTER_NORMAL) 
    { 
        // Bypass 
        // 0xxx xxxx 
        bData = BITEK_RxByte(VP_MAD, VP_08B_IMAGE_ATTR) & ~VP_MASK_FILTER_EN; 
    } 
    else 
    { 
        bData = BITEK_RxByte(VP_MAD, VP_08B_IMAGE_ATTR) & ~VP_MASK_FILTER_TYPE; 
        bData |= VP_MASK_FILTER_EN; 
 
 
        if (bImageFilter < IMAGE_FILTER_NORMAL) 
        { 
            // Smothness 
            // 1000 xxxx 
            // 1011 xxxx 
            bData = bData | ((3 - bImageFilter) << 4); 
        } 
        else if (bImageFilter > IMAGE_FILTER_NORMAL) 
        { 
            // Sharpness 
            // 1100 xxxx 
            // 1111 xxxx 
            bData = bData | ((bImageFilter - 1) << 4); 
        } 
    } 
 
    BITEK_TxByte(VP_MAD, VP_08B_IMAGE_ATTR, bData); 
} /* VP_SetImageFilter */ 
#endif 
 
 
#if (VP_SET_PWM_DUTY) 
/* ------------------------------------------------------------------- 
    Name: VP_SetPWM_DUTY - 
    Purpose: This function sets the VP PWM Duty. 
    Passed: 
    Returns: None. 
    Notes: [1]74 
   ------------------------------------------------------------------- */ 
void VP_SetPWM_DUTY ( 
UB8     bPWM,       // 1..4 
UW16    wDUTY       // 0..511 
) 
{ 
    switch (bPWM) 
    { 
        case 1: 
            BITEK_TxWord(VP_MAD, VP_0E20E3_PWM1_DUTY, wDUTY); 
            break; 
 
        case 2: 
            BITEK_TxWord(VP_MAD, VP_0E80E9_PWM2_DUTY, wDUTY); 
            break; 
 
        case 3: 
            BITEK_TxByte(VP_MAD, VP_0EC_PWM3_DUTY, wDUTY); 
            break; 
 
        case 4: 
            BITEK_TxByte(VP_MAD, VP_0EE_PWM4_DUTY, wDUTY); 
            break; 
    } // switch 
 
} // VP_SetPWM_DUTY 
#endif 
 
 
#if (VP_SET_PWM_FREQ) 
/* ------------------------------------------------------------------- 
    Name: VP_SetPWM_FREQ - 
    Purpose: This function sets the VP PWM Frequency. 
    Passed: 
    Returns: None. 
    Notes: [1]74 
   ------------------------------------------------------------------- */ 
void VP_SetPWM_FREQ ( 
UB8     bPWM,       // 1..4 
UW16    wFREQ       // 0..511 
) 
{ 
    UB8 bData; 
 
 
    switch (bPWM) 
    { 
        case 1: 
            BITEK_TxByte(VP_MAD, VP_0E00E1_PWM1_FREQ, wFREQ); 
 
            bData = BITEK_RxByte(VP_MAD, VP_0E1_PWM1_ATTR) & ~VP_MASK_PWM1_FREQ_MSB; 
            wFREQ >>= 4;                        // 8 -> 4 
            wFREQ &= VP_MASK_PWM1_FREQ_MSB; 
            BITEK_TxByte(VP_MAD, VP_0E1_PWM1_ATTR, bData | wFREQ); 
            break; 
 
        case 2: 
            BITEK_TxByte(VP_MAD, VP_0E50E7_PWM2_FREQ, wFREQ); 
 
            bData = BITEK_RxByte(VP_MAD, VP_0E7_PWM2_ATTR) & ~VP_MASK_PWM2_FREQ_MSB; 
            wFREQ >>= 4;                        // 8 -> 4 
            wFREQ &= VP_MASK_PWM2_FREQ_MSB; 
            BITEK_TxByte(VP_MAD, VP_0E7_PWM2_ATTR, bData | wFREQ); 
            break; 
 
        case 3: 
            BITEK_TxByte(VP_MAD, VP_0EB_PWM3_FREQ, wFREQ); 
            break; 
 
        case 4: 
            BITEK_TxByte(VP_MAD, VP_0ED_PWM4_FREQ, wFREQ); 
            break; 
    } // switch 
} // VP_SetPWM_FREQ 
#endif 
 
 
#if (VP_SET_PWM_REF) 
/* ------------------------------------------------------------------- 
    Name: VP_SetPWM_REF - 
    Purpose: This function sets the VP PWM REF. 
    Passed: 
    Returns: None. 
    Notes: [1]86 
   ------------------------------------------------------------------- */ 
void VP_SetPWM_REF ( 
UB8     bPWM,       // 1..2 
UW16    wREF        // 0..1023 
) 
{ 
    UB8 bData; 
 
 
    switch (bPWM) 
    { 
        case 1: 
            // LSB 
            BITEK_TxByte(VP_MAD, VP_0DF0E1_PWM1_REF, wREF); 
 
            bData = BITEK_RxByte(VP_MAD, VP_0E1_PWM1_ATTR) & ~VP_MASK_PWM1_REF_MSB; 
            wREF >>= 8;                         // 8 -> 0 
            wREF &= VP_MASK_PWM1_REF_MSB; 
            BITEK_TxByte(VP_MAD, VP_0E1_PWM1_ATTR, bData | wREF); 
            break; 
 
        case 2: 
            BITEK_TxByte(VP_MAD, VP_0E40E7_PWM2_REF, wREF); 
 
            bData = BITEK_RxByte(VP_MAD, VP_0E7_PWM2_ATTR) & ~VP_MASK_PWM2_REF_MSB; 
            wREF >>= 8;                         // 8 -> 0 
            wREF &= VP_MASK_PWM2_REF_MSB; 
            BITEK_TxByte(VP_MAD, VP_0E7_PWM2_ATTR, bData | wREF); 
            break; 
    } // switch 
 
} // VP_SetPWM_REF 
#endif 
 
 
#if (VP_SET_TCON_MODE) 
/* ------------------------------------------------------------------- 
    Name: VP_SetTCON_Mode - 
    Purpose: To set the video processor TCON Mode. 
    Passed: 
        UB8 bTCON_Mode  TCON_MODE_RU    or 
                        TCON_MODE_LU    or 
                        TCON_MODE_LD    or 
                        TCON_MODE_RD 
    Returns: None. 
    Notes: 
   ------------------------------------------------------------------- */ 
void VP_SetTCON_Mode (UB8 bTCON_Mode) 
{ 
	UB8 b24; 
 
 
    b24 = BITEK_RxByte(VP_MAD, VP_024_OUTPUT_DATAPATH) & VP_MASK_ACTIVE_TOTAL; 
 
    switch (bTCON_Mode) 
    { 
        case TCON_MODE_RU: 
            BITEK_TxByte(VP_MAD, VP_024_OUTPUT_DATAPATH,  b24 | 0x0F); 
            BITEK_TxByte(VP_MAD, VP_07B_RGBOUT_DLYO,  0x05); 
            SPI_TxByte(0x05, 0x13); 
            break; 
 
        case TCON_MODE_LU: 
            BITEK_TxByte(VP_MAD, VP_024_OUTPUT_DATAPATH,  b24 | 0x8B); 
            BITEK_TxByte(VP_MAD, VP_07B_RGBOUT_DLYO,  0x15); 
            SPI_TxByte(0x05, 0x12); 
            break; 
 
        case TCON_MODE_LD: 
            BITEK_TxByte(VP_MAD, VP_024_OUTPUT_DATAPATH,  b24 | 0x53); 
            BITEK_TxByte(VP_MAD, VP_07B_RGBOUT_DLYO,  0x15); 
            SPI_TxByte(0x05, 0x10); 
            break; 
 
        case TCON_MODE_RD: 
            BITEK_TxByte(VP_MAD, VP_024_OUTPUT_DATAPATH,  b24 | 0xC3); 
            BITEK_TxByte(VP_MAD, VP_07B_RGBOUT_DLYO,  0x15); 
            SPI_TxByte(0x05, 0x11); 
            break; 
    } // switch 
} // VP_SetTCON_Mode 
#endif 
 
 
#if (VP_SET_TESTPATTERN) 
/* ------------------------------------------------------------------- 
    Name: VP_SetTestPattern - 
    Purpose: VP Background and Test Pattern. 
    Passed: 
    Returns: None 
    Notes: [1]40 
   ------------------------------------------------------------------- */ 
void VP_SetTestPattern ( 
UB8 bColorR, 
UB8 bColorG, 
UB8 bColorB, 
UB8 bPatternType,   // Pattern Type 
UB8 bMode           // Freerun/Background 
) 
{ 
    UB8     b40; 
 
 
    b40 = BITEK_RxByte(VP_MAD, VP_040_TESTPAT_ATTR) & (VP_MASK_PATTERN_HV | VP_MASK_PATTERN_DIR); 
 
    BITEK_TxByte(VP_MAD, VP_03C_TESTPAT_R, bColorR); 
    BITEK_TxByte(VP_MAD, VP_03D_TESTPAT_G, bColorG); 
    BITEK_TxByte(VP_MAD, VP_03E_TESTPAT_B, bColorB); 
 
    BITEK_TxByte(VP_MAD, VP_040_TESTPAT_ATTR, b40 | bMode | bPatternType); 
} /* VP_SetTestPattern */ 
#endif 
 
 
 
/* ********************************************************************** 
 
    Description: 
 
   ********************************************************************** */ 
 
/* %% End Of File %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% */