📄 tda8961.c
字号:
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;
for (i = 0; i < 128; i++)
clusterTaps[i] = (Int8) iica[8 + 127 - i];
for (i = 0; i < 4; i++)
staticClusterArray[i].position = vsbStatus->clusterPositions[i];
*clusterArray = staticClusterArray;
/* set control register to disable taps read */
vsbStatus->vsbIICTable[2] &= 0xfe;
err = writeRegisters(vsbStatus, 3);
if (err != TMLIBDEV_OK)
return err;
return TMLIBDEV_OK;
}
/******************************************************************************/
extern tmLibdevErr_t tda8961SetClusters(UInt32 unitID, Int *clusterPositions)
{
ptda8961Status_t vsbStatus = &statusArray[unitID];
Int i;
tmLibdevErr_t err;
tmAssert(clusterPositions, TMLIBDEV_ERR_NULL_PARAMETER);
CHECK_OUTPUT_ATSC(err, return err);
/* check if cluster positions are valid */
for (i = 0; i < 4; i++)
{
if ((clusterPositions[i] < 0) || (clusterPositions[i] > 721))
return TVDIGDEM_ERR_UNSUPPORTED_CLUSTERPOSITION;
vsbStatus->clusterPositions[i] = clusterPositions[i];
}
/* disable cluster taps access */
vsbStatus->vsbIICTable[2] = 0x00;
/* set cluster positions */
for (i = 0; i < 4; i++)
{
vsbStatus->vsbIICTable[0x21 + i * 2] = (UInt8) ((clusterPositions[i] >> 8) & 0x03);
vsbStatus->vsbIICTable[0x21 + i * 2 + 1] = (UInt8) (clusterPositions[i] & 0xff);
}
err = writeRegisters(vsbStatus, 0x29);
if (err != TMLIBDEV_OK)
return err;
/* workaround for HW problems */
microsleep(50000);
return TMLIBDEV_OK;
}
/******************************************************************************/
extern tmLibdevErr_t tda8961Reset(UInt32 unitID)
{
tmLibdevErr_t err;
UInt8 iicd = 0x02;
ptda8961Status_t vsbStatus = &statusArray[unitID];
CHECK_OUTPUT_ATSC(err, return err);
/* do a general reset */
err = iicWriteReg(vsbStatus->iicAddress, -1, iicd);
if (err != TMLIBDEV_OK)
return err;
/* initialize the VSB chip */
err = writeRegisters(vsbStatus, N_VSB_CNTR_REGS);
if (err != TMLIBDEV_OK)
return err;
return TMLIBDEV_OK;
}
/******************************************************************************/
extern tmLibdevErr_t tda8961SetAcquisitionMode(UInt32 unitID, Int mode)
{
tmLibdevErr_t err;
ptda8961Status_t vsbStatus = &statusArray[unitID];
CHECK_OUTPUT_ATSC(err, return err);
switch (mode)
{
case 0:
vsbStatus->vsbIICTable[0x17] = 0x66;
break;
case 1:
vsbStatus->vsbIICTable[0x17] = 0x99;
break;
default:
err = TVDIGDEM_ERR_UNSUPPORTED_ACQUISITION_MODE;
}
err = writeRegisters(vsbStatus, N_VSB_CNTR_REGS);
if (err != TMLIBDEV_OK)
return err;
return err;
}
/******************************************************************************/
extern tmLibdevErr_t tda8961GetSer(UInt32 unitID, UInt *ser)
{
iicRequest_t req;
tmLibdevErr_t err;
Int iicInstance;
UInt8 iica[0x0d];
ptda8961Status_t vsbStatus = &statusArray[unitID];
CHECK_OUTPUT_ATSC(err, return err);
req.address = vsbStatus->iicAddress;
req.byteCount = 0x0d;
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;
*ser = ((UInt) iica[0x0b] << 8) | (UInt) iica[0x0c];
return TMLIBDEV_OK;
}
/******************************************************************************/
extern tmLibdevErr_t tda8961GetSyncConfidence(UInt32 unitID, UInt *syncConfidence)
{
iicRequest_t req;
tmLibdevErr_t err;
Int iicInstance;
UInt8 iica[0x04];
ptda8961Status_t vsbStatus = &statusArray[unitID];
CHECK_OUTPUT_ATSC(err, return err);
req.address = vsbStatus->iicAddress;
req.byteCount = 0x04;
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;
*syncConfidence = (UInt) iica[0x03];
return TMLIBDEV_OK;
}
/******************************************************************************/
extern tmLibdevErr_t tda8961CorrGetStatus(UInt32 unitID, ptsaTvDigDemCorrStatus_t status)
{
iicRequest_t req;
tmLibdevErr_t err;
Int iicInstance;
UInt8 iica[0x09];
ptda8961Status_t vsbStatus = &statusArray[unitID];
CHECK_OUTPUT_ATSC(err, return err);
req.address = vsbStatus->iicAddress;
req.byteCount = 0x09;
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->memFull = False;
status->oddField = False;
if (iica[8] & 0x01)
status->memFull = True;
if (iica[8] & 0x02)
status->oddField = True;
return TMLIBDEV_OK;
}
/******************************************************************************/
extern tmLibdevErr_t tda8961CorrSetParams(UInt32 unitID, ptsaTvDigDemCorrParams_t params)
{
ptda8961Status_t vsbStatus = &statusArray[unitID];
tmLibdevErr_t err;
CHECK_OUTPUT_ATSC(err, return err);
/* set start and end */
vsbStatus->vsbIICTable[0x29] = (params->start >> 8) & 0x03;
vsbStatus->vsbIICTable[0x2a] = (params->start) & 0xff;
vsbStatus->vsbIICTable[0x2b] = (params->end >> 8) & 0x07;
vsbStatus->vsbIICTable[0x2c] = (params->end) & 0xff;
err = writeRegisters(vsbStatus, 0x2d);
if (err != TMLIBDEV_OK)
return err;
return TMLIBDEV_OK;
}
/******************************************************************************/
extern tmLibdevErr_t tda8961CorrReadMem(UInt32 unitID, ptsaTvDigDemCorrMem_t corrMem)
{
iicRequest_t req;
tmLibdevErr_t err;
Int iicInstance;
ptda8961Status_t vsbStatus = &statusArray[unitID];
UInt8 iica[2048 + 0x0b];
Int i;
CHECK_OUTPUT_ATSC(err, return err);
/* enable correlator memory read */
vsbStatus->vsbIICTable[0x02] = 0x10;
err = writeRegisters(vsbStatus, 0x03);
if (err != TMLIBDEV_OK)
return err;
/* read the correlator memory */
req.address = vsbStatus->iicAddress;
req.byteCount = 0x0b + 2048;
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;
/* disable correlator memory read */
vsbStatus->vsbIICTable[0x02] = 0;
err = writeRegisters(vsbStatus, 0x03);
if (err != TMLIBDEV_OK)
return err;
for (i = 0; i < corrMem->size; i++)
corrMem->mem[i] = iica[i];
return TMLIBDEV_OK;
}
/******************************************************************************/
extern tmLibdevErr_t tda8961CorrReset(UInt32 unitID)
{
ptda8961Status_t vsbStatus = &statusArray[unitID];
tmLibdevErr_t err;
CHECK_OUTPUT_ATSC(err, return err);
/* set start and end */
vsbStatus->vsbIICTable[0x1f] = 0x08;
err = writeRegisters(vsbStatus, 0x20);
if (err != TMLIBDEV_OK)
return err;
return TMLIBDEV_OK;
}
/******************************************************************************/
extern tmLibdevErr_t tda8961CorrStartMemFill(UInt32 unitID)
{
ptda8961Status_t vsbStatus = &statusArray[unitID];
tmLibdevErr_t err;
CHECK_OUTPUT_ATSC(err, return err);
/* set CORR_FILL bit to 1 */
vsbStatus->vsbIICTable[0x1f] = 0x10;
err = writeRegisters(vsbStatus, 0x20);
if (err != TMLIBDEV_OK)
return err;
return TMLIBDEV_OK;
}
/******************************************************************************/
extern tmLibdevErr_t tda8961CorrStopMemFill(UInt32 unitID)
{
ptda8961Status_t vsbStatus = &statusArray[unitID];
tmLibdevErr_t err;
CHECK_OUTPUT_ATSC(err, return err);
/* set CORR_FILL bit to 0*/
vsbStatus->vsbIICTable[0x1f] = 0x00;
err = writeRegisters(vsbStatus, 0x20);
if (err != TMLIBDEV_OK)
return err;
return TMLIBDEV_OK;
}
/******************************************************************************/
extern tmLibdevErr_t tda8961ViInit(UInt32 unitID)
{
ptda8961Status_t vsbStatus = &statusArray[unitID];
tmLibdevErr_t err;
if (vsbStatus->outputMode == omITU656)
return TMLIBDEV_OK;
vsbStatus->vsbIICTable[0x30] &= 0xef;
vsbStatus->vsbIICTable[0x31] = 0x08;
/* write changed values into registers */
err = writeRegisters(vsbStatus, 0x32);
if (err != TMLIBDEV_OK)
return err;
vsbStatus->outputMode = omITU656;
return TMLIBDEV_OK;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -