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

📄 saa7115.c

📁 DM642上用的TH8200采集芯片的配套驱动
💻 C
📖 第 1 页 / 共 2 页
字号:
    }
	taskPtr->xPreScale = taskPtr->xInputLength / taskPtr->xOutputLength;
   	if(taskPtr->xPreScale == 0){
   		taskPtr->xPreScale = 1; 
    }
   	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 == &regPtr->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; 
    }    
    else {
        _SAA7115_settingsDef[channel].generics.analogMuxMode = channel; 
        _SAA7115_settingsDef[channel].generics.bypassYCombFilter = 0; 
    }
   	_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);
    
}
 

/*
 * ======== 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);
            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; 
        }else {
            _SAA7115_settingsDef[devId].generics.bypassYCombFilter = 0;         
        }
   	    _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 + -