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

📄 saa7111.c

📁 视频601芯片的驱动源码,你可以完全掌控该芯片了,对于其它多媒体芯片的设计具有参考价值
💻 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 + -