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

📄 tda8961.c

📁 用于TM1300/PNX1300系列DSP(主要用于视频处理)的设备库的源码
💻 C
📖 第 1 页 / 共 2 页
字号:
    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 + -