www.pudn.com > Bit1611_demo_code.rar > YUV.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: YUV.C - Video Decoder. 
 
    Purpose: Implementation of YUV module. 
 
    Version: 0.01                                   08:33PM  2005/12/27 
 
    Compiler: Keil 8051 C Compiler v8.01 
 
    Reference: 
    [1] BIT1611B Data Sheet Version 1.0, 2005-11-10, 
        Beyond Innovation Technology 
 
   ---------------------------------------------------------------------- 
    Modification: 
 
    R0.01 08:32PM  2005/12/27 Jeffrey Chang 
    Reason: 
        1. Original. 
    Solution: 
 
   ---------------------------------------------------------------------- 
    [00001] 19:10PM  2006/01/02 Lily Huang 
    Reason: 
        1. Revise the checking conditon to prevent misjudgement. 
    Solution: 
 
   ********************************************************************** */ 
 
 
#define  _YUV_C_ 
 
/* ------------------------------------ 
    Header Files 
   ------------------------------------ */ 
#include "bitek.h" 
#include "eeprom.h" 
#include "led.h" 
#include "menu.h" 
#include "mcu.h" 
#include "osd.h" 
#include "platform.h" 
#include "timer.h" 
#include "yuv.h" 
 
 
 
/* ------------------------------------ 
    Macro Definitions 
   ------------------------------------ */ 
 
/* ------------------------------------ 
    Type Definitions 
   ------------------------------------ */ 
 
/* ------------------------------------ 
    Variables Definitions 
   ------------------------------------ */ 
static UB8 bIdx; 
 
/* ------------------------------------ 
    Function Prototypes 
   ------------------------------------ */ 
 
/* ------------------------------------------------------------------- 
    Name: YUV_Go - (YUV_01_BIT1611B) 
    Purpose: Polling Video Decoder status. 
    Passed: None. 
    Returns: None. 
    Notes: 
   ------------------------------------------------------------------- */ 
void YUV_Go (void) 
{ 
    switch (tsEYD.bYUV_ID) 
    { 
        case YUV_ID_CVBS_11: 
        case YUV_ID_CVBS_21: 
        case YUV_ID_YC_Y12C22: 
            bYUV_SB = BITEK_RxByte(YUV_MAD, VP_186_DVP_STATUS); 
 
            // lock no change 
            if (bYUV_SB == bLastSB) 
                return; 
 
            break; 
    } // switch 
 
 
    if (YUV_Ready()) 
    { 
        // Video signal is ready ! 
 
 
        // To check TV color standard ! 
        tsEYD.bYUV_CS = YUV_GetColorStandard(); 
 
        // To setup VP original Color Standard ! 
        //VP_SetColorStandard(tsEYD.bYUV_CS); 
 
        // To stop flashing RED LED ! 
        LED_RED_BLINK_OFF; 
        LED_RED_OFF; 
 
 
        switch (tsEYD.bYUV_ID) 
        { 
            case YUV_ID_CVBS_11: 
            case YUV_ID_CVBS_21: 
            case YUV_ID_YC_Y12C22: 
                bColorStd = bYUV_SB & VP_MASK_COLOR_STANDARD; 
 
                if ((bColorStd == YUV_CS_PAL)   && 
                    (bYUV_SB & VP_MASK_FIDT)           ) 
                { 
                    // 60Hz 
                    bColorStd = YUV_CS_PAL_60; 
                } 
 
                if (bYUV_SB & VP_MASK_FIDT)  
                { 
                    // 60Hz 
                    BITEK_TxByte(YUV_MAD, VP_12A_ACLAMP_LEVEL, 0x44); 
                } 
                else 
                { 
                    // 50Hz 
                    BITEK_TxByte(YUV_MAD, VP_12A_ACLAMP_LEVEL, 0x48); 
                } 
                 
 
                OSD_ShowMsg(OSD_MESSAGE, 
                            OSD_X_COLOR_STD, 
                            OSD_Y_COLOR_STD, 
                            apbYUV_ColorStd[ bColorStd ]); 
                break; 
 
        } // switch 
 
 
        OSD_EnableWindow(OSD_MESSAGE, ON); 
 
 
        // OSD Auto OFF ! 
        wMENU_Tick = MENU_AUTO_OFF_TIME; 
 
        // To disable Backlight ! 
        MCU_BL_ON; 
    } 
    else 
    { 
        // To flash RED LED ! 
        LED_RED_BLINK_ON; 
 
 
        // Show Message for NO SIGNAL 
        OSD_ShowMsg(OSD_MESSAGE, 
                    OSD_X_COLOR_STD, 
                    OSD_Y_COLOR_STD, 
                    abNoSignal      ); 
 
        OSD_EnableWindow(OSD_MESSAGE, ON); 
 
        bLastCS = YUV_CS_NONE; 
 
        // To disable OSD Auto OFF ! 
        wMENU_Tick = 0; 
    } // bYUV_SB && bYUV_MSTS 
 
    #ifdef NOT_JUNK 
    OSD_ShowHex(OSD_MESSAGE, 0, 0, bYUV_SB); 
    OSD_ShowHex(OSD_MESSAGE, 3, 0, bLastSB); 
    #endif 
 
    // To backup the debounced Status Byte ! 
    bLastSB = bYUV_SB; 
} // YUV_Go 
 
 
/* ------------------------------------------------------------------- 
    Name: YUV_HardwareReset - (YUV_01_BIT1611B) 
    Purpose: To reset Video Decoder chip before setting any registers. 
    Passed: 
    Returns: 
    Notes: [2]16 
   ------------------------------------------------------------------- */ 
void YUV_HardwareReset (void) 
{ 
} /* YUV_HardwareReset */ 
 
 
/* ------------------------------------------------------------------- 
    Name: YUV_Init - (YUV_01_BIT1611B) 
    Purpose: To initialize the YUV module. 
    Passed: None. 
    Returns: None. 
    Notes: 
   ------------------------------------------------------------------- */ 
void YUV_Init (void) 
{ 
    //YUV_HardwareReset(); 
 
    bLastSB = YUV_SB_BITEK; 
 
    // Look-Up Table Approach 
    BITEK_TxBurst(YUV_MAD, VP_101_AFE_ATTR, sizeof(abYUV_0101_0137), abYUV_0101_0137); 
 
    LED_RED_BLINK_OFF; 
    LED_RED_OFF; 
 
 
    // Brightness 
    YUV_SetBrightness(tsEYD.bBrightness); 
 
    // Contrast 
    YUV_SetContrast(tsEYD.bContrast); 
 
    // Saturation 
    YUV_SetSaturation(tsEYD.bSaturation); 
 
    // Hue 
    YUV_SetHue(tsEYD.bHue); 
 
    // Sharpness ! 
    YUV_SetSharpness(tsEYD.bSharpness); 
 
    // BlackLevel ! 
    YUV_SetBlackLevel(tsEYD.bBlackLevel); 
 
    #if (YUV_GO_POOLING) 
    fYUV_Go_Pooling = TRUE; 
    #endif 
} // YUV_Init 
 
 
/* ------------------------------------------------------------------- 
    Name: YUV_Ready - (YUV_01_BIT1611B) 
    Purpose: To check whether video signal is locked. 
    Passed: None. 
    Returns: 
        TRUE if video signal is locked. 
    Notes: 
   ------------------------------------------------------------------- */ 
BOOL YUV_Ready (void) 
{ 
    switch (tsEYD.bYUV_ID) 
    { 
        case YUV_ID_CVBS_11: 
        case YUV_ID_CVBS_21: 
        case YUV_ID_YC_Y12C22: 
            // CVBS or S-Video 
            //////////////////////////////////////////////////////////////////// 
            // [00001] Revised by LH 19:10PM  2006/01/02 
            if ((bYUV_SB & VP_MASK_STATUS_LOCK) == VP_MASK_STATUS_LOCK) 
            //////////////////////////////////////////////////////////////////// 
                return( TRUE ); 
            else 
                return( FALSE ); 
            break; 
    } // switch 
} // YUV_Ready 
 
 
 
 
 
#define DSUB_640X400_70_4142    0x01C1 
#define DSUB_720X400_70_4142    0x01C1 
 
#define DSUB_VGA60_4142         0x020D 
#define DSUB_SVGA50_4142        0x0271 
#define DSUB_SVGA60_4142        0x0275 
 
#define DSUB_640X400_CRITERIA   ((DSUB_640X400_70_4142 + DSUB_VGA60_4142)   / 2) 
#define DSUB_VGA60_CRITERIA     ((DSUB_VGA60_4142      + DSUB_SVGA50_4142)  / 2) 
#define DSUB_SVGA50_CRITERIA    ((DSUB_SVGA50_4142     + DSUB_SVGA60_4142)  / 2) 
 
 
/* ------------------------------------------------------------------- 
    Name: YUV_GetColorStandard - (YUV_01_BIT1611B) 
    Purpose: To detect Color Standard mode. 
    Passed: None. 
    Returns: 
        YUV_CS_NTSC         if NTSC/M 
        YUV_CS_PAL_BGDHI    if PAL B/G/D/H/I 
        YUV_CS_SECAM_L      if SECAM/L 
        YUV_CS_NONE         if others 
    Notes: 
 
                0x39    0x3A    0x3B    0x40    0x41    0x42 
    640x400@70  19      38      33      BF      C1      11 
    720x400@70  69      88      33      02      C1      01 
 
    640x480@60  F9      18      23      0B      0D      22 
    800x600@50  48      58      33      6C      71      22 
    800x600@60  00      1F      44      70/71   74/75   22 
 
    YPbPr 480i  39      58      33      06/07   0E/11   01 
    YPbPr 576i  39      58      33      06      40      01 
    YPbPr 480p  39      58      33      06      0D      02 
    YPbPr 576p  39      58      33      05      71      02 
 
    SCART 480i  56      58      33      06      40      01 
    SCART 576i  01      58      03      06/07   0E/11   01 
 
   ------------------------------------------------------------------- */ 
UB8 YUV_GetColorStandard (void) 
{ 
    switch (tsEYD.bYUV_ID) 
    { 
        case YUV_ID_CVBS_11: 
        case YUV_ID_CVBS_21: 
        case YUV_ID_YC_Y12C22: 
            if (bYUV_SB & VP_MASK_FIDT) 
                return( YUV_CS_NTSC );                  // 60 Hz 
            else 
                return( YUV_CS_PAL );                   // 50 Hz 
            break; 
    } 
} // YUV_GetColorStandard 
 
 
#if (YUV_SET_BLACKLEVEL) 
/* ------------------------------------------------------------------- 
    Name: YUV_SetBlackLevel - (YUV_01_BIT1611B) 
    Purpose: To set the brightness of Video Decoder. 
    Passed: 
        UB8 bBrightness = 0..255 
    Returns: None. 
    Notes: [1]98 
   ------------------------------------------------------------------- */ 
void YUV_SetBlackLevel (UB8 bBlackLevel) 
{ 
    BITEK_TxByte(YUV_MAD, VP_108_DVP_BLACKLEVEL, bBlackLevel); 
} // YUV_SetBlackLevel 
#endif 
 
 
#if (YUV_SET_BRIGHTNESS) 
/* ------------------------------------------------------------------- 
    Name: YUV_SetBrightness - (YUV_01_BIT1611B) 
    Purpose: To set the brightness of Video Decoder. 
    Passed: 
        UB8 bBrightness = 0..255 
    Returns: None. 
    Notes: [1]98 
   ------------------------------------------------------------------- */ 
void YUV_SetBrightness (UB8 bBrightness) 
{ 
    BITEK_TxByte(YUV_MAD, VP_106_DVP_BRIGHTNESS, bBrightness ^ 0x80); 
} // YUV_SetBrightness 
#endif 
 
 
#if (YUV_SET_CONTRAST) 
/* ------------------------------------------------------------------- 
    Name: YUV_SetContrast - (YUV_01_BIT1611B) 
    Purpose: To set the contrast of Video Decoder. 
    Passed: 
        UB8 bContrast = 0..255 
    Returns: None. 
    Notes: 
   ------------------------------------------------------------------- */ 
void YUV_SetContrast (UB8 bContrast) 
{ 
    BITEK_TxByte(YUV_MAD, VP_107_DVP_CONTRAST, bContrast); 
} // YUV_SetContrast 
#endif 
 
 
#if (YUV_SET_HUE) 
/* ------------------------------------------------------------------- 
    Name: YUV_SetHue - (YUV_01_BIT1611B) 
    Purpose: To set the hue of Video Decoder. 
    Passed: 
        UW16 bHue = 0..255 
    Returns: None. 
    Notes: 
   ------------------------------------------------------------------- */ 
void YUV_SetHue (UB8 bHue) 
{ 
    BITEK_TxByte(YUV_MAD, VP_10A_DVP_HUE, bHue); 
} // YUV_SetHue 
#endif 
 
 
#if (YUV_SET_SATURATION) 
/* ------------------------------------------------------------------- 
    Name: YUV_SetSaturation - (YUV_01_BIT1611B) 
    Purpose: To set the saturation of Video Decoder. 
    Passed: 
        UB8 bSaturation = 0..127 
    Returns: None. 
    Notes: 
   ------------------------------------------------------------------- */ 
void YUV_SetSaturation (UB8 bSaturation) 
{ 
    BITEK_TxByte(YUV_MAD, VP_109_DVP_SATURATION, bSaturation); 
} // YUV_SetSaturation 
#endif 
 
 
#if (YUV_SET_SHARPNESS) 
/* ------------------------------------------------------------------- 
    Name: YUV_SetSharpness - (YUV_01_BIT1611B) 
    Purpose: To set the sharpness of Video Decoder. 
    Passed: 
        UB8 bSharpness = 0..0x7F 
    Returns: None. 
    Notes: 
   ------------------------------------------------------------------- */ 
void YUV_SetSharpness (UB8 bSharpness) 
{ 
    #ifdef NOT_JUNK 
    switch (tsEYD.bYUV_ID) 
    { 
        case YUV_ID_CVBS_11: 
        case YUV_ID_CVBS_21: 
        case YUV_ID_YC_Y12C22: 
            BITEK_TxByte(YUV_MAD, VP_105_LUMA_ATTR, bSharpness); 
            break; 
    } 
    #endif 
 
    // [V00049] Revised by JC 11:51PM  2006/03/09 
    /* 
         R08B[7:4]     R103[2] R105[6:5] 
           1011        0       0 0 
           1010        0       0 1 
           1001        0       1 0 
           1000        1       0 0 
           0111        0       1 1 
           1100        1       0 1 
           1101        1       1 0 
           1110        1       1 1 
           1111 
    */ 
 
    UB8 CODE abLUT_Sharpness[ 51 ] = 
    { 
                    // R08B[7:4] R103[2] R105[6:5] 
        0xB0,       //  0   1011      x000           0 
        0xA0,       //  0   1010      x000           1 
        0x70,       //  0   0111      x000           2 
        0x90,       //  0   1001      x000           3 
        0xB1,       //  1   1011      x001           4 
        0x80,       //  0   1000      x000           5 
        0xA1,       //  1   1010      x001           6 
        0xC0,       //  0   1100      x000           7 
        0x91,       //  1   1001      x001           8 
        0x81,       //  1   1000      x001           9 
        0xB2,       //  2   1011      x010           10 
        0x71,       //  1   0111      x001           11 
        0xD0,       //  0   1101      x000           12 
        0xA2,       //  2   1010      x010           13 
        0xC1,       //  1   1100      x001           14 
        0xE0,       //  0   1110      x000           15 
        0x82,       //  2   1000      x010           16 
        0x92,       //  2   1001      x010           17 
        0x72,       //  2   0111      x010           18 
        0xD1,       //  1   1101      x001           19 
        0xC2,       //  2   1100      x010           20 
        0xA4,       //  3   1010      x100           21 
        0x84,       //  3   1000      x100           22 
        0x94,       //  3   1001      x100           23 
        0xA5,       //  5   1010      x101           24 
        0x74,       //  3   0111      x100           25 
        0xD1,       //  1   1101      x001           26 
        0xC2,       //  2   1100      x010           27 
        0x75,       //  5   0111      x101           28 
        0x76,       //  6   0111      x110           29 
        0xA6,       //  6   1010      x110           30 
        0x95,       //  5   1001      x101           31 
        0xE1,       //  1   1110      x001           32 
        0x85,       //  5   1000      x101           33 
        0x96,       //  6   1001      x110           34 
        0xD2,       //  2   1101      x010           35 
        0x86,       //  6   1000      x110           36 
        0xE2,       //  2   1110      x010           37 
        0xC4,       //  3   1100      x100           38 
        0x87,       //  7   1000      x111           39 
        0xC5,       //  5   1100      x101           40 
        0xC6,       //  6   1100      x110           41 
        0xD4,       //  3   1101      x100           42 
        0x97,       //  7   1001      x111           43 
        0xD5,       //  5   1101      x101           44 
        0x77,       //  7   0111      x111           45 
        0xD6,       //  6   1101      x110           46 
        0xE4,       //  3   1110      x100           47 
        0xE5,       //  5   1110      x101           48 
        0xC7,       //  7   1100      x111           49 
        0xE6,       //  6   1110      x110           50 
    }; 
 
    UB8 bData; 
 
 
    bSharpness %= 51; 
 
    // To setup register R08B[7:4] ! 
    bData = BITEK_RxByte(YUV_MAD, VP_08B_IMAGE_ATTR) & 0x0F; 
 
    BITEK_TxByte(YUV_MAD, 
                 VP_08B_IMAGE_ATTR, 
                 (abLUT_Sharpness[ bSharpness ] & 0xF0) | bData); 
 
    // To setup register R103[2] ! 
    bData = BITEK_RxByte(YUV_MAD, VP_103_LUMA_PATH3) & 0xFB; 
 
    BITEK_TxByte(YUV_MAD, 
                 VP_103_LUMA_PATH3, 
                 (abLUT_Sharpness[ bSharpness ] & 0x04) | bData); 
 
    // To setup register R105[6:5] ! 
    bData = BITEK_RxByte(YUV_MAD, VP_105_LUMA_ATTR) & 0x9F; 
 
    BITEK_TxByte(YUV_MAD, 
                 VP_103_LUMA_PATH3, 
                 ((abLUT_Sharpness[ bSharpness ] << 5) & 0x60) | bData); 
 
 
} // YUV_SetSharpness 
#endif 
 
 
#if (YUV_SET_SKINTONE) 
/* ------------------------------------------------------------------- 
    Name: YUV_SetSkinTone - (YUV_01_BIT1611B) 
    Purpose: To set the skin tone of Video Decoder. 
    Passed: 
        UB8 bSkinTone 
    Returns: None. 
    Notes: 
   ------------------------------------------------------------------- */ 
void YUV_SetSkinTone (UB8 bSkinTone) 
{ 
    bSkinTone = bSkinTone; 
} // YUV_SetSkinTone 
#endif 
 
 
/* ------------------------------------------------------------------- 
    Name: YUV_SetSourceMode - (YUV_01_BIT1611B) 
    Purpose: To set YUV source mode with 100pF. 
    Passed: bSourceID = 0... 
    Returns: None. 
    Notes: 
   ------------------------------------------------------------------- */ 
void YUV_SetSourceMode (UB8 bSourceID) 
{ 
 
    // 0x102: 
    //  7       6       5       4       3       2       1       0 
    //  GAIN2   SEL2    ADC2    GAIN1   SEL1    ADC1    ANY     ANC 
    //  0       0       0       0       1       1       0       0      = CVBS11 0x0C 
    //  0       0       0       0       0       1       0       0      = CVBS12 0x04 
    //  0       1       1       0       0       0       1       0      = CVBS21 0x62 
    //  0       0       1       0       0       0       1       0      = CVBS22 0x22 
    //  0       0       1       0       0       1       0       0      = Y12C22 0x24 
 
    // 0x103: 
    //  7       6       5       4       3       2       1       0 
    //  VD_MON  x       ACLAMP2 ACLAMP1 YC_EN   PREF_EN CHT_SEL CHT_EN 
    //                  TYPE    TYPE 
    //  0       0       0       0       0       1       1       1      = CVBS11 0x07 
    //  0       0       0       0       0       1       1       1      = CVBS12 0x07 
    //  0       0       0       0       0       1       1       1      = CVBS21 0x07 
    //  0       0       0       0       0       1       1       1      = CVBS22 0x07 
    //  0       0       1       0       1       0       0       0      = Y12C22 0x28 
 
/* 
        CVBS                            S-Video 
        AIN11   AIN12   AIN21   AIN22   Y11+C21 Y12+C22 C11+Y21 C12+Y22 
0x101   0x7C    0x7C    0x7C    0x7C    0x7C    0x7C    0x7C    0x7C 
0x102   0x0C    0x04    0x62    0x22    0x6C    0x24    0x6F    0x27 
0x103   0x07    0x07    0x07    0x07    0x28    0x28    0x18    0x18 
0x129   0x00    0x00    0x01    0x01    0x00    0x00    0x01    0x01 
*/ 
 
 
    switch (bSourceID) 
    { 
        case YUV_ID_CVBS_11: 
            BITEK_TxByte(YUV_MAD, VP_101_AFE_ATTR,      0x7C); 
            BITEK_TxByte(YUV_MAD, VP_102_DVP_ATTR,      0x0C); 
            BITEK_TxByte(YUV_MAD, VP_103_LUMA_PATH3,    0x07); 
            BITEK_TxByte(YUV_MAD, VP_129_AAGC_ATTR,     0x00); 
            break; 
 
        case YUV_ID_CVBS_21: 
            BITEK_TxByte(YUV_MAD, VP_101_AFE_ATTR,      0x7C); 
            BITEK_TxByte(YUV_MAD, VP_102_DVP_ATTR,      0x62); 
            BITEK_TxByte(YUV_MAD, VP_103_LUMA_PATH3,    0x07); 
            BITEK_TxByte(YUV_MAD, VP_129_AAGC_ATTR,     0x01); 
            break; 
 
        case YUV_ID_YC_Y12C22: 
            BITEK_TxByte(YUV_MAD, VP_101_AFE_ATTR,      0x7C); 
            BITEK_TxByte(YUV_MAD, VP_102_DVP_ATTR,      0x24); 
            BITEK_TxByte(YUV_MAD, VP_103_LUMA_PATH3,    0x28); 
            BITEK_TxByte(YUV_MAD, VP_129_AAGC_ATTR,     0x00); 
            break; 
    } 
} // YUV_SetSourceMode 
 
 
 
/* ------------------------------------------------------------------- 
    Name:  - 
    Purpose: . 
    Passed: None. 
    Returns: None. 
    Notes: 
   ------------------------------------------------------------------- */ 
 
 
/* ********************************************************************** 
 
    Description: 
 
   ********************************************************************** */ 
 
 
/* %% End Of File %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% */