📄 ad9887.c
字号:
PostCoast = 5;
SyncTHR=16;
break;
default: /* unknown resolution */
break;
}
/* Set sample phase */
AD9887_SetPhase(Phase);
/* PLLDIV = PixelRate / HFreq. */
AD9887_SetPLLDiv(HorTotalTime);
/* Set VCO Range and CP Current */
RegVal.bits.reserved1 = 0;
RegVal.bits.reserved2 = 1;
RegVal.bits.current = Current;
RegVal.bits.vcornge = VcoRange;
rc = AD9887_Write(AD9887_VCO, RegVal.byte);
/* Set Clamp and Duration */
AD9887_SetClamp(Clamp, Duration);
// set sync on green parameters
AD9887_Write(AD9887_PRECOAST, PreCoast);
AD9887_Write(AD9887_POSTCOAST, PostCoast);
AD9887_Read(AD9887_CONTROL2, &ControlBits2Val.byte);
ControlBits2Val.bits.res0 = 0;
ControlBits2Val.bits.res1 = 0;
ControlBits2Val.bits.res2 = 0;
ControlBits2Val.bits.syncgrnsl = SyncTHR;
AD9887_Write(AD9887_CONTROL2, ControlBits2Val.byte);
return (rc);
} /* AD9887_PLL */
/******************************************************************************/
/*****************************************************************************/
TA2D_Result AD9887_InitPLL(void)
{
TA2D_Result rc;
rc = AD9887_SetPLLDiv(1693);
rc = AD9887_Write(AD9887_VCO, 0x48);
return (rc);
}
/******************************************************************************/
/******************************************************************************/
TA2D_Result AD9887_SetVCORange(TBYTE VCORange)
{
TA2D_Result rc;
union {
TAD9887_VcoCurrent bits;
TBYTE byte;
} RegVal;
if(VCORange > 3)
return A2D_IllegalValue;
rc = AD9887_Read(AD9887_VCO, &RegVal.byte);
RegVal.bits.vcornge = VCORange;
rc = AD9887_Write(AD9887_VCO, RegVal.byte);
return rc;
}
/******************************************************************************/
/******************************************************************************/
TA2D_Result AD9887_GetVCORange(TBYTE *VCORange)
{
TA2D_Result rc;
union {
TAD9887_VcoCurrent bits;
TBYTE byte;
} RegVal;
rc = AD9887_Read(AD9887_VCO, &RegVal.byte);
*VCORange = RegVal.bits.vcornge;
return rc;
}
/******************************************************************************/
/******************************************************************************/
/*
* Copyright (c) 1999-2000 Oplus Technologies INC. All Rights resreved.
*
* AD9884A_SetPLLDiv- Set PLL divide ratio
*
*
* description:
* ------------
* PLLDIVM = MSB(plldiv)
* PLLDIVL = LSB(plldiv) << 4
*
*
* Protoype:
* ----------
* TA2D_Result AD9887_SetPLLDiv(TWORD plldiv)
* Where:
* plldiv - PLL divide ratio
* Returns:
* A2D_OK/A2D_ERROR
*
* history:
*
* who when what
* --- ---------- ----
* Ori 21/10/2001 creation
*
*/
TA2D_Result AD9887_SetPLLDiv(TWORD plldiv)
{
TA2D_Result rc = A2D_OK;
/* plldiv is in the range 0-0xfff */
if (plldiv > 0xfff)
rc = A2D_IllegalValue;
else /* legal value */
{
plldiv--;
rc = AD9887_Write(AD9887_PLLDIVM, (TBYTE)(plldiv >> 4));
rc = AD9887_Write(AD9887_PLLDIVL, plldiv << 4);
}
return (rc);
} /* AD9887_SetPLLDiv */
/******************************************************************************/
/******************************************************************************/
/*
* Copyright (c) 1999-2000 Oplus Technologies INC. All Rights resreved.
*
* AD9887_GetPLLDiv- Get PLL divide ratio
*
*
* description:
* ------------
* PLLDIVM = MSB(plldiv)
* PLLDIVL = LSB(plldiv) << 4
*
*
* Protoype:
* ----------
* TWORD AD9887_GetPLLDiv(void)
* Where:
*
* Returns:
* plldiv - PLL divide ratio
*
* history:
*
* who when what
* --- ---------- ----
* Ori 21/10/2001 creation
*
*/
TWORD AD9887_GetPLLDiv(void)
{
TWORD plldiv = 0;
TBYTE pllbyte;
AD9887_Read(AD9887_PLLDIVM, &pllbyte);
plldiv = (TWORD)pllbyte << 8;
AD9887_Read(AD9887_PLLDIVL, &pllbyte);
plldiv |= pllbyte;
plldiv >>= 4;
return (plldiv + 1);
} /* AD9887_GetPLLDiv */
/******************************************************************************/
/******************************************************************************/
/*
* Copyright (c) 1999-2000 Oplus Technologies INC. All Rights resreved.
*
* AD9887_SetClamp- Set clamping parameters
*
*
* description:
* ------------
* Set clamping parameters - signal source, signal polarity, placement and duration..
* The function actually calls to the on-board A2D function.
*
*
* Protoype:
* ----------
* TA2D_Result AD9887_SetClamp(TBYTE Placement, TBYTE Duration)
*
* Where:
* Placement - Position of the internally generated clamp in pixel periods (1-255).
* Duration - Clamp duration in pixel periods (1-255).
* Returns:
* A2D_OK
*
* history:
*
* who when what
* --- ---------- ----
* ori 21/10/2001 creation
*
*/
TA2D_Result AD9887_SetClamp(TBYTE Placement, TBYTE Duration)
{
TA2D_Result rc;
if (Placement == 0 || Duration == 0)
rc = A2D_IllegalValue;
else
{
rc = AD9887_Write(AD9887_CLPLACE, Placement);
rc = AD9887_Write(AD9887_CLDUR, Duration);
}
return (rc);
} /* AD9887_SetClamp */
/******************************************************************************/
/******************************************************************************/
static TA2D_Result AD9887_Read(TAD9887_Registers Reg, TBYTE *Data)
{
TA2D_Result rc = A2D_OK;
T_I2CERROR i2c;
i2c = I2CReadByte(I2C_AD9887, (TBYTE)Reg, Data, I2C_MAIN_BUS);
if (i2c != I2C_OK)
rc = A2D_NoResponse;
return(rc);
}
/******************************************************************************/
/******************************************************************************/
static TA2D_Result AD9887_Write(TAD9887_Registers Reg, TBYTE Data)
{
TA2D_Result rc = A2D_OK;
T_I2CERROR i2c;
i2c = I2CWriteByte(I2C_AD9887, (TBYTE)Reg, Data, I2C_MAIN_BUS);
if (i2c != I2C_OK)
rc = A2D_NoResponse;
return(rc);
}
/******************************************************************************/
/******************************************************************************/
/*
* Copyright (c) 1999-2000 Oplus Technologies INC. All Rights resreved.
*
* AD9887_SetOutput- A2D module set output mode
*
*
* description:
* ------------
*
* Sets single or parallel output
*
* Protoype:
* ----------
* TA2D_Result AD9884A_SetOutput(int parallel)
* Where:
* Returns:
* A2D_OK or A2D_DeviceNotSupported
*
* history:
*
* who when what
* --- ---------- ----
* Ori 22/10/2001 creation
*
*/
TA2D_Result AD9887_SetOutput(int parallel)
{
TA2D_Result rc = A2D_OK;
union {
TAD9887_ModeControl1 bits;
TBYTE byte;
} ModeControl1Val;
if (rc == A2D_OK)
{
rc = AD9887_Read(AD9887_MODCONTROL1, &ModeControl1Val.byte);
if (parallel)
{
ModeControl1Val.bits.chmode = 1; /* Simoltaneous data */
ModeControl1Val.bits.outputmode = 1; /* Simoltaneous data */
}
else
{
ModeControl1Val.bits.chmode = 0; /* single data */
ModeControl1Val.bits.outputmode = 0; /* mux data */
}
rc = AD9887_Write(AD9887_MODCONTROL1, ModeControl1Val.byte);
}
return (rc);
} /* AD9887_SetOutput */
/******************************************************************************/
/******************************************************************************/
/*
* Copyright (c) 1999-2000 Oplus Technologies INC. All Rights resreved.
*
*
*
* description:
* ------------
*
* Get Input Format Not support in this modal
*
* Protoype:
* ----------
* TA2D_Result AD9884A_SetOutput(int parallel)
* history:
*
* who when what
* --- ---------- ----
* ori 22/10/2001 creation
*
*/
static TA2D_InputFormat currentFormat = A2D_Graphics;
TA2D_Result AD9887_SetInputFormat(TA2D_InputFormat NewFormat)
{
TA2D_Result rc = A2D_OK;
if(NewFormat == A2D_Hdtv)
AD9887_InitHdtv();
else if (NewFormat == A2D_Graphics)
AD9887_InitGraphic();
else if (NewFormat == A2D_DVI)
AD9887_InitDVI();
currentFormat = NewFormat;
return(rc);
}
/******************************************************************************/
/******************************************************************************/
TA2D_Result AD9887_GetInputFormat(TA2D_InputFormat *Format)
{
TA2D_Result rc = A2D_OK;
*Format = currentFormat;
return(rc);
}
/******************************************************************************/
/******************************************************************************/
/*
* Copyright (c) 1999-2000 Oplus Technologies INC. All Rights resreved.
*
*
*
* description:
* ------------
*
* Init the A/D to HDTV working parameters (YPbPr input)
*
* Protoype:
* ----------
* static void AD9887_InitHdtv()
* history:
*
* who when what
* --- ---------- ----
* ori 22/10/2001 creation
*
*/
static void AD9887_InitHdtv()
{
union {
TAD9887_ModeControl1 bits; // 0x0E
TBYTE byte;
} ModeControl1Val;
union {
TAD9887_PllClampControl bits; // 0x0F
TBYTE byte;
} PllClampControlVal;
union {
TAD9887_ModeControl2 bits; // 0x10
TBYTE byte;
} ModeControl2Val;
union {
TAD9887_ActiveInterface bits; // 0x12
TBYTE byte;
} ActiveInterfaceVal;
union {
TAD9887_ControlBits1 bits; // 0x14
TBYTE byte;
} ControlBits1Val;
union {
TAD9887_ControlBits2 bits; // 0x16
TBYTE byte;
} ControlBits2Val;
union {
TAD9887_VcoCurrent bits; // 0x03
TBYTE byte;
} VcoCurrentVal;
union {
TAD9887_Phase bits; // 0x04
TBYTE byte;
} PhaseVal;
EVB_SwitchDataInput(0); // set external mux for HDTV
// Active interface
AD9887_Read(AD9887_ACIN, &ActiveInterfaceVal.byte);
ActiveInterfaceVal.bits.pwrdn = 1;
ActiveInterfaceVal.bits.coastsel = 1;
ActiveInterfaceVal.bits.actvsysel = 1; // Vsync on green
ActiveInterfaceVal.bits.actvsyovr = 1; // Vsync override
ActiveInterfaceVal.bits.acthsyovr = 1; // Hsync override
ActiveInterfaceVal.bits.acthsysel = 1; // Hsync on green
ActiveInterfaceVal.bits.ais = 0;
ActiveInterfaceVal.bits.aio = 1;
AD9887_Write(AD9887_ACIN, ActiveInterfaceVal.byte);
// pll divider control
AD9887_Write(AD9887_PLLDIVM, 0x89);
AD9887_Write(AD9887_PLLDIVL, 0x80);
// VCO and current
AD9887_Read(AD9887_VCO, &VcoCurrentVal.byte);
VcoCurrentVal.bits.current = 3;
VcoCurrentVal.bits.vcornge = 2;
VcoCurrentVal.bits.reserved2 = 1;
AD9887_Write(AD9887_VCO, VcoCurrentVal.byte);
//Clock generator
AD9887_Read(AD9887_PHASE, &PhaseVal.byte);
PhaseVal.bits.phase = 6;
AD9887_Write(AD9887_PHASE, PhaseVal.byte);
//clamp timing
AD9887_Write(AD9887_CLDUR, 0x0A);
AD9887_Write(AD9887_CLPLACE, 0x28);
// input gain
AD9887_Write(AD9887_REDGAIN, 0x80);
AD9887_Write(AD9887_GRNGAIN, 0x80);
AD9887_Write(AD9887_BLUGAIN, 0x80);
// input offset
AD9887_Write(AD9887_REDOFST, 0x80);
AD9887_Write(AD9887_GRNOFST, 0x80);
AD9887_Write(AD9887_BLUOFST, 0x80);
// mode control 1
AD9887_Read(AD9887_MODCONTROL1, &ModeControl1Val.byte);
ModeControl1Val.bits.vsyncinv = 1;
ModeControl1Val.bits.abinv = 1;
ModeControl1Val.bits.outputmode = 1;
ModeControl1Val.bits.chmode = 1; // dual pixel mode
// ModeControl1Val.bits.hsyncpol = 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -