📄 tmbslsaa7104.c
字号:
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 + -