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

📄 tda9850.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              : tda9850.c    1.2
 *
 *  Last update              : 18:43:50 - 00/11/09
 *
 *  Description              :
 *
 */

#include <ops/custom_defs.h>
#include <tmlib/tmtypes.h>
#include <tm1/tmBoardDef.h>
#include <tm1/tsaTvAudDem.h>
#include <tm1/tmIIC.h>
#include <tm1/tmBoard.h>
#include <tm1/tmAvFormats.h>
#include <tm1/tmAssert.h>
#include <tmlib/dprintf.h>    /* for debugging with DP(()) */
#include <tm1/tmLibdevErr.h>

#include "tda9850.h"
#include "iicDirection.h"

#define TDA9850_WRITE_REGS 7

typedef struct
{
    Bool            used;
    unitSelect_t    id;
    UInt            iicAddress;
    UInt            iicDirection;
    UInt8           iicRegs[TDA9850_WRITE_REGS];
}tda9850UnitVars_t, *ptda9850UnitVars_t;

static tda9850UnitVars_t unitVars0 = {False, unit0, 0, 0, {0,0,0,0,0,0,0}};
static tda9850UnitVars_t unitVars1 = {False, unit1, 0, 0, {0,0,0,0,0,0,0}};

static UInt8 iicRegsDefault[TDA9850_WRITE_REGS] =
{
    0x00,   /* control 1: noise threshold for stereo: str1 */
    0x00,   /* control 2: noise threshold for SAP: sap1 */
    0x08,   /* control 3: SAP disabled, stereo disabled, SAP mute off, stereo mute on */
    0x07,   /* control 4: level adjust setting: 0.0 */
    0x0f,   /* alignment 1: nominal gain */
    0x0f,   /* alignment 2: nominal gain */
    0x83    /* alignment 3: auto adjustment, timing nominal */
};

extern tmLibdevErr_t tda9850Init(unitSelect_t unitID, ptda9850Param_t params)
{
    ptda9850UnitVars_t  uv;
    iicRequest_t        req;
    Int                 iicInstance;
    tmLibdevErr_t       err = TMLIBDEV_OK;
    Int                 i;

    if (unitVars0.used)
    {
        if (unitVars1.used)
            return -1;
        else
            uv = &unitVars1;
    }
    else
        uv = &unitVars0;

    uv->id   = unitID;
    uv->used = True;

    /* initialize unit variables */
    uv->iicAddress   = params->iicAddress;
    uv->iicDirection = params->iicDirection;
    for (i = 0; i < TDA9850_WRITE_REGS; i++)
        uv->iicRegs[i] = iicRegsDefault[i];

    err = iicDirectionSelect(uv->iicDirection);
    if (err != TMLIBDEV_OK)
        return err;

    /* setup for the audio demodulator */
    req.address             = uv->iicAddress;
    req.subaddress          = 0x04;
    req.byteCount           = TDA9850_WRITE_REGS;
    req.direction           = IIC_WRITE;
    req.type                = IIC_SUBADDRESS;
    req.data                = uv->iicRegs;
    req.numRetries          = 1;
    req.waitBeforeRetry     = 200;
    req.mode                = IIC_Synchronous_By_Polling;
    req.completion_function = Null;

    err = iicOpen(&iicInstance);
    if (err != TMLIBDEV_OK)
        goto tda9850InitExit;

    err = iicDispatch(iicInstance, &req);
    if (err != TMLIBDEV_OK)
        goto tda9850InitExit;

    err = iicClose(iicInstance);

tda9850InitExit:

    iicDirectionUnSelect(uv->iicDirection);
    return err;
}

extern tmLibdevErr_t tda9850Term(unitSelect_t unitID)
{
    ptda9850UnitVars_t  uv;

    if (unitID == unitVars0.id)
        uv = &unitVars0;
    else
        uv = &unitVars1;

    uv->used = False;

    return TMLIBDEV_OK;
}

extern tmLibdevErr_t tda9850Start(unitSelect_t unitID)
{
    ptda9850UnitVars_t  uv;
    UInt                iicd;
    tmLibdevErr_t       err;

    if (unitID == unitVars0.id)
        uv = &unitVars0;
    else
        uv = &unitVars1;

    err = iicDirectionSelect(uv->iicDirection);
    if (err != TMLIBDEV_OK)
        return err;

    iicd = uv->iicRegs[2] & 0xe7;
    err = iicWriteReg(uv->iicAddress, 0x06, iicd);

    if (err == TMLIBDEV_OK)
        uv->iicRegs[2] = iicd;

    iicDirectionUnSelect(uv->iicDirection);
    return err;
}

extern tmLibdevErr_t tda9850Stop(unitSelect_t unitID)
{
    ptda9850UnitVars_t  uv;
    UInt                iicd;
    tmLibdevErr_t       err;

    if (unitID == unitVars0.id)
        uv = &unitVars0;
    else
        uv = &unitVars1;

    err = iicDirectionSelect(uv->iicDirection);
    if (err != TMLIBDEV_OK)
        return err;

    iicd = uv->iicRegs[2] | 0x18;
    err = iicWriteReg(uv->iicAddress, 0x06, iicd);

    if (err == TMLIBDEV_OK)
        uv->iicRegs[2] = iicd;

    iicDirectionUnSelect(uv->iicDirection);
    return err;
}

extern tmLibdevErr_t tda9850MuteStereo(unitSelect_t unitID)
{
    return TMLIBDEV_OK;
}

extern tmLibdevErr_t tda9850MuteSAP(unitSelect_t unitID)
{
    return TMLIBDEV_OK;
}

extern tmLibdevErr_t tda9850SetStereo(unitSelect_t unitID, Bool enable)
{
    ptda9850UnitVars_t  uv;
    UInt                iicd;
    tmLibdevErr_t       err;

    if (unitID == unitVars0.id)
        uv = &unitVars0;
    else
        uv = &unitVars1;

    err = iicDirectionSelect(uv->iicDirection);
    if (err != TMLIBDEV_OK)
        return err;

    iicd = uv->iicRegs[2] & 0x3f;
    if (enable)
        iicd |= 0x40;
    err = iicWriteReg(uv->iicAddress, 0x06, iicd);

    if (err == TMLIBDEV_OK)
        uv->iicRegs[2] = iicd;

    iicDirectionUnSelect(uv->iicDirection);
    return err;
}

extern tmLibdevErr_t tda9850SetSAP(unitSelect_t unitID, Bool enable)
{
    ptda9850UnitVars_t  uv;
    UInt                iicd;
    tmLibdevErr_t       err;

    if (unitID == unitVars0.id)
        uv = &unitVars0;
    else
        uv = &unitVars1;

    err = iicDirectionSelect(uv->iicDirection);
    if (err != TMLIBDEV_OK)
        return err;

    iicd = uv->iicRegs[2] & 0x3f;
    if (enable)
        iicd |= 0x80;
    err = iicWriteReg(uv->iicAddress, 0x06, iicd);

    if (err == TMLIBDEV_OK)
        uv->iicRegs[2] = iicd;

    iicDirectionUnSelect(uv->iicDirection);
    return err;
}

extern tmLibdevErr_t tda9850GetStatus(unitSelect_t unitID, ptsaTvAudDemStatus_t status)
{
    ptda9850UnitVars_t  uv;
    iicRequest_t        req;
    Int                 iicInstance;
    tmLibdevErr_t       err = TMLIBDEV_OK;
    UInt8               iica[2];
    Int                 i;

    status->stereoPresent = False;
    status->sapPresent    = False;

    if (unitID == unitVars0.id)
        uv = &unitVars0;
    else
        uv = &unitVars1;

    err = iicDirectionSelect(uv->iicDirection);
    if (err != TMLIBDEV_OK)
        return err;

    /* setup for the audio demodulator */
    req.address             = uv->iicAddress;
    req.byteCount           = 2;
    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)
        goto tda9850GetStatusExit;

    err = iicDispatch(iicInstance, &req);
    if (err != TMLIBDEV_OK)
        goto tda9850GetStatusExit;

    err = iicClose(iicInstance);

    if (iica[0] & 0x20)
        status->stereoPresent = True;
    if (iica[0] & 0x40)
        status->sapPresent    = True;

tda9850GetStatusExit:

    iicDirectionUnSelect(uv->iicDirection);
    return err;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -