📄 saa7111.c
字号:
/*------------------------------------------------------------------------
$Workfile: SAA7111.C $
$Date: 6/20/97 3:48p $
$Revision: 10 $
* Purpose:
* SAA711 Video Input chip support routines.
*
* Notes:
*
$History: SAA7111.C $
*
* ***************** Version 10 *****************
* User: Stevel Date: 6/20/97 Time: 3:48p
* Updated in $/601cman
* Add new header vlab.h.
*
* ***************** Version 9 *****************
* User: Dstarr Date: 8/07/96 Time: 1:29p
* Updated in $/601cman
* Support Phillips mode
*
* ***************** Version 8 *****************
* User: Stevel Date: 7/29/96 Time: 4:59p
* Updated in $/601cman
* Replace HPLL_ON by HPLL_OPEN.
*
* ***************** Version 7 *****************
* User: Stevel Date: 7/17/96 Time: 7:46p
* Updated in $/601cman
* Disable H.W. reset in adc_int() and Dave had verified it works !
*
* ***************** Version 6 *****************
* User: Dstarr Date: 5/03/96 Time: 12:25p
* Updated in $/601cman
* Add support for digital video.
*
* ***************** Version 5 *****************
* User: Dstarr Date: 4/13/96 Time: 12:18p
* Updated in $/601cman
* In playback the SAA7111 format and output control registers (10 and
* 11 hex) are written with 0. This seems to work, although we don't
* understand why.
*
* ***************** Version 3 *****************
* User: Dstarr Date: 3/13/96 Time: 5:11p
* Updated in $/601cman
* Checked out in lab. 601test plays beauty thru dll. Added pragma to
* suppress inconsistant use of dllimport, export is assumed warning.
*
* ***************** Version 2 *****************
* User: Stevel Date: 3/10/96 Time: 10:10p
* Updated in $/601cman
* Add DLLEXPORT to export functions for diagnostic test
*
* ***************** Version 1 *****************
* User: Stevel Date: 3/06/96 Time: 7:51p
* Created in $/601cman
* Initial relase
This code and information is provided "as is" without warranty of any
kind, either expressed or implied, including but not limited to the
implied warranties of merchantability and/or fitness for a particular
purpose.
1996 Analog Devices, Inc.
-------------------------------------------------------------------------*/
#include <stdlib.h>
#include <windows.h>
#include "globsym.h" /* Common symbols */
#include "amcc.h"
#include "saa7111.h" /* ADV7111 Register & bit names*/
#include "vlab.h"
#include "i2c.h" /* I2c bus service routines */
#include "vxdmsg.h"
#include "capplybk.h"
#include "601error.h"
#pragma warning(disable : 4273) /*dll export assumed warning. We are
a dll, we always export and never import */
SAA7111_REG init_7111; /* Structure to hold initial values
for 7111 registers */
DLLEXPORT int adc_init(int vformat, int dir, int input_video, int vcr_mode, AMCC_OP_REGS * ptr2amcc_opregs)
/******************************************************************
Processing: Copy the initial values from ram into all 7111 registers
Inputs: input_video can be S_VIDEO, COMPOSITE or DIG_VIDEO
vformat cal be NTSC or PAL
Outputs: As declared
Side-effects None
*******************************************************************/
{
int rtnvar;
memset (&init_7111,0,sizeof(init_7111));
/* make sure unused bits are 0*/
init_7111.chipaddr = ADCADDRESS;
if (dir == S_PlayBack )
{
init_7111.sync_ctl = AUFD | VNOI_OFF | HPLL_OPEN;
init_7111.out_ctl1 =0;
init_7111.format_delay = 0;
}
else
{
init_7111.sync_ctl = AUFD | VNOI_OFF;
init_7111.out_ctl1 = OEYC | OEHV;
if (vformat & PHILLIPS)
{
init_7111.format_delay = YUV422_16BIT;
}
else
{
init_7111.format_delay = YUV_CCIR656_8BIT;
}
}
if (input_video == S_VIDEO)
{
init_7111.aico1 = SLUGGISH | SVID_AGC_A1 | BYPASS_ANTIALIAS;
init_7111.luma_ctl = UPTCV | BYPS | BANDPASS3_8MHZ;
init_7111.chroma_ctl = DCCF | CDTO | RTCO_ON | NOMINAL_BAND;
}
else /* its composite or digital */
{
init_7111.aico1 = SLUGGISH | COMP_VID_A22 | BYPASS_ANTIALIAS;
init_7111.luma_ctl = UPTCV | BANDPASS3_8MHZ;
init_7111.chroma_ctl = CDTO | RTCO_ON | NOMINAL_BAND;
}
if (input_video == DIG_VIDEO)
init_7111.out_ctl1 = TRI_STATE | OEHV;
if (vcr_mode == TV) /* The VTRC bit makes the PLL track */
init_7111.sync_ctl &= ~VTRC; /* shaky video from a tape deck */
else /* If the sync is solid, you get */
init_7111.sync_ctl |= VTRC; /* a steadier sampling clk without */
/* the VTRC bit */
init_7111.luma_brig = CCIR_BRIG;
init_7111.luma_cont = CCIR_CONTRAST;
init_7111.chroma_sat = CCIR_SAT;
init_7111.hsync_stop = (byte)-17;
init_7111.out_ctl2 = AOUT_COMPOSITE;
rtnvar = rite_i2c_chip (&init_7111,0,ALL7111REGS);
Delay(60); /*Allow time for reset */
init_7111.chroma_ctl &= ~CDTO; /* Osc. On */
rtnvar |= rite_i2c_chip (&init_7111,CHROMACTL,1);
return rtnvar;
}
/******************************************************************
Processing: Read in all 7111 registers
Inputs: As declared
Outputs: As declared
Side-effects None
*******************************************************************/
DLLEXPORT int read_adc_all_regs(SAA7111_REG * p7111Regs, AMCC_OP_REGS * ptr2amcc_opregs)
{
int rtnvar;
ptr2amcc_opregs->MCSR |= ADD_ON_RESET; // Hardware reset
Delay (1); // of whole board.
ptr2amcc_opregs->MCSR &= ~ADD_ON_RESET; // try to remove sometime
p7111Regs->chipaddr = ADCADDRESS;
rtnvar = read_i2c_chip(p7111Regs, 0, ALL7111REGS);
Delay(60); // Allow time for reset
//ptr2amcc_opregs->MCSR |= ADD_ON_RESET; // Hardware reset
//Delay (1); // of whole board.
return rtnvar;
}
/******************************************************************
Processing: Write out all 7111 registers
Inputs: As declared
Outputs: As declared
Side-effects None
*******************************************************************/
DLLEXPORT int write_adc_all_regs(SAA7111_REG * p7111Regs, AMCC_OP_REGS * ptr2amcc_opregs)
{
int rtnvar;
ptr2amcc_opregs->MCSR |= ADD_ON_RESET; // Hardware reset
Delay (1); // of whole board.
ptr2amcc_opregs->MCSR &= ~ADD_ON_RESET; // try to remove sometime
p7111Regs->chipaddr = ADCADDRESS;
rtnvar = rite_i2c_chip(p7111Regs, 0, ALL7111REGS);
Delay(60); // Allow time for reset
//ptr2amcc_opregs->MCSR |= ADD_ON_RESET; // Hardware reset
//Delay (1); // of whole board.
return rtnvar;
}
/******************************************************************
Processing: Read in one 7111 registers
Inputs: As declared
Outputs: As declared
Side-effects None
*******************************************************************/
DLLEXPORT int read_adc_reg(int SubAdr, byte *pVal, AMCC_OP_REGS * ptr2amcc_opregs)
{
int rtnvar;
byte chip_i2c_addr;
if (SubAdr < 2 || SubAdr > 0x1F)
return CMAN_PARAM_ERR;
ptr2amcc_opregs->MCSR |= ADD_ON_RESET; // Hardware reset
Delay (1); // of whole board.
ptr2amcc_opregs->MCSR &= ~ADD_ON_RESET; // try to remove sometime
chip_i2c_addr = ADCADDRESS;
chip_i2c_addr &= ~1;
I2CStart();
rtnvar = I2CWriteData(chip_i2c_addr);/* send the chip address */
if (rtnvar == SUCCESS)
{
rtnvar = I2CWriteData((byte) SubAdr); // Send SubAddress
if (rtnvar == SUCCESS)
{
I2CStart();
chip_i2c_addr |= 1; /* set chip address Read bit */
rtnvar = I2CWriteData(chip_i2c_addr);/* send the chip address*/
if (rtnvar == SUCCESS)
{
*pVal =I2CReadData(); // Fetch data byte by byte
// I2CReadAck(); /* ack all but last byte*/
}
}
}
I2CStop();
//ptr2amcc_opregs->MCSR |= ADD_ON_RESET; // Hardware reset
//Delay (1); // of whole board.
return rtnvar;
}
/******************************************************************
Processing: Write out all 7111 registers
Inputs: As declared
Outputs: As declared
Side-effects None
*******************************************************************/
DLLEXPORT int write_adc_reg(int SubAdr, byte Val, AMCC_OP_REGS * ptr2amcc_opregs)
{
int rtnvar;
byte chip_i2c_addr;
if (SubAdr < 2 || SubAdr > 0x1F)
return CMAN_PARAM_ERR;
ptr2amcc_opregs->MCSR |= ADD_ON_RESET; // Hardware reset
Delay (1); // of whole board.
ptr2amcc_opregs->MCSR &= ~ADD_ON_RESET; // try to remove sometime
chip_i2c_addr = ADCADDRESS;
chip_i2c_addr &= 0xFE; // clear chip address Read bit
rtnvar = I2CWriteData(chip_i2c_addr);/* send the chip address */
if (rtnvar == SUCCESS)
{
rtnvar = I2CWriteData((byte) SubAdr); // Send SubAddress
if (rtnvar == SUCCESS)
rtnvar = I2CWriteData(Val); // Xmit data byte by byte
}
I2CStop();
//ptr2amcc_opregs->MCSR |= ADD_ON_RESET; // Hardware reset
//Delay (1); // of whole board.
return rtnvar;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -