📄 saa7115.c
字号:
/*
* Copyright 2003 by Texas Instruments Incorporated.
* All rights reserved. Property of Texas Instruments Incorporated.
* Restricted rights to use, duplicate or disclose this code are
* granted through contract.
*
*/
/* "@(#) DDK 1.10.00.23 07-02-03 (ddk-b12)" */
/**************************************************************************/
/* 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 = TRUE, PROGRESSIVE = FALSE} 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 void setupUserDefResolution(Arg arg);
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 Int outModeTbl[9][3] = {
{640, 480, INTERLACED},/* NTSC640 */
{720, 480, INTERLACED},/* NTSC720 */
{720, 576, INTERLACED},/* PAL720 */
{768, 576, INTERLACED},/* PAL768 */
{352, 288, INTERLACED},/* CIF */
{176, 144, INTERLACED},/* QCIF */
{128, 96, INTERLACED},/* SQCIF */
{320, 240, INTERLACED},/* SIF */
{480, 480, INTERLACED} /* USER DEFINED */
};
/*
* ======== 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;
}
taskPtr->xPreScale = taskPtr->xInputLength / taskPtr->xOutputLength;
if(taskPtr->xPreScale == 0){
taskPtr->xPreScale = 1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -