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

📄 tda8980.c

📁 用于TM1300/PNX1300系列DSP(主要用于视频处理)的设备库的源码
💻 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 + -