📄 dtvvsb2.c
字号:
/* 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 + -