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

📄 saa7115.c

📁 DM642上用的TH8200采集芯片的配套驱动
💻 C
📖 第 1 页 / 共 2 页
字号:
/**************************************************************************/
/* saa7115.c file */
/**************************************************************************/
#include <std.h>
#include <csl_i2c.h>      
#include <csl_stdinc.h>
#include <edc.h>
#include <saa7115.h>

#include "_iic.h"
#include "_saa7115.h"

typedef enum {INTERLACED, PROGRESSIVE} FrameType ;   

static void configSAA7115(Int decNum, SAA7115_Mode inMode,                     
    SAA7115_Mode outMode, SAA7115_AnalogFormat inFormat);
static void enableIPortOutput(Int channel, Bool iPortOutputEnable);
static void enableTask(Uns channel, Uns task, Uns enableFlag);
static void initSAA7115Def(Uns channel);
static void powerdownSAA7115(Int channel, Bool powerDownEnable);
static void resetSAA7115(Int channel);
static void scalerReset(Uns channel);
static void setInOutImageSize(Uns channel, Uns inType, Uns outType);
static void setNTSCScalerParameters(Uns channel,Uns task, Uns frameType);
static void setScalerGlobals(Uns channel);
static void setSAA7115InputFormat(Int channel, SAA7115_AnalogFormat inFormat);
static void setSAA7115SyncMode(Int channel, Bool enableBT656Sync);
static Int SAA7115_ctrl(EDC_Handle handle, SAA7115_Cmd cmd, Arg arg);
static Int SAA7115_close(EDC_Handle handle);
static EDC_Handle SAA7115_open(String devName, Arg optArg);



EDC_Fxns SAA7115_Fxns = {
    SAA7115_open,
    SAA7115_close,
    SAA7115_ctrl                   
};

static I2C_Handle hI2C[2] = {INV, INV};
static const Int inModeTbl[2][5] = {
    {240, 0x11, 0x01, 0, 1},/* NTSC */
    {288, 0x15, 0x35, 0, 1} /* PAL  */
};
static const Int outModeTbl[7][3] = {
    {640, 480, INTERLACED},/* NTSC640 */
    {720, 480, INTERLACED},/* NTSC720 */
    {720, 576, INTERLACED},/* PAL720  */
    {352, 288, PROGRESSIVE},/* CIF    */
    {176, 144, PROGRESSIVE},/* QCIF   */
    {128, 96, PROGRESSIVE}, /* SQCIF  */
    {352, 240, PROGRESSIVE},/* SIF    */
};


/*
 * ======== configSAA7115 ========
 */
static void configSAA7115(Int decNum, SAA7115_Mode inMode, 
        SAA7115_Mode outMode, SAA7115_AnalogFormat inFormat)
{
    initSAA7115Def(decNum);
	setInOutImageSize(decNum,inMode,outMode);
    setSAA7115InputFormat(decNum, inFormat);
}


/*
 * ======== enableIPortOutput ========
 */
static void enableIPortOutput(Int channel, Bool iPortOutputEnable)
{
    _SAA7115_settingsDef[channel].globals.iPortEnable = iPortOutputEnable;
    _SAA7115_settingsDef[channel].globals.xPortEnable = !iPortOutputEnable;
}

/*
 * ======== enableTask ========
 */
static void enableTask(Uns channel, Uns task, Uns enableFlag)
{
   	_SAA7115_Globals *globalPtr;
    Uint8 addrI2C;


    addrI2C = (channel == 0) ? _SAA7115_IIC_ADDR0 : _SAA7115_IIC_ADDR1;
   	globalPtr = &_SAA7115_settingsDef[channel].globals;
    if(task == _SAA7115_TASKA) {
	    globalPtr->taskAEnable = enableFlag;
	}else {
	    globalPtr->taskBEnable = enableFlag;
    }	
   	_IIC_write(hI2C[channel], addrI2C,0x80,(Uint8 *)globalPtr,1);
}

/*
 * ======== initSAA7115Def ========
 */
static void initSAA7115Def(Uns channel)
{
	_SAA7115_Generics *genericPtr; 
    Uint8 addrI2C;


    addrI2C = (channel == 0) ? _SAA7115_IIC_ADDR0 : _SAA7115_IIC_ADDR1;
   	genericPtr = &_SAA7115_settingsDef[channel].generics;
    _IIC_write(hI2C[channel], addrI2C,1,(Uint8 *)genericPtr + 1,29);
   	_IIC_write(hI2C[channel], addrI2C,0x30,(Uint8 *)genericPtr + 0x30,0x30);
   	_IIC_write(hI2C[channel], addrI2C,0xF0,(Uint8 *)genericPtr + 0xF0,0x10);
   	setScalerGlobals(channel);
}


/*
 * ======== powerdownSAA7115 ========
 */
static void powerdownSAA7115(Int channel, Bool powerDownEnable)
{
    Uint8 addrI2C;
    Uint8 powerdownSettings = 0x0d;


    /*Put _SAA7115 in power down mode */
    if(!powerDownEnable) {
        powerdownSettings = 0xf0;
    }
    addrI2C = (channel == 0) ? _SAA7115_IIC_ADDR0 : _SAA7115_IIC_ADDR1;
    _IIC_write(hI2C[channel], addrI2C,0x88,&powerdownSettings,1);
}

/*
 * ======== resetSAA7115 ========
 */
static void resetSAA7115(Int channel)
{
/***************************************************************/
/* Reset 7115 */
/***************************************************************/
    scalerReset(channel);
   	powerdownSAA7115(channel, FALSE);
}


/*
 * ======== scalerReset ========
 */
static void scalerReset(Uns channel)
{
   	_SAA7115_Globals *globalPtr;
   	Uint8 addrI2C;


    addrI2C = (channel == 0) ? _SAA7115_IIC_ADDR0 : _SAA7115_IIC_ADDR1;
   	globalPtr = &_SAA7115_settingsDef[channel].globals;
	/* reset */
	globalPtr->resetScaler = 0;
   	_IIC_write( hI2C[channel], addrI2C, 0x88, (Uint8 *)globalPtr + 8, 1 );
	/* unreset */
	globalPtr->resetScaler = 1;
   	_IIC_write( hI2C[channel], addrI2C, 0x88, (Uint8 *)globalPtr + 8, 1 );
}


/*
 * ======== setInOutImageSize ========
 */
static void setInOutImageSize(Uns channel, Uns inType, Uns outType)
{
	_SAA7115_Task *taskPtr;
	_SAA7115_Generics *genericPtr; 
	Uns pixelsInput,linesInput,pixelsOutput,linesOutput;
    Int frameType;
    Uns scalerFlag;
    Uns xOffset = 8;
    Uns yOffset = 15;
    Uint8 addrI2C;
    Int index;
	

    pixelsInput = 720; 
    addrI2C = (channel == 0) ? _SAA7115_IIC_ADDR0 : _SAA7115_IIC_ADDR1;
    index = (inType == SAA7115_MODE_NTSC720) ? 0 : 1;
    linesInput = inModeTbl[index][0];
    _SAA7115_settingsDef[channel].generics.vGateStart = inModeTbl[index][1];
	_SAA7115_settingsDef[channel].generics.vGateStop = inModeTbl[index][2];
	_SAA7115_settingsDef[channel].generics.vGateStartMsb = inModeTbl[index][3];
    _SAA7115_settingsDef[channel].generics.vGateStopMsb = inModeTbl[index][4];			    	    
    
   	genericPtr = &_SAA7115_settingsDef[channel].generics;
   	_IIC_write(hI2C[channel], addrI2C,0x15,(Uint8 *)genericPtr + 0X15, 3);
    index = outType;
    
    pixelsOutput = outModeTbl[index][0];
    linesOutput = outModeTbl[index][1];
    frameType = outModeTbl[index][2];
   	scalerFlag = TRUE;
   	if(pixelsInput == pixelsOutput) {
   		if (frameType == INTERLACED){
   			if (linesInput == linesOutput / 2){
   				scalerFlag = FALSE;          
   			}
   		}
   		else if (linesInput == linesOutput){
   			scalerFlag = FALSE;
   		}
   	}
   	if(scalerFlag == TRUE) {
   	    /* enable I-port output but disable X-port output */
        _SAA7115_settingsDef[channel].globals.iPortEnable = 1;
        _SAA7115_settingsDef[channel].globals.xPortEnable = 0;
    }
   	taskPtr = &_SAA7115_settingsDef[channel].taskA;
	taskPtr->xInputOffset = xOffset;
	taskPtr->yInputOffset = yOffset;
	taskPtr->xInputLength = pixelsInput;
	taskPtr->yInputLength = linesInput;
   	taskPtr->xOutputLength = pixelsOutput;
    if(frameType == INTERLACED){
   		taskPtr->yOutputLength = linesOutput / 2;
   	}else{
   		taskPtr->yOutputLength = linesOutput;
   	}
   	setNTSCScalerParameters(channel,_SAA7115_TASKA, frameType);
	enableTask(channel,_SAA7115_TASKA, TRUE);

   	taskPtr = &_SAA7115_settingsDef[channel].taskB;
	taskPtr->xInputOffset = xOffset;
	taskPtr->yInputOffset = yOffset;
	taskPtr->xInputLength = pixelsInput;
	taskPtr->yInputLength = linesInput;
   	taskPtr->xOutputLength = pixelsOutput;
    if(frameType == INTERLACED){
   		taskPtr->yOutputLength = linesOutput / 2;
   	}else{
   		taskPtr->yOutputLength = linesOutput;
   	}
   	setNTSCScalerParameters(channel,_SAA7115_TASKB, frameType);
	enableTask(channel,_SAA7115_TASKB, TRUE);
   	
}


/*
 * ======== setNTSCScalerParameters ========
 */
static void setNTSCScalerParameters(Uns channel,Uns task, Uns frameType)
{
   	Uns i,xRatio,firLuma,firChroma,xLumaInc;
   	Uns saturation,yRatio,lpiMode,yLumaInc;
	_SAA7115_Regs *regPtr;
	_SAA7115_Task *taskPtr;
    Uint8 addrI2C;
	

    addrI2C = (channel == 0) ? _SAA7115_IIC_ADDR0 : _SAA7115_IIC_ADDR1;
	regPtr = (_SAA7115_Regs *)&_SAA7115_settingsDef[channel];
	if(task == _SAA7115_TASKA){
		taskPtr = &_SAA7115_settingsDef[channel].taskA;
    }
	else{
		taskPtr = &_SAA7115_settingsDef[channel].taskB;

⌨️ 快捷键说明

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