📄 tda9850.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 + -