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

📄 saa7182.c

📁 用于TM1300/PNX1300系列DSP(主要用于视频处理)的设备库的源码
💻 C
字号:
/*
 * Copyright (c) 1995-1999 by TriMedia Technologies. 
 *
 * +------------------------------------------------------------------+
 * | This software is furnished under a license and may only be used  |
 * | and copied in accordance with the terms and conditions of  such  |
 * | a license and with the inclusion of this copyright notice. This  |
 * | software or any other copies of this software may not be provided|
 * | or otherwise made available to any other person.  The ownership  |
 * | and title of this software is not transferred.                   |
 * |                                                                  |
 * | The information in this software is subject  to change without   |
 * | any  prior notice and should not be construed as a commitment by |
 * | TriMedia Technologies.                                           |
 * |                                                                  |
 * | this code and information is provided "as is" without any        |
 * | warranty of any kind, either expressed or implied, including but |
 * | not limited to the implied warranties of merchantability and/or  |
 * | fitness for any particular purpose.                              |
 * +------------------------------------------------------------------+
 *
 *  Module name              : saa7182.c    1.6
 *
 *  Last update              : 18:43:46 - 00/11/09
 *
 *  Description              :
 *
 *  Initialize and control routines for saa7182 DENC.
 *
 *  Revision                 :
 *      Built for the TCS 2.0 release
 *
 *
 */


#include <stdio.h>

#include <tm1/tmIIC.h>
#include <tm1/tmVO.h>
#include <tm1/tmAvFormats.h>
#include <tm1/tmProcessor.h>
#include <tmlib/tmtypes.h>

#include "saa7182.h"

#define SAA7182_NREGS   0x7E    /* number of 7182 registers     */
#define SAA7182_STARADR 0x38    /* Start for sub-addresses for 7182 */
#define SAA7182_ADDR    0x8C    /* SAA7182 IIC address */

#define SAA7182_BLACKLEVEL_REG    0x5D    /* bits 0-5 */

/* ALL VALUES TAKEN FROM DPC71SRC */

static unsigned char saa7182_init[SAA7182_NREGS - SAA7182_STARADR] = {
        /* 0x38 */ 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
        /* 0x40 */ 0x00, 0x00, 0x6B, 0x00, 0x00, 0x22, 0xAC, 0x0E,
        /* 0x48 */ 0x03, 0x1D, 0xAC, 0xF0, 0xC8, 0xB9, 0xD4, 0x38,
        /* 0x50 */ 0x47, 0xC1, 0xE3, 0x54, 0xA3, 0x54, 0xF2, 0x90,
        /* 0x58 */ 0x00, 0x00, 0x00, 0x79, 0xAD, 0x3C, 0x3A, 0x3A,
        /* 0x60 */ 0x00, 0x15, 0x69, 0x1F, 0x7C, 0xF0, 0x21, 0x00,
        /* 0x68 */ 0x00, 0x00, 0x00, 0x6D, 0x9B, 0xCC, 0x30, 0xD1,
        /* 0x70 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        /* 0x78 */ 0x00, 0x00, 0x12, 0x03, 0x40, 0x00
};

typedef struct subaddInfo_t {
    UInt8       subAddr;    /* subaddress of IIC register */
    UInt8       value;      /* data for IIC register */
}           subaddInfo_t;


/* PAL mode */
static subaddInfo_t saa7182_pal[] = {

    {0x5B, 0x8D}, /* Gain U-Axis */
    {0x5C, 0xC9}, /* Gain V-Axis */
    {0x5D, 0x2D}, /* Black Level */
    {0x5E, 0x3F}, /* Blanking Level */
    {0x5F, 0x3F}, /* */
    {0x61, 0x06}, /* DAC and Standard Control */
    {0x63, 0xCB}, /* Standard Subcarrier (4LSB's) */
    {0x64, 0x8A}, /* Standard Subcarrier */
    {0x65, 0x09}, /* Standard Subcarrier */
    {0x66, 0x2A}, /* Standard Subcarrier (4 MSB's) */
    {0x6C, 0xA6}, /* Horizontal Trigger (8 LSB's) */
    {0x6E, 0x20}, /* Multi Control */
    {0x6F, 0xD4}, /* Closed Caption/TTX Control */
    {0x7A, 0x15}, /* First active line (8 LSB's) */
    {0x7B, 0x35}, /* Last active line (8 LSB's) sf */
    {0x62, 0x4E}, /* 0xCE Burst Amplitude and RTC control (bit 7)*/
    {0x6C, 0xAE} /* 0xAF Horizontal Trigger (8 LSB's)*/

};

/* NTSC mode */
static subaddInfo_t saa7182_ntsc[] = {

    {0x5B, 0x79}, /* Gain U-Axis */
    {0x5C, 0x3C}, /* Gain V-Axis */
    {0x5E, 0x3A}, /* Blanking Level */
    {0x5F, 0x3A}, /* */
    {0x61, 0x15}, /* DAC and Standard Control */
    {0x63, 0x1F}, /* Standard Subcarrier (4LSB's) */
    {0x64, 0x7C}, /* Standard Subcarrier */
    {0x65, 0xF0}, /* Standard Subcarrier */
    {0x66, 0x21}, /* Standard Subcarrier (4 MSB's) */
    {0x6E, 0x30}, /* Multi Control */
    {0x6F, 0xD1}, /* Closed Caption/TTX Control */
    {0x7A, 0x12}, /* First active line (8 LSB's) */
    {0x7B, 0x03}, /* Last active line (8 LSB's) sf */
    {0x62, 0x69}, /* 0xE9 Burst Amplitude and RTC control (bit 7)*/
    {0x6C, 0x9A} /* 0x9B Horizontal Trigger (8 LSB's)*/

};

/* SECAM mode */
static subaddInfo_t saa7182_secam[] = {

    {0x5B, 0x6A}, /* Gain U-Axis */
    {0x5C, 0x7F}, /* Gain V-Axis */
    {0x5E, 0xBF}, /* Blanking Level */
    {0x5F, 0xBF}, /* */
    {0x61, 0x0E}, /* DAC and Standard Control */
    {0x63, 0xB2}, /* Standard Subcarrier (4LSB's) */
    {0x64, 0x3B}, /* Standard Subcarrier */
    {0x65, 0xA3}, /* Standard Subcarrier */
    {0x66, 0x28}, /* Standard Subcarrier (4 MSB's) */
    {0x6C, 0xA6}, /* Horizontal Trigger (8 LSB's) */
    {0x6E, 0x20}, /* Multi Control */
    {0x6F, 0xD4}, /* Closed Caption/TTX Control */
    {0x7A, 0x15}, /* First active line (8 LSB's) */
    {0x7B, 0x35}, /* Last active line (8 LSB's) sf */
    {0x62, 0x4E}, /* 0xCE Burst Amplitude and RTC control (bit 7)*/
    {0x6C, 0xAE} /* 0xAF Horizontal Trigger (8 LSB's)*/

};

static
tmLibdevErr_t 
saa7182Config(UInt32 address, subaddInfo_t * tobeupdated, UInt32 last_address)
{
    int         i, err;
    unsigned char subaddr, data;
    tmLibdevErr_t retval = TMLIBDEV_OK;

    /* Update the device */
    for (i = 0; i < last_address; i++) {
        subaddr = tobeupdated[i].subAddr;
        data = tobeupdated[i].value;
        err = iicWriteReg(address, subaddr, data);

        if (err)
            retval |= err;
    } 
    return (retval);
}

/****  Public Init function ****/
#define        SAA7111_ADDR      0x48    /* SAA7111 IIC address     */
#define VIVO_THRU_TM1 (1 << 7) /* @ iic SAA7111_ADDR sub 0x11,  
                                  0 = video goes directly from dec to enc 
                                  1 = video goes thru TM1 */
tmLibdevErr_t 
saa7182Init(pboardVOParam_t param)
{
    int         i;
    int         retval = 0;
    unsigned char subaddr, data;
    pprocCapabilities_t procCap;
    UInt val; 

    procGetCapabilities(&procCap);

    /* make sure VO clock is running at 27MHz! */
    MMIO(VO_CLOCK) = (unsigned int) (0.5 + 
        (1431655765.0 * 27000000 / (float) procCap->cpuClockFrequency));
    MMIO(VO_CTL) = 0x02700000 | (MMIO(VO_CTL) | VO_RESET);    
        /* do not take it out of reset */

    microsleep(20000);    /* wait an extra 20ms */

    if (param->videoStandard == vasNone) 
	return TMLIBDEV_OK;

    /* Update the device */
    for (i = 0; i < SAA7182_NREGS; i++)
        retval |= iicWriteReg(SAA7182_ADDR, i, 0);

    if (retval)
        return ((tmLibdevErr_t) retval);

    for (i = 0; i < (SAA7182_NREGS - SAA7182_STARADR); i++) {
        subaddr = (unsigned char) (SAA7182_STARADR + i);
        data = saa7182_init[i];
        retval |= iicWriteReg(SAA7182_ADDR, subaddr, data);
    }
    
    if (retval)
        return ((tmLibdevErr_t) retval);

    switch (param->videoStandard) {
    case vasNTSC:        /* Update for vasNTSC standard */
        retval |= saa7182Config(SAA7182_ADDR, saa7182_ntsc, 
                                (sizeof (saa7182_ntsc) >> 1));
        break;
    case vasPAL:        /* Update for vasPAL standard */
        retval |= saa7182Config(SAA7182_ADDR, saa7182_pal, 
                                (sizeof (saa7182_pal) >> 1));
        break;
    case vasSECAM:      /* Update for vasSECAM standard */
        retval |= saa7182Config(SAA7182_ADDR, saa7182_secam, 
                                (sizeof (saa7182_secam) >> 1));
        break;
    case vasNone:
	return TMLIBDEV_OK;
    default:
        return VO_ERR_STANDARD_NOT_SUPPORTED;
    }
    retval |= saa7182Stop(param->videoStandard);
    retval |= saa7182Start(param->videoStandard);
    
    if (retval)
        return retval;

    /* Set demux on board so 7182 gets input from TM iso 7111 */ 
    retval |= iicReadReg(SAA7111_ADDR, 0x11, &val);
    retval |= iicWriteReg(SAA7111_ADDR, 0x11, val | VIVO_THRU_TM1);

    return ((tmLibdevErr_t) retval);
}



/****  Public Config function ****/
tmLibdevErr_t 
saa7182Configure(UInt32 subaddr, UInt32 value)
{
    int         err;
    tmLibdevErr_t retval = TMLIBDEV_OK;

    err = iicWriteReg(SAA7182_ADDR, subaddr, value);

    if (err)
        retval |= err;
    return (retval);
}

/************************** Turn Denc DAC on  *****************************/

tmLibdevErr_t
saa7182Start(tmVideoAnalogStandard_t standard)
{
    
    switch (standard) {
    case vasNTSC:
        return (iicWriteReg(SAA7182_ADDR, 0x61, 0x15));
    case vasPAL:
        return (iicWriteReg(SAA7182_ADDR, 0x61, 0x16));
    case vasSECAM:
        return (iicWriteReg(SAA7182_ADDR, 0x61, 0x1C));
    default:
        return BOARD_ERR_UNSUPPORTED_STANDARD;
    }
}

/************************** Turn Denc DAC off  *****************************/

tmLibdevErr_t
saa7182Stop(tmVideoAnalogStandard_t standard)
{
    switch (standard) {
    case vasNTSC:
        return (iicWriteReg(SAA7182_ADDR, 0x61, 0xD5));
    case vasPAL:
        return (iicWriteReg(SAA7182_ADDR, 0x61, 0xD6));
    case vasSECAM:
        return (iicWriteReg(SAA7182_ADDR, 0x61, 0xDC));
    default:
        return BOARD_ERR_UNSUPPORTED_STANDARD;
    }
}

/************************** Set Brightness (or Balck Level) *****************/
tmLibdevErr_t 
saa7182SetBrightness(UInt val)
{
    if (val > 63)
        return BOARD_ERR_VAL_OUT_OF_RANGE;

    return iicWriteReg(SAA7182_ADDR, SAA7182_BLACKLEVEL_REG, val);
}

⌨️ 快捷键说明

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