📄 tda8980.c
字号:
/* Copyright (c) 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 : tda8980.c 1.3
*
* Last update : 18:43:49 - 00/11/09
*
* Description :
*
*
*/
#include "tda8980.h"
#include "tda8980Defines.h"
#include "iicDirection.h"
#include <tm1/tmLibdevErr.h>
#include <tmlib/dprintf.h>
#include <tm1/tmAssert.h>
#include <tm1/tmIIC.h>
#include <tmlib/tmtypes.h>
/******************************** Types ******************************/
typedef struct
{
UInt32 iicAddress;
UInt32 mpocVersion;
UInt8 controlRegisters[TDA8980_NUM_CONTROL_REGS];
UInt8 viControlRegisters[TDA8980_NUM_CONTROL_REGS];
}tda8980InstVars_t, *ptda8980InstVars_t;
/*************************** static varibles *************************/
static UInt8 defaultControlRegs[TDA8980_NUM_CONTROL_REGS] =
{
0x20, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00
};
static tda8980InstVars_t aInstVars[2];
/****************************** Functions ****************************/
extern tmLibdevErr_t tda8980Init(UInt32 unitID, ptda8980Param_t pParams)
{
ptda8980InstVars_t ivp = &aInstVars[unitID];
Int i;
iicRequest_t req;
tmLibdevErr_t err;
Int iicInstance;
tmAssert(unitID < 2, -1);
tmAssert(pParams, TMLIBDEV_ERR_NULL_PARAMETER);
ivp->iicAddress = pParams->iicAddress;
ivp->mpocVersion = pParams->mpocVersion;
for (i = 0; i < TDA8980_NUM_CONTROL_REGS; i++)
ivp->controlRegisters[i] = defaultControlRegs[i];
req.address = ivp->iicAddress;
req.subaddress = TDA8980_CTRL_SUBADDR_START;
req.byteCount = TDA8980_NUM_CONTROL_REGS;
req.direction = IIC_WRITE;
req.type = IIC_SUBADDRESS;
req.data = ivp->controlRegisters;
req.numRetries = 1;
req.waitBeforeRetry = 200;
req.mode = IIC_Synchronous_By_Polling;
req.completion_function = Null;
err = iicOpen(&iicInstance);
if (err != TMLIBDEV_OK)
return err;
err = iicDispatch(iicInstance, &req);
if (err != TMLIBDEV_OK)
return err;
err = iicClose(iicInstance);
return err;
}
extern tmLibdevErr_t tda8980DigDemInit(UInt32 unitID)
{
ptda8980InstVars_t ivp = &aInstVars[unitID];
UInt8 iicd;
tmLibdevErr_t err;
iicd = (ivp->controlRegisters[TDA8980_VISION_IF0] & TDA8980_IFON_MASK) | TDA8980_IFON_NORMAL_OP;
err = iicWriteReg(ivp->iicAddress, TDA8980_VISION_IF0 + TDA8980_CTRL_SUBADDR_START, iicd);
if (err != TMLIBDEV_OK)
return err;
ivp->controlRegisters[TDA8980_VISION_IF0] = iicd;
iicd = ivp->controlRegisters[TDA8980_VISION_IF1];
iicd = (iicd & TDA8980_AGCM_MASK & TDA8980_AGC_SPEED_MASK) | TDA8980_AGCM_EXTERNAL | TDA8980_AGC_SPEED_NORM;
err = iicWriteReg(ivp->iicAddress, TDA8980_VISION_IF1 + TDA8980_CTRL_SUBADDR_START, iicd);
if (err != TMLIBDEV_OK)
return err;
ivp->controlRegisters[TDA8980_VISION_IF1] = iicd;
iicd = ivp->controlRegisters[TDA8980_VIDEO_ADC0];
if (ivp->mpocVersion <= 3)
iicd = (iicd & TDA8980_VON_MASK & TDA8980_VFMT_MASK) | TDA8980_VON_ADC_ON | TDA8980_VFMT_VSB_I;
else
iicd = (iicd & TDA8980_VON_MASK & TDA8980_VFMT_MASK) | TDA8980_VON_ADC_ON | TDA8980_VFMT_VSB_IQ;
err = iicWriteReg(ivp->iicAddress, TDA8980_VIDEO_ADC0 + TDA8980_CTRL_SUBADDR_START, iicd);
if (err != TMLIBDEV_OK)
return err;
ivp->controlRegisters[TDA8980_VIDEO_ADC0] = iicd;
return TMLIBDEV_OK;
}
/*****************************************************************************************/
extern tmLibdevErr_t tda8980ViInit(pboardVIDec_t pVD, UInt32 unitID)
{
ptda8980InstVars_t ivp = &aInstVars[unitID];
UInt8 iicd;
tmLibdevErr_t err;
pVD->handle = (Pointer) ivp;
iicd = (ivp->controlRegisters[TDA8980_VISION_IF0] & TDA8980_IFON_MASK) | TDA8980_IFON_NORMAL_OP;
if (ivp->mpocVersion > 3)
iicd = (iicd & TDA8980_IF_MASK) | TDA8980_IF_45_75;
err = iicWriteReg(ivp->iicAddress, TDA8980_VISION_IF0 + TDA8980_CTRL_SUBADDR_START, iicd);
if (err != TMLIBDEV_OK)
return err;
ivp->controlRegisters[TDA8980_VISION_IF0] = iicd;
iicd = ivp->controlRegisters[TDA8980_VISION_IF1];
iicd = (iicd & TDA8980_AGCM_MASK & TDA8980_AGC_SPEED_MASK) | TDA8980_AGCM_INTERNAL | TDA8980_AGC_SPEED_NORM;
err = iicWriteReg(ivp->iicAddress, TDA8980_VISION_IF1 + TDA8980_CTRL_SUBADDR_START, iicd);
if (err != TMLIBDEV_OK)
return err;
ivp->controlRegisters[TDA8980_VISION_IF1] = iicd;
iicd = ivp->controlRegisters[TDA8980_VIDEO_ADC0];
iicd = (iicd & TDA8980_VON_MASK & TDA8980_VFMT_MASK) | TDA8980_VON_ADC_ON | TDA8980_VFMT_TV_27;
err = iicWriteReg(ivp->iicAddress, TDA8980_VIDEO_ADC0 + TDA8980_CTRL_SUBADDR_START, iicd);
if (err != TMLIBDEV_OK)
return err;
ivp->controlRegisters[TDA8980_VIDEO_ADC0] = iicd;
return TMLIBDEV_OK;
}
/*****************************************************************************************/
extern tmLibdevErr_t tda8980ViGetDefaultAcquisitionWnd(pboardVIDec_t pVD, UInt *beginX, UInt *beginY, UInt *endX, UInt *endY)
{
switch (pVD->curVideoStandard)
{
case vasNTSC:
/* Set default acquisition window for NTSC */
*beginX = 0;
*beginY = 0;
*endX = *beginX + 719;
*endY = *beginY + 239;
break;
default:
return BOARD_ERR_COLOR_STANDARD_NOT_DETECTED;
}
return TMLIBDEV_OK;
}
/*****************************************************************************************/
extern tmLibdevErr_t tda8980ViGetStatus(pboardVIDec_t pVD, tmVideoStatusType_t type, UInt *pState)
{
tmLibdevErr_t err;
UInt iicd;
err = iicDirectionSelect(pVD->iicDirection);
if (err != TMLIBDEV_OK)
return err;
err = iicReadReg(pVD->slaveAddr, -1, &iicd);
if (err != TMLIBDEV_OK)
goto tda8980GetStatusExit;
switch (type)
{
case vstLocked:
*pState = (iicd & 0x40) ? True : False;
break;
case vstColorSignal:
*pState = (iicd & 0x01) ? True : False;
break;
default:
return BOARD_ERR_VAL_OUT_OF_RANGE;
}
tda8980GetStatusExit:
iicDirectionUnSelect(pVD->iicDirection);
return err;
}
/*****************************************************************************************/
extern tmLibdevErr_t tda8980ViSetAnalogInput(pboardVIDec_t pVD, UInt num)
{
tmLibdevErr_t err;
UInt8 iicd;
ptda8980InstVars_t ivp = (ptda8980InstVars_t) pVD->handle;
iicd = ivp->controlRegisters[TDA8980_VIDEO_SWITCH] & 0xe0;
iicd |= num | (num << 3);
err = iicWriteReg(ivp->iicAddress, TDA8980_CTRL_SUBADDR_START + TDA8980_VIDEO_SWITCH, iicd);
if (err != TMLIBDEV_OK)
return err;
ivp->controlRegisters[TDA8980_VIDEO_SWITCH] = iicd;
return TMLIBDEV_OK;
}
/********************************************************************************************/
extern tmLibdevErr_t tda8980ViGetVSyncFallingEdge(pboardVIDec_t pVD, UInt *lineNumber)
{
/* Equivalent to Video DecHAL VideoDecGetDefaultAcquisitionWnd */
switch (pVD->curVideoStandard)
{
case vasNTSC:
/* First line seen by TM */
*lineNumber = 0;
break;
default:
return BOARD_ERR_COLOR_STANDARD_NOT_DETECTED;
}
return TMLIBDEV_OK;
}
/*****************************************************************************************/
extern tmLibdevErr_t tda8980AiInit(UInt32 unitID)
{
UInt8 iicd;
ptda8980InstVars_t ivp = &aInstVars[unitID];
tmLibdevErr_t err;
iicd = (ivp->controlRegisters[TDA8980_AUDIO_ADC1] & TDA8980_AON_MASK) | TDA8980_AON_ON;
err = iicWriteReg(ivp->iicAddress, TDA8980_AUDIO_ADC1 + TDA8980_CTRL_SUBADDR_START, iicd);
if (err == TMLIBDEV_OK)
ivp->controlRegisters[TDA8980_AUDIO_ADC1] = iicd;
return err;
}
/*****************************************************************************************/
extern tmLibdevErr_t tda8980AiSetSRate(UInt32 unitID, Float sRate)
{
UInt8 iicd;
ptda8980InstVars_t ivp = &aInstVars[unitID];
tmLibdevErr_t err;
iicd = ivp->controlRegisters[TDA8980_AUDIO_ADC1] & TDA8980_ASF_MASK;
if (sRate <= 32000.0)
iicd |= TDA8980_ASF_32KHZ;
else if (sRate <= 44100.0)
iicd |= TDA8980_ASF_44KHZ;
else
iicd |= TDA8980_ASF_48KHZ;
err = iicWriteReg(ivp->iicAddress, TDA8980_AUDIO_ADC1 + TDA8980_CTRL_SUBADDR_START, iicd);
if (err == TMLIBDEV_OK)
ivp->controlRegisters[TDA8980_AUDIO_ADC1] = iicd;
return err;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -