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 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% */