📄 saa7115.c
字号:
}
else if(taskPtr->xPreScale > 63){
taskPtr->xPreScale = 63;
}
taskPtr->xAccLength = _SAA7115_xScale.xValues[taskPtr->xPreScale].acl;
xRatio = 100 * taskPtr->xInputLength;
xRatio /= taskPtr->xOutputLength;
if(xRatio > 275){
firLuma = 3;
}else if(xRatio > 200){
firLuma = 2;
}else if(xRatio >= 170){
firLuma = 1;
}else{
firLuma = 0;
}
firChroma = firLuma;
taskPtr->xACLWeighting = _SAA7115_xScale.xValues[taskPtr->xPreScale].c21;
taskPtr->scalerDCGain = _SAA7115_xScale.xValues[taskPtr->xPreScale].dcGain;
taskPtr->yPreFilterType = firLuma;
taskPtr->cxPreFilterType = firChroma;
xLumaInc = 1024 * taskPtr->xInputLength;
xLumaInc /= taskPtr->xOutputLength;
xLumaInc /= taskPtr->xPreScale;
if(xLumaInc > 0x1FFF){
xLumaInc = 0x1FFF;
}
yRatio = 100 * taskPtr->yInputLength;
yRatio /= taskPtr->yOutputLength;
taskPtr->brightness = 0x80;
if(yRatio < 125){
lpiMode = 0;
taskPtr->contrast = 64;
taskPtr->saturation = 64;
}else{
lpiMode = 1;
saturation = 64 * taskPtr->yOutputLength;
saturation /= taskPtr->yInputLength;
taskPtr->contrast = (Uint8)saturation;
taskPtr->saturation = (Uint8)saturation;
}
taskPtr->xLumaIncrement = xLumaInc;
taskPtr->xChromaIncrement = xLumaInc / 2;
taskPtr->xLumaPhaseOffset = 0;
taskPtr->xChromaPhaseOffset = 0;
yLumaInc = 1024 * taskPtr->yInputLength;
yLumaInc /= taskPtr->yOutputLength;
if(yLumaInc > 0xFFFF){
yLumaInc = 0xFFFF;
}
taskPtr->yLumaIncrement = yLumaInc;
taskPtr->yChromaIncrement = yLumaInc;
taskPtr->verticalScalingType = lpiMode;
for(i = 0; i < 4; i ++){
taskPtr->yLumaPhaseOffset[i] = 0;
taskPtr->yChromaPhaseOffset[i] = 0;
}
if(frameType == INTERLACED){
taskPtr->eventTrigger = 1;
}
else {
if(taskPtr == ®Ptr->taskA){
taskPtr->eventTrigger = 2;
}else{
taskPtr->eventTrigger = 3;
}
}
if(task == _SAA7115_TASKA){
_IIC_write(hI2C[channel], addrI2C,0x90,(Uint8 *)taskPtr,0x30);
}
else {
_IIC_write(hI2C[channel], addrI2C,0xC0,(Uint8 *)taskPtr,0x30);
}
}
/*
* ======== setScalerGlobals ========
*/
static void setScalerGlobals(Uns channel)
{
_SAA7115_Globals *globalPtr;
Uint8 addrI2C;
addrI2C = (channel == 0) ? _SAA7115_IIC_ADDR0 : _SAA7115_IIC_ADDR1;
globalPtr = &_SAA7115_settingsDef[channel].globals;
_IIC_write(hI2C[channel], addrI2C,0x80,(Uint8 *)globalPtr,9);
}
/*
* ======== setSAA7115InputFormat ========
*/
static void setSAA7115InputFormat(Int channel, SAA7115_AnalogFormat inFormat)
{
_SAA7115_Generics *genericPtr;
Uint8 addrI2C;
addrI2C = (channel == 0) ? _SAA7115_IIC_ADDR0 : _SAA7115_IIC_ADDR1;
genericPtr = &_SAA7115_settingsDef[channel].generics;
if(inFormat == SAA7115_AFMT_SVIDEO) {
_SAA7115_settingsDef[channel].generics.analogMuxMode = 7;
_SAA7115_settingsDef[channel].generics.bypassYCombFilter = 1;
_SAA7115_settingsDef[channel].generics.yCombFilter = 0;
}
else {
_SAA7115_settingsDef[channel].generics.analogMuxMode = channel;
_SAA7115_settingsDef[channel].generics.bypassYCombFilter = 0;
_SAA7115_settingsDef[channel].generics.yCombFilter = 1;
}
_IIC_write(hI2C[channel], addrI2C, 0x2,(Uint8 *)genericPtr + 2,1);
_IIC_write(hI2C[channel], addrI2C, 0x9,(Uint8 *)genericPtr + 9,1);
}
/*
* ======== setSAA7115SyncMode ========
*/
static void setSAA7115SyncMode(Int channel, Bool enableBT656Sync)
{
_SAA7115_Task *taskPtrA, *taskPtrB;
_SAA7115_Generics *genericPtr;
Uint8 addrI2C;
addrI2C = (channel == 0) ? _SAA7115_IIC_ADDR0 : _SAA7115_IIC_ADDR1;
genericPtr = &_SAA7115_settingsDef[channel].generics;
taskPtrA = &_SAA7115_settingsDef[channel].taskA;
taskPtrB = &_SAA7115_settingsDef[channel].taskB;
if(enableBT656Sync) {
_SAA7115_settingsDef[channel].taskA.ccir656Enable = 1;
_SAA7115_settingsDef[channel].taskB.ccir656Enable = 1;
_SAA7115_settingsDef[channel].generics.ofts = 0;
_SAA7115_settingsDef[channel].generics.ofts3 = 0;
} else {
_SAA7115_settingsDef[channel].taskA.ccir656Enable = 0;
_SAA7115_settingsDef[channel].taskB.ccir656Enable = 0;
_SAA7115_settingsDef[channel].generics.ofts = 2;
_SAA7115_settingsDef[channel].generics.ofts3 = 0;
}
_IIC_write(hI2C[channel], addrI2C,0x93,(Uint8 *)taskPtrA + 3,1);
_IIC_write(hI2C[channel], addrI2C,0xc3,(Uint8 *)taskPtrB + 3,1);
_IIC_write(hI2C[channel], addrI2C,0x13,(Uint8 *)genericPtr + 0x13, 1);
_IIC_write(hI2C[channel], addrI2C,0x1b,(Uint8 *)genericPtr + 0x1b, 1);
}
/*
* ======== setupUserDefResolution ========
*/
static void setupUserDefResolution(Arg arg)
{
SAA7115_ConfParams *saa7115Params = (SAA7115_ConfParams *)arg;
if(saa7115Params->outMode == SAA7115_MODE_USER) {
outModeTbl[SAA7115_MODE_USER][0] = saa7115Params->hSize;
outModeTbl[SAA7115_MODE_USER][1] = saa7115Params->vSize;
outModeTbl[SAA7115_MODE_USER][2] = saa7115Params->interlaced;
}
}
/*
* ======== SAA7115_close ========
*/
static Int SAA7115_close(EDC_Handle handle)
{
Int devId = (int)handle;
/*First Check if the Handle is correct */
if(devId == 0 || devId == 1) {
/*Put _SAA7115 in power down mode */
powerdownSAA7115(devId, TRUE);
return EDC_SUCCESS;
} else {
return EDC_FAILED;
}
}
/*
* ======== SAA7115_ctrl ========
*/
static Int SAA7115_ctrl(EDC_Handle handle, SAA7115_Cmd cmd, Arg arg)
{
Int devId = (int)handle;
_SAA7115_Generics *genericPtr;
Uint8 addrI2C;
addrI2C = (devId == 0) ? _SAA7115_IIC_ADDR0 : _SAA7115_IIC_ADDR1;
genericPtr = &_SAA7115_settingsDef[devId].generics;
/*First Check if the Handle is correct */
if(devId != 0 && devId != 1) {
return EDC_FAILED;
}
switch(cmd) {
case EDC_CONFIG: {
SAA7115_ConfParams *saa7115Params = (SAA7115_ConfParams *)arg;
hI2C[devId] = saa7115Params->hI2C;
enableIPortOutput(devId, saa7115Params->enableIPortOutput);
setupUserDefResolution(arg);
configSAA7115(devId, saa7115Params->inMode, saa7115Params->outMode,
saa7115Params->aFmt);
setSAA7115SyncMode(devId, saa7115Params->enableBT656Sync);
}
break;
case EDC_RESET:
resetSAA7115(devId);
break;
case SAA7115_POWERDOWN:
powerdownSAA7115(devId, TRUE);
break;
case SAA7115_POWERUP:
powerdownSAA7115(devId, FALSE);
break;
case SAA7115_SET_AMUXMODE:
_SAA7115_settingsDef[devId].generics.analogMuxMode = (int)arg;
if((int)arg >= 6) {/* svideo input */
_SAA7115_settingsDef[devId].generics.bypassYCombFilter = 1;
_SAA7115_settingsDef[devId].generics.yCombFilter = 0;
}else {
_SAA7115_settingsDef[devId].generics.bypassYCombFilter = 0;
_SAA7115_settingsDef[devId].generics.yCombFilter = 1;
}
_IIC_write(hI2C[0], addrI2C,0x2,(Uint8 *)genericPtr + 2,1);
_IIC_write(hI2C[0], addrI2C,0x9,(Uint8 *)genericPtr + 9,1);
break;
}
return EDC_SUCCESS;
}
/*
* ======== SAA7115_open ========
*/
static EDC_Handle SAA7115_open(String devName, Arg optArg)
{
Int devId;
/* Check if the addresse is correct */
if(devName[0] != '/') {
devId = -1;
} else if(devName[1] == '0') {
devId = 0;
} else if(devName[1] == '1'){
devId = 1;
} else {
devId = -1;
}
return (EDC_Handle)devId;
}
/**************************************************************************/
/* End of file */
/**************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -