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

📄 tmbslsaa7104.c

📁 PNX1500上7104芯片设置源代码!标准的C代码。
💻 C
📖 第 1 页 / 共 5 页
字号:
    ptmbslVencAna_t 			pInstance,
    tmbslVencAna_ColorSystem_t 	colorSystem
    )
{
    tmErrorCode_t error = TM_OK;
	
    DBG_ASSERT(pInstance != Null);
    DBG_ASSERT(pInstance->magic == SAA7104_MAGIC_NUMBER);
	
    switch(colorSystem)
    {
    case tmbslVencAna_PalM:
    case tmbslVencAna_PalN:
    case tmbslVencAna_PalBg:
        strcpy(pInstance->currentVideoStandard, "pal");
        break;
    case tmbslVencAna_NtscM:
    case tmbslVencAna_NtscJ:
        strcpy(pInstance->currentVideoStandard, "ntsc");
        break;
    case tmbslVencAna_Secam:
        strcpy(pInstance->currentVideoStandard, "secam");
        break;
    default:
        error = TMBSL_ERR_VENCANA_BAD_PARAMETER;
        DBG_ASSERT2( error == TM_OK, ("Unsupported colorSystem: 0x%X", colorSystem) );
        return error;
    }
    pInstance->currentColorSystem = colorSystem;

    return error;
}

/******************************************************************************/
tmErrorCode_t tmbsl7104GetColorSystem(
    ptmbslVencAna_t 			pInstance,
    tmbslVencAna_ColorSystem_t 	*pColorSystem
    )
{
    DBG_ASSERT(pInstance != Null);
    DBG_ASSERT(pInstance->magic == SAA7104_MAGIC_NUMBER);
    DBG_ASSERT(pColorSystem != Null);

    *pColorSystem = pInstance->currentColorSystem;
	
    return TM_OK;
}

/******************************************************************************/
tmErrorCode_t tmbsl7104GetSuppEncodingType( 
    ptmbslVencAna_t 				pInstance,
    tmbslVencAna_EncodingTypeSet_t 	*pEncTypes
    )
{
    DBG_ASSERT(pInstance != Null);
    DBG_ASSERT(pInstance->magic == SAA7104_MAGIC_NUMBER);
    DBG_ASSERT(pEncTypes != Null);
    (void)pInstance;

    *pEncTypes =	tmbslVencAna_Cvbs |
        tmbslVencAna_Yc |
        tmbslVencAna_Vga |
        tmbslVencAna_Scart |
        tmbslVencAna_Ext1;
	
    return TM_OK;
}

/******************************************************************************/
tmErrorCode_t tmbsl7104GetSuppColorSystems( 
    ptmbslVencAna_t 				pInstance,
    tmbslVencAna_ColorSystemSet_t 	*pColorSystems
    )
{
    DBG_ASSERT(pInstance != Null);
    DBG_ASSERT(pInstance->magic == SAA7104_MAGIC_NUMBER);
    DBG_ASSERT(pColorSystems != Null);
    (void)pInstance;
	
    *pColorSystems =	tmbslVencAna_PalM |
        tmbslVencAna_PalN |
        tmbslVencAna_PalBg |
        tmbslVencAna_NtscM |
        tmbslVencAna_Secam;

    return TM_OK;
}


/******************************************************************************
* EXPORTED FUNCTION PROTOTYPES serving ItmbslVencAnaExt               		  *
*******************************************************************************/

/******************************************************************************/
tmErrorCode_t tmbsl7104ExtSetStandard( 
    ptmbslVencAnaExt_t 		pInstance,
    char* 					standard
    )
{
    DBG_ASSERT(pInstance != Null);
    DBG_ASSERT(pInstance->magic == SAA7104_MAGIC_NUMBER);
    DBG_ASSERT(standard != Null);

    strcpy(pInstance->currentVideoStandard, standard);

    return TM_OK;
}

/******************************************************************************/
tmErrorCode_t tmbsl7104ExtSetDataFormat( 
    ptmbslVencAnaExt_t pInstance,
    tmVideoOutFormat_t dataFormat
    )
{
    DBG_ASSERT(pInstance != Null);
    DBG_ASSERT(pInstance->magic == SAA7104_MAGIC_NUMBER);
	
    pInstance->currentVideoSubType = dataFormat;

    return TM_OK;
}

/******************************************************************************/

/******************************************************************************/
tmErrorCode_t tmbsl7104ExtSetSubcarrierFreq(
	ptmbslVencAnaExt_t pInstance,    
    Float freqHertz )
{
    tmErrorCode_t   tmRetVal = TM_OK;
    Float           lineFrequency, subcarrierFrequency, fscFloat;
    UInt32          fscInt;
    UInt8           dataArray[8];        
    tmUnitSelect_t 		avoUnit = pInstance->unitNumber;
    
    DBG_ASSERT(pInstance != Null);

    if(!strcmp(pInstance->currentVideoStandard, "ntsc"))
    {
        lineFrequency = 15734.25;      
        subcarrierFrequency = 227.5;
        fscFloat = (subcarrierFrequency * lineFrequency / freqHertz) * (((UInt32) 1)<<31);
        fscFloat = fscFloat * 2; //multiply by 2^32 in two steps
        fscInt = (UInt32)fscFloat; // Round after multiplication by 2^32
    }
    else if(!strcmp(pInstance->currentVideoStandard, "pal"))
    {
        lineFrequency = 15625.0;
        subcarrierFrequency = 283.7516;
        fscFloat = (subcarrierFrequency * lineFrequency / freqHertz) * (((UInt32) 1)<<31);
        fscFloat = fscFloat * 2; //multiply by 2^32 in two steps
        fscInt = (UInt32)fscFloat;
    }
    else if(!strcmp(pInstance->currentVideoStandard, "secam"))
    {
        lineFrequency = 15625.0;
        subcarrierFrequency = 282.0; //color carrier freq. = 4.40625 MHz
        fscFloat = (subcarrierFrequency * lineFrequency / freqHertz) * (((UInt32) 1)<<31);
        fscFloat = fscFloat* 2; //multiply by 2^32 in two steps
        fscInt = (UInt32)fscFloat;
    }
    else
    {
        fscInt=0;
    }

    if(fscInt!=0)
    {
        dataArray[0] = 0x63;
        dataArray[1] = (UInt8) ((fscInt) & 0xff);

        dataArray[2] = 0x64;
        dataArray[3] = (UInt8) ((fscInt >> 8) & 0xff);

        dataArray[0] = 0x65;
        dataArray[1] = (UInt8) ((fscInt >> 16) & 0xff);

        dataArray[0] = 0x66;
        dataArray[1] = (UInt8) ((fscInt >> 24) & 0xff);


        tmRetVal = saa7104WriteArray (
            avoUnit,
            SAA7104_REG_VIDEO,
            (UInt8*) dataArray,
            sizeof(dataArray));
    }
    return tmRetVal;
}

/******************************************************************************/
tmErrorCode_t tmbsl7104ExtGetClockType( 
    ptmbslVencAnaExt_t 			pInstance,
    ptmbslVencAnaClockSelect_t 	inputClockType 
    )
{
    DBG_ASSERT(pInstance != Null);
    DBG_ASSERT(pInstance->magic == SAA7104_MAGIC_NUMBER);
    DBG_ASSERT(inputClockType != Null);
    (void)pInstance;

    // 7104 needs a buffered clock
    *inputClockType = (tmbslVencAnaClockSelect_t)0;
    
    return TM_OK;
}

/******************************************************************************/
tmErrorCode_t tmbsl7104ExtSetAdapter( 
    ptmbslVencAnaExt_t 		pInstance,
    tmVideoAnalogAdapter_t 	adapter 
    )
{
    tmErrorCode_t 					error = TM_OK;
    tmbslVencAna_EncodingType_t  	encodingType;
    
    DBG_ASSERT(pInstance != Null);
    DBG_ASSERT(pInstance->magic == SAA7104_MAGIC_NUMBER);
    
    switch (adapter)
    {
    case vaaCVBS:
        encodingType = tmbslVencAna_Cvbs;
        break;
    case vaaSvideo:
        encodingType = tmbslVencAna_Yc;
        break;
    case vaaVGA:
        encodingType = tmbslVencAna_Vga;
        break;
    case vaaSCART:
        encodingType = tmbslVencAna_Scart;
        break;
    case vaaExt1:
        encodingType = tmbslVencAna_Ext1;
        break;
    default:
        error = TMBSL_ERR_VENCANA_BAD_PARAMETER;
        DBG_ASSERT2( error == TM_OK, ("Unsupported adapter: 0x%X", adapter) );
        return error;
    }

    error = tmbsl7104SetEncodingType(pInstance, encodingType);
    return error;
}


/******************************************************************************
* EXPORTED FUNCTION PROTOTYPES serving ItmbslVencAnaVbiExt               	  *
*******************************************************************************/

