📄 tda8960.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 : tda8960.c 1.3
*
* Last update : 18:43:48 - 00/11/09
*
* Description :
*
*/
#include "tda8960.h"
#include <tmlib/dprintf.h>
#include <tm1/tmAssert.h>
#include <tm1/tmIIC.h>
#include <tmlib/tmtypes.h>
#define N_VSB_CNTR_REGS 17
typedef struct
{
UInt32 iicAddress;
UInt8 *vsbIICTable;
}tda8960Status_t, *ptda8960Status_t;
static UInt8 vsbDefaultInits1[ N_VSB_CNTR_REGS ] = {
/* 0x0000 */ 0x00, 0x00, 0x04, 0x00, 0x02, 0x80, 0x00, 0xCA,
/* 0x0008 */ 0x74, 0x00, 0x00, 0x00, 0xFC, 0x96, 0x66, 0x55,
/* 0x0010 */ 0x5F
};
static UInt8 vsbAlternateInits1[ N_VSB_CNTR_REGS ] = {
/* 0x0000 */ 0x00, 0x00, 0x04, 0x00, 0x02, 0x80, 0x00, 0xCA,
/* 0x0008 */ 0x74, 0x00, 0x00, 0x00, 0xFC, 0x96, 0x99, 0x55,
/* 0x0010 */ 0x5F
};
static Int eqTaps[148];
static tda8960Status_t statusArray[4];
static tmLibdevErr_t initRegisters(ptda8960Status_t vsbStatus);
/******************************************************************************/
static tmLibdevErr_t initRegisters(ptda8960Status_t vsbStatus)
{
iicRequest_t req;
tmLibdevErr_t err;
Int iicInstance;
DP(("tda8960 initRegisters\n"));
req.address = vsbStatus->iicAddress;
req.byteCount = N_VSB_CNTR_REGS + 1;
req.direction = IIC_WRITE;
req.type = IIC_SIMPLE;
req.data = vsbStatus->vsbIICTable;
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);
if (err != TMLIBDEV_OK)
return err;
return TMLIBDEV_OK;
}
/******************************************************************************/
extern tmLibdevErr_t tda8960Init(UInt32 unitID, ptda8960Param_t params)
{
tmLibdevErr_t err;
ptda8960Status_t vsbStatus = &statusArray[unitID];
tmAssert(params, TMLIBDEV_ERR_NULL_PARAMETER);
if (params->standard != ddsATSC)
return TVDIGDEM_ERR_UNSUPPORTED_STANDARD;
vsbStatus->iicAddress = params->iicAddress;
vsbStatus->vsbIICTable = vsbDefaultInits1;
/* reset VSB chip */
err = iicWriteReg(vsbStatus->iicAddress, -1, 0xff);
err = iicWriteReg(vsbStatus->iicAddress, -1, 0x00);
err = initRegisters(vsbStatus);
if (err != TMLIBDEV_OK)
return err;
return TMLIBDEV_OK;
}
/******************************************************************************/
extern tmLibdevErr_t tda8960Term(UInt32 unitID)
{
return TMLIBDEV_OK;
}
/******************************************************************************/
extern tmLibdevErr_t tda8960Start(UInt32 unitID)
{
tmLibdevErr_t err;
ptda8960Status_t vsbStatus = &statusArray[unitID];
DP(("tda8960Start\n"));
err = initRegisters(vsbStatus);
if (err != TMLIBDEV_OK)
return err;
return TMLIBDEV_OK;
}
/******************************************************************************/
extern tmLibdevErr_t tda8960Stop(UInt32 unitID)
{
return TMLIBDEV_OK;
}
/******************************************************************************/
extern tmLibdevErr_t tda8960GetStatus(UInt32 unitID, ptsaTvDigDemStatus_t status)
{
iicRequest_t req;
tmLibdevErr_t err;
Int iicInstance;
UInt8 iica[3];
ptda8960Status_t vsbStatus = &statusArray[unitID];
DP(("tda8960GetStatus\n"));
req.address = vsbStatus->iicAddress;
req.byteCount = 3;
req.direction = IIC_READ;
req.type = IIC_SIMPLE;
req.data = iica;
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);
if (err != TMLIBDEV_OK)
return err;
status->lockIndicator = (iica[0] & 0x04)?True:False;
status->eqLockIndicator = (iica[0] & 0x02)?True:False;
status->mse = ((UInt) iica[1]) << 8;
status->mse |= iica[2];
return TMLIBDEV_OK;
}
/******************************************************************************/
extern tmLibdevErr_t tda8960GetTapsAndStatus(UInt32 unitID, ptsaTvDigDemStatus_t status)
{
iicRequest_t req;
tmLibdevErr_t err;
Int iicInstance;
UInt8 iica[154];
Int i;
ptda8960Status_t vsbStatus = &statusArray[unitID];
req.address = vsbStatus->iicAddress;
req.byteCount = 154;
req.direction = IIC_READ;
req.type = IIC_SIMPLE;
req.data = iica;
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);
if (err != TMLIBDEV_OK)
return err;
status->lockIndicator = (iica[0] & 0x04)?True:False;
status->eqLockIndicator = (iica[0] & 0x02)?True:False;
status->mse = ((UInt) iica[1]) << 8;
status->mse |= iica[2];
for (i = 0; i < 148; i++)
eqTaps[i] = (Int8) iica[6 + i];
status->numEqTaps = 148;
status->eqTaps = eqTaps;
return TMLIBDEV_OK;
}
/******************************************************************************/
extern tmLibdevErr_t tda8960GetOffset(UInt32 unitID, Int *offset)
{
iicRequest_t req;
tmLibdevErr_t err;
Int iicInstance;
UInt8 iica[4];
ptda8960Status_t vsbStatus = &statusArray[unitID];
req.address = vsbStatus->iicAddress;
req.byteCount = 4;
req.direction = IIC_READ;
req.type = IIC_SIMPLE;
req.data = iica;
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);
if (err != TMLIBDEV_OK)
return err;
*offset = (Int) (1250 * (Int8) iica[3]);
return TMLIBDEV_OK;
}
extern tmLibdevErr_t tda8960Reset(UInt32 unitID)
{
tmLibdevErr_t err;
UInt8 iicd = 0x02;
ptda8960Status_t vsbStatus = &statusArray[unitID];
/* do a general reset */
err = iicWriteReg(vsbStatus->iicAddress, -1, iicd);
if (err != TMLIBDEV_OK)
return err;
/* initialize the VSB chip */
err = initRegisters(vsbStatus);
if (err != TMLIBDEV_OK)
return err;
return TMLIBDEV_OK;
}
extern tmLibdevErr_t tda8960SetAcquisitionMode(UInt32 unitID, Int mode)
{
tmLibdevErr_t err;
ptda8960Status_t vsbStatus = &statusArray[unitID];
switch (mode)
{
case 0:
vsbStatus->vsbIICTable = vsbDefaultInits1;
err = TMLIBDEV_OK;
break;
case 1:
vsbStatus->vsbIICTable = vsbAlternateInits1;
err = TMLIBDEV_OK;
break;
default:
err = TVDIGDEM_ERR_UNSUPPORTED_ACQUISITION_MODE;
}
return err;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -