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

📄 dtvvsb2.c

📁 用于TM1300/PNX1300系列DSP(主要用于视频处理)的设备库的源码
💻 C
📖 第 1 页 / 共 3 页
字号:
/* Copyright (c) 1999 - 2000 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              : dtvVsb2.c  1.12
 *
 *  Last update              : 19:08:33  -  00/11/09
 *
 *  Description              :
 *
 *
 */

#include <string.h>
#include <tmlib/dprintf.h>
#include <tm1/tmAssert.h>
#include <tm1/tmBoard.h>
#include <tm1/tmGPIOpins.h>
#include <tm1/tmBoardID.h>
#include <tm1/tsaReg.h>
#include <tm1/tsaComponent.h>
#include <tm1/tmIIC.h>
#include <tmlib/tmtypes.h>
#include <tm1/tsaTvTuner.h>
#include <tm1/tmAI.h>
#include <tm1/tmProcessor.h>

#include "iicDirection.h"
#include "td1536.h"
#include "tda8961.h"
#include "tda8980.h"
#include "tda9851.h"

/************************************** defines ******************************************/
static Int vsb2IICDirection = IIC_DIRECTION_NIM2;

#define TRY(x) \
do { \
tmLibdevErr_t _err = (x); \
if (_err != TMLIBDEV_OK) { \
DP(("Failed at line %d in file %s. Err = %x\n", __LINE__, __FILE__, _err)); \
return _err; \
}} while (0) 

#define TRY_UNSELECT(x) \
do { \
tmLibdevErr_t _err = (x);                                                   \
if (_err != TMLIBDEV_OK) {                                                  \
DP(("Failed at line %d in file %s. Err = %x\n", __LINE__, __FILE__, _err)); \
iicDirectionUnSelect(vsb2IICDirection);                                   \
return _err;                                                                \
}} while (0) 

#define VSB2_TUNER_IIC_ADDRESS TD1536_IIC_ADDRESS_0

#define CATALINA_IIC_EXPANDER_A 0x40
#define CATALINA_IIC_EXPANDER_B 0x46
#define CATALINA_IIC_EXPANDER_C 0x44

#define IIC_EEPROM_ADDRESS      0xa7

/**************************** static functions and variables *****************************/
static tmLibdevErr_t dtvVsb2Activate(pcomponent_t comp);
static tmLibdevErr_t dtvVsb2Register(void);
static tmLibdevErr_t dtvVsb2Detect(void);
static tmLibdevErr_t dtvVsb2Init(void);
static tmLibdevErr_t getNumberOfUnits(UInt32 *pNumberOfUnits, Char *searchString);

/* iic ports on the board */
static UInt8 iicPortA = 04;
static UInt8 iicPortB = 0x00; /* S/PDIF status */
static UInt8 iicPortC = 0x04; /* L3 bus, audio input select */
static Float CPUClock = 1.0;

/* tuner support */
static tmLibdevErr_t dtvVsb2TunerInit(pboardTvTunerParameters_t params);
static tmLibdevErr_t dtvVsb2TunerTerm(void);
static tmLibdevErr_t dtvVsb2TunerConfig(UInt32 command, Pointer value);
static tmLibdevErr_t dtvVsb2TunerSetChannel(ptsaTvTunerChannelParams_t chanParams);
static tmLibdevErr_t dtvVsb2TunerConfigChannel(UInt32 command, Pointer value);

static boardTvTunerConfig_t tunerConfig = 
{
    "VSB II - TD1536",
    dtvVsb2TunerInit,
    dtvVsb2TunerTerm,
    dtvVsb2TunerConfig,
    dtvVsb2TunerSetChannel,
    dtvVsb2TunerConfigChannel,
    TD1536_SUPPORTED_STEP_SIZES,
    TD1536_SUPPORTED_INPUTS,
    TD1536_MIN_FREQUENCY,
    TD1536_MAX_FREQUENCY,
    {0xff, 0xff, unit1, vaaCVBS, 1}
};

/* Video in support. */
#define NO_OF_VIDEO_ADAPTERS 3
static boardVIAdapterEntry_t dtvVsb2Apters [NO_OF_VIDEO_ADAPTERS] =
{
    { vaaCVBS,   0, 2}, /* CVBS    adapter 0 */
    { vaaCVBS,   1, 0}, /* CVBS    adapter 1 (analog TV) */
    { vaaSvideo, 0, 5}  /* S-Video adapter 0 */
};

static tmLibdevErr_t dtvVsb2ViInit(pboardVIParam_t params);
static tmLibdevErr_t dtvVsb2ViConfigure(UInt32 subaddr, UInt32 value);
static tmLibdevErr_t dtvVsb2ViSetAnalogInput(pboardVIDec_t pVD, tmVideoAnalogAdapter_t adapter, UInt adapterInstance);
static tmLibdevErr_t dtvVsb2ViGetAnalogInput(pboardVIDec_t pVD, tmVideoAnalogAdapter_t *adapter, UInt *adapterInstance);

static boardVIConfig_t dtvVsb2Vi =
{
    "tw98",                         /* decoder name */
    dtvVsb2ViInit,                  /* decode init */
    Null,                           /* decoder term */
    Null,                           /* get standard */
    Null,
    Null,
    Null,
    Null,
    dtvVsb2ViConfigure,             /* config */
    TDA8980_SUPPORTED_STANDARDS,    /* supported color standards */
    TDA8980_SUPPORTED_ADAPTERS,     /* supported adapters */
    intVIDEOIN2,                    /* interrupt number */
    VI2_STATUS,                     /* mmioBase */
    GPIO_VI2_CLK,                   /* gpio first pin */
    GPIO_VI2_DATA9,                 /* gpio last pin */
    TDA8980_CAPABILITIES_FLAGS,     /* capabilitie flags */
    TDA8980_OUTPUT_FORMATS,         /* output formats */
    tda8980ViGetVSyncFallingEdge,   /* returns line number of VSync falling edge */
    Null,                           /* returns sliced Closed Caption data */
    tda8980ViGetStatus,             /* get status information */
    Null,                           /* returns supported services for each VBI line */
    Null,                           /* sets data services to be sliced */
    Null,                           /* enables HW slicing */
    Null,                           /* set video standard for slicer */
    Null,                           /* get slicer's video standard */
    Null,                           /* toggle slicer's field ID */
    Null,                           /* set input of slicer */
    Null,                           /* get slicer's input */
    Null,                           /* set BCSH for active video */
    Null,                           /* get BCSH for active video */
    dtvVsb2ViSetAnalogInput,        /* set video input mode */
    dtvVsb2ViGetAnalogInput,        /* get video input mode */
    Null,                           /* set video standard */
    Null,                           /* set video source type */
    Null,                           /* get video source type */
    Null,                           /* set the video's output format */
    Null,                           /* get the video's output format */
    Null,                           /* set video acquisition window */
    Null,                           /* get video acquisition window */
    tda8980ViGetDefaultAcquisitionWnd,  /* get the default acquisition window */
    Null,                           /* set video output size */
    Null,                           /* set interlaced mode */
    Null,                           /* disable video decoder */
    Null,                           /* set power save mode */
    Null,                           /* get number of GPIOs on decoder */
    Null,                           /* set the state of one GPIO pin */
    Null,                           /* get a GPIO pin's state */
    Null,                           /* open VBI decoder */
    Null,                           /* enable VBI */
    Null,                           /* set VBI mode */
    Null,                           /* set the slicer's mode */
    Null,                           /* close VBI decoder */
    Null,                           /* get the slicer's line flags */
    { TDA8980_IIC_ADDRESS_0,        /* TW98's I2C slave address */
      NO_OF_VIDEO_ADAPTERS,         /* number of adapters          */
      dtvVsb2Apters,                /* mapping table of adapters to inputs */
      vasNone,
      0,
      Null },
    Null                            /* Get the standard for a specific adapter */
};

/* digital demodulator support */
static tmLibdevErr_t dtvVsb2DigDemInit(pboardTvDigDemParameters_t params);
static tmLibdevErr_t dtvVsb2DigDemTerm(void);
static tmLibdevErr_t dtvVsb2DigDemConfig(UInt32 command, Pointer value);
static tmLibdevErr_t dtvVsb2DigDemStart(void);
static tmLibdevErr_t dtvVsb2DigDemStop(void);
static tmLibdevErr_t dtvVsb2DigDemGetStatus(tsaTvDigDemStatusMode_t statusMode, ptsaTvDigDemStatus_t status);

static boardTvDigDemConfig_t digDemConfig =
{
    "VSB II - TDA9861",
    dtvVsb2DigDemInit,
    dtvVsb2DigDemTerm,
    dtvVsb2DigDemConfig,
    dtvVsb2DigDemStart,
    dtvVsb2DigDemStop,
    dtvVsb2DigDemGetStatus,
    TDA8961_SUPPORTED_STANDARDS,
    TDA8961_MAX_OFFSET,
    TDA8961_NUM_ACQUISITION_MODES,
    unit0,
    unit1
};

static tsaTvTunerInput_t tunerInput;
static UInt              mpocVersion;

/* NTSC audio demodulator */
static tmLibdevErr_t dtvVsb2AudDemInit(unitSelect_t unitID, pboardTvAudDemParameters_t params);
static tmLibdevErr_t dtvVsb2AudDemConfig(unitSelect_t unitID, UInt32 command, Pointer Value);

static boardTvAudDemConfig_t audDemConfig1 = 
{
    "NIM - TDA9851",
    dtvVsb2AudDemInit,                  /* initFunc */
    tda9851Term,                    /* termFunc */
    dtvVsb2AudDemConfig,                /* configFunc */
    tda9851Start,                   /* startFunc */
    tda9851Stop,                    /* stopFunc */
    tda9851GetStatus,               /* getStatusFunc */
    TDA9851_SUPPORTED_AUDIO_MODES,  /* supportedAudioModes */
    unit1,                          /* aiUnit */
    aaaAuxInput1,                   /* aiAnalogAdapter */
    unit1                           /* tunerID */
};

/* AI */
#define DTVVSB2_SUPPORTED_AUDIO_IN_TYPES       (atfLinearPCM)
#define DTVVSB2_SUPPORTED_AUDIO_IN_SUBTYPES    (apfStereo16)
#define DTVVSB2_SUPPORTED_AUDIO_ADAPTERS       (aaaNone | aaaLineInput | aaaAuxInput1)

static UInt32 aiMMIOBase = AI2_STATUS;

static tmLibdevErr_t dtvVsb2AI2Init(boardAIParam_t *param);  
static tmLibdevErr_t dtvVsb2AI2Term(void);
static tmLibdevErr_t dtvVsb2AI2Start(void);
static tmLibdevErr_t dtvVsb2AI2Stop(void);
static tmLibdevErr_t dtvVsb2AI2SetSrate(Float sRate);
static tmLibdevErr_t dtvVsb2AI2GetSrate(Float *sRate);
static tmLibdevErr_t dtvVsb2AI2SetInput(tmAudioAnalogAdapter_t input);
static tmLibdevErr_t dtvVsb2AI2GetInput(tmAudioAnalogAdapter_t *input);
static tmLibdevErr_t dtvVsb2AI2GetFormat(tmAudioFormat_t *inputFormat);
static tmLibdevErr_t dtvVsb2AI2Config(UInt32 subaddr, Pointer value);

static boardAIConfig_t ai2Config =
{
    "NIM AI 2",
    dtvVsb2AI2Init,       /* init */
    dtvVsb2AI2Term,       /* term */
    dtvVsb2AI2Start,      /* start */
    dtvVsb2AI2Stop,       /* stop */
    dtvVsb2AI2SetSrate,   /* set srate */
    dtvVsb2AI2GetSrate,   /* get srate */
    Null,               /* set volume */
    Null,               /* get volume */
    dtvVsb2AI2SetInput,   /* set input */    
    dtvVsb2AI2GetInput,   /* get input */    
    dtvVsb2AI2Config,     /* config */
    dtvVsb2AI2GetFormat,  /* getFormat */
    DTVVSB2_SUPPORTED_AUDIO_IN_TYPES,       /* types supported */
    DTVVSB2_SUPPORTED_AUDIO_IN_SUBTYPES,    /* subtypes supported */
    DTVVSB2_SUPPORTED_AUDIO_ADAPTERS,       /* audioAdapters supported*/
    intAUDIOIN2,       /* interrupt */
    AI2_STATUS,        /* mmioBase */
    50000,             /* max sample rate */
    20000,             /* min sample rate */
    GPIO_AI2_OSCLK,    /* gpio first pin */
    GPIO_AI2_WS        /* gpio last pin */
};

/************************************* functions *****************************************/
static tmLibdevErr_t mapAdapter2Mode(pboardVIDec_t pVD, tmVideoAnalogAdapter_t adapter, UInt adapterInstance, UInt *mode)
{
    UInt i; 

    /* If this is vaaNone then use the default adapter */
    if (adapter == vaaNone)
    {
        *mode = pVD->adapterTable[0].decInput;
        return TMLIBDEV_OK;
    }

    for (i = 0; i < pVD->numAdapters; i++)
    {
        /* Find the right instance of the adapter */
        if ((pVD->adapterTable[i].instNum == adapterInstance) &&
            (pVD->adapterTable[i].adapterType == adapter))
        {
            *mode = pVD->adapterTable[i].decInput;
            return TMLIBDEV_OK;
        }
    }

    /* Right adapter was not found -> return error */
    return BOARD_ERR_UNSUPPORTED_ADAPTER;
}

/*****************************************************************************************/
static tmLibdevErr_t getNumberOfUnits(UInt32 *pNumberOfUnits, Char *searchString)
{
    UInt32        i = 0;
    tsaRegFind_t  findInfo;
    tmLibdevErr_t err;

    err = tsaRegFindFirstEntry(searchString, &findInfo);
    if (err)
    {
        *pNumberOfUnits = 0;
        return TMLIBDEV_OK;
    }

    i++;

    while (tsaRegFindNextEntry(searchString, &findInfo) == TMLIBDEV_OK)
        i++;

    *pNumberOfUnits = i;

    return TMLIBDEV_OK;
}

/*****************************************************************************************/
static tmLibdevErr_t dtvVsb2DigDemInit(pboardTvDigDemParameters_t params)
{
    tmLibdevErr_t  err;

    tmAssert(params, TMLIBDEV_ERR_NULL_PARAMETER);

    err = iicDirectionSelect(vsb2IICDirection);
    if (err != TMLIBDEV_OK)
        return err;

    err = tda8980DigDemInit(0);
    if (err != TMLIBDEV_OK)
        goto dtvVsb2DigDemInitExit;

    err = tda8961DigDemInit(0);
    if (err != TMLIBDEV_OK)
        goto dtvVsb2DigDemInitExit;

dtvVsb2DigDemInitExit:

    iicDirectionUnSelect(vsb2IICDirection);

    return err;
}

/*****************************************************************************************/
static tmLibdevErr_t dtvVsb2DigDemTerm(void)
{
    return TMLIBDEV_OK;
}

/*****************************************************************************************/
static tmLibdevErr_t dtvVsb2DigDemConfig(UInt32 command, Pointer value)
{
    tmLibdevErr_t err;

    err = iicDirectionSelect(vsb2IICDirection);
    if (err != TMLIBDEV_OK)
        return err;

    switch (command)
    {
        case TVDIGDEM_CONFIG_GET_OFFSET:
        {
            Int d;

            tmAssert(value, TMLIBDEV_ERR_NULL_PARAMETER);
            err = tda8961GetOffset(0, &d);
            * (Int *) value = d;
            break;
        }
        case TVDIGDEM_CONFIG_SW_RESET:
            err = tda8961Reset(0);
            break;
        case TVDIGDEM_CONFIG_SET_ACQUISITION_MODE:
            tmAssert(value, TMLIBDEV_ERR_NULL_PARAMETER);
            err = tda8961SetAcquisitionMode(0, * (Int*) value);
            break;
        case TVDIGDEM_CONFIG_GET_NUM_EQ_CLUSTERS:
            tmAssert(value, TMLIBDEV_ERR_NULL_PARAMETER);
            * (UInt *) value = 4;
            break;
        case TVDIGDEM_CONFIG_GET_EQ_CLUSTERS:
            tmAssert(value, TMLIBDEV_ERR_NULL_PARAMETER);
            err = tda8961GetClusters(0, (ptsaTvDigDemEqCluster_t *) value);
            break;
        case TVDIGDEM_CONFIG_SET_EQ_CLUSTERS:
            tmAssert(value, TMLIBDEV_ERR_NULL_PARAMETER);
            err = tda8961SetClusters(0, (Int *) value);
            break;
        case TVDIGDEM_CONFIG_GET_SER:
            tmAssert(value, TMLIBDEV_ERR_NULL_PARAMETER);
            err = tda8961GetSer(0, (UInt *) value);
            break;
        case TVDIGDEM_CONFIG_GET_SYNC_CONFIDENCE:
            tmAssert(value, TMLIBDEV_ERR_NULL_PARAMETER);
            err = tda8961GetSyncConfidence(0, (UInt *) value);
            break;
        case TVDIGDEM_CONFIG_CORR_RESET:
            err = tda8961CorrReset(0);
            break;
        case TVDIGDEM_CONFIG_CORR_GET_STATUS:
            tmAssert(value, TMLIBDEV_ERR_NULL_PARAMETER);
            err = tda8961CorrGetStatus(0, (ptsaTvDigDemCorrStatus_t) value);
            break;
        case TVDIGDEM_CONFIG_CORR_SET_PARAMS:
            tmAssert(value, TMLIBDEV_ERR_NULL_PARAMETER);
            err = tda8961CorrSetParams(0, (ptsaTvDigDemCorrParams_t) value);
            break;
        case TVDIGDEM_CONFIG_CORR_READ_MEM:
            tmAssert(value, TMLIBDEV_ERR_NULL_PARAMETER);
            err = tda8961CorrReadMem(0, (ptsaTvDigDemCorrMem_t) value);

⌨️ 快捷键说明

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