/******************************************************************************/
tmErrorCode_t tmbsl7104GetSupportedDataServices(
    ptmbslVencAnaVbiExt_t pInstance,
    tmVideoDataService_t field1[],
    tmVideoDataService_t field2[],
    UInt8                tblSize
    )
{
    tmErrorCode_t   tmRetVal = TM_OK;
    UInt8 			i;

    DBG_ASSERT(pInstance != Null);
    DBG_ASSERT(pInstance->magic == SAA7104_MAGIC_NUMBER);
	
    /* Write supported data services into arrays */
    for (i = 0; i < tblSize; i++)
    {
        if (i < 2)
        {
            // No data slicing allowed in first two lines 
            field1 [i] = field2 [i] = vdsNone; 
        }
        else
        {
            // Allow all kind of data services
            field1 [i] = field2 [i] = (tmVideoDataService_t) 
                (vdsEuroClosedCaption | vdsVPS | vdsWSS | vdsCGMS | 
                 vdsUSClosedCaption );
        }
    }

    return tmRetVal;
}

/******************************************************************************/
tmErrorCode_t tmbsl7104SetDataServices 
(
    ptmbslVencAnaVbiExt_t  	pInstance,
    tmVideoDataService_t 	field1[],
    tmVideoDataService_t 	field2[],
    UInt8                	tblSize
    )
{
    int     				i;
    UInt8   			    bData, value;
    tmVideoDataService_t 	localField1[PAL_VBI_LINES_FIELD1];
    tmVideoDataService_t 	localField2[PAL_VBI_LINES_FIELD1];
    tmUnitSelect_t 			avoUnit = pInstance->unitNumber;
    tmErrorCode_t   		tmRetVal = TM_OK;

    DBG_ASSERT(pInstance != Null);
    DBG_ASSERT(pInstance->magic == SAA7104_MAGIC_NUMBER);
	
    // Check if valid unit
    if (pInstance->unitNumber >= SAA7104_MAX_UNITS)
    {
        tmRetVal = TMBSL_ERR_VENCANA_BAD_UNIT_NUMBER;
    }
    else if (gSaa7104Inst[pInstance->unitNumber].init != TM_TRUE )
    {
        tmRetVal = TMBSL_ERR_VENCANA_NOT_INITIALIZED;
    }
    else
    {
        // Need to find out if there's a possible macrovision clash - if so 
        // must disable VBI for that line.
        
        // Need to fill out static VBI table so that if macrovision gets
        // changed, vbi data enabling will still be addressed.
        gSaa7104VbiData[pInstance->unitNumber].avoUnit = pInstance->unitNumber;
        for(i=0;i<PAL_VBI_LINES_FIELD1;i++)
        {
            gSaa7104VbiData[pInstance->unitNumber].field1[i] = field1[i];
            gSaa7104VbiData[pInstance->unitNumber].field2[i] = field2[i];
            if((copyProtectVBITable[pInstance->unitNumber][i])&&((field1[i])||(field2[i])))
            {
                localField1[i] = localField2[i] = (tmVideoDataService_t)0;
            }
            else
            {
                localField1[i] = field1[i];
                localField2[i] = field2[i];
            }
        }
        gSaa7104VbiData[pInstance->unitNumber].tblSize = tblSize;

        // default - turn off everything

        // turn off CC
        tmRetVal = saa7104GetReg (pInstance->unitNumber, 0x6F/*CCEN*/, &bData);
        DBG_ASSERT2(tmRetVal == TM_OK, ("Failed in Get reg 0x6F = 0X%x",tmRetVal));
        if(tmRetVal != TM_OK)
        {
            return tmRetVal;
        }
        bData = (UInt8)(bData & 0x3F) ;
        tmRetVal =  saa7104SetReg(avoUnit, 0x6F, bData);
        DBG_ASSERT2(tmRetVal == TM_OK, ("Failed in Set reg 0x6F = 0X%x",tmRetVal));
        if(tmRetVal != TM_OK)
        {
            return tmRetVal;
        }

        // turn off WSS
        tmRetVal = saa7104GetReg (pInstance->unitNumber, 0x27/*WSSON*/, &bData);
        DBG_ASSERT2(tmRetVal == TM_OK, ("Failed in Get reg 0x27 = 0X%x",tmRetVal));
        if(tmRetVal != TM_OK)
        {
            return tmRetVal;
        }
        bData = (UInt8)(bData & 0x7F) ;
        tmRetVal =  saa7104SetReg(avoUnit, 0x27, bData);
        DBG_ASSERT2(tmRetVal == TM_OK, ("Failed in Set reg 0x27 = 0X%x",tmRetVal));
        if(tmRetVal != TM_OK)
        {
            return tmRetVal;
        }

         // turn off CGMS
        tmRetVal = saa7104GetReg (pInstance->unitNumber, 0x2C/*CGEN*/, &bData);
        DBG_ASSERT2(tmRetVal == TM_OK, ("Failed in Get reg 0x2C = 0X%x",tmRetVal));
        if(tmRetVal != TM_OK)
        {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -