| /******************************************************************************** |
| * Marvell GPL License Option |
| * |
| * If you received this File from Marvell, you may opt to use, redistribute and/or |
| * modify this File in accordance with the terms and conditions of the General |
| * Public License Version 2, June 1991 (the "GPL License"), a copy of which is |
| * available along with the File in the license.txt file or by writing to the Free |
| * Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 or |
| * on the worldwide web at http://www.gnu.org/licenses/gpl.txt. |
| * |
| * THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE IMPLIED |
| * WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY |
| * DISCLAIMED. The GPL License provides additional details about this warranty |
| * disclaimer. |
| ******************************************************************************/ |
| |
| #if (BERLIN_CHIP_VERSION == BERLIN_BG2CDP) |
| #pragma GCC optimize ("O0") |
| #include <string.h> |
| #include "galois_io.h" |
| #include "pllDiag.h" |
| #include "global.h" |
| //#include "GaloisTime.h" |
| #ifdef DIAG_PRT |
| #include "lgpl_printf.h" |
| #endif |
| |
| volatile SIE_avPll regSIE_avPll; |
| int vcoFreqIndex; |
| unsigned int avPllChRegOffset[8]= |
| { |
| RA_avPll_C1, |
| RA_avPll_C2, |
| RA_avPll_C3, |
| RA_avPll_C4, |
| RA_avPll_C5, |
| RA_avPll_C6, |
| RA_avPll_C7, |
| RA_avPll_C8 |
| }; |
| |
| typedef struct |
| { |
| int vco_freq_index; |
| float clkout_freq; //in MHz |
| int freq_offset; //signed number |
| unsigned int p_sync2; |
| unsigned int p_sync1; |
| unsigned int post_div; |
| unsigned int post_div_0p5; |
| unsigned int invalid; //this indicate it is a valid setting or not: 0 is valid, 1 is not |
| } CLK_FREQ; |
| |
| //for channel 1 to 7, index starts at 1, [0][0] and [1][0] are not used |
| float current_freq[2][8]; |
| |
| enum |
| { |
| HDMI_8BIT_MODE=0, |
| HDMI_10BIT_MODE, |
| HDMI_12BIT_MODE |
| }; |
| |
| enum |
| { |
| FRAME_RATE_59P94=0, |
| FRAME_RATE_60 |
| }; |
| |
| #define OVERSAMPLE_HDMI 0 |
| #define OVERSAMPLE_1X 1 |
| #define OVERSAMPLE_2X 2 |
| #define OVERSAMPLE_4X 4 |
| #define OVERSAMPLE_8X 8 |
| |
| double diag_videoFreqs[] = |
| { |
| //video frequencies, pixel freq |
| 25.17482517, |
| 27, |
| 54, |
| 74.17582418, |
| 108, |
| 148.3516484 |
| }; |
| |
| //all the VCO freq reqired for video and audio in MHz |
| double diag_vcoFreqs[]= |
| { |
| 1512, //8 bit HDMI and 12 bit HMDI |
| 1620, //12 bit HDMI |
| 1856.25,//10 bit HDMI |
| 2160, //8 bit HDMI |
| 2227.5, //12 bit HDMI |
| 2520, //10 bit HDMI |
| 2700, //10 bit HDMI |
| 2970, //8 bit HDMI |
| }; |
| |
| //from Section 7 table |
| unsigned char diag_avpllRegFBDIV[]= |
| { |
| 60, //VCO_FREQ_1_512G, |
| 65, //VCO_FREQ_1_620G, |
| 74, //VCO_FREQ_1_856G, |
| 86, //VCO_FREQ_2_160G, |
| 89, //VCO_FREQ_2_227G, |
| 101, //VCO_FREQ_2_520G, |
| 108, //VCO_FREQ_2_700G, |
| 119, //VCO_FREQ_2_970G, |
| }; |
| |
| //from Section 7 table, bit18 is sign bit |
| //Note that sign bit=0 for negative |
| //sign bit=1 for positive |
| unsigned int diag_avpllRegFREQ_OFFSET_C8[]= |
| { |
| (33554), //VCO_FREQ_1_512G, |
| ((1<<18)|(12905)), //VCO_FREQ_1_620G, |
| (14169), //VCO_FREQ_1_856G, |
| (19508), //VCO_FREQ_2_160G, |
| (4712), //VCO_FREQ_2_227G |
| ((1<<18)|(8305)), //VCO_FREQ_2_520G, |
| (00000), //VCO_FREQ_2_700G, |
| ((1<<18)|(7049)), //VCO_FREQ_2_970G, |
| }; |
| |
| unsigned int diag_avpllRegSPEED[]= |
| { |
| 0x2, //1.5G<F<=1.7G , for 1.512G |
| 0x2, //1.5G<F<=1.7G , for 1.62G |
| 0x3, //1.7G<F<=1.9G , for 1.856G |
| // 0x4, //1.9G<F<=2.1G |
| 0x5, //2.1G<F<=2.3G , for 2.16G |
| 0x5, //2.1G<F<=2.3G , for 2.227G |
| // 0x6, //2.3G<F<=2.45G |
| 0x7, //2.45G<F<=2.6G, for 2.52G |
| 0x8, //2.6G<F<= 2.75G, for 2.7G |
| // 0x9, //2.75G<F<= 2.9G |
| 0xa, //2.9G<F<=3.0G, for 2.97G |
| }; |
| |
| |
| /*Interpolator current setting for different frequency |
| VCO Frequency ' INTPI |
| */ |
| unsigned int diag_avpllRegINTPI[]= |
| { |
| 0x3, //for 1.512G |
| 0x3, //for 1.62G |
| 0x5, //for 1.856G |
| 0x7, //for 2.16G |
| 0x7, //for 2.227G |
| 0x9, //for 2.52G |
| 0xa, //for 2.7G |
| 0xb, //for 2.97G |
| }; |
| |
| unsigned int diag_avpllRegINTPR[]= |
| { |
| 0x4, //for 1.512G |
| 0x4, //for 1.62G |
| 0x4, //for 1.856G |
| 0x3, //for 2.16G |
| 0x3, //for 2.227G |
| 0x3, //for 2.52G |
| 0x1, //for 2.7G |
| 0x1, //for 2.97G |
| }; |
| |
| //vco is determined by video frequence and HDMI mode |
| static int vcoSelectionTable[3][6] = |
| { |
| //8 bit table |
| {VCO_FREQ_1_512G, VCO_FREQ_2_160G, VCO_FREQ_2_160G, VCO_FREQ_2_970G, VCO_FREQ_2_160G, VCO_FREQ_2_970G}, |
| //10 bit table |
| {VCO_FREQ_2_520G, VCO_FREQ_2_700G, VCO_FREQ_2_700G, VCO_FREQ_1_856G, VCO_FREQ_2_700G, VCO_FREQ_1_856G}, |
| //12 bit table |
| {VCO_FREQ_1_512G, VCO_FREQ_1_620G, VCO_FREQ_1_620G, VCO_FREQ_2_227G, VCO_FREQ_1_620G, VCO_FREQ_2_227G}, |
| }; |
| |
| //1KPPM is determined by video frequence and 59Hz/60Hz mode |
| static int ppm1kSelectionTable[2][6] = |
| { |
| {-1, 0, 0, -1, 0, -1}, //59.94Hz 1KPPM flag |
| { 0, 1, 1, 0, 1, 0}, //60Hz 1KPPM flag |
| }; |
| |
| static CLK_FREQ clk_freqs_computed[VCO_FREQ_2_970G+1]; |
| |
| int diag_pll_A_VCO_Setting = VCO_FREQ_2_227G; |
| int diag_pll_B_VCO_Setting = VCO_FREQ_1_620G; |
| |
| unsigned int gAVPLLA_Channel_OutputClock[8] = {0}; |
| unsigned int gAVPLLB_Channel_OutputClock[8] = {0}; |
| |
| //this is good for all VCOs except 2520GHz |
| unsigned int audio_freq1[] = |
| { |
| 8467200 , |
| 11289600 , |
| 90316800 , |
| 16934400 , |
| 22579200 , |
| 33868800 , |
| 6144000 , |
| 8192000 , |
| 65536000 , |
| 12288000 , |
| 16384000 , |
| 24576000 , |
| 9216000 , |
| 12288000 , |
| 98304000 , |
| 18432000 , |
| 24576000 , |
| 36864000 , |
| }; |
| |
| //this is for 2520GHz |
| unsigned int audio_freq2[] = |
| { |
| 705600 , |
| 1411200 , |
| 2822400 , |
| 5644800 , |
| 8467200 , |
| 11289600 , |
| 16934400 , |
| 22579200 , |
| 33868800 , |
| 45158400 , |
| 90316800 , |
| 512000 , |
| 1024000 , |
| 2048000 , |
| 4096000 , |
| 6144000 , |
| 8192000 , |
| 12288000 , |
| 16384000 , |
| 24576000 , |
| 32768000 , |
| 768000 , |
| 1536000 , |
| 3072000 , |
| 6144000 , |
| 9216000 , |
| 12288000 , |
| 18432000 , |
| 24576000 , |
| 36864000 , |
| 49152000 , |
| 98304000 , |
| }; |
| |
| void diag_videoFreq(SIE_avPll *avPllBase, int freqIndex, int hdmiMode, int frameRate, float overSampleRate, int chId); |
| static void diag_assertPllReset(SIE_avPll *avPllBase); |
| static void diag_deassertPllReset(SIE_avPll *avPllBase); |
| //assert reset for channel1 to 7 |
| static void diag_assertCxReset(SIE_avPll *avPllBase); |
| static void diag_deassertCxReset(SIE_avPll *avPllBase); |
| static void diag_enableAvPll(SIE_avPll *avPllBase, unsigned int init_vco); |
| static void diag_dump_CLK_FREQ(CLK_FREQ* pCLK_FREQ); |
| |
| void diag_setDPll(SIE_avPll *avPllBase, int enable, int p_sync1, int p_sync2, int chId) |
| { |
| //disable DPll first |
| //((SIE_avpllCh *)(&(avPllBase->ie_C1)))[chId-1].uctrl_EN_DPLL = 0; |
| PHY_HOST_Bus_Read32(((SIE_avpllCh *)(&(avPllBase->ie_C1)))[chId-1].u32avpllCh_ctrl, ((SIE_avpllCh *)&(regSIE_avPll.ie_C1))[chId-1].u32avpllCh_ctrl); |
| ((SIE_avpllCh *)&(regSIE_avPll.ie_C1))[chId-1].uctrl_EN_DPLL = 0; |
| PHY_HOST_Bus_Write32(((SIE_avpllCh *)(&(avPllBase->ie_C1)))[chId-1].u32avpllCh_ctrl, ((SIE_avpllCh *)&(regSIE_avPll.ie_C1))[chId-1].u32avpllCh_ctrl); |
| |
| if(!p_sync1) |
| { |
| if(enable) |
| { |
| dbg_printf(PRN_RES, "Warning p_sync1 is 0\n"); |
| } |
| } |
| |
| //((SIE_avpllCh *)(&(avPllBase->ie_C1)))[chId-1].uctrl_P_SYNC1 = p_sync1; |
| PHY_HOST_Bus_Read32(((SIE_avpllCh *)(&(avPllBase->ie_C1)))[chId-1].u32avpllCh_ctrl2, ((SIE_avpllCh *)&(regSIE_avPll.ie_C1))[chId-1].u32avpllCh_ctrl2); |
| ((SIE_avpllCh *)&(regSIE_avPll.ie_C1))[chId-1].uctrl_P_SYNC1 = p_sync1; |
| PHY_HOST_Bus_Write32(((SIE_avpllCh *)(&(avPllBase->ie_C1)))[chId-1].u32avpllCh_ctrl2, ((SIE_avpllCh *)&(regSIE_avPll.ie_C1))[chId-1].u32avpllCh_ctrl2); |
| |
| //((SIE_avpllCh *)(&(avPllBase->ie_C1)))[chId-1].uctrl_P_SYNC2 = p_sync2; |
| PHY_HOST_Bus_Read32(((SIE_avpllCh *)(&(avPllBase->ie_C1)))[chId-1].u32avpllCh_ctrl3, ((SIE_avpllCh *)&(regSIE_avPll.ie_C1))[chId-1].u32avpllCh_ctrl3); |
| ((SIE_avpllCh *)&(regSIE_avPll.ie_C1))[chId-1].uctrl_P_SYNC2 = p_sync2; |
| PHY_HOST_Bus_Write32(((SIE_avpllCh *)(&(avPllBase->ie_C1)))[chId-1].u32avpllCh_ctrl3, ((SIE_avpllCh *)&(regSIE_avPll.ie_C1))[chId-1].u32avpllCh_ctrl3); |
| |
| if(enable) |
| { |
| //enable DPLL |
| //((SIE_avpllCh *)(&(avPllBase->ie_C1)))[chId-1].uctrl_EN_DPLL = 1; |
| PHY_HOST_Bus_Read32(((SIE_avpllCh *)(&(avPllBase->ie_C1)))[chId-1].u32avpllCh_ctrl, ((SIE_avpllCh *)&(regSIE_avPll.ie_C1))[chId-1].u32avpllCh_ctrl); |
| ((SIE_avpllCh *)&(regSIE_avPll.ie_C1))[chId-1].uctrl_EN_DPLL = 1; |
| PHY_HOST_Bus_Write32(((SIE_avpllCh *)(&(avPllBase->ie_C1)))[chId-1].u32avpllCh_ctrl, ((SIE_avpllCh *)&(regSIE_avPll.ie_C1))[chId-1].u32avpllCh_ctrl); |
| } |
| } |
| |
| void diag_setVDDL_VCOref(SIE_avPll *avPllBase) |
| { |
| //T32avPll_ctrlPLL ctrlPLL; |
| //ctrlPLL.u32 = avPllBase->u32avPll_ctrlPLL; |
| PHY_HOST_Bus_Read32(avPllBase->u32avPll_ctrlPLL, regSIE_avPll.u32avPll_ctrlPLL); |
| |
| //ctrlPLL.uctrlPLL_VCO_REF1P45_SEL = 0x3; |
| //ctrlPLL.uctrlPLL_VDDL = 0xF;// set VDDL to 1.16v |
| regSIE_avPll.uctrlPLL_VCO_REF1P45_SEL = 0x3; |
| regSIE_avPll.uctrlPLL_VDDL = 0xF;// set VDDL to 1.16v |
| |
| //* (volatile unsigned int *)(&(avPllBase->u32avPll_ctrlPLL)) = ctrlPLL.u32; |
| PHY_HOST_Bus_Write32(avPllBase->u32avPll_ctrlPLL, regSIE_avPll.u32avPll_ctrlPLL); |
| } |
| static void diag_powerDownChannel(SIE_avPll *avPllBase, int chId); |
| |
| void diag_setVCO(SIE_avPll *avPllBase, int vco_freq_index) |
| { |
| dbg_printf(PRN_INFO, "PLLA %d VCO freq change to %f\n", vco_freq_index, diag_vcoFreqs[vco_freq_index]); |
| |
| //first power done PLL and Channels |
| diag_powerDown(avPllBase); |
| |
| //assert resets |
| diag_assertPllReset(avPllBase); |
| diag_assertCxReset(avPllBase); |
| |
| //change VDDL and VCO_ref to meet duty cycle |
| diag_setVDDL_VCOref(avPllBase); |
| |
| //power up PLL and channels |
| diag_powerUp(avPllBase); |
| |
| // @yeliu: power down these channels by hardcoded, only for bg2cdp |
| diag_powerDownChannel(avPllBase, 2); |
| diag_powerDownChannel(avPllBase, 5); |
| diag_powerDownChannel(avPllBase, 6); |
| |
| //following settings are done under reset to improve long term reliability |
| //avPllBase->uctrlPLL_FBDIV = diag_avpllRegFBDIV[vco_freq_index]; |
| PHY_HOST_Bus_Read32(avPllBase->u32avPll_ctrlPLL, regSIE_avPll.u32avPll_ctrlPLL); |
| regSIE_avPll.uctrlPLL_FBDIV = diag_avpllRegFBDIV[vco_freq_index]; |
| PHY_HOST_Bus_Write32(avPllBase->u32avPll_ctrlPLL, regSIE_avPll.u32avPll_ctrlPLL); |
| |
| //avPllBase->uctrlINTP_INTPI = diag_avpllRegINTPI[vco_freq_index]; |
| PHY_HOST_Bus_Read32(avPllBase->u32avPll_ctrlINTP, regSIE_avPll.u32avPll_ctrlINTP); |
| regSIE_avPll.uctrlINTP_INTPI = diag_avpllRegINTPI[vco_freq_index]; |
| PHY_HOST_Bus_Write32(avPllBase->u32avPll_ctrlINTP, regSIE_avPll.u32avPll_ctrlINTP); |
| |
| //avPllBase->uctrlINTP_INTPR = diag_avpllRegINTPR[vco_freq_index]; |
| PHY_HOST_Bus_Read32(avPllBase->u32avPll_ctrlINTP, regSIE_avPll.u32avPll_ctrlINTP); |
| regSIE_avPll.uctrlINTP_INTPR = diag_avpllRegINTPR[vco_freq_index]; |
| PHY_HOST_Bus_Write32(avPllBase->u32avPll_ctrlINTP, regSIE_avPll.u32avPll_ctrlINTP); |
| |
| //avPllBase->uctrlPLL_EXT_SPEED = diag_avpllRegSPEED[vco_freq_index]; |
| PHY_HOST_Bus_Read32(avPllBase->u32avPll_ctrlPLL1, regSIE_avPll.u32avPll_ctrlPLL1); |
| regSIE_avPll.uctrlPLL_EXT_SPEED = diag_avpllRegSPEED[vco_freq_index]; |
| PHY_HOST_Bus_Write32(avPllBase->u32avPll_ctrlPLL1, regSIE_avPll.u32avPll_ctrlPLL1); |
| |
| |
| //(avPllBase->ie_C8).uctrl_FREQ_OFFSET = diag_avpllRegFREQ_OFFSET_C8[vco_freq_index]; |
| PHY_HOST_Bus_Read32((avPllBase->ie_C8).u32avpllCh8_ctrl1, (regSIE_avPll.ie_C8).u32avpllCh8_ctrl1); |
| (regSIE_avPll.ie_C8).uctrl_FREQ_OFFSET = diag_avpllRegFREQ_OFFSET_C8[vco_freq_index]; |
| PHY_HOST_Bus_Write32((avPllBase->ie_C8).u32avpllCh8_ctrl1, (regSIE_avPll.ie_C8).u32avpllCh8_ctrl1); |
| |
| if(avPllBase == (SIE_avPll *)AVPLL_A) |
| diag_pll_A_VCO_Setting = vco_freq_index; |
| else |
| diag_pll_B_VCO_Setting = vco_freq_index; |
| |
| //deassert resets |
| diag_deassertCxReset(avPllBase); |
| |
| diag_deassertPllReset(avPllBase); |
| |
| |
| //toggle the offset_rdy bit |
| { |
| //(avPllBase->ie_C8).uctrl_FREQ_OFFSET_READY = 1; |
| PHY_HOST_Bus_Read32((avPllBase->ie_C8).u32avpllCh8_ctrl1, (regSIE_avPll.ie_C8).u32avpllCh8_ctrl1); |
| (regSIE_avPll.ie_C8).uctrl_FREQ_OFFSET_READY = 1; |
| PHY_HOST_Bus_Write32((avPllBase->ie_C8).u32avpllCh8_ctrl1, (regSIE_avPll.ie_C8).u32avpllCh8_ctrl1); |
| |
| //add some delay for Fvco=3GHz pulse>172ns, For Fvco=1.5GHz pulse>344ns |
| // for(i=0; i<10000*10; i++); |
| cpu_cycle_count_delay(550); |
| |
| //(avPllBase->ie_C8).uctrl_FREQ_OFFSET_READY = 0; |
| PHY_HOST_Bus_Read32((avPllBase->ie_C8).u32avpllCh8_ctrl1, (regSIE_avPll.ie_C8).u32avpllCh8_ctrl1); |
| (regSIE_avPll.ie_C8).uctrl_FREQ_OFFSET_READY = 0; |
| PHY_HOST_Bus_Write32((avPllBase->ie_C8).u32avpllCh8_ctrl1, (regSIE_avPll.ie_C8).u32avpllCh8_ctrl1); |
| } |
| |
| //do calibration |
| diag_calibrate(avPllBase, diag_vcoFreqs[vco_freq_index]); |
| |
| } |
| |
| void diag_setChanOffset(SIE_avPll *avPllBase, int offset, int chId) |
| { |
| unsigned int reg_offset = 0; |
| |
| dbg_printf(PRN_RES, "avPllBase(0x%X), offset(%d), chId(%d)\n", avPllBase, offset, chId); |
| if(offset>0) |
| { |
| reg_offset = (1<<18) | (offset) ; |
| } |
| else |
| { |
| reg_offset = -offset; |
| } |
| |
| dbg_printf(PRN_INFO, "set 0x%X offset to 0x%x for C%d\n", avPllBase, reg_offset, chId); |
| |
| //set offset register |
| //((SIE_avpllCh *)(&(avPllBase->ie_C1)))[chId-1].uctrl_FREQ_OFFSET = reg_offset; |
| PHY_HOST_Bus_Read32(((SIE_avpllCh *)(&(avPllBase->ie_C1)))[chId-1].u32avpllCh_ctrl1, ((SIE_avpllCh *)&(regSIE_avPll.ie_C1))[chId-1].u32avpllCh_ctrl1); |
| ((SIE_avpllCh *)&(regSIE_avPll.ie_C1))[chId-1].uctrl_FREQ_OFFSET = reg_offset; |
| PHY_HOST_Bus_Write32(((SIE_avpllCh *)(&(avPllBase->ie_C1)))[chId-1].u32avpllCh_ctrl1, ((SIE_avpllCh *)&(regSIE_avPll.ie_C1))[chId-1].u32avpllCh_ctrl1); |
| |
| //toggle the offset_rdy bit |
| { |
| //((SIE_avpllCh *)(&(avPllBase->ie_C1)))[chId-1].uctrl_FREQ_OFFSET_READY = 1; |
| PHY_HOST_Bus_Read32(((SIE_avpllCh *)(&(avPllBase->ie_C1)))[chId-1].u32avpllCh_ctrl1, ((SIE_avpllCh *)&(regSIE_avPll.ie_C1))[chId-1].u32avpllCh_ctrl1); |
| ((SIE_avpllCh *)&(regSIE_avPll.ie_C1))[chId-1].uctrl_FREQ_OFFSET_READY = 1; |
| PHY_HOST_Bus_Write32(((SIE_avpllCh *)(&(avPllBase->ie_C1)))[chId-1].u32avpllCh_ctrl1, ((SIE_avpllCh *)&(regSIE_avPll.ie_C1))[chId-1].u32avpllCh_ctrl1); |
| |
| //add some delay because need to be asserted by 30ns |
| // for(i=0; i<10000; i++); |
| cpu_cycle_count_delay(200); |
| |
| //((SIE_avpllCh *)(&(avPllBase->ie_C1)))[chId-1].uctrl_FREQ_OFFSET_READY = 0; |
| PHY_HOST_Bus_Read32(((SIE_avpllCh *)(&(avPllBase->ie_C1)))[chId-1].u32avpllCh_ctrl1, ((SIE_avpllCh *)&(regSIE_avPll.ie_C1))[chId-1].u32avpllCh_ctrl1); |
| ((SIE_avpllCh *)&(regSIE_avPll.ie_C1))[chId-1].uctrl_FREQ_OFFSET_READY = 0; |
| PHY_HOST_Bus_Write32(((SIE_avpllCh *)(&(avPllBase->ie_C1)))[chId-1].u32avpllCh_ctrl1, ((SIE_avpllCh *)&(regSIE_avPll.ie_C1))[chId-1].u32avpllCh_ctrl1); |
| } |
| } |
| |
| void diag_set_Post_Div(SIE_avPll *avPllBase, int div, int chId) |
| { |
| //((SIE_avpllCh *)(&(avPllBase->ie_C1)))[chId-1].uctrl_POSTDIV = div; |
| PHY_HOST_Bus_Read32(((SIE_avpllCh *)(&(avPllBase->ie_C1)))[chId-1].u32avpllCh_ctrl, ((SIE_avpllCh *)&(regSIE_avPll.ie_C1))[chId-1].u32avpllCh_ctrl); |
| ((SIE_avpllCh *)&(regSIE_avPll.ie_C1))[chId-1].uctrl_POSTDIV = div; |
| PHY_HOST_Bus_Write32(((SIE_avpllCh *)(&(avPllBase->ie_C1)))[chId-1].u32avpllCh_ctrl, ((SIE_avpllCh *)&(regSIE_avPll.ie_C1))[chId-1].u32avpllCh_ctrl); |
| } |
| |
| void diag_set_Post_0P5_Div(SIE_avPll *avPllBase, int enable, int chId) |
| { |
| //((SIE_avpllCh *)(&(avPllBase->ie_C1)))[chId-1].uctrl_POSTDIV_0P5 = enable; |
| PHY_HOST_Bus_Read32(((SIE_avpllCh *)(&(avPllBase->ie_C1)))[chId-1].u32avpllCh_ctrl, ((SIE_avpllCh *)&(regSIE_avPll.ie_C1))[chId-1].u32avpllCh_ctrl); |
| ((SIE_avpllCh *)&(regSIE_avPll.ie_C1))[chId-1].uctrl_POSTDIV_0P5 = enable; |
| PHY_HOST_Bus_Write32(((SIE_avpllCh *)(&(avPllBase->ie_C1)))[chId-1].u32avpllCh_ctrl, ((SIE_avpllCh *)&(regSIE_avPll.ie_C1))[chId-1].u32avpllCh_ctrl); |
| } |
| |
| #define OFFSET_1KPPM_INC (4190) |
| #define OFFSET_1KPPM_DEC (-4194) |
| |
| //this is done by using offset and dpll |
| //inc=1 means increase freq to 1001/1000 |
| //inc=0 means disable 1KPPM (by setting offset to 0 and disable DPLL) |
| //inc=-1 means decrease freq to 1000/1001 |
| void diag_set1KPPM(SIE_avPll *avPllBase, int inc, int chId) |
| { |
| dbg_printf(PRN_RES, "avPllBase=0x%X, inc=%i, chId=%i\n", avPllBase, inc, chId); |
| if(inc) |
| { |
| if(inc>0) |
| { |
| //increase by 1KPPM |
| diag_setChanOffset(avPllBase, OFFSET_1KPPM_INC, chId); |
| diag_setDPll(avPllBase, 1, 1000, 1001, chId); |
| } |
| else |
| { |
| //decrease by 1KPPM |
| diag_setChanOffset(avPllBase, OFFSET_1KPPM_DEC, chId); |
| diag_setDPll(avPllBase, 1, 1001, 1000, chId); |
| } |
| } |
| else |
| { |
| //set offset to 0 and disable DPLL |
| diag_setChanOffset(avPllBase, 0, chId); |
| diag_setDPll(avPllBase, 0, 0, 0, chId); |
| } |
| } |
| |
| /* new reference in MHz, chan : chan_A 0, Chan_B 1 */ |
| void diag_changeVcoFreq(int vco_freq_index, int grp) |
| { |
| if(grp ==0) |
| { |
| diag_setVCO((SIE_avPll *)AVPLL_A, vco_freq_index); |
| } |
| #if HAS_AVPLL_B |
| else |
| { |
| diag_setVCO(AVPLL_B, vco_freq_index); |
| } |
| #endif |
| } |
| |
| void diag_assertPllReset(SIE_avPll *avPllBase) |
| { |
| //assert reset |
| //avPllBase->uctrlPLL_RESET=1; |
| PHY_HOST_Bus_Read32(avPllBase->u32avPll_ctrlPLL, regSIE_avPll.u32avPll_ctrlPLL); |
| regSIE_avPll.uctrlPLL_RESET = 1; |
| PHY_HOST_Bus_Write32(avPllBase->u32avPll_ctrlPLL, regSIE_avPll.u32avPll_ctrlPLL); |
| } |
| |
| //assert reset for channel1 to 7 |
| void diag_assertCxReset(SIE_avPll *avPllBase) |
| { |
| int chId; |
| |
| for(chId=1; chId<=7; chId++) |
| { |
| //((SIE_avpllCh *)(&(avPllBase->ie_C1)))[chId-1].uctrl_RESET = 1; |
| PHY_HOST_Bus_Read32(((SIE_avpllCh *)(&(avPllBase->ie_C1)))[chId-1].u32avpllCh_ctrl3, ((SIE_avpllCh *)&(regSIE_avPll.ie_C1))[chId-1].u32avpllCh_ctrl3); |
| ((SIE_avpllCh *)&(regSIE_avPll.ie_C1))[chId-1].uctrl_RESET = 1; |
| PHY_HOST_Bus_Write32(((SIE_avpllCh *)(&(avPllBase->ie_C1)))[chId-1].u32avpllCh_ctrl3, ((SIE_avpllCh *)&(regSIE_avPll.ie_C1))[chId-1].u32avpllCh_ctrl3); |
| } |
| } |
| |
| void diag_deassertPllReset(SIE_avPll *avPllBase) |
| { |
| volatile int i; |
| |
| for(i=0; i<10000*10; i++); |
| |
| //deassert reset |
| //avPllBase->uctrlPLL_RESET=0; |
| PHY_HOST_Bus_Read32(avPllBase->u32avPll_ctrlPLL, regSIE_avPll.u32avPll_ctrlPLL); |
| regSIE_avPll.uctrlPLL_RESET = 0; |
| PHY_HOST_Bus_Write32(avPllBase->u32avPll_ctrlPLL, regSIE_avPll.u32avPll_ctrlPLL); |
| } |
| |
| //assert reset for channel1 to 7 |
| void diag_deassertCxReset(SIE_avPll *avPllBase) |
| { |
| int chId; |
| |
| for(chId=1; chId<=7; chId++) |
| { |
| //((SIE_avpllCh *)(&(avPllBase->ie_C1)))[chId-1].uctrl_RESET = 0; |
| PHY_HOST_Bus_Read32(((SIE_avpllCh *)(&(avPllBase->ie_C1)))[chId-1].u32avpllCh_ctrl3, ((SIE_avpllCh *)&(regSIE_avPll.ie_C1))[chId-1].u32avpllCh_ctrl3); |
| ((SIE_avpllCh *)&(regSIE_avPll.ie_C1))[chId-1].uctrl_RESET = 0; |
| PHY_HOST_Bus_Write32(((SIE_avpllCh *)(&(avPllBase->ie_C1)))[chId-1].u32avpllCh_ctrl3, ((SIE_avpllCh *)&(regSIE_avPll.ie_C1))[chId-1].u32avpllCh_ctrl3); |
| } |
| } |
| |
| static void diag_powerDownChannel(SIE_avPll *avPllBase, int chId) |
| { |
| PHY_HOST_Bus_Read32(((SIE_avpllCh *)(&(avPllBase->ie_C1)))[chId-1].u32avpllCh_ctrl1, ((SIE_avpllCh *)&(regSIE_avPll.ie_C1))[chId-1].u32avpllCh_ctrl1); |
| ((SIE_avpllCh *)&(regSIE_avPll.ie_C1))[chId-1].uctrl_PU = 0; |
| PHY_HOST_Bus_Write32(((SIE_avpllCh *)(&(avPllBase->ie_C1)))[chId-1].u32avpllCh_ctrl1, ((SIE_avpllCh *)&(regSIE_avPll.ie_C1))[chId-1].u32avpllCh_ctrl1); |
| } |
| |
| static void diag_powerUpChannel(SIE_avPll *avPllBase, int chId) |
| { |
| PHY_HOST_Bus_Read32(((SIE_avpllCh *)(&(avPllBase->ie_C1)))[chId-1].u32avpllCh_ctrl1, ((SIE_avpllCh *)&(regSIE_avPll.ie_C1))[chId-1].u32avpllCh_ctrl1); |
| ((SIE_avpllCh *)&(regSIE_avPll.ie_C1))[chId-1].uctrl_PU = 1; |
| PHY_HOST_Bus_Write32(((SIE_avpllCh *)(&(avPllBase->ie_C1)))[chId-1].u32avpllCh_ctrl1, ((SIE_avpllCh *)&(regSIE_avPll.ie_C1))[chId-1].u32avpllCh_ctrl1); |
| } |
| |
| void diag_powerDown(SIE_avPll *avPllBase) |
| { |
| int chId; |
| |
| //avPllBase->uctrlPLL_PU = 0; |
| PHY_HOST_Bus_Read32(avPllBase->u32avPll_ctrlPLL, regSIE_avPll.u32avPll_ctrlPLL); |
| regSIE_avPll.uctrlPLL_PU = 0; |
| PHY_HOST_Bus_Write32(avPllBase->u32avPll_ctrlPLL, regSIE_avPll.u32avPll_ctrlPLL); |
| |
| |
| for(chId=1; chId<=7; chId++) |
| { |
| diag_powerDownChannel(avPllBase, chId); |
| } |
| |
| //avPllBase->ie_C8.uctrl_PU = 0; |
| PHY_HOST_Bus_Read32((avPllBase->ie_C8).u32avpllCh8_ctrl1, (regSIE_avPll.ie_C8).u32avpllCh8_ctrl1); |
| (regSIE_avPll.ie_C8).uctrl_PU = 0; |
| PHY_HOST_Bus_Write32((avPllBase->ie_C8).u32avpllCh8_ctrl1, (regSIE_avPll.ie_C8).u32avpllCh8_ctrl1); |
| } |
| |
| void diag_powerUp(SIE_avPll *avPllBase) |
| { |
| int chId; |
| |
| for(chId=1; chId<=7; chId++) |
| { |
| diag_powerUpChannel(avPllBase, chId); |
| } |
| //avPllBase->ie_C8.uctrl_PU = 1; |
| PHY_HOST_Bus_Read32((avPllBase->ie_C8).u32avpllCh8_ctrl1, (regSIE_avPll.ie_C8).u32avpllCh8_ctrl1); |
| (regSIE_avPll.ie_C8).uctrl_PU = 1; |
| PHY_HOST_Bus_Write32((avPllBase->ie_C8).u32avpllCh8_ctrl1, (regSIE_avPll.ie_C8).u32avpllCh8_ctrl1); |
| |
| //avPllBase->uctrlPLL_PU = 1; |
| PHY_HOST_Bus_Read32(avPllBase->u32avPll_ctrlPLL, regSIE_avPll.u32avPll_ctrlPLL); |
| regSIE_avPll.uctrlPLL_PU = 1; |
| PHY_HOST_Bus_Write32(avPllBase->u32avPll_ctrlPLL, regSIE_avPll.u32avPll_ctrlPLL); |
| } |
| |
| //this function will enable AVPLL A and B and turn on caliberation |
| void diag_initAvPll() |
| { |
| int i; |
| T32Gbl_PadSelect regPadSelect; |
| T32avioGbl_AVPLLA_CLK_EN avplla_clk_en_data; |
| |
| |
| diag_enableAvPll((SIE_avPll *)AVPLL_A, VCO_FREQ_2_227G); |
| #if (BERLIN_CHIP_VERSION != BERLIN_BG2_CD) && (BERLIN_CHIP_VERSION != BERLIN_BG2CDP) |
| diag_enableAvPll((SIE_avPll *)AVPLL_B, VCO_FREQ_1_620G); |
| #endif |
| |
| BFM_HOST_Bus_Read32((MEMMAP_AVIO_GBL_BASE + RA_avioGbl_AVPLLA_CLK_EN), &avplla_clk_en_data.u32); |
| avplla_clk_en_data.uAVPLLA_CLK_EN_ctrl=0x3f; |
| BFM_HOST_Bus_Write32((MEMMAP_AVIO_GBL_BASE + RA_avioGbl_AVPLLA_CLK_EN), avplla_clk_en_data.u32); |
| |
| |
| |
| dbg_printf(PRN_RES, "Enable DVIO Pad\n"); |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_PadSelect), ®PadSelect.u32); |
| regPadSelect.uPadSelect_DVIO_OEN = 1; |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_PadSelect), regPadSelect.u32); |
| |
| |
| for (i=0; i<8; i++) { |
| gAVPLLA_Channel_OutputClock[i] = 0; |
| gAVPLLB_Channel_OutputClock[i] = 0; |
| } |
| // 525P settings for CPCB |
| diag_videoFreq((SIE_avPll *)AVPLL_A, 1, 0, 0, 4, 1); |
| //for HDMI |
| diag_videoFreq((SIE_avPll *)AVPLL_A, 1, 0, 0, 10.0, 7); |
| } |
| /* |
| // This function is from Diag's 1/16/2014 version, it is not called by any other functions. |
| //this function only reintialize the AVIO_GBL's AVPLL. It should be called after AVIO gets reset |
| void diag_reInitAvPll_A() |
| { |
| int i; |
| int chId; |
| T32Gbl_PadSelect regPadSelect; |
| T32avioGbl_AVPLLA_CLK_EN avplla_clk_en_data; |
| |
| diag_enableAvPll(AVPLL_A, VCO_FREQ_2_227G); |
| |
| |
| BFM_HOST_Bus_Read32((MEMMAP_AVIO_GBL_BASE + RA_avioGbl_AVPLLA_CLK_EN), &avplla_clk_en_data.u32); |
| avplla_clk_en_data.uAVPLLA_CLK_EN_ctrl=0x3f; |
| BFM_HOST_Bus_Write32((MEMMAP_AVIO_GBL_BASE + RA_avioGbl_AVPLLA_CLK_EN), avplla_clk_en_data.u32); |
| |
| for (i=0; i<8; i++) { |
| gAVPLLA_Channel_OutputClock[i] = 0; |
| } |
| } |
| */ |
| void diag_enableAvPll(SIE_avPll *avPllBase, unsigned int init_vco) |
| { |
| //set up VCO frequency, calibration done inside |
| diag_setVCO(avPllBase, init_vco); |
| dbg_printf(PRN_RES, "Enabled AvPLL instance %x\n", avPllBase); |
| } |
| |
| |
| void diag_calibrate(SIE_avPll *avPllBase, double fvco) |
| { |
| volatile int i=100000; |
| //MV_TimeSpec_t Time_Start, Time_End; |
| |
| //set the speed_thresh for current Fvco |
| //avPllBase->uctrlCAL_SPEED_THRESH = (int)(fvco/100+0.5); |
| PHY_HOST_Bus_Read32(avPllBase->u32avPll_ctrlCAL, regSIE_avPll.u32avPll_ctrlCAL); |
| regSIE_avPll.uctrlCAL_SPEED_THRESH = (int)(fvco/100+0.5); |
| PHY_HOST_Bus_Write32(avPllBase->u32avPll_ctrlCAL, regSIE_avPll.u32avPll_ctrlCAL); |
| |
| |
| //assert PLL resebratet |
| //avPllBase->uctrlPLL_RESET=1; |
| PHY_HOST_Bus_Read32(avPllBase->u32avPll_ctrlPLL, regSIE_avPll.u32avPll_ctrlPLL); |
| regSIE_avPll.uctrlPLL_RESET = 1; |
| PHY_HOST_Bus_Write32(avPllBase->u32avPll_ctrlPLL, regSIE_avPll.u32avPll_ctrlPLL); |
| |
| cpu_cycle_count_delay(20000); |
| //MV_Time_GetSysTime(&Time_Start); |
| //avPllBase->uctrlPLL_RESET=0; |
| PHY_HOST_Bus_Read32(avPllBase->u32avPll_ctrlPLL, regSIE_avPll.u32avPll_ctrlPLL); |
| regSIE_avPll.uctrlPLL_RESET = 0; |
| PHY_HOST_Bus_Write32(avPllBase->u32avPll_ctrlPLL, regSIE_avPll.u32avPll_ctrlPLL); |
| |
| //>20us and <50us must start calibration |
| cpu_cycle_count_delay(35000); |
| |
| //avPllBase->uctrlCAL_PLL_CAL_START = 1; |
| PHY_HOST_Bus_Read32(avPllBase->u32avPll_ctrlCAL, regSIE_avPll.u32avPll_ctrlCAL); |
| regSIE_avPll.uctrlCAL_PLL_CAL_START = 1; |
| PHY_HOST_Bus_Write32(avPllBase->u32avPll_ctrlCAL, regSIE_avPll.u32avPll_ctrlCAL); |
| |
| //MV_Time_GetSysTime(&Time_End); |
| #if 1 // PLATFORM==ASIC |
| //poll PLL CAL done bit |
| //while(!avPllBase->ustatus_PLL_CAL_DONE) |
| while(1) |
| { |
| PHY_HOST_Bus_Read32(avPllBase->u32avPll_status, regSIE_avPll.u32avPll_status); |
| if(regSIE_avPll.ustatus_PLL_CAL_DONE) |
| break; |
| |
| if(--i<0) |
| { |
| dbg_printf(PRN_RES, "PLL calibration Failed\n"); |
| break; |
| } |
| } |
| #endif |
| cpu_cycle_count_delay(20000); |
| |
| //avPllBase->uctrlCAL_PLL_CAL_START = 0; |
| PHY_HOST_Bus_Read32(avPllBase->u32avPll_ctrlCAL, regSIE_avPll.u32avPll_ctrlCAL); |
| regSIE_avPll.uctrlCAL_PLL_CAL_START = 0; |
| PHY_HOST_Bus_Write32(avPllBase->u32avPll_ctrlCAL, regSIE_avPll.u32avPll_ctrlCAL); |
| |
| } |
| |
| int divHDMICode[] = |
| { |
| 1, 2, 4, 6 |
| }; |
| |
| int divAV1Code[] = |
| { |
| 1, 2, 5, 5 |
| }; |
| |
| void diag_avpllFreq(SIE_avPll *avPllBase, int chId) |
| { |
| double vco_freq; |
| double freq_from_dpll, freq_from_offset; |
| int offset, sync1, sync2, post_div, post_0p5_div; |
| int enDPLL; |
| |
| dbg_printf(PRN_RES, "avPllBase=0x%x, diag_pll_A_VCO_Setting=%i, diag_pll_B_VCO_Setting=%i\n", \ |
| avPllBase, diag_pll_A_VCO_Setting, diag_pll_B_VCO_Setting); |
| dbg_printf(PRN_RES, "diag_vcoFreqs[diag_pll_A_VCO_Setting]=%f, diag_vcoFreqs[diag_pll_B_VCO_Setting]=%f\n", \ |
| diag_vcoFreqs[diag_pll_A_VCO_Setting], diag_vcoFreqs[diag_pll_B_VCO_Setting]); |
| if(avPllBase == (SIE_avPll *)AVPLL_A) |
| vco_freq=diag_vcoFreqs[diag_pll_A_VCO_Setting]; |
| else |
| vco_freq=diag_vcoFreqs[diag_pll_B_VCO_Setting]; |
| |
| //find offset, sync1, sync2, divHDMI, divAV1, divAV2, divAV3 for this channel |
| //offset = ((SIE_avpllCh *)(&(avPllBase->ie_C1)))[chId-1].uctrl_FREQ_OFFSET; |
| PHY_HOST_Bus_Read32(((SIE_avpllCh *)(&(avPllBase->ie_C1)))[chId-1].u32avpllCh_ctrl1, ((SIE_avpllCh *)&(regSIE_avPll.ie_C1))[chId-1].u32avpllCh_ctrl1); |
| offset = ((SIE_avpllCh *)&(regSIE_avPll.ie_C1))[chId-1].uctrl_FREQ_OFFSET; |
| |
| //sync1 = ((SIE_avpllCh *)(&(avPllBase->ie_C1)))[chId-1].uctrl_P_SYNC1; |
| PHY_HOST_Bus_Read32(((SIE_avpllCh *)(&(avPllBase->ie_C1)))[chId-1].u32avpllCh_ctrl2, ((SIE_avpllCh *)&(regSIE_avPll.ie_C1))[chId-1].u32avpllCh_ctrl2); |
| sync1 = ((SIE_avpllCh *)&(regSIE_avPll.ie_C1))[chId-1].uctrl_P_SYNC1; |
| |
| //sync2 = ((SIE_avpllCh *)(&(avPllBase->ie_C1)))[chId-1].uctrl_P_SYNC2; |
| PHY_HOST_Bus_Read32(((SIE_avpllCh *)(&(avPllBase->ie_C1)))[chId-1].u32avpllCh_ctrl3, ((SIE_avpllCh *)&(regSIE_avPll.ie_C1))[chId-1].u32avpllCh_ctrl3); |
| sync2 = ((SIE_avpllCh *)&(regSIE_avPll.ie_C1))[chId-1].uctrl_P_SYNC2; |
| |
| //post_div = ((SIE_avpllCh *)(&(avPllBase->ie_C1)))[chId-1].uctrl_POSTDIV; |
| PHY_HOST_Bus_Read32(((SIE_avpllCh *)(&(avPllBase->ie_C1)))[chId-1].u32avpllCh_ctrl, ((SIE_avpllCh *)&(regSIE_avPll.ie_C1))[chId-1].u32avpllCh_ctrl); |
| post_div = ((SIE_avpllCh *)&(regSIE_avPll.ie_C1))[chId-1].uctrl_POSTDIV; |
| |
| //post_0p5_div = ((SIE_avpllCh *)(&(avPllBase->ie_C1)))[chId-1].uctrl_POSTDIV_0P5; |
| PHY_HOST_Bus_Read32(((SIE_avpllCh *)(&(avPllBase->ie_C1)))[chId-1].u32avpllCh_ctrl, ((SIE_avpllCh *)&(regSIE_avPll.ie_C1))[chId-1].u32avpllCh_ctrl); |
| post_0p5_div = ((SIE_avpllCh *)&(regSIE_avPll.ie_C1))[chId-1].uctrl_POSTDIV_0P5; |
| |
| //enDPLL = ((SIE_avpllCh *)(&(avPllBase->ie_C1)))[chId-1].uctrl_EN_DPLL; |
| PHY_HOST_Bus_Read32(((SIE_avpllCh *)(&(avPllBase->ie_C1)))[chId-1].u32avpllCh_ctrl, ((SIE_avpllCh *)&(regSIE_avPll.ie_C1))[chId-1].u32avpllCh_ctrl); |
| enDPLL = ((SIE_avpllCh *)&(regSIE_avPll.ie_C1))[chId-1].uctrl_EN_DPLL; |
| |
| |
| dbg_printf(PRN_RES, "offset=%i, sync1=%i, sync2=%i\n", offset, sync1, sync2); |
| dbg_printf(PRN_RES, "post_div=%i, post_0p5_div=%i, enDPLL=%i\n", \ |
| post_div, post_0p5_div, enDPLL); |
| |
| if(enDPLL != 0) |
| freq_from_dpll = vco_freq*sync2/sync1; |
| else |
| freq_from_dpll = vco_freq; |
| |
| if(offset & (1<<18)) |
| { |
| offset = (offset & ((1<<18)-1)); |
| } |
| else |
| { |
| offset = -offset; |
| } |
| freq_from_offset = 1/(1-(double)offset/4194304)*vco_freq; |
| |
| if(post_div) |
| { |
| freq_from_offset = freq_from_offset/(post_div+post_0p5_div*.5); |
| freq_from_dpll = freq_from_dpll/(post_div+post_0p5_div*.5); |
| } |
| |
| dbg_printf(PRN_RES, "PLLA C%d Freq is: %fMHz(Offset) %fMHz(DPLL)\n", chId, freq_from_offset, freq_from_dpll); |
| |
| if(avPllBase == (SIE_avPll *)AVPLL_A) |
| current_freq[0][chId]=freq_from_dpll; |
| else |
| current_freq[1][chId]=freq_from_dpll; |
| |
| } |
| |
| int diag_getVCOFreq(int hdmiMode, int freqIndex) |
| { |
| return (vcoSelectionTable[hdmiMode][freqIndex]); |
| } |
| |
| void diag_vcoFreq(SIE_avPll *avPllBase) |
| { |
| double ref_freq=25.0; |
| double freq_from_offset; |
| int offset, fbDiv; |
| (void)freq_from_offset; |
| |
| //offset = (avPllBase->ie_C8).uctrl_FREQ_OFFSET; |
| PHY_HOST_Bus_Read32((avPllBase->ie_C8).u32avpllCh8_ctrl1, (regSIE_avPll.ie_C8).u32avpllCh8_ctrl1); |
| offset = (regSIE_avPll.ie_C8).uctrl_FREQ_OFFSET; |
| |
| //fbDiv = avPllBase->uctrlPLL_FBDIV; |
| PHY_HOST_Bus_Read32(avPllBase->u32avPll_ctrlPLL, regSIE_avPll.u32avPll_ctrlPLL); |
| fbDiv = regSIE_avPll.uctrlPLL_FBDIV; |
| |
| if(offset& (1<<18)) |
| { |
| offset = (offset & ((1<<18)-1)); |
| } |
| else |
| { |
| offset = -offset; |
| } |
| |
| freq_from_offset = ref_freq*fbDiv*(1 - (double)offset/4194304); |
| |
| dbg_printf(PRN_RES, "PLLA VCO Freq is: %f\n", freq_from_offset); |
| } |
| |
| |
| //freq_index, 0 to 5, the 6 VCLKs |
| //hdmiMode, HDMI_8BIT_MODE, HDMI_10BIT_MODE, HDMI_12BIT_MODE |
| //frameRate, FRAME_RATE_59P94 FRAME_RATE_60 |
| //overSampleRate, 1, 2, 4, 8, 10, 12.5, 15 |
| void diag_videoFreq(SIE_avPll *avPllBase, int freqIndex, int hdmiMode, int frameRate, float overSampleRate, int chId) |
| { |
| double vcoFreq, videoFreq; |
| int ppm1K=ppm1kSelectionTable[frameRate][freqIndex]; |
| double divider; |
| |
| vcoFreqIndex=vcoSelectionTable[hdmiMode][freqIndex]; |
| //set VCO freq here |
| diag_setVCO(avPllBase, vcoFreqIndex); |
| dbg_printf(PRN_RES, "VCO freq=%f\n", diag_vcoFreqs[vcoFreqIndex]); |
| |
| //check to see if ppm1K is need |
| vcoFreq = diag_vcoFreqs[vcoFreqIndex]; |
| if(ppm1K<0) |
| { |
| vcoFreq = vcoFreq*1000/1001; |
| } |
| |
| if(ppm1K>0) |
| { |
| vcoFreq = vcoFreq*1001/1000; |
| } |
| diag_set1KPPM(avPllBase, ppm1K, chId); |
| |
| //get the video freq |
| videoFreq = diag_videoFreqs[freqIndex]; |
| if(frameRate) |
| { |
| //60Hz vclk is 1001/1000 times 59.94Hz vclk |
| videoFreq = videoFreq*1001/1000; |
| } |
| dbg_printf(PRN_RES, "Video freq=%f\n", videoFreq); |
| |
| divider = vcoFreq*2/videoFreq/overSampleRate; |
| dbg_printf(PRN_RES, "AV post divider is %f %d\n", divider/2, (int)(divider+0.5)/2); |
| |
| //disable dividers |
| diag_set_Post_Div(avPllBase, 0 , chId); |
| diag_set_Post_0P5_Div(avPllBase, 0 , chId); |
| |
| //this enables post divider |
| if(divider>2) |
| { |
| diag_set_Post_Div(avPllBase, ((int)(divider+0.5)/2) , chId); |
| } |
| |
| if(((int)(divider+0.5))&1) |
| { |
| //fractional divider, use POSTDIV_0P5_CX |
| diag_set_Post_0P5_Div(avPllBase, 1 , chId); |
| } |
| |
| dbg_printf(PRN_RES, "PLL(%x) C%d=%f\n", avPllBase, chId, videoFreq*overSampleRate); |
| |
| if(((unsigned int)avPllBase&0xffff0000)==MEMMAP_AVIO_GBL_BASE) |
| gAVPLLA_Channel_OutputClock[chId] = (unsigned int)(videoFreq*overSampleRate*1000000); |
| else |
| gAVPLLB_Channel_OutputClock[chId] = (unsigned int)(videoFreq*overSampleRate*1000000); |
| |
| diag_dump_CLK_FREQ(&(clk_freqs_computed[freqIndex])); |
| } |
| |
| //freqIndex is the vco freq index into clk_freqs_computed[] array |
| int diag_clockFreq_computed(SIE_avPll *avPllBase, int freqIndex, int chId) |
| { |
| int diag_pll_VCO_Setting; |
| |
| if(avPllBase == (SIE_avPll *)AVPLL_A) |
| { |
| diag_pll_VCO_Setting=diag_pll_A_VCO_Setting; |
| dbg_printf(PRN_RES, "set A%d to %fMHz\n", chId, clk_freqs_computed[freqIndex].clkout_freq); |
| } |
| else |
| { |
| diag_pll_VCO_Setting=diag_pll_B_VCO_Setting; |
| dbg_printf(PRN_RES, "set B%d to %fMHz\n", chId, clk_freqs_computed[freqIndex].clkout_freq); |
| } |
| |
| if(freqIndex > (int)(sizeof(clk_freqs_computed) / sizeof(CLK_FREQ))) |
| { |
| dbg_printf(PRN_RES, "VCO Freq Index not found\n"); |
| return 1; |
| } |
| |
| if(clk_freqs_computed[freqIndex].invalid) |
| { |
| dbg_printf(PRN_RES, "Frequency entry is invalid!\n"); |
| return 1; |
| } |
| |
| if(diag_pll_VCO_Setting != clk_freqs_computed[freqIndex].vco_freq_index) |
| { |
| dbg_printf(PRN_RES, "VCO frequency is changed to %f!\n", |
| diag_vcoFreqs[clk_freqs_computed[freqIndex].vco_freq_index]); |
| |
| diag_setVCO(avPllBase, clk_freqs_computed[freqIndex].vco_freq_index); |
| } |
| |
| //change offset |
| diag_setChanOffset(avPllBase, clk_freqs_computed[freqIndex].freq_offset, chId); |
| |
| //change p_sync |
| diag_setDPll(avPllBase, (clk_freqs_computed[freqIndex].p_sync1!=0), |
| clk_freqs_computed[freqIndex].p_sync1, |
| clk_freqs_computed[freqIndex].p_sync2, chId); |
| |
| //update now div |
| diag_set_Post_Div(avPllBase, clk_freqs_computed[freqIndex].post_div, chId); |
| diag_set_Post_0P5_Div(avPllBase, clk_freqs_computed[freqIndex].post_div_0p5, chId); |
| |
| dbg_printf(PRN_RES, "-------------clk_freqs_computed[%i]----------------------------\n", freqIndex); |
| diag_dump_CLK_FREQ(&(clk_freqs_computed[freqIndex])); |
| return 0; |
| |
| } |
| |
| /*this function is introduced by software team*/ |
| int diag_getChannelOutputFreq(int AVPLLIndex,int chID) |
| { |
| if (chID<0 || chID>7) |
| return 0; |
| |
| if (AVPLLIndex == 0) //AVPLL-A |
| return (gAVPLLA_Channel_OutputClock[chID]); |
| else |
| return (gAVPLLB_Channel_OutputClock[chID]); |
| } |
| |
| int diag_en_ATP(SIE_avPll *avPllBase) |
| { |
| int i; |
| char character; |
| |
| dbg_printf(PRN_RES, "enabling PLL_A Analog Test Point one-by-one\n"); |
| |
| for(i=1; i<=0x1f; i++) |
| { |
| //avPllBase->uctrlTest_TEST_MON = (0x20 | i); |
| PHY_HOST_Bus_Read32(avPllBase->u32avPll_ctrlTest, regSIE_avPll.u32avPll_ctrlTest); |
| regSIE_avPll.uctrlTest_TEST_MON = (0x20 | i); |
| PHY_HOST_Bus_Write32(avPllBase->u32avPll_ctrlTest, regSIE_avPll.u32avPll_ctrlTest); |
| |
| dbg_printf(PRN_RES, "enabled ATP %d, hit n for next\n", i); |
| while(1) |
| { |
| //character = diag_uart_master_read_1_char(0); |
| if (character == 'n') break; |
| } |
| } |
| |
| //avPllBase->uctrlTest_TEST_MON = 0; |
| PHY_HOST_Bus_Read32(avPllBase->u32avPll_ctrlTest, regSIE_avPll.u32avPll_ctrlTest); |
| regSIE_avPll.uctrlTest_TEST_MON = 0; |
| PHY_HOST_Bus_Write32(avPllBase->u32avPll_ctrlTest, regSIE_avPll.u32avPll_ctrlTest); |
| |
| return 0; |
| } |
| |
| int diag_en_clkout_tst(SIE_avPll *avPllBase, int test_mon) |
| { |
| char character = '\0'; |
| |
| //avPllBase->uctrlTest_CLKOUT_TST_EN = 0; |
| PHY_HOST_Bus_Read32(avPllBase->u32avPll_ctrlTest, regSIE_avPll.u32avPll_ctrlTest); |
| regSIE_avPll.uctrlTest_CLKOUT_TST_EN = 0; |
| PHY_HOST_Bus_Write32(avPllBase->u32avPll_ctrlTest, regSIE_avPll.u32avPll_ctrlTest); |
| |
| //avPllBase->uctrlTest_TEST_MON = test_mon; |
| PHY_HOST_Bus_Read32(avPllBase->u32avPll_ctrlTest, regSIE_avPll.u32avPll_ctrlTest); |
| regSIE_avPll.uctrlTest_TEST_MON = test_mon; |
| PHY_HOST_Bus_Write32(avPllBase->u32avPll_ctrlTest, regSIE_avPll.u32avPll_ctrlTest); |
| |
| //avPllBase->uctrlTest_CLKOUT_TST_EN = 1; |
| PHY_HOST_Bus_Read32(avPllBase->u32avPll_ctrlTest, regSIE_avPll.u32avPll_ctrlTest); |
| regSIE_avPll.uctrlTest_TEST_MON = 1; |
| PHY_HOST_Bus_Write32(avPllBase->u32avPll_ctrlTest, regSIE_avPll.u32avPll_ctrlTest); |
| |
| dbg_printf(PRN_RES, "enabled CLKOUT TST %d, hit q to quit\n", test_mon); |
| while(1) |
| { |
| //character = diag_uart_master_read_1_char(0); |
| if (character == 'q') break; |
| } |
| |
| //avPllBase->uctrlTest_CLKOUT_TST_EN = 0; |
| PHY_HOST_Bus_Read32(avPllBase->u32avPll_ctrlTest, regSIE_avPll.u32avPll_ctrlTest); |
| regSIE_avPll.uctrlTest_CLKOUT_TST_EN = 0; |
| PHY_HOST_Bus_Write32(avPllBase->u32avPll_ctrlTest, regSIE_avPll.u32avPll_ctrlTest); |
| |
| return 0; |
| } |
| |
| int diag_avPllRegDump(SIE_avPll *avPllBase) |
| { |
| int chId; |
| (void)avPllBase; |
| |
| dbg_printf(PRN_RES, "AVPLL control Regs:\n"); |
| |
| dbg_printf(PRN_RES, "0x%08X: 0x%08X\n", &(avPllBase->u32avPll_ctrlPLL), avPllBase->u32avPll_ctrlPLL); |
| dbg_printf(PRN_RES, "0x%08X: 0x%08X\n", &(avPllBase->u32avPll_ctrlPLL1), avPllBase->u32avPll_ctrlPLL1); |
| dbg_printf(PRN_RES, "0x%08X: 0x%08X\n", &(avPllBase->u32avPll_ctrlCAL), avPllBase->u32avPll_ctrlCAL); |
| dbg_printf(PRN_RES, "0x%08X: 0x%08X\n", &(avPllBase->u32avPll_ctrlCAL1), avPllBase->u32avPll_ctrlCAL1); |
| dbg_printf(PRN_RES, "0x%08X: 0x%08X\n", &(avPllBase->u32avPll_ctrlSlowLoop), avPllBase->u32avPll_ctrlSlowLoop); |
| dbg_printf(PRN_RES, "0x%08X: 0x%08X\n", &(avPllBase->u32avPll_ctrlINTP), avPllBase->u32avPll_ctrlINTP); |
| |
| for(chId=1; chId<=7; chId++) |
| { |
| dbg_printf(PRN_RES, "AVPLL Channel control Regs, chanId=%d:\n", chId); |
| |
| dbg_printf(PRN_RES, "0x%08X: 0x%08X\n", &(((SIE_avpllCh *)(&(avPllBase->ie_C1)))[chId-1].u32avpllCh_ctrl), ((SIE_avpllCh *)(&(avPllBase->ie_C1)))[chId-1].u32avpllCh_ctrl); |
| dbg_printf(PRN_RES, "0x%08X: 0x%08X\n", &(((SIE_avpllCh *)(&(avPllBase->ie_C1)))[chId-1].u32avpllCh_ctrl1), ((SIE_avpllCh *)(&(avPllBase->ie_C1)))[chId-1].u32avpllCh_ctrl1); |
| dbg_printf(PRN_RES, "0x%08X: 0x%08X\n", &(((SIE_avpllCh *)(&(avPllBase->ie_C1)))[chId-1].u32avpllCh_ctrl2), ((SIE_avpllCh *)(&(avPllBase->ie_C1)))[chId-1].u32avpllCh_ctrl2); |
| dbg_printf(PRN_RES, "0x%08X: 0x%08X\n", &(((SIE_avpllCh *)(&(avPllBase->ie_C1)))[chId-1].u32avpllCh_ctrl3), ((SIE_avpllCh *)(&(avPllBase->ie_C1)))[chId-1].u32avpllCh_ctrl3); |
| |
| } |
| |
| chId=8; |
| dbg_printf(PRN_RES, "AVPLL Channel control Regs, chanId=%d:\n", chId); |
| |
| dbg_printf(PRN_RES, "0x%08X: 0x%08X\n", &(((SIE_avpllCh *)(&(avPllBase->ie_C1)))[chId-1].u32avpllCh_ctrl), ((SIE_avpllCh *)(&(avPllBase->ie_C1)))[chId-1].u32avpllCh_ctrl); |
| dbg_printf(PRN_RES, "0x%08X: 0x%08X\n", &(((SIE_avpllCh *)(&(avPllBase->ie_C1)))[chId-1].u32avpllCh_ctrl1), ((SIE_avpllCh *)(&(avPllBase->ie_C1)))[chId-1].u32avpllCh_ctrl1); |
| dbg_printf(PRN_RES, "0x%08X: 0x%08X\n", &(((SIE_avpllCh *)(&(avPllBase->ie_C1)))[chId-1].u32avpllCh_ctrl2), ((SIE_avpllCh *)(&(avPllBase->ie_C1)))[chId-1].u32avpllCh_ctrl2); |
| dbg_printf(PRN_RES, "0x%08X: 0x%08X\n", &(((SIE_avpllCh *)(&(avPllBase->ie_C1)))[chId-1].u32avpllCh_ctrl3), ((SIE_avpllCh *)(&(avPllBase->ie_C1)))[chId-1].u32avpllCh_ctrl3); |
| |
| dbg_printf(PRN_RES, "AVPLL status:\n"); |
| dbg_printf(PRN_RES, "0x%08X: 0x%08X\n", &(avPllBase->u32avPll_status), avPllBase->u32avPll_status); |
| dbg_printf(PRN_RES, "0x%08X: 0x%08X\n", &(avPllBase->u32avPll_status1), avPllBase->u32avPll_status1); |
| return 0; |
| } |
| |
| int gcd(unsigned int m, unsigned int n) |
| { |
| dbg_printf(PRN_INFO, "R=%d, Q=%d\n", m, n); |
| |
| int rem; |
| while(n!=0) |
| { |
| rem=m%n; |
| m=n; |
| n=rem; |
| } |
| |
| dbg_printf(PRN_INFO, "S=%d\n", m); |
| return(m); |
| } |
| |
| void diag_print_freqs_computed(int i) |
| { |
| if(clk_freqs_computed[i].invalid) |
| { |
| dbg_printf(PRN_RES, "%d: %4.2fGHz\t%4.3fMHz\tN\A\n", i, |
| diag_vcoFreqs[i], |
| clk_freqs_computed[i].clkout_freq); |
| } |
| else |
| { |
| dbg_printf(PRN_RES, "%d: %4.2fGHz\t%4.3fMHz\t%6d\t%6d\t%6d\t%d\t%d\t%1.3f\n", i, |
| diag_vcoFreqs[i], |
| clk_freqs_computed[i].clkout_freq, |
| clk_freqs_computed[i].freq_offset, |
| clk_freqs_computed[i].p_sync2, |
| clk_freqs_computed[i].p_sync1, |
| clk_freqs_computed[i].post_div, |
| clk_freqs_computed[i].post_div_0p5, |
| (((double)clk_freqs_computed[i].p_sync2-(double)clk_freqs_computed[i].p_sync1))/clk_freqs_computed[i].p_sync1); |
| } |
| } |
| |
| //target_freq is in Hz |
| //compute channel post div, freq_offset for target freq |
| int diag_compute_freq_setting(unsigned int vco_freq_index, unsigned int target_freq) |
| { |
| double offset, offset_percent; |
| double divider; |
| double ratio; |
| int int_divider; |
| |
| memset(&(clk_freqs_computed[vco_freq_index]), 0, sizeof(CLK_FREQ)); |
| |
| clk_freqs_computed[vco_freq_index].vco_freq_index=vco_freq_index; |
| clk_freqs_computed[vco_freq_index].clkout_freq=(float)target_freq/1000000; |
| |
| //.5 divider is only used when divider is less than 24 |
| //This matches the settings in audio freq table in the IP doc |
| |
| ratio = diag_vcoFreqs[vco_freq_index]*1000000/target_freq; |
| |
| if(ratio < 24) |
| { |
| //allow 0.5 divider, round to closest 0.5 |
| int_divider = (int)(ratio*2+0.5); |
| } |
| else |
| { |
| //round to closest int |
| int_divider = ((int)(ratio+0.5))*2; |
| } |
| divider = ((double)int_divider)/2; |
| |
| dbg_printf(PRN_INFO, "int_div=%d, divider=%f\n", int_divider, divider); |
| |
| clk_freqs_computed[vco_freq_index].post_div_0p5= (int_divider&1); |
| clk_freqs_computed[vco_freq_index].post_div=((int)(divider)); |
| |
| //now figure out the offset |
| offset_percent = (target_freq*divider/1000000 - diag_vcoFreqs[vco_freq_index])/diag_vcoFreqs[vco_freq_index]; |
| |
| dbg_printf(PRN_INFO, "offset_percent=%f\n", offset_percent); |
| |
| offset = 4194304*offset_percent/(1+offset_percent); |
| |
| dbg_printf(PRN_INFO, "offset=%f\n", offset); |
| |
| |
| if(offset<=-262144 || offset>= 262144) |
| { |
| //offset cannot be achieved |
| clk_freqs_computed[vco_freq_index].invalid = 1; |
| return 1; |
| } |
| else |
| { |
| unsigned int vco_ratio, freq_ratio, gcd_val; |
| |
| //for rounding |
| if(offset>0) offset+=0.5; |
| else offset-=0.5; |
| |
| clk_freqs_computed[vco_freq_index].freq_offset = (int)(offset); |
| dbg_printf(PRN_INFO, "target=%d, divider=%f, target_freq*divider=%f\n", target_freq, divider, (target_freq*divider)); |
| gcd_val= gcd(diag_vcoFreqs[vco_freq_index]*1000000, target_freq*divider); |
| vco_ratio = (int)(diag_vcoFreqs[vco_freq_index]*1000000/gcd_val); |
| freq_ratio = (int)(target_freq*divider/gcd_val); |
| dbg_printf(PRN_INFO, "T=%d, U=%d\n", freq_ratio, vco_ratio); |
| |
| if((gcd_val/1000)<1000) |
| { |
| clk_freqs_computed[vco_freq_index].p_sync2=freq_ratio; |
| clk_freqs_computed[vco_freq_index].p_sync1=vco_ratio; |
| } |
| else |
| { |
| clk_freqs_computed[vco_freq_index].p_sync2=freq_ratio*((int)(gcd_val/1000000+0.5)); |
| clk_freqs_computed[vco_freq_index].p_sync1=vco_ratio*((int)(gcd_val/1000000+0.5)); |
| } |
| |
| } |
| |
| return 0; |
| } |
| |
| int diag_clockFreq(SIE_avPll *avPllBase, int vco_freq_index, unsigned int target_freq, int chId) |
| { |
| dbg_printf(PRN_RES, "avPllBase(0x%X), vco_freq_index(%d), target_freq(%d), chId(%d)\n", avPllBase, vco_freq_index, target_freq, chId); |
| |
| if(diag_compute_freq_setting(vco_freq_index, target_freq)) |
| { |
| dbg_printf(PRN_RES, "freq %fHz cannot be achieved with VCO=%fMHz\n", (float)target_freq/1000000, diag_vcoFreqs[vco_freq_index]); |
| return 1; |
| } |
| else |
| { |
| //frequency ok, set it |
| diag_clockFreq_computed(avPllBase, vco_freq_index, chId); |
| } |
| |
| return 0; |
| } |
| |
| void diag_check_audioFreq() |
| { |
| size_t i; |
| |
| dbg_printf(PRN_RES, "VCO=%f:\n", diag_vcoFreqs[VCO_FREQ_2_227G]); |
| for(i=0; i<sizeof(audio_freq1)/sizeof(int); i++) |
| { |
| diag_compute_freq_setting(VCO_FREQ_2_227G, audio_freq1[i]); |
| diag_print_freqs_computed(VCO_FREQ_2_227G); |
| } |
| |
| |
| dbg_printf(PRN_RES, "VCO=%f:\n", diag_vcoFreqs[VCO_FREQ_1_620G]); |
| for(i=0; i<sizeof(audio_freq1)/sizeof(int); i++) |
| { |
| diag_compute_freq_setting(VCO_FREQ_1_620G, audio_freq1[i]); |
| diag_print_freqs_computed(VCO_FREQ_1_620G); |
| } |
| |
| dbg_printf(PRN_RES, "VCO=%f:\n", diag_vcoFreqs[VCO_FREQ_1_512G]); |
| for(i=0; i<sizeof(audio_freq1)/sizeof(int); i++) |
| { |
| diag_compute_freq_setting(VCO_FREQ_1_512G, audio_freq1[i]); |
| diag_print_freqs_computed(VCO_FREQ_1_512G); |
| } |
| |
| dbg_printf(PRN_RES, "VCO=%f:\n", diag_vcoFreqs[VCO_FREQ_2_700G]); |
| for(i=0; i<sizeof(audio_freq1)/sizeof(int); i++) |
| { |
| diag_compute_freq_setting(VCO_FREQ_2_700G, audio_freq1[i]); |
| diag_print_freqs_computed(VCO_FREQ_2_700G); |
| } |
| |
| dbg_printf(PRN_RES, "VCO=%f:\n", diag_vcoFreqs[VCO_FREQ_1_856G]); |
| for(i=0; i<sizeof(audio_freq1)/sizeof(int); i++) |
| { |
| diag_compute_freq_setting(VCO_FREQ_1_856G, audio_freq1[i]); |
| diag_print_freqs_computed(VCO_FREQ_1_856G); |
| } |
| |
| dbg_printf(PRN_RES, "VCO=%f:\n", diag_vcoFreqs[VCO_FREQ_2_520G]); |
| for(i=0; i<sizeof(audio_freq2)/sizeof(int); i++) |
| { |
| diag_compute_freq_setting(VCO_FREQ_2_520G, audio_freq2[i]); |
| diag_print_freqs_computed(VCO_FREQ_2_520G); |
| } |
| |
| dbg_printf(PRN_RES, "VCO=%f:\n", diag_vcoFreqs[VCO_FREQ_2_160G]); |
| for(i=0; i<sizeof(audio_freq1)/sizeof(int); i++) |
| { |
| diag_compute_freq_setting(VCO_FREQ_2_160G, audio_freq1[i]); |
| diag_print_freqs_computed(VCO_FREQ_2_160G); |
| } |
| |
| dbg_printf(PRN_RES, "VCO=%f:\n", diag_vcoFreqs[VCO_FREQ_2_970G]); |
| for(i=0; i<sizeof(audio_freq1)/sizeof(int); i++) |
| { |
| diag_compute_freq_setting(VCO_FREQ_2_970G, audio_freq1[i]); |
| diag_print_freqs_computed(VCO_FREQ_2_970G); |
| } |
| } |
| |
| /* |
| // This function is from Diag's 1/16/2014 version, it is not called by any other functions. |
| //check if the current avPLL is power down or not |
| //0=power down |
| //1=power up |
| int diag_powerStatus(SIE_avPll *avPllBase) |
| { |
| return avPllBase->uctrlPLL_PU; |
| } |
| */ |
| |
| void diag_dump_CLK_FREQ(CLK_FREQ* pCLK_FREQ) |
| { |
| (void)pCLK_FREQ; |
| dbg_printf(PRN_RES, "vco_freq_index=%i\n", pCLK_FREQ->vco_freq_index); |
| dbg_printf(PRN_RES, "clkout_freq=%f\n", pCLK_FREQ->clkout_freq); |
| dbg_printf(PRN_RES, "freq_offset=%i\n", pCLK_FREQ->freq_offset); |
| dbg_printf(PRN_RES, "p_sync2=%i\n", pCLK_FREQ->p_sync2); |
| dbg_printf(PRN_RES, "p_sync1=%i\n", pCLK_FREQ->p_sync1); |
| dbg_printf(PRN_RES, "post_div=%i\n", pCLK_FREQ->post_div); |
| dbg_printf(PRN_RES, "post_div_0p5=%i\n", pCLK_FREQ->post_div_0p5); |
| dbg_printf(PRN_RES, "invalid=%i\n", pCLK_FREQ->invalid); |
| } |
| |
| void cpu_cycle_count_delay(unsigned int ns) |
| { |
| unsigned int start,diff, end; |
| |
| GA_REG_WORD32_READ(0xF7E82C04, &start); |
| |
| do |
| { |
| GA_REG_WORD32_READ(0xF7E82C04, &end); |
| if(start >= end) |
| diff = start - end; |
| else |
| diff = 1000*1000 + start - end; |
| |
| } while(diff < ns/10); |
| } |
| |
| int AVPLL_Set(int groupId, int chanId, unsigned int avFreq) |
| { |
| if (groupId == 0) |
| diag_clockFreq((SIE_avPll *)AVPLL_A, vcoFreqIndex, avFreq, chanId); |
| #if HAS_AVPLL_B |
| else if (groupId == 1) |
| diag_clockFreq(AVPLL_B, vcoFreqIndex, avFreq, chanId); |
| #endif |
| return 0; |
| } |
| |
| void diag_videoFreq_A(int freqIndex, int hdmiMode, int frameRate, float overSampleRate, int chId) |
| { |
| (void)freqIndex; |
| (void)hdmiMode; |
| (void)frameRate; |
| (void)overSampleRate; |
| (void)chId; |
| } |
| |
| void diag_videoFreq_B(int freqIndex, int hdmiMode, int frameRate, float overSampleRate, int chId) |
| { |
| (void)freqIndex; |
| (void)hdmiMode; |
| (void)frameRate; |
| (void)overSampleRate; |
| (void)chId; |
| } |
| |
| void dump_AVPLL_regs(int nRegs) |
| { |
| int i; |
| |
| dbg_printf(PRN_RES, "\n"); |
| for (i=0; i<=nRegs && i<0xD0; i +=0x10) |
| dbg_printf(PRN_RES, "0x%08X:\t0x%08X\t0x%08X\t0x%08X\t0x%08X\n", 0xf7e20000 + i, *((unsigned int*)((char*)AVPLL_A + i)), *((unsigned int*)((char*)AVPLL_A + i + 4)), *((unsigned int*)((char*)AVPLL_A + i + 8)), *((unsigned int*)((char*)AVPLL_A + i +12))); |
| if(i == 0xD0 && i < nRegs) { |
| dbg_printf(PRN_RES, "0x%08X:\t0x%08X\t0x%08X\n", 0xf7e200d0, *((unsigned int*)((char*)AVPLL_A + 0xd0)), *((unsigned int*)((char*)AVPLL_A + 0xd4))); |
| } |
| dbg_printf(PRN_RES, "\n"); |
| } |
| |
| void AVPLL_Enable(void) |
| { |
| diag_initAvPll(); |
| } |
| #else //BG2CDP |
| #include "com_type.h" |
| #include "Galois_memmap.h" |
| #include "galois_io.h" |
| #include "global.h" |
| #include "avpll.h" |
| #include "mv_logger.h" |
| |
| #if (BERLIN_CHIP_VERSION >= BERLIN_BG2_Q) |
| #include "avioGbl.h" |
| #endif |
| #ifdef BERLIN |
| |
| #define BFM_HOST_Bus_Write32 GA_REG_WORD32_WRITE |
| #define BFM_HOST_Bus_Read32 GA_REG_WORD32_READ |
| |
| static char dbg_buf[256]; |
| |
| enum PRINT_LEVEL |
| { |
| PRN_NONE=0, |
| PRN_ERR, |
| PRN_RES, |
| PRN_INFO, |
| PRN_DBG |
| }; |
| void dbg_printf(SIGN32 logLevel,const char* szFormat, ...) |
| { |
| #if 1 |
| va_list args; |
| va_start(args, szFormat); |
| vsnprintf(dbg_buf, 255, szFormat, args); |
| printf("%s\n", dbg_buf); |
| va_end(args); |
| #endif |
| } |
| |
| typedef struct |
| { |
| unsigned int vco_freq_index; |
| unsigned int av_freq_index; |
| int freq_offset; //signed number |
| unsigned int p_sync2; |
| unsigned int p_sync1; |
| unsigned int divAV1; |
| unsigned int divAV2; |
| unsigned int divAV3; |
| //unsigned int invalid; //this indicate it is a valid setting or not: 0 is valid, 1 is not |
| |
| } CLK_FREQ; |
| |
| double current_freq[2][7]; |
| |
| enum |
| { |
| HDMI_8BIT_MODE=0, |
| HDMI_10BIT_MODE, |
| HDMI_12BIT_MODE, |
| HDMI_MAX_MODE |
| }; |
| |
| enum |
| { |
| FRAME_RATE_59P94=0, |
| FRAME_RATE_60 |
| }; |
| |
| #define OVERSAMPLE_HDMI 0 |
| #define OVERSAMPLE_1X 1 |
| #define OVERSAMPLE_2X 2 |
| #define OVERSAMPLE_4X 4 |
| #define OVERSAMPLE_8X 8 |
| |
| double diag_hdmiOverSample[] = |
| { |
| 10, |
| 12.5, |
| 15 |
| }; |
| |
| double diag_videoFreqs[] = |
| { |
| //video frequencies, pixel freq |
| 25.17482517, |
| 27, |
| 54, |
| 74.17582418, |
| 108, |
| 148.3516484, |
| 135.30 |
| }; |
| |
| //all the VCO freq reqired for video and audio in MHz |
| double diag_vcoFreqs[]= |
| { |
| 1080, //8 bit HDMI |
| 1260, //10 bit HDMI |
| 1350, //10 bit HDMI |
| 1485, //8 bit HDMI |
| 1512, //8 bit HDMI and 12 bit HDMI |
| 1620, //12 bit HDMI |
| 1856.25,//10 bit HDMI |
| 2227.5, //12 bit HDMI |
| 1353, |
| }; |
| |
| //from Section 7 table |
| unsigned char diag_avpllRegFBDIV[]= |
| { |
| 43, //VCO_FREQ_1_080G, |
| 50, //VCO_FREQ_1_260G, |
| 54, //VCO_FREQ_1_350G, |
| 59, //VCO_FREQ_1_485G, |
| 60, //VCO_FREQ_1_512G, |
| 65, //VCO_FREQ_1_620G, |
| 74, //VCO_FREQ_1_856G, |
| 89, //VCO_FREQ_2_227G |
| 54, //VCO_FREQ_1_353G, |
| }; |
| |
| //from Section 7 table, bit18 is signe bit |
| #if (BERLIN_CHIP_VERSION >= BERLIN_BG2_Q) |
| unsigned int diag_avpllRegFREQ_OFFSET_C8[]= |
| { |
| (19508), //VCO_FREQ_1_080G, |
| (33554), //VCO_FREQ_1_260G, |
| (00000), //VCO_FREQ_1_350G, |
| (28435), //VCO_FREQ_1_485G, |
| (33554), //VCO_FREQ_1_512G, |
| ((1<<18)|(12906)), //VCO_FREQ_1_620G, |
| (14170), //VCO_FREQ_1_856G, |
| (4713), //VCO_FREQ_2_227G |
| (00000), //VCO_FREQ_1_353G, |
| }; |
| #else |
| unsigned int diag_avpllRegFREQ_OFFSET_C8[]= |
| { |
| (19508), //VCO_FREQ_1_080G, |
| (33554), //VCO_FREQ_1_260G, |
| (00000), //VCO_FREQ_1_350G, |
| (28435), //VCO_FREQ_1_485G, |
| (33554), //VCO_FREQ_1_512G, |
| ((1<<18)|(12905)), //VCO_FREQ_1_620G, |
| (14169), //VCO_FREQ_1_856G, |
| (4712), //VCO_FREQ_2_227G |
| (00000), //VCO_FREQ_1_353G, |
| }; |
| #endif |
| |
| #if (BERLIN_CHIP_VERSION >= BERLIN_BG2_Q) |
| unsigned int diag_avpllRegSPEED[]= |
| { |
| 0x0, //1.08G<F<= 1.21G, for 1.08G |
| 0x2, //1.21G<F<=1.4G for 1.26G |
| 0x2, //1.21G<F<=1.4G for 1.35G |
| 0x3, //1.4G<F<=1.61G for 1.48G |
| 0x3, //1.4G<F<=1.61G for 1.51G |
| 0x4, //1.61G<F<= 1.86G for 1.62G |
| 0x5, //1.61G<F<= 1.86G for 1.85G |
| // 0x4, //1.86G<F<= 2G not used |
| // 0x5, //2G<F<=2.22G not used |
| 0x6, //F> 2.22G for 2.22G |
| 0x2, //1.21G<F<=1.4G for 1.35G |
| }; |
| #else |
| #if (BERLIN_CHIP_VERSION != BERLIN_BG2_CD) && (BERLIN_CHIP_VERSION != BERLIN_BG2CDP) |
| unsigned int diag_avpllRegSPEED[]= |
| { |
| 0x0, //1.08G<F<= 1.21G, for 1.08G |
| 0x0, //1.21G<F<=1.4G for 1.26G |
| 0x1, //1.21G<F<=1.4G for 1.35G |
| 0x2, //1.4G<F<=1.61G for 1.48G |
| 0x2, //1.4G<F<=1.61G for 1.51G |
| 0x3, //1.61G<F<= 1.86G for 1.62G |
| 0x4, //1.61G<F<= 1.86G for 1.85G |
| // 0x4, //1.86G<F<= 2G not used |
| // 0x5, //2G<F<=2.22G not used |
| 0x6, //F> 2.22G for 2.22G |
| 0x1, // for 1.35G |
| }; |
| #else /* (BERLIN_CHIP_VERSION == BERLIN_BG2_CD) */ |
| unsigned int diag_avpllRegSPEED[]= |
| { |
| 0x0, //0.95G<F<=1.08G for 1.08G |
| 0x2, //1.25G<F<=1.4G for 1.26G |
| 0x2, //1.21G<F<=1.4G for 1.35G |
| 0x3, //1.42G<F<=1.61G for 1.48G |
| 0x3, //1.42G<F<=1.61G for 1.51G |
| 0x4, //1.60G<F<= 1.86G for 1.62G |
| 0x5, //1.80G<F<= 2G for 1.85G |
| 0x6, //2.0G<F<=2.3G for 2.22G |
| 0x2, //1.21G<F<=1.4G for 1.35G |
| }; |
| #endif /* (BERLIN_CHIP_VERSION != BERLIN_BG2_CD) */ |
| #endif /* (BERLIN_CHIP_VERSION >= BERLIN_BG2_Q) */ |
| |
| #if (BERLIN_CHIP_VERSION >= BERLIN_BG2_Q) |
| unsigned int diag_avpllRegINTPI[]= |
| { |
| 0x3, //1G~1.4 for 1.08G |
| 0x3, //1G~1.4 for 1.26G |
| 0x3, //1G~1.4 for 1.35G |
| 0x4, //1.4G~1.8G for 1.48G |
| 0x4, //1.4G~1.8G for 1.51G |
| 0x4, //1.4G~1.8G for 1.62G |
| 0x5, //1.8G~2.25G for 1.85G |
| 0x5, //1.8G~2.25G for 2.22G |
| 0x3, // for 1.35G |
| }; |
| #else |
| #if (BERLIN_CHIP_VERSION != BERLIN_BG2_CD) && (BERLIN_CHIP_VERSION != BERLIN_BG2CDP) |
| unsigned int diag_avpllRegINTPI[]= |
| { |
| 0x2, //1G~1.4 for 1.08G |
| 0x2, //1G~1.4 for 1.26G |
| 0x2, //1G~1.4 for 1.35G |
| 0x3, //1.4G~1.8G for 1.48G |
| 0x3, //1.4G~1.8G for 1.51G |
| 0x3, //1.4G~1.8G for 1.62G |
| 0x4, //1.8G~2.25G for 1.85G |
| 0x4, //1.8G~2.25G for 2.22G |
| 0x2, // for 1.35G |
| }; |
| #else /* (BERLIN_CHIP_VERSION == BERLIN_BG2_CD) */ |
| unsigned int diag_avpllRegINTPI[]= |
| { |
| 0x3, //1G~1.4 for 1.08G |
| 0x3, //1G~1.4 for 1.26G |
| 0x3, //1G~1.4 for 1.35G |
| 0x4, //1.4G~1.8G for 1.48G |
| 0x4, //1.4G~1.8G for 1.51G |
| 0x4, //1.4G~1.8G for 1.62G |
| 0x5, //1.8G~2.25G for 1.85G |
| 0x5, //1.8G~2.25G for 2.22G |
| 0x3, // for 1.35G |
| }; |
| #endif /* (BERLIN_CHIP_VERSION != BERLIN_BG2_CD) */ |
| #endif /* (BERLIN_CHIP_VERSION >= BERLIN_BG2_Q) */ |
| |
| //vco is determined by video frequence and HDMI mode |
| static int vcoSelectionTable[3][7] = |
| { |
| {AVPLL_VCO_FREQ_1_512G, AVPLL_VCO_FREQ_1_080G, AVPLL_VCO_FREQ_1_080G, AVPLL_VCO_FREQ_1_485G, AVPLL_VCO_FREQ_1_080G, AVPLL_VCO_FREQ_1_485G, AVPLL_VCO_FREQ_1_353G}, |
| {AVPLL_VCO_FREQ_1_260G, AVPLL_VCO_FREQ_1_350G, AVPLL_VCO_FREQ_1_350G, AVPLL_VCO_FREQ_1_856G, AVPLL_VCO_FREQ_1_350G, AVPLL_VCO_FREQ_1_856G, AVPLL_VCO_FREQ_1_353G}, |
| {AVPLL_VCO_FREQ_1_512G, AVPLL_VCO_FREQ_1_620G, AVPLL_VCO_FREQ_1_620G, AVPLL_VCO_FREQ_2_227G, AVPLL_VCO_FREQ_1_620G, AVPLL_VCO_FREQ_2_227G, AVPLL_VCO_FREQ_1_353G}, |
| }; |
| |
| //1KPPM is determined by video frequence and 59Hz/60Hz mode |
| static int ppm1kSelectionTable[2][7] = |
| { |
| {-1, 0, 0, -1, 0, -1, 0}, //59.94Hz 1KPPM flag |
| { 0, 1, 1, 0, 1, 0, 0}, //60Hz 1KPPM flag |
| }; |
| |
| |
| CLK_FREQ clk_freqs_computed[AVPLL_VCO_FREQ_MAX]; |
| |
| // Just for Audio channel configuration. Video channel configuration uses other tables. |
| static CLK_FREQ clk_freqs[] = |
| { |
| {AVPLL_VCO_FREQ_2_227G, AUDIO_FREQ_90P3168_MHZ, -56508, 12544, 12375, 6, 0x5}, // 44.1KHz |
| {AVPLL_VCO_FREQ_2_227G, AUDIO_FREQ_65P536_MHZ, -121161,114688,111375,6, 0x7}, // 32KHz |
| {AVPLL_VCO_FREQ_2_227G, AUDIO_FREQ_98P304_MHZ, -62130, 188416,185625,4, 0x17}, // 48KHz |
| |
| {AVPLL_VCO_FREQ_1_620G, AUDIO_FREQ_90P3168_MHZ, -14712, 3136, 3125, 5, 0x9}, |
| {AVPLL_VCO_FREQ_1_620G, AUDIO_FREQ_65P536_MHZ, -47104, 2048, 2025, 6, 0x5}, |
| {AVPLL_VCO_FREQ_1_620G, AUDIO_FREQ_98P304_MHZ, 125696, 16384, 16875,5, 0x8}, |
| |
| {AVPLL_VCO_FREQ_1_512G, AUDIO_FREQ_90P3168_MHZ, -63883, 1904, 1875, 4, 0x11}, |
| {AVPLL_VCO_FREQ_1_512G, AUDIO_FREQ_65P536_MHZ, 13000, 23552, 23625,4, 0x17}, |
| {AVPLL_VCO_FREQ_1_512G, AUDIO_FREQ_98P304_MHZ, 106496, 1536, 1575, 4, 0xF}, |
| |
| {AVPLL_VCO_FREQ_1_350G, AUDIO_FREQ_90P3168_MHZ, -14712, 3136, 3125, 4, 0xF}, |
| {AVPLL_VCO_FREQ_1_350G, AUDIO_FREQ_65P536_MHZ, -80018, 28672, 28125,4, 0x15}, |
| {AVPLL_VCO_FREQ_1_350G, AUDIO_FREQ_98P304_MHZ, -80018, 28672, 28125,5, 0x7}, |
| |
| {AVPLL_VCO_FREQ_1_856G, AUDIO_FREQ_90P3168_MHZ, -89347, 175616, 171875,4,0x15}, |
| {AVPLL_VCO_FREQ_1_856G, AUDIO_FREQ_65P536_MHZ, 48553, 917504, 928125,5,0xE}, |
| {AVPLL_VCO_FREQ_1_856G, AUDIO_FREQ_98P304_MHZ, -25882, 311296, 309375,4,0x13}, |
| |
| {AVPLL_VCO_FREQ_1_260G, AUDIO_FREQ_90P3168_MHZ, -14712, 3136, 3125, 5,0x7}, |
| {AVPLL_VCO_FREQ_1_260G, AUDIO_FREQ_65P536_MHZ, 49906, 38912, 39375, 4,0x13}, |
| {AVPLL_VCO_FREQ_1_260G, AUDIO_FREQ_98P304_MHZ, -58919, 13312, 13125, 4,0xD}, |
| |
| {AVPLL_VCO_FREQ_1_080G, AUDIO_FREQ_90P3168_MHZ, -14712, 3136, 3125, 5,0x6}, |
| {AVPLL_VCO_FREQ_1_080G, AUDIO_FREQ_65P536_MHZ, 125696, 16384, 16875, 5,0x8}, |
| {AVPLL_VCO_FREQ_1_080G, AUDIO_FREQ_98P304_MHZ, -5213, 5632, 5625, 4,0xB}, |
| |
| {AVPLL_VCO_FREQ_1_485G, AUDIO_FREQ_90P3168_MHZ, 115900, 100352, 103125,5,0x8}, |
| {AVPLL_VCO_FREQ_1_485G, AUDIO_FREQ_65P536_MHZ, -62130, 188416, 185625,4,0x17}, |
| {AVPLL_VCO_FREQ_1_485G, AUDIO_FREQ_98P304_MHZ, 29696, 4096, 4125, 4,0xF}, |
| |
| {AVPLL_VCO_FREQ_2_227G, AUDIO_FREQ_22P5792_MHZ, -56508, 12544, 12375, 6, 0x14}, // 44.1KHz |
| {AVPLL_VCO_FREQ_2_227G, AUDIO_FREQ_16P384_MHZ, 29696, 4096, 4125, 6, 0x1B}, // 32KHz |
| {AVPLL_VCO_FREQ_2_227G, AUDIO_FREQ_24P576_MHZ, 29696, 4096, 4125, 6, 0x12}, // 48KHz |
| |
| {AVPLL_VCO_FREQ_1_620G, AUDIO_FREQ_22P5792_MHZ, 104704, 5488, 5625, 6, 0xE}, |
| {AVPLL_VCO_FREQ_1_620G, AUDIO_FREQ_16P384_MHZ, -47104, 2048, 2025, 6, 0x14}, |
| {AVPLL_VCO_FREQ_1_620G, AUDIO_FREQ_24P576_MHZ, 59234, 3328, 3375, 6, 0xD}, |
| |
| {AVPLL_VCO_FREQ_1_512G, AUDIO_FREQ_22P5792_MHZ, 126750, 1456, 1500, 6, 0xD}, |
| {AVPLL_VCO_FREQ_1_512G, AUDIO_FREQ_16P384_MHZ, 106496, 1536, 1575, 6, 0x12}, |
| {AVPLL_VCO_FREQ_1_512G, AUDIO_FREQ_24P576_MHZ, 106496, 1536, 1575, 6, 0xC}, |
| |
| {AVPLL_VCO_FREQ_1_350G, AUDIO_FREQ_22P5792_MHZ, -14712, 3136, 3125, 6, 0xC}, |
| {AVPLL_VCO_FREQ_1_350G, AUDIO_FREQ_16P384_MHZ, 125696, 16384, 16875, 6, 0x10}, |
| {AVPLL_VCO_FREQ_1_350G, AUDIO_FREQ_24P576_MHZ, -5213, 5632, 5625, 6, 0xB}, |
| |
| {AVPLL_VCO_FREQ_1_856G, AUDIO_FREQ_22P5792_MHZ, 115900, 100352,103125,6, 0x10}, |
| {AVPLL_VCO_FREQ_1_856G, AUDIO_FREQ_16P384_MHZ, 125696, 16384, 16875, 4, 0x6E}, |
| {AVPLL_VCO_FREQ_1_856G, AUDIO_FREQ_24P576_MHZ, 29696, 4096, 4125, 6, 0xF}, |
| |
| {AVPLL_VCO_FREQ_1_260G, AUDIO_FREQ_22P5792_MHZ, 61280, 1232, 1250, 6, 0xB}, |
| {AVPLL_VCO_FREQ_1_260G, AUDIO_FREQ_16P384_MHZ, 106496, 1024, 1050, 6, 0xF}, |
| {AVPLL_VCO_FREQ_1_260G, AUDIO_FREQ_24P576_MHZ, 106496, 1024, 1050, 6, 0xA}, |
| |
| {AVPLL_VCO_FREQ_1_080G, AUDIO_FREQ_22P5792_MHZ, -181895,1176, 1125, 6, 0xA}, |
| {AVPLL_VCO_FREQ_1_080G, AUDIO_FREQ_16P384_MHZ, 59234, 3328, 3375, 6, 0xD}, |
| {AVPLL_VCO_FREQ_1_080G, AUDIO_FREQ_24P576_MHZ, -98304, 1152, 1125, 6, 0x9}, |
| |
| {AVPLL_VCO_FREQ_1_485G, AUDIO_FREQ_22P5792_MHZ, 49589, 20384, 20625, 6, 0xD}, |
| {AVPLL_VCO_FREQ_1_485G, AUDIO_FREQ_16P384_MHZ, 29696, 4096, 4125, 6, 0x12}, |
| {AVPLL_VCO_FREQ_1_485G, AUDIO_FREQ_24P576_MHZ, 29696, 4096, 4125, 6, 0xC}, |
| |
| // new entries for APLL deviation |
| {AVPLL_VCO_FREQ_2_227G, AUDIO_FREQ_22P636_MHZ, -66890, 22636, 22275, 6, 0x14}, // |
| {AVPLL_VCO_FREQ_2_227G, AUDIO_FREQ_16P424_MHZ, 19408, 4106, 4125, 6, 0x1B}, |
| {AVPLL_VCO_FREQ_2_227G, AUDIO_FREQ_24P636_MHZ, 19408, 4106, 4125, 6, 0x12}, |
| |
| {AVPLL_VCO_FREQ_1_620G, AUDIO_FREQ_22P636_MHZ, 93917, 39613, 40500, 6, 0xE}, // |
| {AVPLL_VCO_FREQ_1_620G, AUDIO_FREQ_16P424_MHZ, -57204, 2053, 2025, 6, 0x14}, |
| {AVPLL_VCO_FREQ_1_620G, AUDIO_FREQ_24P636_MHZ, 48875, 26689, 27000, 6, 0xD}, |
| |
| {AVPLL_VCO_FREQ_1_512G, AUDIO_FREQ_22P636_MHZ, 115908, 73567, 75600, 6, 0xD}, |
| {AVPLL_VCO_FREQ_1_512G, AUDIO_FREQ_16P424_MHZ, 96021, 2053, 2100, 6, 0x12}, |
| {AVPLL_VCO_FREQ_1_512G, AUDIO_FREQ_24P636_MHZ, 96021, 2053, 2100, 6, 0xC}, |
| |
| {AVPLL_VCO_FREQ_1_350G, AUDIO_FREQ_22P636_MHZ, -25199, 5659, 5625, 6, 0xC}, |
| {AVPLL_VCO_FREQ_1_350G, AUDIO_FREQ_16P424_MHZ, 115174, 16424, 16875, 6, 0x10}, |
| {AVPLL_VCO_FREQ_1_350G, AUDIO_FREQ_24P636_MHZ, -15415, 22583, 22500, 6, 0xB}, |
| |
| {AVPLL_VCO_FREQ_1_856G, AUDIO_FREQ_22P636_MHZ, 105084, 181088, 185625, 6, 0x10}, |
| {AVPLL_VCO_FREQ_1_856G, AUDIO_FREQ_16P424_MHZ, -72193, 188876, 185625, 6, 0x17}, |
| {AVPLL_VCO_FREQ_1_856G, AUDIO_FREQ_24P636_MHZ, 19408, 4106, 4125, 6, 0xF}, |
| |
| {AVPLL_VCO_FREQ_1_260G, AUDIO_FREQ_22P636_MHZ, 50601, 62249, 63000, 6, 0xB}, |
| {AVPLL_VCO_FREQ_1_260G, AUDIO_FREQ_16P424_MHZ, 96021, 2053, 2100, 6, 0xF}, |
| {AVPLL_VCO_FREQ_1_260G, AUDIO_FREQ_24P636_MHZ, 96021, 2053, 2100, 6, 0xA}, |
| |
| {AVPLL_VCO_FREQ_1_080G, AUDIO_FREQ_22P636_MHZ, -191964, 5659, 5400, 6, 0xA}, |
| {AVPLL_VCO_FREQ_1_080G, AUDIO_FREQ_16P424_MHZ, 48875, 26689, 27000, 6, 0xD}, |
| {AVPLL_VCO_FREQ_1_080G, AUDIO_FREQ_24P636_MHZ, -108279, 2053, 2000, 6, 0x9}, |
| |
| {AVPLL_VCO_FREQ_1_485G, AUDIO_FREQ_22P636_MHZ, 38940, 73567, 74250, 6, 0xD}, |
| {AVPLL_VCO_FREQ_1_485G, AUDIO_FREQ_16P424_MHZ, 19408, 4106, 4125, 6, 0x12}, |
| {AVPLL_VCO_FREQ_1_485G, AUDIO_FREQ_24P636_MHZ, 19408, 4106, 4125, 6, 0xC}, |
| |
| {AVPLL_VCO_FREQ_2_227G, AUDIO_FREQ_90P544_MHZ, -66890, 22636, 22275, 6, 0x5}, |
| {AVPLL_VCO_FREQ_2_227G, AUDIO_FREQ_65P696_MHZ, -131081, 114968 , 111375, 6, 0x7}, |
| {AVPLL_VCO_FREQ_2_227G, AUDIO_FREQ_98P544_MHZ, 115174, 16424, 16875, 5, 0xB}, |
| |
| {AVPLL_VCO_FREQ_1_620G, AUDIO_FREQ_90P544_MHZ, -25199, 5659, 5625, 5, 0x9}, |
| {AVPLL_VCO_FREQ_1_620G, AUDIO_FREQ_65P696_MHZ, -57204, 2053, 2025, 6, 0x5}, |
| {AVPLL_VCO_FREQ_1_620G, AUDIO_FREQ_98P544_MHZ, 115174, 16424, 16875, 5, 0x8}, |
| |
| {AVPLL_VCO_FREQ_1_512G, AUDIO_FREQ_90P544_MHZ, -74248, 96203, 94500, 4, 0x11}, |
| {AVPLL_VCO_FREQ_1_512G, AUDIO_FREQ_65P696_MHZ, 2753, 47219, 47250, 4, 0x17}, |
| {AVPLL_VCO_FREQ_1_512G, AUDIO_FREQ_98P544_MHZ, -172123, 8212, 7875, 5, 0x8}, |
| |
| {AVPLL_VCO_FREQ_1_350G, AUDIO_FREQ_90P544_MHZ, -25199, 5659, 5625, 4, 0xF}, |
| {AVPLL_VCO_FREQ_1_350G, AUDIO_FREQ_65P696_MHZ, -90038, 28742, 28125, 4, 0x15}, |
| {AVPLL_VCO_FREQ_1_350G, AUDIO_FREQ_98P544_MHZ, -90038, 28742, 28125, 5, 0x7}, |
| |
| {AVPLL_VCO_FREQ_1_856G, AUDIO_FREQ_90P544_MHZ, 105084, 181088, 185625, 6, 0x4}, |
| {AVPLL_VCO_FREQ_1_856G, AUDIO_FREQ_65P696_MHZ, -243948, 65696, 61875, 6, 0x6}, |
| {AVPLL_VCO_FREQ_1_856G, AUDIO_FREQ_98P544_MHZ, 194979, 32848, 34375, 5, 0x9}, |
| |
| {AVPLL_VCO_FREQ_1_260G, AUDIO_FREQ_90P544_MHZ, -25199, 5659, 5625, 5, 0x7}, |
| {AVPLL_VCO_FREQ_1_260G, AUDIO_FREQ_65P696_MHZ, -172123, 8212, 7875, 6, 0x4}, |
| {AVPLL_VCO_FREQ_1_260G, AUDIO_FREQ_98P544_MHZ, -68990, 26689, 26250, 4, 0xD}, |
| |
| {AVPLL_VCO_FREQ_1_080G, AUDIO_FREQ_90P544_MHZ, -25199, 5659, 5625, 5, 0x6}, |
| {AVPLL_VCO_FREQ_1_080G, AUDIO_FREQ_65P696_MHZ, 115174, 16424, 16875, 5, 0x8}, |
| {AVPLL_VCO_FREQ_1_080G, AUDIO_FREQ_98P544_MHZ, -15415, 22583, 22500, 4, 0xB}, |
| |
| {AVPLL_VCO_FREQ_1_485G, AUDIO_FREQ_90P544_MHZ, 105084, 181088, 185625, 5, 0x8}, |
| {AVPLL_VCO_FREQ_1_485G, AUDIO_FREQ_65P696_MHZ, 115174, 16424, 16875, 5, 0xB}, |
| {AVPLL_VCO_FREQ_1_485G, AUDIO_FREQ_98P544_MHZ, -243948, 65686, 61875, 5, 0x8}, |
| |
| // |
| {AVPLL_VCO_FREQ_2_227G, AUDIO_FREQ_22P522_MHZ, -45999, 22522, 22275, 6, 0x14}, // |
| {AVPLL_VCO_FREQ_2_227G, AUDIO_FREQ_16P342_MHZ, 40551, 8171, 8250, 6, 0x1B}, |
| {AVPLL_VCO_FREQ_2_227G, AUDIO_FREQ_24P514_MHZ, 40375, 12257, 12375, 6, 0x12}, |
| |
| {AVPLL_VCO_FREQ_1_620G, AUDIO_FREQ_22P522_MHZ, 115623, 78827, 81000, 6, 0xE}, // |
| {AVPLL_VCO_FREQ_1_620G, AUDIO_FREQ_16P342_MHZ, -36445, 8171, 8100, 6, 0x14}, |
| {AVPLL_VCO_FREQ_1_620G, AUDIO_FREQ_24P514_MHZ, 5381, 134827, 135000, 5, 0x21}, |
| |
| {AVPLL_VCO_FREQ_1_512G, AUDIO_FREQ_22P522_MHZ, 137725, 146393, 151200, 6, 0xD}, |
| {AVPLL_VCO_FREQ_1_512G, AUDIO_FREQ_16P342_MHZ, -109390, 155249, 151200, 6, 0x13}, |
| {AVPLL_VCO_FREQ_1_512G, AUDIO_FREQ_24P514_MHZ, -21712, 54281, 54000, 5, 0x1F}, |
| |
| {AVPLL_VCO_FREQ_1_350G, AUDIO_FREQ_22P522_MHZ, -4097, 11261, 11250, 6, 0xC}, |
| {AVPLL_VCO_FREQ_1_350G, AUDIO_FREQ_16P342_MHZ, -117972, 138907, 135000, 6, 0x11}, |
| {AVPLL_VCO_FREQ_1_350G, AUDIO_FREQ_24P514_MHZ, 5381, 134827, 135000, 6, 0xB}, |
| |
| {AVPLL_VCO_FREQ_1_856G, AUDIO_FREQ_22P522_MHZ, 126846, 180176, 185625, 6, 0x10}, |
| {AVPLL_VCO_FREQ_1_856G, AUDIO_FREQ_16P342_MHZ, -51510, 187933, 185625, 6, 0x17}, |
| {AVPLL_VCO_FREQ_1_856G, AUDIO_FREQ_24P514_MHZ, 40379, 12257, 12375, 6, 0xF}, |
| |
| {AVPLL_VCO_FREQ_1_260G, AUDIO_FREQ_22P522_MHZ, 72088, 123871, 126000,6, 0xB}, |
| {AVPLL_VCO_FREQ_1_260G, AUDIO_FREQ_16P342_MHZ, 117549, 8171, 8400, 6, 0xF}, |
| {AVPLL_VCO_FREQ_1_260G, AUDIO_FREQ_24P514_MHZ, 117373, 1751, 1800, 6, 0xA}, |
| |
| {AVPLL_VCO_FREQ_1_080G, AUDIO_FREQ_22P522_MHZ, -171705, 11261, 10800, 6, 0xA}, |
| {AVPLL_VCO_FREQ_1_080G, AUDIO_FREQ_16P342_MHZ, 70166, 106223, 108000,6, 0xD}, |
| {AVPLL_VCO_FREQ_1_080G, AUDIO_FREQ_24P514_MHZ, -87944, 12257, 12000, 6, 0x9}, |
| |
| {AVPLL_VCO_FREQ_1_485G, AUDIO_FREQ_22P522_MHZ, 60367, 146393, 148500, 6, 0xD}, |
| {AVPLL_VCO_FREQ_1_485G, AUDIO_FREQ_16P342_MHZ, 40551, 8171, 8250, 6, 0x12}, |
| {AVPLL_VCO_FREQ_1_485G, AUDIO_FREQ_24P514_MHZ, 40379, 12257, 12375, 6, 0xC}, |
| |
| {AVPLL_VCO_FREQ_2_227G, AUDIO_FREQ_90P088_MHZ, -45999, 22522, 22275, 6, 0x5}, |
| {AVPLL_VCO_FREQ_2_227G, AUDIO_FREQ_65P368_MHZ, -110692, 114394 , 111375, 6, 0x7}, |
| {AVPLL_VCO_FREQ_2_227G, AUDIO_FREQ_98P056_MHZ, 136622, 49028, 50625, 5, 0xB}, |
| |
| {AVPLL_VCO_FREQ_1_620G, AUDIO_FREQ_90P088_MHZ, -4097, 11261, 11250, 5, 0x9}, |
| {AVPLL_VCO_FREQ_1_620G, AUDIO_FREQ_65P368_MHZ, -36445, 8171, 8100, 6, 0x5}, |
| {AVPLL_VCO_FREQ_1_620G, AUDIO_FREQ_98P056_MHZ, 136622, 49028, 50625, 5, 0x8}, |
| |
| {AVPLL_VCO_FREQ_1_512G, AUDIO_FREQ_90P088_MHZ, -53393, 191437, 189000, 4, 0x11}, |
| {AVPLL_VCO_FREQ_1_512G, AUDIO_FREQ_65P368_MHZ, 23813, 187933, 189000, 4, 0x17}, |
| {AVPLL_VCO_FREQ_1_512G, AUDIO_FREQ_98P056_MHZ, -152106, 3502, 3375, 5, 0x8}, |
| |
| {AVPLL_VCO_FREQ_1_350G, AUDIO_FREQ_90P088_MHZ, -4097, 11261, 11250, 4, 0xF}, |
| {AVPLL_VCO_FREQ_1_350G, AUDIO_FREQ_65P368_MHZ, -69444, 57197, 56250, 4, 0x15}, |
| {AVPLL_VCO_FREQ_1_350G, AUDIO_FREQ_98P056_MHZ, -69612, 85799, 84375, 5, 0x7}, |
| |
| {AVPLL_VCO_FREQ_1_856G, AUDIO_FREQ_90P088_MHZ, 126846, 180176, 185625, 6, 0x4}, |
| {AVPLL_VCO_FREQ_1_856G, AUDIO_FREQ_65P368_MHZ, -224126, 65368, 61875, 6, 0x6}, |
| {AVPLL_VCO_FREQ_1_856G, AUDIO_FREQ_98P056_MHZ, 216824, 98056, 103125, 5, 0x9}, |
| |
| {AVPLL_VCO_FREQ_1_260G, AUDIO_FREQ_90P088_MHZ, -4097, 11261, 11250, 5, 0x7}, |
| {AVPLL_VCO_FREQ_1_260G, AUDIO_FREQ_65P368_MHZ, -151941, 8171, 7875, 6, 0x4}, |
| {AVPLL_VCO_FREQ_1_260G, AUDIO_FREQ_98P056_MHZ, -48460, 22763, 22500, 4, 0xD}, |
| |
| {AVPLL_VCO_FREQ_1_080G, AUDIO_FREQ_90P088_MHZ, -4097, 11261, 11250, 5, 0x6}, |
| {AVPLL_VCO_FREQ_1_080G, AUDIO_FREQ_65P368_MHZ, 136798, 16342, 16875, 5, 0x8}, |
| {AVPLL_VCO_FREQ_1_080G, AUDIO_FREQ_98P056_MHZ, 5381, 134827, 135000, 4, 0xB}, |
| |
| {AVPLL_VCO_FREQ_1_485G, AUDIO_FREQ_90P088_MHZ, 126846, 180176, 185625, 5, 0x8}, |
| {AVPLL_VCO_FREQ_1_485G, AUDIO_FREQ_65P368_MHZ, 136798, 16342, 16875, 5, 0xB}, |
| {AVPLL_VCO_FREQ_1_485G, AUDIO_FREQ_98P056_MHZ, -224288, 196112, 185625, 5, 0x8}, |
| }; |
| |
| int diag_pll_A_VCO_Setting = AVPLL_VCO_FREQ_2_227G; |
| int diag_pll_B_VCO_Setting = AVPLL_VCO_FREQ_1_620G; |
| |
| unsigned int gAVPLLA_Channel_OutputClock[8] = {0}; |
| unsigned int gAVPLLB_Channel_OutputClock[8] = {0}; |
| |
| #define OFFSET_1KPPM_INC (-4194) |
| #define OFFSET_1KPPM_DEC (4194) |
| |
| int divHDMICode[] = |
| { |
| 1, 2, 4, 6 |
| }; |
| |
| int divAV1Code[] = |
| { |
| 1, 2, 5, 5 |
| }; |
| |
| |
| //Yongchun Move from lower here to handle the resolution change could change the VCO. |
| static int avpll_inited[2] = {0, 0}; |
| static double org_ppm[2] = {0.0, 0.0}; |
| static double cur_ppm[2] = {0.0, 0.0}; |
| |
| // This formular covert the actual base ref frequency (f0) to the nominal resolution reference frequency Fr |
| // The VCO out and in is reversed as the PLL nornal channels. so. Fr/f0 = (1+ Offset0/P) p= 4194304 |
| // so: f0/Fr= 1+ ppm0 = 1/(1+ Offset/P); then ppm0 = -(Offset)/(P+offset) |
| static double offset_2_ppm(int offset) { |
| int v = offset & 0x3ffff; |
| |
| if(offset & 0x40000) v = -v; |
| |
| return -((1000000.0 * v)/(4194304.0 + v)); |
| } |
| |
| // This is used to cover the real_ppm to nominal reference frequency to real base ref frequency. |
| // Fx/Fr = (1+ ppm_real) = Fx/f0*f0/Fr = (1+Offset_X/P)(1+ppm0) then Offset_X = P*(ppm_real-ppm0)/(1+ppm0) |
| // however the input parameter ppm = ppm0+ ppm_real(delta) so offset_X = P*(ppm -2*ppm0)/(1+ppm0) |
| |
| static int ppm_2_offset(double ppm, double ppm0) { |
| double c = 4194304.0 * (ppm - 2*ppm0) / (1000000.0 + ppm0); |
| |
| int offset = (int)c; |
| |
| if(offset > 524287) { |
| offset = 524287; |
| }else if(offset < -524287) { |
| offset = -524287; |
| } |
| |
| return (offset < 0) ? ((-offset) | 0x40000) : offset; |
| } |
| |
| |
| #if (BERLIN_CHIP_VERSION < BERLIN_BG2_Q) |
| void diag_setDPll_A(int enable, int p_sync1, int p_sync2, int chId) |
| { |
| #ifndef FPGA_TAILORED_BOARDVER |
| T32Gbl_avPllCtl30 regData30; |
| |
| double ppm_from_dpll; |
| |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl30), ®Data30.u32); |
| |
| |
| //disable DPll first |
| regData30.uavPllCtl_avPllEnDpllC_A &= ~(1<<(chId-1)); |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl30), regData30.u32); |
| |
| if(!p_sync1) |
| { |
| if(enable) dbg_printf(PRN_RES, "Warning p_sync1 is 0\n"); |
| } |
| else |
| { |
| ppm_from_dpll = (double)p_sync2/p_sync1; |
| dbg_printf(PRN_RES, " DPLL PPM is %f\n", ppm_from_dpll); |
| } |
| |
| switch(chId) |
| { |
| //set values |
| case 1: |
| { |
| T32Gbl_avPllCtl15 regData15; |
| T32Gbl_avPllCtl23 regData23; |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl15), ®Data15.u32); |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl23), ®Data23.u32); |
| regData15.uavPllCtl_avPllPSync1C1_A = p_sync1; |
| regData23.uavPllCtl_avPllPSync2C1_A = p_sync2; |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl15), regData15.u32); |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl23), regData23.u32); |
| } |
| break; |
| case 2: |
| { |
| T32Gbl_avPllCtl16 regData16; |
| T32Gbl_avPllCtl24 regData24; |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl16), ®Data16.u32); |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl24), ®Data24.u32); |
| regData16.uavPllCtl_avPllPSync1C2_A = p_sync1; |
| regData24.uavPllCtl_avPllPSync2C2_A = p_sync2; |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl16), regData16.u32); |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl24), regData24.u32); |
| } |
| break; |
| case 3: |
| { |
| T32Gbl_avPllCtl17 regData17; |
| T32Gbl_avPllCtl25 regData25; |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl17), ®Data17.u32); |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl25), ®Data25.u32); |
| regData17.uavPllCtl_avPllPSync1C3_A = p_sync1; |
| regData25.uavPllCtl_avPllPSync2C3_A = p_sync2; |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl17), regData17.u32); |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl25), regData25.u32); |
| } |
| break; |
| case 4: |
| { |
| T32Gbl_avPllCtl18 regData18; |
| T32Gbl_avPllCtl26 regData26; |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl18), ®Data18.u32); |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl26), ®Data26.u32); |
| regData18.uavPllCtl_avPllPSync1C4_A = p_sync1; |
| regData26.uavPllCtl_avPllPSync2C4_A = p_sync2; |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl18), regData18.u32); |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl26), regData26.u32); |
| } |
| break; |
| case 5: |
| { |
| T32Gbl_avPllCtl19 regData19; |
| T32Gbl_avPllCtl27 regData27; |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl19), ®Data19.u32); |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl27), ®Data27.u32); |
| regData19.uavPllCtl_avPllPSync1C5_A = p_sync1; |
| regData27.uavPllCtl_avPllPSync2C5_A = p_sync2; |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl19), regData19.u32); |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl27), regData27.u32); |
| } |
| break; |
| case 6: |
| { |
| T32Gbl_avPllCtl20 regData20; |
| T32Gbl_avPllCtl28 regData28; |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl20), ®Data20.u32); |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl28), ®Data28.u32); |
| regData20.uavPllCtl_avPllPSync1C6_A = p_sync1; |
| regData28.uavPllCtl_avPllPSync2C6_A = p_sync2; |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl20), regData20.u32); |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl28), regData28.u32); |
| } |
| break; |
| case 7: |
| { |
| T32Gbl_avPllCtl21 regData21; |
| T32Gbl_avPllCtl29 regData29; |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl21), ®Data21.u32); |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl29), ®Data29.u32); |
| regData21.uavPllCtl_avPllPSync1C7_A = p_sync1; |
| regData29.uavPllCtl_avPllPSync2C7_A = p_sync2; |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl21), regData21.u32); |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl29), regData29.u32); |
| } |
| break; |
| case 8: |
| { |
| T32Gbl_avPllCtl22 regData22; |
| T32Gbl_avPllCtl30 regData30; |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl22), ®Data22.u32); |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl30), ®Data30.u32); |
| regData22.uavPllCtl_avPllPSync1C8_A = p_sync1; |
| regData30.uavPllCtl_avPllPSync2C8_A = p_sync2; |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl22), regData22.u32); |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl30), regData30.u32); |
| } |
| break; |
| default: |
| dbg_printf(PRN_RES, "Invalid channel\n"); |
| break; |
| } |
| |
| if(enable) |
| { |
| //enable DPLL |
| regData30.uavPllCtl_avPllEnDpllC_A |= (1<<(chId-1)); |
| |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl30), regData30.u32); |
| } |
| #endif |
| } |
| |
| void diag_setDPll_B(int enable, int p_sync1, int p_sync2, int chId) |
| { |
| #if (BERLIN_CHIP_VERSION != BERLIN_BG2_CD) && (BERLIN_CHIP_VERSION != BERLIN_BG2CDP) |
| T32Gbl_avPllCtl61 regData61; |
| double ppm_from_dpll; |
| |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl61), ®Data61.u32); |
| |
| //disable DPLL first |
| regData61.uavPllCtl_avPllEnDpllC_B &= ~(1<<(chId-1)); |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl61), regData61.u32); |
| |
| if(!p_sync1) |
| { |
| if(enable) dbg_printf(PRN_RES, "Warning p_sync1 is 0\n"); |
| } |
| else |
| { |
| ppm_from_dpll = (double)p_sync2/p_sync1; |
| dbg_printf(PRN_RES, " DPLL PPM is %f\n", ppm_from_dpll); |
| } |
| |
| switch(chId) |
| { |
| //set values |
| case 1: |
| { |
| T32Gbl_avPllCtl46 regData46; |
| T32Gbl_avPllCtl54 regData54; |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl46), ®Data46.u32); |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl54), ®Data54.u32); |
| regData46.uavPllCtl_avPllPSync1C1_B = p_sync1; |
| regData54.uavPllCtl_avPllPSync2C1_B = p_sync2; |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl46), regData46.u32); |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl54), regData54.u32); |
| } |
| break; |
| case 2: |
| { |
| T32Gbl_avPllCtl47 regData47; |
| T32Gbl_avPllCtl55 regData55; |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl47), ®Data47.u32); |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl55), ®Data55.u32); |
| regData47.uavPllCtl_avPllPSync1C2_B = p_sync1; |
| regData55.uavPllCtl_avPllPSync2C2_B = p_sync2; |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl47), regData47.u32); |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl55), regData55.u32); |
| } |
| break; |
| case 3: |
| { |
| T32Gbl_avPllCtl48 regData48; |
| T32Gbl_avPllCtl56 regData56; |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl48), ®Data48.u32); |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl56), ®Data56.u32); |
| regData48.uavPllCtl_avPllPSync1C3_B = p_sync1; |
| regData56.uavPllCtl_avPllPSync2C3_B = p_sync2; |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl48), regData48.u32); |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl56), regData56.u32); |
| } |
| break; |
| case 4: |
| { |
| T32Gbl_avPllCtl49 regData49; |
| T32Gbl_avPllCtl57 regData57; |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl49), ®Data49.u32); |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl57), ®Data57.u32); |
| regData49.uavPllCtl_avPllPSync1C4_B = p_sync1; |
| regData57.uavPllCtl_avPllPSync2C4_B = p_sync2; |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl49), regData49.u32); |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl57), regData57.u32); |
| } |
| break; |
| case 5: |
| { |
| T32Gbl_avPllCtl50 regData50; |
| T32Gbl_avPllCtl58 regData58; |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl50), ®Data50.u32); |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl58), ®Data58.u32); |
| regData50.uavPllCtl_avPllPSync1C5_B = p_sync1; |
| regData58.uavPllCtl_avPllPSync2C5_B = p_sync2; |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl50), regData50.u32); |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl58), regData58.u32); |
| } |
| break; |
| case 6: |
| { |
| T32Gbl_avPllCtl51 regData51; |
| T32Gbl_avPllCtl59 regData59; |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl51), ®Data51.u32); |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl59), ®Data59.u32); |
| regData51.uavPllCtl_avPllPSync1C6_B = p_sync1; |
| regData59.uavPllCtl_avPllPSync2C6_B = p_sync2; |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl51), regData51.u32); |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl59), regData59.u32); |
| } |
| break; |
| case 7: |
| { |
| T32Gbl_avPllCtl52 regData52; |
| T32Gbl_avPllCtl60 regData60; |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl52), ®Data52.u32); |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl60), ®Data60.u32); |
| regData52.uavPllCtl_avPllPSync1C7_B = p_sync1; |
| regData60.uavPllCtl_avPllPSync2C7_B = p_sync2; |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl52), regData52.u32); |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl60), regData60.u32); |
| } |
| break; |
| case 8: |
| { |
| T32Gbl_avPllCtl53 regData53; |
| T32Gbl_avPllCtl61 regData61; |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl53), ®Data53.u32); |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl61), ®Data61.u32); |
| regData53.uavPllCtl_avPllPSync1C8_B = p_sync1; |
| regData61.uavPllCtl_avPllPSync2C8_B = p_sync2; |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl53), regData53.u32); |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl61), regData61.u32); |
| } |
| break; |
| default: |
| dbg_printf(PRN_RES, "Invalid channel\n"); |
| break; |
| } |
| |
| if(enable) |
| { |
| //re-enable DPLL |
| regData61.uavPllCtl_avPllEnDpllC_B |= (1<<(chId-1)); |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl61), regData61.u32); |
| } |
| #endif |
| } |
| |
| void diag_setVCO_A(int vco_freq_index) |
| { |
| #ifndef FPGA_TAILORED_BOARDVER |
| T32Gbl_avPllCtl reg; |
| T32Gbl_avPllCtl1 regData1; |
| T32Gbl_avPllCtl9 regData9; |
| |
| dbg_printf(PRN_INFO, "PLLA %d VCO freq change to %f\n", diag_vcoFreqs[vco_freq_index]); |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl), ®.u32); |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl1), ®Data1.u32); |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl9), ®Data9.u32); |
| |
| //following three settings are done under reset to improve long term reliability |
| diag_assertReset_A(); |
| regData1.uavPllCtl_avPllFbDiv_A = diag_avpllRegFBDIV[vco_freq_index]; |
| reg.uavPllCtl_avPllSpeed_A = diag_avpllRegSPEED[vco_freq_index]; |
| reg.uavPllCtl_avPllIntpi_A = diag_avpllRegINTPI[vco_freq_index]; |
| diag_deassertReset_A(); |
| |
| regData9.uavPllCtl_avPllFreqOffsetC8_A = diag_avpllRegFREQ_OFFSET_C8[vco_freq_index]; |
| |
| diag_pll_A_VCO_Setting = vco_freq_index; |
| |
| cur_ppm[0] = org_ppm[0] = offset_2_ppm(regData9.uavPllCtl_avPllFreqOffsetC8_A); |
| avpll_inited[0] = 1; |
| |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl), reg.u32); |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl1), regData1.u32); |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl9), regData9.u32); |
| |
| //toggle the offset_rdy bit |
| { |
| volatile int i; |
| |
| T32Gbl_avPllCtl9 regData; |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl9), ®Data.u32); |
| |
| regData.uavPllCtl_avPllFreqOffsetReadyC_A = (1<<7); |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl9), regData.u32); |
| |
| //add some delay because need to be asserted by 30ns |
| for(i=0; i<10000; i++); |
| |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl9), ®Data.u32); |
| |
| regData.uavPllCtl_avPllFreqOffsetReadyC_A = 0; |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl9), regData.u32); |
| } |
| #endif |
| } |
| |
| void diag_setVCO_B(int vco_freq_index) |
| { |
| #if (BERLIN_CHIP_VERSION != BERLIN_BG2_CD) && (BERLIN_CHIP_VERSION != BERLIN_BG2CDP) |
| T32Gbl_avPllCtl31 regData31; |
| T32Gbl_avPllCtl32 regData32; |
| T32Gbl_avPllCtl40 regData40; |
| |
| dbg_printf(PRN_INFO, "PLLB %d VCO freq change to %f\n", diag_vcoFreqs[vco_freq_index]); |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl31), ®Data31.u32); |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl32), ®Data32.u32); |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl40), ®Data40.u32); |
| |
| //following three settings are done under reset to improve long term reliability |
| diag_assertReset_B(); |
| regData32.uavPllCtl_avPllFbDiv_B = diag_avpllRegFBDIV[vco_freq_index]; |
| regData31.uavPllCtl_avPllSpeed_B = diag_avpllRegSPEED[vco_freq_index]; |
| regData31.uavPllCtl_avPllIntpi_B = diag_avpllRegINTPI[vco_freq_index]; |
| diag_deassertReset_B(); |
| |
| regData40.uavPllCtl_avPllFreqOffsetC8_B = diag_avpllRegFREQ_OFFSET_C8[vco_freq_index]; |
| |
| diag_pll_B_VCO_Setting = vco_freq_index; |
| |
| cur_ppm[1] = org_ppm[1] = offset_2_ppm(regData40.uavPllCtl_avPllFreqOffsetC8_B); |
| avpll_inited[1] = 1; |
| |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl40), regData40.u32); |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl32), regData32.u32); |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl31), regData31.u32); |
| |
| //toggle the offset_rdy bit |
| { |
| volatile int i; |
| |
| T32Gbl_avPllCtl40 regData; |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl40), ®Data.u32); |
| |
| regData.uavPllCtl_avPllFreqOffsetReadyC_B = (1<<7); |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl40), regData.u32); |
| |
| //add some delay because need to be asserted by 30ns |
| for(i=0; i<10000; i++); |
| |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl40), ®Data.u32); |
| |
| regData.uavPllCtl_avPllFreqOffsetReadyC_B = 0; |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl40), regData.u32); |
| } |
| #endif |
| } |
| |
| void diag_setChanOffset_A(int offset, int chId) |
| { |
| #ifndef FPGA_TAILORED_BOARDVER |
| unsigned int reg_offset; |
| double ppm_from_offset; |
| |
| if(offset<0) |
| { |
| reg_offset = (1<<18) | (-offset) ; |
| } |
| else |
| { |
| reg_offset = offset; |
| } |
| |
| dbg_printf(PRN_INFO, "set A%d offset to 0x%x\n", chId, reg_offset); |
| |
| if(offset != 0) |
| { |
| ppm_from_offset = 1/((double)offset/4194304+1); |
| dbg_printf(PRN_RES, "offset PPM is %f\n", ppm_from_offset); |
| } |
| |
| //set offset register |
| switch(chId) |
| { |
| case 1: |
| { |
| T32Gbl_avPllCtl2 regData; |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl2), ®Data.u32); |
| regData.uavPllCtl_avPllFreqOffsetC1_A = reg_offset; |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl2), regData.u32); |
| } |
| break; |
| case 2: |
| { |
| T32Gbl_avPllCtl3 regData; |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl3), ®Data.u32); |
| regData.uavPllCtl_avPllFreqOffsetC2_A = reg_offset; |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl3), regData.u32); |
| } |
| break; |
| case 3: |
| { |
| T32Gbl_avPllCtl4 regData; |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl4), ®Data.u32); |
| regData.uavPllCtl_avPllFreqOffsetC3_A = reg_offset; |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl4), regData.u32); |
| } |
| break; |
| case 4: |
| { |
| T32Gbl_avPllCtl5 regData; |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl5), ®Data.u32); |
| regData.uavPllCtl_avPllFreqOffsetC4_A = reg_offset; |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl5), regData.u32); |
| } |
| break; |
| case 5: |
| { |
| T32Gbl_avPllCtl6 regData; |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl6), ®Data.u32); |
| regData.uavPllCtl_avPllFreqOffsetC5_A = reg_offset; |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl6), regData.u32); |
| } |
| break; |
| case 6: |
| { |
| T32Gbl_avPllCtl7 regData; |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl7), ®Data.u32); |
| regData.uavPllCtl_avPllFreqOffsetC6_A = reg_offset; |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl7), regData.u32); |
| } |
| break; |
| case 7: |
| { |
| T32Gbl_avPllCtl8 regData; |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl8), ®Data.u32); |
| regData.uavPllCtl_avPllFreqOffsetC7_A = reg_offset; |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl8), regData.u32); |
| } |
| break; |
| default: |
| dbg_printf(PRN_RES, "Invlid Channel ID (1 to 7 only)\n"); |
| break; |
| } |
| |
| //toggle the offset_rdy bit |
| { |
| volatile int i; |
| |
| T32Gbl_avPllCtl9 regData; |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl9), ®Data.u32); |
| |
| regData.uavPllCtl_avPllFreqOffsetReadyC_A = (1<<(chId-1)); |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl9), regData.u32); |
| |
| //add some delay because need to be asserted by 30ns |
| for(i=0; i<10000; i++); |
| |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl9), ®Data.u32); |
| |
| regData.uavPllCtl_avPllFreqOffsetReadyC_A = 0; |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl9), regData.u32); |
| } |
| #endif |
| } |
| |
| void diag_setChanOffset_B(int offset, int chId) |
| { |
| #if (BERLIN_CHIP_VERSION != BERLIN_BG2_CD) && (BERLIN_CHIP_VERSION != BERLIN_BG2CDP) |
| unsigned int reg_offset; |
| double ppm_from_offset; |
| |
| if(offset<0) |
| { |
| reg_offset = (1<<18) | (-offset) ; |
| } |
| else |
| { |
| reg_offset = offset; |
| } |
| |
| dbg_printf(PRN_INFO, "set A%d offset to 0x%x\n", chId, reg_offset); |
| |
| if(offset != 0) |
| { |
| ppm_from_offset = 1/((double)offset/4194304+1); |
| dbg_printf(PRN_RES, "offset PPM is %f\n", ppm_from_offset); |
| } |
| |
| //set offset register |
| switch(chId) |
| { |
| case 1: |
| { |
| T32Gbl_avPllCtl33 regData; |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl33), ®Data.u32); |
| regData.uavPllCtl_avPllFreqOffsetC1_B = reg_offset; |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl33), regData.u32); |
| } |
| break; |
| case 2: |
| { |
| T32Gbl_avPllCtl34 regData; |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl34), ®Data.u32); |
| regData.uavPllCtl_avPllFreqOffsetC2_B = reg_offset; |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl34), regData.u32); |
| } |
| break; |
| case 3: |
| { |
| T32Gbl_avPllCtl35 regData; |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl35), ®Data.u32); |
| regData.uavPllCtl_avPllFreqOffsetC3_B = reg_offset; |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl35), regData.u32); |
| } |
| break; |
| case 4: |
| { |
| T32Gbl_avPllCtl36 regData; |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl36), ®Data.u32); |
| regData.uavPllCtl_avPllFreqOffsetC4_B = reg_offset; |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl36), regData.u32); |
| } |
| break; |
| case 5: |
| { |
| T32Gbl_avPllCtl37 regData; |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl37), ®Data.u32); |
| regData.uavPllCtl_avPllFreqOffsetC5_B = reg_offset; |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl37), regData.u32); |
| } |
| break; |
| case 6: |
| { |
| T32Gbl_avPllCtl38 regData; |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl38), ®Data.u32); |
| regData.uavPllCtl_avPllFreqOffsetC6_B = reg_offset; |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl38), regData.u32); |
| } |
| break; |
| case 7: |
| { |
| T32Gbl_avPllCtl39 regData; |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl39), ®Data.u32); |
| regData.uavPllCtl_avPllFreqOffsetC7_B = reg_offset; |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl39), regData.u32); |
| } |
| break; |
| default: |
| dbg_printf(PRN_RES, "Invlid Channel ID (1 to 7 only)\n"); |
| break; |
| } |
| |
| //toggle the offset_rdy bit |
| { |
| volatile int i; |
| |
| T32Gbl_avPllCtl40 regData; |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl40), ®Data.u32); |
| |
| regData.uavPllCtl_avPllFreqOffsetReadyC_B = (1<<(chId-1)); |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl40), regData.u32); |
| |
| //add some delay because need to be asserted by 30ns |
| for(i=0; i<10000; i++); |
| |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl40), ®Data.u32); |
| |
| regData.uavPllCtl_avPllFreqOffsetReadyC_B = 0; |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl40), regData.u32); |
| } |
| #endif |
| } |
| |
| void diag_setHDMI_Div_A(int divHDMI, int chId) |
| { |
| #ifndef FPGA_TAILORED_BOARDVER |
| unsigned int div_reg; |
| T32Gbl_avPllCtl11 regData; |
| |
| switch(divHDMI) |
| { |
| case 0: |
| div_reg = 0; //disable DIV_HDMI |
| break; |
| case 1: |
| div_reg = 4; //div by 1, by pass |
| break; |
| case 2: |
| div_reg = 5; //div by 2 |
| break; |
| case 4: |
| div_reg = 6; //div by 4 |
| break; |
| case 6: |
| div_reg = 7; //div by 6 |
| break; |
| default: |
| { |
| dbg_printf(PRN_RES, "Invalid divider for HDMI\n"); |
| return ; |
| } |
| } |
| |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl11), ®Data.u32); |
| |
| switch(chId) |
| { |
| case 1: |
| regData.uavPllCtl_avPllDivHdmiC1_A = div_reg; |
| break; |
| case 2: |
| regData.uavPllCtl_avPllDivHdmiC2_A = div_reg; |
| break; |
| case 3: |
| regData.uavPllCtl_avPllDivHdmiC3_A = div_reg; |
| break; |
| case 4: |
| regData.uavPllCtl_avPllDivHdmiC4_A = div_reg; |
| break; |
| case 5: |
| regData.uavPllCtl_avPllDivHdmiC5_A = div_reg; |
| break; |
| case 6: |
| regData.uavPllCtl_avPllDivHdmiC6_A = div_reg; |
| break; |
| case 7: |
| regData.uavPllCtl_avPllDivHdmiC7_A = div_reg; |
| break; |
| default: |
| dbg_printf(PRN_RES, "Invalid Channel Id\n"); |
| break; |
| } |
| |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl11), regData.u32); |
| #endif |
| } |
| |
| void diag_setHDMI_Div_B(int divHDMI, int chId) |
| { |
| #if (BERLIN_CHIP_VERSION != BERLIN_BG2_CD) && (BERLIN_CHIP_VERSION != BERLIN_BG2CDP) |
| unsigned int div_reg; |
| T32Gbl_avPllCtl42 regData; |
| |
| switch(divHDMI) |
| { |
| case 0: |
| div_reg = 0; //disable DIV_HDMI |
| break; |
| case 1: |
| div_reg = 4; //div by 1, by pass |
| break; |
| case 2: |
| div_reg = 5; //div by 2 |
| break; |
| case 4: |
| div_reg = 6; //div by 4 |
| break; |
| case 6: |
| div_reg = 7; //div by 6 |
| break; |
| default: |
| { |
| dbg_printf(PRN_RES, "Invalid divider for HDMI\n"); |
| return ; |
| } |
| } |
| |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl42), ®Data.u32); |
| |
| switch(chId) |
| { |
| case 1: |
| regData.uavPllCtl_avPllDivHdmiC1_B = div_reg; |
| break; |
| case 2: |
| regData.uavPllCtl_avPllDivHdmiC2_B = div_reg; |
| break; |
| case 3: |
| regData.uavPllCtl_avPllDivHdmiC3_B = div_reg; |
| break; |
| case 4: |
| regData.uavPllCtl_avPllDivHdmiC4_B = div_reg; |
| break; |
| case 5: |
| regData.uavPllCtl_avPllDivHdmiC5_B = div_reg; |
| break; |
| case 6: |
| regData.uavPllCtl_avPllDivHdmiC6_B = div_reg; |
| break; |
| case 7: |
| regData.uavPllCtl_avPllDivHdmiC7_B = div_reg; |
| break; |
| default: |
| dbg_printf(PRN_RES, "Invalid Channel Id\n"); |
| break; |
| } |
| |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl42), regData.u32); |
| #endif |
| } |
| |
| //divAV1 is the register value, not the actual divider |
| //mapping is (binary): |
| //000 = bypass, the whole divAV channel will be bypassed |
| //100 = div by 1 |
| //101 = div by 2 |
| //110 = div by 5 |
| //111 = div by 5 |
| void diag_setAV_Div_A(int divAV1, int divAV2, int chId) |
| { |
| #ifndef FPGA_TAILORED_BOARDVER |
| if(divAV2 !=0 && (divAV2<4 || divAV2>127)) |
| { |
| dbg_printf(PRN_RES, "Invalid divider for AV1\n"); |
| return ; |
| } |
| |
| |
| //program DIV_AV1 and DIV_AV2 |
| switch(chId) |
| { |
| case 1: |
| { |
| T32Gbl_avPllCtl11 regData11; |
| T32Gbl_avPllCtl12 regData12; |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl11), ®Data11.u32); |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl12), ®Data12.u32); |
| regData11.uavPllCtl_avPllDivAv1C1_A = divAV1; |
| regData12.uavPllCtl_avPllDivAv2C1_A = divAV2; |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl11), regData11.u32); |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl12), regData12.u32); |
| } |
| break; |
| case 2: |
| { |
| T32Gbl_avPllCtl12 regData12; |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl12), ®Data12.u32); |
| regData12.uavPllCtl_avPllDivAv1C2_A = divAV1; |
| regData12.uavPllCtl_avPllDivAv2C2_A = divAV2; |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl12), regData12.u32); |
| } |
| break; |
| case 3: |
| { |
| T32Gbl_avPllCtl12 regData12; |
| T32Gbl_avPllCtl13 regData13; |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl12), ®Data12.u32); |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl13), ®Data13.u32); |
| regData12.uavPllCtl_avPllDivAv1C3_A = divAV1; |
| regData13.uavPllCtl_avPllDivAv2C3_A = divAV2; |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl12), regData12.u32); |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl13), regData13.u32); |
| } |
| break; |
| case 4: |
| { |
| T32Gbl_avPllCtl12 regData12; |
| T32Gbl_avPllCtl13 regData13; |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl12), ®Data12.u32); |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl13), ®Data13.u32); |
| regData12.uavPllCtl_avPllDivAv1C4_A = divAV1; |
| regData13.uavPllCtl_avPllDivAv2C4_A = divAV2; |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl12), regData12.u32); |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl13), regData13.u32); |
| } |
| break; |
| case 5: |
| { |
| T32Gbl_avPllCtl12 regData12; |
| T32Gbl_avPllCtl13 regData13; |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl12), ®Data12.u32); |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl13), ®Data13.u32); |
| regData12.uavPllCtl_avPllDivAv1C5_A = divAV1; |
| regData13.uavPllCtl_avPllDivAv2C5_A = divAV2; |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl12), regData12.u32); |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl13), regData13.u32); |
| } |
| break; |
| case 6: |
| { |
| T32Gbl_avPllCtl12 regData12; |
| T32Gbl_avPllCtl13 regData13; |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl12), ®Data12.u32); |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl13), ®Data13.u32); |
| regData12.uavPllCtl_avPllDivAv1C6_A = divAV1; |
| regData13.uavPllCtl_avPllDivAv2C6_A = divAV2; |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl12), regData12.u32); |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl13), regData13.u32); |
| } |
| break; |
| case 7: |
| { |
| T32Gbl_avPllCtl12 regData12; |
| T32Gbl_avPllCtl14 regData14; |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl12), ®Data12.u32); |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl14), ®Data14.u32); |
| regData12.uavPllCtl_avPllDivAv1C7_A = divAV1; |
| regData14.uavPllCtl_avPllDivAv2C7_A = divAV2; |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl12), regData12.u32); |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl14), regData14.u32); |
| } |
| break; |
| default: |
| dbg_printf(PRN_RES, "Invalid Channel Id\n"); |
| break; |
| } |
| #endif |
| } |
| |
| //divAV1 is the register value, not the actual divider |
| //mapping is (binary): |
| //000 = bypass |
| //100 = div by 1 |
| //101 = div by 2 |
| //110 = div by 5 |
| //111 = div by 5 |
| void diag_setAV_Div_B(int divAV1, int divAV2, int chId) |
| { |
| #if (BERLIN_CHIP_VERSION != BERLIN_BG2_CD) && (BERLIN_CHIP_VERSION != BERLIN_BG2CDP) |
| if(divAV2 !=0 && (divAV2<4 || divAV2>127)) |
| { |
| dbg_printf(PRN_RES, "Invalid divider for AV1\n"); |
| return ; |
| } |
| |
| |
| //program DIV_AV1 and DIV_AV2 |
| switch(chId) |
| { |
| case 1: |
| { |
| T32Gbl_avPllCtl42 regData42; |
| T32Gbl_avPllCtl43 regData43; |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl42), ®Data42.u32); |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl43), ®Data43.u32); |
| regData42.uavPllCtl_avPllDivAv1C1_B = divAV1; |
| regData43.uavPllCtl_avPllDivAv2C1_B = divAV2; |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl42), regData42.u32); |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl43), regData43.u32); |
| } |
| break; |
| case 2: |
| { |
| T32Gbl_avPllCtl43 regData43; |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl43), ®Data43.u32); |
| regData43.uavPllCtl_avPllDivAv1C2_B = divAV1; |
| regData43.uavPllCtl_avPllDivAv2C2_B = divAV2; |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl43), regData43.u32); |
| } |
| break; |
| case 3: |
| { |
| T32Gbl_avPllCtl43 regData43; |
| T32Gbl_avPllCtl44 regData44; |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl43), ®Data43.u32); |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl44), ®Data44.u32); |
| regData43.uavPllCtl_avPllDivAv1C3_B = divAV1; |
| regData44.uavPllCtl_avPllDivAv2C3_B = divAV2; |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl43), regData43.u32); |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl44), regData44.u32); |
| } |
| break; |
| case 4: |
| { |
| T32Gbl_avPllCtl43 regData43; |
| T32Gbl_avPllCtl44 regData44; |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl43), ®Data43.u32); |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl44), ®Data44.u32); |
| regData43.uavPllCtl_avPllDivAv1C4_B = divAV1; |
| regData44.uavPllCtl_avPllDivAv2C4_B = divAV2; |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl43), regData43.u32); |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl44), regData44.u32); |
| } |
| break; |
| case 5: |
| { |
| T32Gbl_avPllCtl43 regData43; |
| T32Gbl_avPllCtl44 regData44; |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl43), ®Data43.u32); |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl44), ®Data44.u32); |
| regData43.uavPllCtl_avPllDivAv1C5_B = divAV1; |
| regData44.uavPllCtl_avPllDivAv2C5_B = divAV2; |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl43), regData43.u32); |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl44), regData44.u32); |
| } |
| break; |
| case 6: |
| { |
| T32Gbl_avPllCtl43 regData43; |
| T32Gbl_avPllCtl44 regData44; |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl43), ®Data43.u32); |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl44), ®Data44.u32); |
| regData43.uavPllCtl_avPllDivAv1C6_B = divAV1; |
| regData44.uavPllCtl_avPllDivAv2C6_B = divAV2; |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl43), regData43.u32); |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl44), regData44.u32); |
| } |
| break; |
| case 7: |
| { |
| T32Gbl_avPllCtl43 regData43; |
| T32Gbl_avPllCtl45 regData45; |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl43), ®Data43.u32); |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl45), ®Data45.u32); |
| regData43.uavPllCtl_avPllDivAv1C7_B = divAV1; |
| regData45.uavPllCtl_avPllDivAv2C7_B = divAV2; |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl43), regData43.u32); |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl45), regData45.u32); |
| } |
| break; |
| default: |
| dbg_printf(PRN_RES, "Invalid Channel Id\n"); |
| break; |
| } |
| #endif |
| } |
| |
| //Input is the hex code for AV2 and AV3, see table III |
| void diag_setAV3_Div_A(int divAV2, int divAV3, int chId) |
| { |
| #ifndef FPGA_TAILORED_BOARDVER |
| T32Gbl_avPllCtl12 regData12; |
| T32Gbl_avPllCtl13 regData13; |
| T32Gbl_avPllCtl14 regData14; |
| T32Gbl_avPllCtl15 regData15; |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl12), ®Data12.u32); |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl13), ®Data13.u32); |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl14), ®Data14.u32); |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl15), ®Data15.u32); |
| |
| |
| //program DIV_AV1 and DIV_AV2 |
| switch(chId) |
| { |
| case 1: |
| { |
| regData12.uavPllCtl_avPllDivAv2C1_A = divAV2; |
| regData14.uavPllCtl_avPllDivAv3C1_A = divAV3; |
| } |
| break; |
| case 2: |
| { |
| regData12.uavPllCtl_avPllDivAv2C2_A = divAV2; |
| regData14.uavPllCtl_avPllDivAv3C2_A = divAV3; |
| } |
| break; |
| case 3: |
| { |
| regData13.uavPllCtl_avPllDivAv2C3_A = divAV2; |
| regData14.uavPllCtl_avPllDivAv3C3_A = divAV3; |
| } |
| break; |
| case 4: |
| { |
| regData13.uavPllCtl_avPllDivAv2C4_A = divAV2; |
| regData14.uavPllCtl_avPllDivAv3C4_A = divAV3; |
| } |
| break; |
| case 5: |
| { |
| regData13.uavPllCtl_avPllDivAv2C5_A = divAV2; |
| regData14.uavPllCtl_avPllDivAv3C5_A = divAV3; } |
| break; |
| case 6: |
| { |
| regData13.uavPllCtl_avPllDivAv2C6_A = divAV2; |
| regData14.uavPllCtl_avPllDivAv3C6_A = divAV3; } |
| break; |
| case 7: |
| { |
| regData14.uavPllCtl_avPllDivAv2C7_A = divAV2; |
| regData15.uavPllCtl_avPllDivAv3C7_A = divAV3; } |
| break; |
| default: |
| dbg_printf(PRN_RES, "Invalid Channel Id\n"); |
| break; |
| } |
| |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl12), regData12.u32); |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl13), regData13.u32); |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl14), regData14.u32); |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl15), regData15.u32); |
| #endif |
| } |
| |
| void diag_setAV3_Div_B(int divAV2, int divAV3, int chId) |
| { |
| #if (BERLIN_CHIP_VERSION != BERLIN_BG2_CD) && (BERLIN_CHIP_VERSION != BERLIN_BG2CDP) |
| T32Gbl_avPllCtl43 regData43; |
| T32Gbl_avPllCtl44 regData44; |
| T32Gbl_avPllCtl45 regData45; |
| T32Gbl_avPllCtl46 regData46; |
| |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl43), ®Data43.u32); |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl44), ®Data44.u32); |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl45), ®Data45.u32); |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl46), ®Data46.u32); |
| |
| switch(chId) |
| { |
| case 1: |
| { |
| regData43.uavPllCtl_avPllDivAv2C1_B = divAV2; |
| regData45.uavPllCtl_avPllDivAv3C1_B = divAV3; |
| } |
| break; |
| case 2: |
| { |
| regData43.uavPllCtl_avPllDivAv2C2_B = divAV2; |
| regData45.uavPllCtl_avPllDivAv3C2_B = divAV3; |
| } |
| break; |
| case 3: |
| { |
| regData44.uavPllCtl_avPllDivAv2C3_B = divAV2; |
| regData45.uavPllCtl_avPllDivAv3C3_B = divAV3; |
| } |
| break; |
| case 4: |
| { |
| regData44.uavPllCtl_avPllDivAv2C4_B = divAV2; |
| regData45.uavPllCtl_avPllDivAv3C4_B = divAV3; |
| } |
| break; |
| case 5: |
| { |
| regData44.uavPllCtl_avPllDivAv2C5_B = divAV2; |
| regData45.uavPllCtl_avPllDivAv3C5_B = divAV3; |
| } |
| break; |
| case 6: |
| { |
| regData44.uavPllCtl_avPllDivAv2C6_B = divAV2; |
| regData45.uavPllCtl_avPllDivAv3C6_B = divAV3; |
| } |
| break; |
| case 7: |
| { |
| regData45.uavPllCtl_avPllDivAv2C7_B = divAV2; |
| regData46.uavPllCtl_avPllDivAv3C7_B = divAV3; |
| } |
| break; |
| default: |
| dbg_printf(PRN_RES, "Invalid Channel Id\n"); |
| break; |
| } |
| |
| //write divAV2, divAV3 back |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl43), regData43.u32); |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl44), regData44.u32); |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl45), regData45.u32); |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl46), regData46.u32); |
| #endif |
| } |
| |
| |
| |
| //this is done by using offset and dpll |
| //inc=1 means increase freq to 1001/1000 |
| //inc=0 means disable 1KPPM (by setting offset to 0 and disable DPLL) |
| //inc=-1 means decrease freq to 1000/1001 |
| void diag_set1KPPM_A(int inc, int chId) |
| { |
| if(inc) |
| { |
| if(inc>0) |
| { |
| //increase by 1KPPM |
| diag_setChanOffset_A(OFFSET_1KPPM_INC, chId); |
| diag_setDPll_A(1, 1000, 1001, chId); |
| } |
| else |
| { |
| //decrease by 1KPPM |
| diag_setChanOffset_A(OFFSET_1KPPM_DEC, chId); |
| diag_setDPll_A(1, 1001, 1000, chId); |
| } |
| } |
| else |
| { |
| //set offset to 0 and disable DPLL |
| diag_setChanOffset_A(0, chId); |
| diag_setDPll_A(0, 0, 0, chId); |
| } |
| } |
| |
| void diag_set1KPPM_B(int inc, int chId) |
| { |
| #if (BERLIN_CHIP_VERSION != BERLIN_BG2_CD) && (BERLIN_CHIP_VERSION != BERLIN_BG2CDP) |
| if(inc) |
| { |
| if(inc>0) |
| { |
| //increase by 1KPPM |
| diag_setChanOffset_B(OFFSET_1KPPM_INC, chId); |
| diag_setDPll_B(1, 1000, 1001, chId); |
| } |
| else |
| { |
| //decrease by 1KPPM |
| diag_setChanOffset_B(OFFSET_1KPPM_DEC, chId); |
| diag_setDPll_B(1, 1001, 1000, chId); |
| } |
| } |
| else |
| { |
| //set offset to 0 and disable DPLL |
| diag_setChanOffset_B(0, chId); |
| diag_setDPll_B(0, 0, 0, chId); |
| } |
| #endif |
| } |
| |
| /* new reference in MHz, chan : chan_A 0, Chan_B 1 */ |
| void diag_changeRefFreq(int vco_freq_index, int grp) |
| { |
| if(grp ==0) |
| { |
| diag_setVCO_A(vco_freq_index); |
| } |
| else |
| { |
| diag_setVCO_B(vco_freq_index); |
| } |
| } |
| |
| void diag_setMasterSlaveB(int MasterSlaveB_A, int MasterSlaveB_B) |
| { |
| #ifndef FPGA_TAILORED_BOARDVER |
| T32Gbl_avPllCtl30 regData30; |
| T32Gbl_avPllCtl61 regData61; |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl30), ®Data30.u32); |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl61), ®Data61.u32); |
| |
| regData30.uavPllCtl_avPllMasterSlaveB_A = MasterSlaveB_A; |
| regData61.uavPllCtl_avPllMasterSlaveB_B = MasterSlaveB_B; |
| |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl30), regData30.u32); |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl61), regData61.u32); |
| #endif |
| } |
| |
| void diag_assertReset_A() |
| { |
| #ifndef FPGA_TAILORED_BOARDVER |
| T32Gbl_avPllCtl reg; |
| |
| //assert reset |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl), ®.u32); |
| reg.uavPllCtl_avPllResetPll_A=1; |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl), reg.u32); |
| #endif |
| } |
| |
| void diag_deassertReset_A() |
| { |
| #ifndef FPGA_TAILORED_BOARDVER |
| volatile int i; |
| |
| T32Gbl_avPllCtl reg; |
| |
| for(i=0; i<10000; i++); |
| |
| //deassert reset |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl), ®.u32); |
| reg.uavPllCtl_avPllResetPll_A=0; |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl), reg.u32); |
| #endif |
| } |
| |
| void diag_assertReset_B() |
| { |
| #if (BERLIN_CHIP_VERSION != BERLIN_BG2_CD) && (BERLIN_CHIP_VERSION != BERLIN_BG2CDP) |
| T32Gbl_avPllCtl31 reg; |
| |
| //assert reset |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl31), ®.u32); |
| reg.uavPllCtl_avPllResetPll_B=1; |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl31), reg.u32); |
| #endif |
| } |
| |
| void diag_deassertReset_B() |
| { |
| #if (BERLIN_CHIP_VERSION != BERLIN_BG2_CD) && (BERLIN_CHIP_VERSION != BERLIN_BG2CDP) |
| volatile int i; |
| |
| T32Gbl_avPllCtl31 reg; |
| |
| for(i=0; i<10000; i++); |
| |
| //deassert reset |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl31), ®.u32); |
| reg.uavPllCtl_avPllResetPll_B=0; |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl31), reg.u32); |
| #endif |
| } |
| |
| void diag_powerDown_A() |
| { |
| #ifndef FPGA_TAILORED_BOARDVER |
| T32Gbl_avPllCtl regData; |
| T32Gbl_avPllCtl10 regData10; |
| |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl), ®Data.u32); |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl10), ®Data10.u32); |
| regData.uavPllCtl_avPllPu_A = 0; |
| regData10.uavPllCtl_avPllPuC_A = 0; |
| |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl), regData.u32); |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl10), regData10.u32); |
| #endif |
| } |
| |
| void diag_powerUp_A() |
| { |
| #ifndef FPGA_TAILORED_BOARDVER |
| T32Gbl_avPllCtl regData; |
| T32Gbl_avPllCtl10 regData10; |
| |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl), ®Data.u32); |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl10), ®Data10.u32); |
| regData.uavPllCtl_avPllPu_A = 1; |
| regData10.uavPllCtl_avPllPuC_A = 0x7f; |
| |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl), regData.u32); |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl10), regData10.u32); |
| #endif |
| } |
| |
| void diag_powerDown_B() |
| { |
| #if (BERLIN_CHIP_VERSION != BERLIN_BG2_CD) && (BERLIN_CHIP_VERSION != BERLIN_BG2CDP) |
| T32Gbl_avPllCtl31 regData31; |
| T32Gbl_avPllCtl41 regData41; |
| |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl31), ®Data31.u32); |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl41), ®Data41.u32); |
| regData31.uavPllCtl_avPllPu_B = 0; |
| regData41.uavPllCtl_avPllPuC_B = 0; |
| |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl31), regData31.u32); |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl41), regData41.u32); |
| #endif |
| } |
| |
| void diag_powerUp_B() |
| { |
| #if (BERLIN_CHIP_VERSION != BERLIN_BG2_CD) && (BERLIN_CHIP_VERSION != BERLIN_BG2CDP) |
| T32Gbl_avPllCtl31 regData31; |
| T32Gbl_avPllCtl41 regData41; |
| |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl31), ®Data31.u32); |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl41), ®Data41.u32); |
| regData31.uavPllCtl_avPllPu_B = 1; |
| regData41.uavPllCtl_avPllPuC_B = 0x7f; |
| |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl31), regData31.u32); |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl41), regData41.u32); |
| #endif |
| } |
| |
| //this function will enable AVPLL A and B and turn on caliberation |
| void AVPLL_Enable(void) |
| { |
| #ifndef FPGA_TAILORED_BOARDVER |
| T32Gbl_avPllCtl31 regData31; |
| T32Gbl_avPllCtl32 regData32; |
| |
| T32Gbl_avPllCtl12 regData12; |
| T32Gbl_avPllCtl1 regData1; |
| T32Gbl_avPllCtl regData; |
| T32Gbl_clkEnable regClkEnable; |
| T32Gbl_PadSelect regPadSelect; |
| T32Gbl_avPllCtl11 regData11; |
| T32Gbl_avPllCtl42 regData42; |
| T32Gbl_avPllCtl9 regData9; |
| T32Gbl_avPllCtl10 regData10; |
| T32Gbl_avPllCtl40 regData40; |
| T32Gbl_avPllCtl41 regData41; |
| |
| volatile int i; |
| int avpll_initialized=0; |
| |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl31), ®Data31.u32); |
| //speed is not defaut value, then pll must has been initialized. |
| if(regData31.uavPllCtl_avPllSpeed_B != diag_avpllRegSPEED[0]) |
| avpll_initialized=1; |
| //turn on the reset_A and reset_B |
| //these should be always on |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl11), ®Data11.u32); |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl42), ®Data42.u32); |
| regData11.uavPllCtl_avPllResetC_A = 0; |
| regData42.uavPllCtl_avPllResetC_B = 0; |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl11), regData11.u32); |
| if(!avpll_initialized) |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl42), regData42.u32); |
| |
| //turn on offset |
| //these should be always on |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl9), ®Data9.u32); |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl10), ®Data10.u32); |
| regData9.uavPllCtl_avPllReserveC1_A = 1; |
| regData9.uavPllCtl_avPllReserveC2_A = 1; |
| regData10.uavPllCtl_avPllReserveC3_A = 1; |
| regData10.uavPllCtl_avPllReserveC4_A = 1; |
| regData10.uavPllCtl_avPllReserveC5_A = 1; |
| regData10.uavPllCtl_avPllReserveC6_A = 1; |
| regData10.uavPllCtl_avPllReserveC7_A = 1; |
| regData10.uavPllCtl_avPllReserveC8_A = 1; |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl9), regData9.u32); |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl10), regData10.u32); |
| |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl40), ®Data40.u32); |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl41), ®Data41.u32); |
| regData40.uavPllCtl_avPllReserveC1_B = 1; |
| regData40.uavPllCtl_avPllReserveC2_B = 1; |
| regData41.uavPllCtl_avPllReserveC3_B = 1; |
| regData41.uavPllCtl_avPllReserveC4_B = 1; |
| regData41.uavPllCtl_avPllReserveC5_B = 1; |
| regData41.uavPllCtl_avPllReserveC6_B = 1; |
| regData41.uavPllCtl_avPllReserveC7_B = 1; |
| regData41.uavPllCtl_avPllReserveC8_B = 1; |
| if(!avpll_initialized) { |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl40), regData40.u32); |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl41), regData41.u32); |
| } |
| |
| //set p9v to correct value |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl), ®Data.u32); |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl31), ®Data31.u32); |
| #if (BERLIN_CHIP_VERSION == BERLIN_BG2_CD) || (BERLIN_CHIP_VERSION == BERLIN_BG2CDP) |
| regData.uavPllCtl_avPllVddr1p45V_A= 1; |
| #endif /* (BERLIN_CHIP_VERSION == BERLIN_BG2_CD) */ |
| regData.uavPllCtl_avPllVddr0p9V_A = 0xA; |
| regData.uavPllCtl_avPllVthVcoCal_A = 0x2; |
| regData31.uavPllCtl_avPllVddr0p9V_B = 0xA; |
| regData31.uavPllCtl_avPllVthVcoCal_B = 0x2; |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl), regData.u32); |
| if(!avpll_initialized) |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl31), regData31.u32); |
| |
| //set ICP to correct value |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl1), ®Data1.u32); |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl32), ®Data32.u32); |
| regData1.uavPllCtl_avPllIcp_A = 0x5; |
| regData32.uavPllCtl_avPllIcp_B = 0x5; |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl1), regData1.u32); |
| if(!avpll_initialized) |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl32), regData32.u32); |
| |
| diag_assertReset_A(); |
| if(!avpll_initialized) |
| diag_assertReset_B(); |
| |
| diag_setVCO_A(AVPLL_VCO_FREQ_2_227G); |
| if(!avpll_initialized) |
| diag_setVCO_B(AVPLL_VCO_FREQ_1_620G); |
| |
| //power up |
| diag_powerUp_A(); |
| if(!avpll_initialized) |
| diag_powerUp_B(); |
| |
| //reset, has delay inside function |
| diag_deassertReset_A(); |
| if(!avpll_initialized) |
| diag_deassertReset_B(); |
| |
| //caliberate |
| diag_calibrate_A(); |
| if(!avpll_initialized) |
| diag_calibrate_B(); |
| |
| //set up VCO frequency. |
| diag_setVCO_A(AVPLL_VCO_FREQ_2_227G); |
| if(!avpll_initialized) |
| diag_setVCO_B(AVPLL_VCO_FREQ_1_620G); |
| |
| #if (BERLIN_CHIP_VERSION == BERLIN_BG2_CD) || (BERLIN_CHIP_VERSION == BERLIN_BG2CDP) |
| dbg_printf(PRN_RES, "Power down AVPLL B\n"); |
| diag_powerDown_B(); |
| #endif /* (BERLIN_CHIP_VERSION == BERLIN_BG2_CD) */ |
| |
| dbg_printf(PRN_RES, "Enabled AvPLL A and B Channels\n"); |
| |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_clkEnable), ®ClkEnable.u32); |
| regClkEnable.uclkEnable_audio0ClkEn = 1; |
| regClkEnable.uclkEnable_audio1ClkEn = 1; |
| regClkEnable.uclkEnable_audio2ClkEn = 1; |
| regClkEnable.uclkEnable_audio3ClkEn = 1; |
| regClkEnable.uclkEnable_audioHdClkEn = 1; |
| regClkEnable.uclkEnable_video0ClkEn = 1; |
| regClkEnable.uclkEnable_video1ClkEn = 1; |
| regClkEnable.uclkEnable_video2ClkEn = 1; |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_clkEnable), regClkEnable.u32); |
| |
| dbg_printf(PRN_RES, "Enable DVIO Pad\n"); |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_PadSelect), ®PadSelect.u32); |
| regPadSelect.uPadSelect_DVIO_OEN = 1; |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_PadSelect), regPadSelect.u32); |
| |
| for (i=0; i<8; i++) { |
| gAVPLLA_Channel_OutputClock[i] = 0; |
| gAVPLLB_Channel_OutputClock[i] = 0; |
| } |
| |
| #if (BERLIN_CHIP_VERSION >= BERLIN_BG2_A0) |
| diag_videoFreq_A(5, 0, 0, 1, 6); // set default video0clk to 148.5M |
| diag_videoFreq_A(5, 0, 0, 1, 5); // set default video1clk to 148.5M |
| diag_videoFreq_B(1, 2, 0, 1, 6); // set default video1clk to 148.5M |
| #else |
| diag_videoFreq_A(5, 0, 0, 1, 1); // set default video0clk to 148.5M |
| diag_videoFreq_A(5, 0, 0, 1, 2); // set default video1clk to 148.5M |
| diag_videoFreq_B(1, 2, 0, 1, 1); // set default video1clk to 148.5M |
| #endif |
| #endif // FPGA_TAILORED_BOARDVER |
| } |
| |
| void diag_calibrate_A(void) |
| { |
| #ifndef FPGA_TAILORED_BOARDVER |
| T32Gbl_avPllCtl1 regData1; |
| volatile int i; |
| |
| //turn off caliberation |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl1), ®Data1.u32); |
| regData1.uavPllCtl_avPllPllCaliStart_A=0; |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl1), regData1.u32); |
| |
| //add some delay |
| for(i=0; i<10000; i++); |
| |
| //enable caliberation |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl1), ®Data1.u32); |
| regData1.uavPllCtl_avPllPllCaliStart_A=1; |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl1), regData1.u32); |
| #endif |
| } |
| |
| void diag_calibrate_B(void) |
| { |
| #if (BERLIN_CHIP_VERSION != BERLIN_BG2_CD) && (BERLIN_CHIP_VERSION != BERLIN_BG2CDP) |
| T32Gbl_avPllCtl32 regData32; |
| volatile int i; |
| |
| //turn off caliberation |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl32), ®Data32.u32); |
| regData32.uavPllCtl_avPllPllCaliStart_B=0; |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl32), regData32.u32); |
| |
| //add some delay |
| for(i=0; i<10000; i++); |
| |
| //enable caliberation |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl32), ®Data32.u32); |
| regData32.uavPllCtl_avPllPllCaliStart_B=1; |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl32), regData32.u32); |
| #endif |
| } |
| |
| void diag_avpllFreq_A(int chId) |
| { |
| #ifndef FPGA_TAILORED_BOARDVER |
| double vco_freq=diag_vcoFreqs[diag_pll_A_VCO_Setting]; |
| double freq_from_dpll, freq_from_offset; |
| int offset, sync1, sync2, divHDMI, divAV1, divAV2, divAV3; |
| int enDPLL; |
| |
| T32Gbl_avPllCtl11 regData11; |
| T32Gbl_avPllCtl12 regData12; |
| T32Gbl_avPllCtl13 regData13; |
| T32Gbl_avPllCtl14 regData14; |
| T32Gbl_avPllCtl15 regData15; |
| T32Gbl_avPllCtl30 regData30; |
| |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl11), ®Data11.u32); |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl12), ®Data12.u32); |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl13), ®Data13.u32); |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl14), ®Data14.u32); |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl15), ®Data15.u32); |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl30), ®Data30.u32); |
| |
| enDPLL = regData30.uavPllCtl_avPllEnDpllC_A & (1<<(chId-1)); |
| |
| //find offset, sync1, sync2, divHDMI, divAV1, divAV2, divAV3 |
| switch(chId) |
| { |
| case 1: |
| { |
| T32Gbl_avPllCtl2 regData2; |
| T32Gbl_avPllCtl23 regData23; |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl2), ®Data2.u32); |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl23), ®Data23.u32); |
| |
| offset = regData2.uavPllCtl_avPllFreqOffsetC1_A; |
| sync1 = regData15.uavPllCtl_avPllPSync1C1_A; |
| sync2 = regData23.uavPllCtl_avPllPSync2C1_A; |
| divHDMI= regData11.uavPllCtl_avPllDivHdmiC1_A; |
| divAV1 = regData11.uavPllCtl_avPllDivAv1C1_A; |
| divAV2 = regData12.uavPllCtl_avPllDivAv2C1_A; |
| divAV3 = regData14.uavPllCtl_avPllDivAv3C1_A; |
| } |
| break; |
| case 2: |
| { |
| T32Gbl_avPllCtl3 regData3; |
| T32Gbl_avPllCtl16 regData16; |
| T32Gbl_avPllCtl24 regData24; |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl3), ®Data3.u32); |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl16), ®Data16.u32); |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl24), ®Data24.u32); |
| |
| offset = regData3.uavPllCtl_avPllFreqOffsetC2_A; |
| sync1 = regData16.uavPllCtl_avPllPSync1C2_A; |
| sync2 = regData24.uavPllCtl_avPllPSync2C2_A; |
| divHDMI= regData11.uavPllCtl_avPllDivHdmiC2_A; |
| divAV1 = regData12.uavPllCtl_avPllDivAv1C2_A; |
| divAV2 = regData12.uavPllCtl_avPllDivAv2C2_A; |
| divAV3 = regData14.uavPllCtl_avPllDivAv3C2_A; |
| } |
| break; |
| case 3: |
| { |
| T32Gbl_avPllCtl4 regData4; |
| T32Gbl_avPllCtl17 regData17; |
| T32Gbl_avPllCtl25 regData25; |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl4), ®Data4.u32); |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl17), ®Data17.u32); |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl25), ®Data25.u32); |
| offset = regData4.uavPllCtl_avPllFreqOffsetC3_A; |
| sync1 = regData17.uavPllCtl_avPllPSync1C3_A; |
| sync2 = regData25.uavPllCtl_avPllPSync2C3_A; |
| divHDMI= regData11.uavPllCtl_avPllDivHdmiC3_A; |
| divAV1 = regData12.uavPllCtl_avPllDivAv1C3_A; |
| divAV2 = regData13.uavPllCtl_avPllDivAv2C3_A; |
| divAV3 = regData14.uavPllCtl_avPllDivAv3C3_A; |
| } |
| break; |
| case 4: |
| { |
| T32Gbl_avPllCtl5 regData5; |
| T32Gbl_avPllCtl18 regData18; |
| T32Gbl_avPllCtl26 regData26; |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl5), ®Data5.u32); |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl18), ®Data18.u32); |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl26), ®Data26.u32); |
| offset = regData5.uavPllCtl_avPllFreqOffsetC4_A; |
| sync1 = regData18.uavPllCtl_avPllPSync1C4_A; |
| sync2 = regData26.uavPllCtl_avPllPSync2C4_A; |
| divHDMI= regData11.uavPllCtl_avPllDivHdmiC4_A; |
| divAV1 = regData12.uavPllCtl_avPllDivAv1C4_A; |
| divAV2 = regData13.uavPllCtl_avPllDivAv2C4_A; |
| divAV3 = regData14.uavPllCtl_avPllDivAv3C4_A; |
| } |
| break; |
| case 5: |
| { |
| T32Gbl_avPllCtl6 regData6; |
| T32Gbl_avPllCtl19 regData19; |
| T32Gbl_avPllCtl27 regData27; |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl6), ®Data6.u32); |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl19), ®Data19.u32); |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl27), ®Data27.u32); |
| offset = regData6.uavPllCtl_avPllFreqOffsetC5_A; |
| sync1 = regData19.uavPllCtl_avPllPSync1C5_A; |
| sync2 = regData27.uavPllCtl_avPllPSync2C5_A; |
| divHDMI= regData11.uavPllCtl_avPllDivHdmiC5_A; |
| divAV1 = regData12.uavPllCtl_avPllDivAv1C5_A; |
| divAV2 = regData13.uavPllCtl_avPllDivAv2C5_A; |
| divAV3 = regData14.uavPllCtl_avPllDivAv3C5_A; |
| } |
| break; |
| case 6: |
| { |
| T32Gbl_avPllCtl7 regData7; |
| T32Gbl_avPllCtl20 regData20; |
| T32Gbl_avPllCtl28 regData28; |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl7), ®Data7.u32); |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl20), ®Data20.u32); |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl28), ®Data28.u32); |
| offset = regData7.uavPllCtl_avPllFreqOffsetC6_A; |
| sync1 = regData20.uavPllCtl_avPllPSync1C6_A; |
| sync2 = regData28.uavPllCtl_avPllPSync2C6_A; |
| divHDMI= regData11.uavPllCtl_avPllDivHdmiC6_A; |
| divAV1 = regData12.uavPllCtl_avPllDivAv1C6_A; |
| divAV2 = regData13.uavPllCtl_avPllDivAv2C6_A; |
| divAV3 = regData14.uavPllCtl_avPllDivAv3C6_A; |
| } |
| break; |
| case 7: |
| { |
| T32Gbl_avPllCtl8 regData8; |
| T32Gbl_avPllCtl21 regData21; |
| T32Gbl_avPllCtl29 regData29; |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl8), ®Data8.u32); |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl21), ®Data21.u32); |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl29), ®Data29.u32); |
| offset = regData8.uavPllCtl_avPllFreqOffsetC7_A; |
| sync1 = regData21.uavPllCtl_avPllPSync1C7_A; |
| sync2 = regData29.uavPllCtl_avPllPSync2C7_A; |
| divHDMI= regData11.uavPllCtl_avPllDivHdmiC7_A; |
| divAV1 = regData12.uavPllCtl_avPllDivAv1C7_A; |
| divAV2 = regData14.uavPllCtl_avPllDivAv2C7_A; |
| divAV3 = regData15.uavPllCtl_avPllDivAv3C7_A; |
| } |
| break; |
| default: |
| dbg_printf(PRN_RES, "Invalid Channel\n"); |
| return; |
| |
| } |
| |
| if(enDPLL != 0) |
| freq_from_dpll = vco_freq*sync2/sync1; |
| else |
| freq_from_dpll = vco_freq; |
| |
| if(offset& (1<<18)) |
| { |
| offset = - (offset & ((1<<18)-1)); |
| } |
| freq_from_offset = vco_freq/((double)offset/4194304+1); |
| |
| //figure out which divider used |
| if(divHDMI != 0) |
| { |
| divHDMI &= 0x3; |
| dbg_printf(PRN_RES, "divHDMI on: %d\n", divHDMI); |
| |
| freq_from_dpll = freq_from_dpll/divHDMICode[divHDMI]; |
| freq_from_offset = freq_from_offset/divHDMICode[divHDMI]; |
| } |
| |
| if(divAV1 != 0) |
| { |
| divAV1 &= 0x3; |
| dbg_printf(PRN_RES, "divAV1 on: %d\n", divAV1); |
| |
| freq_from_dpll = freq_from_dpll/divAV1Code[divAV1]; |
| freq_from_offset = freq_from_offset/divAV1Code[divAV1]; |
| } |
| |
| if(divAV2 != 0) |
| { |
| if(divAV3 == 0) |
| { |
| dbg_printf(PRN_RES, "divAV2 on: %d\n", divAV2); |
| freq_from_dpll = freq_from_dpll/divAV2; |
| freq_from_offset = freq_from_offset/divAV2; |
| } |
| else |
| { |
| dbg_printf(PRN_RES, "divAV2 on: %d\n", divAV2); |
| dbg_printf(PRN_RES, "divAV3 on: %d\n", divAV3); |
| if( (((int)((double)divAV2/4+.5))-1) != (divAV3&0x7)) |
| { |
| dbg_printf(PRN_RES, "Invalid divAV2 and divAV3 combination\n"); |
| } |
| freq_from_dpll = freq_from_dpll*2/divAV2; |
| freq_from_offset = freq_from_offset*2/divAV2; |
| } |
| } |
| |
| dbg_printf(PRN_RES, "PLLA C%d Freq is: %fMHz(Offset) %fMHz(DPLL)\n", chId, freq_from_offset, freq_from_dpll); |
| |
| current_freq[0][chId]=freq_from_dpll; |
| #endif |
| } |
| |
| void diag_avpllFreq_B(int chId) |
| { |
| #if (BERLIN_CHIP_VERSION != BERLIN_BG2_CD) && (BERLIN_CHIP_VERSION != BERLIN_BG2CDP) |
| double vco_freq=diag_vcoFreqs[diag_pll_B_VCO_Setting]; |
| double freq_from_dpll, freq_from_offset; |
| int offset, sync1, sync2, divHDMI, divAV1, divAV2, divAV3; |
| int enDPLL; |
| |
| T32Gbl_avPllCtl42 regData42; |
| T32Gbl_avPllCtl43 regData43; |
| T32Gbl_avPllCtl44 regData44; |
| T32Gbl_avPllCtl45 regData45; |
| T32Gbl_avPllCtl46 regData46; |
| T32Gbl_avPllCtl61 regData61; |
| |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl42), ®Data42.u32); |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl43), ®Data43.u32); |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl44), ®Data44.u32); |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl45), ®Data45.u32); |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl46), ®Data46.u32); |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl61), ®Data61.u32); |
| |
| enDPLL = regData61.uavPllCtl_avPllEnDpllC_B & (1<<(chId-1)); |
| |
| //find offset, sync1, sync2, divHDMI, divAV1, divAV2, divAV3 |
| switch(chId) |
| { |
| case 1: |
| { |
| T32Gbl_avPllCtl33 regData33; |
| T32Gbl_avPllCtl46 regData46; |
| T32Gbl_avPllCtl54 regData54; |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl33), ®Data33.u32); |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl46), ®Data46.u32); |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl54), ®Data54.u32); |
| |
| offset = regData33.uavPllCtl_avPllFreqOffsetC1_B; |
| sync1 = regData46.uavPllCtl_avPllPSync1C1_B; |
| sync2 = regData54.uavPllCtl_avPllPSync2C1_B; |
| divHDMI= regData42.uavPllCtl_avPllDivHdmiC1_B; |
| divAV1 = regData42.uavPllCtl_avPllDivAv1C1_B; |
| divAV2 = regData43.uavPllCtl_avPllDivAv2C1_B; |
| divAV3 = regData45.uavPllCtl_avPllDivAv3C1_B; |
| } |
| break; |
| case 2: |
| { |
| T32Gbl_avPllCtl34 regData34; |
| T32Gbl_avPllCtl47 regData47; |
| T32Gbl_avPllCtl55 regData55; |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl34), ®Data34.u32); |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl47), ®Data47.u32); |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl55), ®Data55.u32); |
| |
| offset = regData34.uavPllCtl_avPllFreqOffsetC2_B; |
| sync1 = regData47.uavPllCtl_avPllPSync1C2_B; |
| sync2 = regData55.uavPllCtl_avPllPSync2C2_B; |
| divHDMI= regData42.uavPllCtl_avPllDivHdmiC2_B; |
| divAV1 = regData43.uavPllCtl_avPllDivAv1C2_B; |
| divAV2 = regData43.uavPllCtl_avPllDivAv2C2_B; |
| divAV3 = regData45.uavPllCtl_avPllDivAv3C2_B; |
| } |
| break; |
| case 3: |
| { |
| T32Gbl_avPllCtl35 regData35; |
| T32Gbl_avPllCtl48 regData48; |
| T32Gbl_avPllCtl56 regData56; |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl35), ®Data35.u32); |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl48), ®Data48.u32); |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl56), ®Data56.u32); |
| offset = regData35.uavPllCtl_avPllFreqOffsetC3_B; |
| sync1 = regData48.uavPllCtl_avPllPSync1C3_B; |
| sync2 = regData56.uavPllCtl_avPllPSync2C3_B; |
| divHDMI= regData42.uavPllCtl_avPllDivHdmiC3_B; |
| divAV1 = regData43.uavPllCtl_avPllDivAv1C3_B; |
| divAV2 = regData44.uavPllCtl_avPllDivAv2C3_B; |
| divAV3 = regData45.uavPllCtl_avPllDivAv3C3_B; |
| } |
| break; |
| case 4: |
| { |
| T32Gbl_avPllCtl36 regData36; |
| T32Gbl_avPllCtl49 regData49; |
| T32Gbl_avPllCtl57 regData57; |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl36), ®Data36.u32); |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl49), ®Data49.u32); |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl57), ®Data57.u32); |
| offset = regData36.uavPllCtl_avPllFreqOffsetC4_B; |
| sync1 = regData49.uavPllCtl_avPllPSync1C4_B; |
| sync2 = regData57.uavPllCtl_avPllPSync2C4_B; |
| divHDMI= regData42.uavPllCtl_avPllDivHdmiC4_B; |
| divAV1 = regData43.uavPllCtl_avPllDivAv1C4_B; |
| divAV2 = regData44.uavPllCtl_avPllDivAv2C4_B; |
| divAV3 = regData45.uavPllCtl_avPllDivAv3C4_B; |
| } |
| break; |
| case 5: |
| { |
| T32Gbl_avPllCtl37 regData37; |
| T32Gbl_avPllCtl50 regData50; |
| T32Gbl_avPllCtl58 regData58; |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl37), ®Data37.u32); |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl50), ®Data50.u32); |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl58), ®Data58.u32); |
| offset = regData37.uavPllCtl_avPllFreqOffsetC5_B; |
| sync1 = regData50.uavPllCtl_avPllPSync1C5_B; |
| sync2 = regData58.uavPllCtl_avPllPSync2C5_B; |
| divHDMI= regData42.uavPllCtl_avPllDivHdmiC5_B; |
| divAV1 = regData43.uavPllCtl_avPllDivAv1C5_B; |
| divAV2 = regData44.uavPllCtl_avPllDivAv2C5_B; |
| divAV3 = regData45.uavPllCtl_avPllDivAv3C5_B; |
| } |
| break; |
| case 6: |
| { |
| T32Gbl_avPllCtl38 regData38; |
| T32Gbl_avPllCtl51 regData51; |
| T32Gbl_avPllCtl59 regData59; |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl38), ®Data38.u32); |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl51), ®Data51.u32); |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl59), ®Data59.u32); |
| offset = regData38.uavPllCtl_avPllFreqOffsetC6_B; |
| sync1 = regData51.uavPllCtl_avPllPSync1C6_B; |
| sync2 = regData59.uavPllCtl_avPllPSync2C6_B; |
| divHDMI= regData42.uavPllCtl_avPllDivHdmiC6_B; |
| divAV1 = regData43.uavPllCtl_avPllDivAv1C6_B; |
| divAV2 = regData44.uavPllCtl_avPllDivAv2C6_B; |
| divAV3 = regData45.uavPllCtl_avPllDivAv3C6_B; |
| } |
| break; |
| case 7: |
| { |
| T32Gbl_avPllCtl39 regData39; |
| T32Gbl_avPllCtl52 regData52; |
| T32Gbl_avPllCtl60 regData60; |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl39), ®Data39.u32); |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl52), ®Data52.u32); |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl60), ®Data60.u32); |
| offset = regData39.uavPllCtl_avPllFreqOffsetC7_B; |
| sync1 = regData52.uavPllCtl_avPllPSync1C7_B; |
| sync2 = regData60.uavPllCtl_avPllPSync2C7_B; |
| divHDMI= regData42.uavPllCtl_avPllDivHdmiC7_B; |
| divAV1 = regData43.uavPllCtl_avPllDivAv1C7_B; |
| divAV2 = regData45.uavPllCtl_avPllDivAv2C7_B; |
| divAV3 = regData46.uavPllCtl_avPllDivAv3C7_B; |
| } |
| break; |
| default: |
| dbg_printf(PRN_RES, "Invalid Channel\n"); |
| return; |
| |
| } |
| |
| if(enDPLL != 0) |
| freq_from_dpll = vco_freq*sync2/sync1; |
| else |
| freq_from_dpll = vco_freq; |
| |
| if(offset& (1<<18)) |
| { |
| offset = - (offset & ((1<<18)-1)); |
| } |
| freq_from_offset = vco_freq/((double)offset/4194304+1); |
| |
| //figure out which divider used |
| if(divHDMI != 0) |
| { |
| divHDMI &= 0x3; |
| dbg_printf(PRN_RES, "divHDMI on: %d\n", divHDMI); |
| |
| freq_from_dpll = freq_from_dpll/divHDMICode[divHDMI]; |
| freq_from_offset = freq_from_offset/divHDMICode[divHDMI]; |
| } |
| |
| if(divAV1 != 0) |
| { |
| divAV1 &= 0x3; |
| dbg_printf(PRN_RES, "divAV1 on: %d\n", divAV1); |
| |
| freq_from_dpll = freq_from_dpll/divAV1Code[divAV1]; |
| freq_from_offset = freq_from_offset/divAV1Code[divAV1]; |
| } |
| |
| if(divAV2 != 0) |
| { |
| if(divAV3 == 0) |
| { |
| dbg_printf(PRN_RES, "divAV2 on: %d\n", divAV2); |
| freq_from_dpll = freq_from_dpll/divAV2; |
| freq_from_offset = freq_from_offset/divAV2; |
| } |
| else |
| { |
| dbg_printf(PRN_RES, "divAV2 on: %d\n", divAV2); |
| dbg_printf(PRN_RES, "divAV3 on: %d\n", divAV3); |
| if( (((int)((double)divAV2/4+.5))-1) != (divAV3&0x7)) |
| { |
| dbg_printf(PRN_RES, "Invalid divAV2 and divAV3 combination\n"); |
| } |
| freq_from_dpll = freq_from_dpll*2/divAV2; |
| freq_from_offset = freq_from_offset*2/divAV2; |
| } |
| } |
| |
| dbg_printf(PRN_RES, "PLLB C%d Freq is: %fMHz(Offset) %fMHz(DPLL)\n", chId, freq_from_offset, freq_from_dpll); |
| |
| current_freq[1][chId]=freq_from_dpll; |
| #endif |
| } |
| |
| void diag_vcoFreq_A(void) |
| { |
| #ifndef FPGA_TAILORED_BOARDVER |
| double ref_freq=25.0; |
| double freq_from_offset; |
| int offset, fbDiv; |
| |
| T32Gbl_avPllCtl1 regData1; |
| T32Gbl_avPllCtl9 regData9; |
| |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl1), ®Data1.u32); |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl9), ®Data9.u32); |
| |
| //find offset, fbDiv |
| offset = regData9.uavPllCtl_avPllFreqOffsetC8_A; |
| fbDiv = regData1.uavPllCtl_avPllFbDiv_A; |
| |
| if(offset& (1<<18)) |
| { |
| offset = - (offset & ((1<<18)-1)); |
| } |
| //note that the offset formula for VCO(C8) is different from C1-C7 |
| //according to John Ma, the formula is the same, just that ref_freq is CKOUT |
| //and VCO freq is CKIN |
| freq_from_offset = ref_freq*((double)offset/4194304+1); |
| |
| freq_from_offset = freq_from_offset*fbDiv; |
| |
| dbg_printf(PRN_RES, "PLLA VCO Freq is: %f\n", freq_from_offset); |
| #endif |
| } |
| |
| void diag_vcoFreq_B(void) |
| { |
| #if (BERLIN_CHIP_VERSION != BERLIN_BG2_CD) && (BERLIN_CHIP_VERSION != BERLIN_BG2CDP) |
| double ref_freq=25.0; |
| double freq_from_offset; |
| int offset, fbDiv; |
| |
| T32Gbl_avPllCtl32 regData32; |
| T32Gbl_avPllCtl40 regData40; |
| |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl32), ®Data32.u32); |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl40), ®Data40.u32); |
| |
| //find offset, fbDiv |
| offset = regData40.uavPllCtl_avPllFreqOffsetC8_B; |
| fbDiv = regData32.uavPllCtl_avPllFbDiv_B; |
| |
| if(offset& (1<<18)) |
| { |
| offset = - (offset & ((1<<18)-1)); |
| } |
| //note that the offset formula for VCO(C8) is different from C1-C7 |
| //according to John Ma, the formula is the same, just that ref_freq is CKOUT |
| //and VCO freq is CKIN |
| freq_from_offset = ref_freq*((double)offset/4194304+1); |
| |
| freq_from_offset = freq_from_offset*fbDiv; |
| |
| dbg_printf(PRN_RES, "PLLB VCO Freq is: %f\n", freq_from_offset); |
| #endif |
| } |
| |
| int diag_getVCOFreq(int hdmiMode, int freqIndex) |
| { |
| return (vcoSelectionTable[hdmiMode][freqIndex]); |
| } |
| |
| int diag_getChannelOutputFreq(int AVPLLIndex,int chID) |
| { |
| if (chID<0 || chID>7) |
| return 0; |
| |
| if (AVPLLIndex == 0) //AVPLL-A |
| return (gAVPLLA_Channel_OutputClock[chID]); |
| else |
| return (gAVPLLB_Channel_OutputClock[chID]); |
| } |
| |
| //freq_index, 0 to 5, the 6 VCLKs |
| //hdmiMode, HDMI_8BIT_MODE, HDMI_10BIT_MODE, HDMI_12BIT_MODE |
| //frameRate, FRAME_RATE_59P94 FRAME_RATE_60 |
| //overSampleRate, 1, 2, 4, 8, 10, 12.5, 15 |
| void diag_videoFreq_A(int freqIndex, int hdmiMode, int frameRate, float overSampleRate, int chId) |
| { |
| int vcoFreqIndex=vcoSelectionTable[hdmiMode][freqIndex]; |
| double vcoFreq, videoFreq; |
| int ppm1K=ppm1kSelectionTable[frameRate][freqIndex]; |
| double divider; |
| |
| if (chId<0 || chId>7) |
| return; |
| |
| dbg_printf(PRN_RES, "Set PLLA C%d:\n", chId); |
| //set VCO freq here |
| diag_setVCO_A(vcoFreqIndex); |
| dbg_printf(PRN_RES, "VCO freq=%f\n", diag_vcoFreqs[vcoFreqIndex]); |
| |
| //check to see if ppm1K is need |
| vcoFreq = diag_vcoFreqs[vcoFreqIndex]; |
| if(ppm1K<0) |
| { |
| vcoFreq = vcoFreq*1000/1001; |
| } |
| |
| if(ppm1K>0) |
| { |
| vcoFreq = vcoFreq*1001/1000; |
| } |
| diag_set1KPPM_A(ppm1K, chId); |
| |
| //get the video freq |
| videoFreq = diag_videoFreqs[freqIndex]; |
| if(frameRate) |
| { |
| //60Hz vclk is 1001/1000 times 59.94Hz vclk |
| videoFreq = videoFreq*1001/1000; |
| } |
| |
| dbg_printf(PRN_RES, "Video freq=%f\n", videoFreq); |
| |
| //disable all dividers |
| diag_setHDMI_Div_A(0, chId); |
| diag_setAV_Div_A(0, 0, chId); //divAV1 is for divide by 1, 0 will disable the whole divAV chain |
| diag_setAV3_Div_A(0, 0, chId); |
| |
| //set the divider |
| if(overSampleRate>=10) |
| { |
| //use HDMI divider |
| divider = vcoFreq/videoFreq/overSampleRate; |
| dbg_printf(PRN_RES, "HDMI divider is %f %d\n", divider, (int)(divider+0.5)); |
| |
| diag_setHDMI_Div_A((int)(divider+0.5), chId); |
| dbg_printf(PRN_RES, "PLLA C%d=%f\n", chId, videoFreq*overSampleRate); |
| } |
| else |
| { |
| divider = vcoFreq*2/videoFreq/overSampleRate; |
| dbg_printf(PRN_RES, "AV divider is %f %d\n", divider/2, (int)(divider+0.5)/2); |
| |
| if(((int)(divider+0.5))&1) |
| { |
| //fractional divider, use AV2 and AV3 |
| //figure out AV3, AV3 = round(AV2/4)-1 |
| int divAV3 = ((int)((double)divider/4+0.5))-1; |
| |
| //this enables divAV channel |
| diag_setAV_Div_A(4, 0, chId); |
| |
| //add enable bit |
| divAV3 |= (1<<3); |
| diag_setAV3_Div_A((int)(divider+0.5), divAV3, chId); |
| } |
| else |
| { |
| //integer divider, use AV2 only |
| diag_setAV_Div_A(4, (int)(divider+0.5)/2, chId); |
| } |
| |
| dbg_printf(PRN_RES, "PLLA C%d=%f\n", chId, videoFreq*overSampleRate); |
| } |
| |
| gAVPLLA_Channel_OutputClock[chId] = (unsigned int)(videoFreq*overSampleRate*1000000); |
| |
| } |
| |
| //freq_index, 0 to 5, the 6 VCLKs |
| //hdmiMode, HDMI_8BIT_MODE, HDMI_10BIT_MODE, HDMI_12BIT_MODE |
| //frameRate, FRAME_RATE_59P94 FRAME_RATE_60 |
| //overSampleRate, 1, 2, 4, 8, 10, 12.5, 15 |
| void diag_videoFreq_B(int freqIndex, int hdmiMode, int frameRate, float overSampleRate, int chId) |
| { |
| #if (BERLIN_CHIP_VERSION != BERLIN_BG2_CD) && (BERLIN_CHIP_VERSION != BERLIN_BG2CDP) |
| int vcoFreqIndex=vcoSelectionTable[hdmiMode][freqIndex]; |
| double vcoFreq, videoFreq; |
| int ppm1K=ppm1kSelectionTable[frameRate][freqIndex]; |
| double divider; |
| |
| if (chId<0 || chId>7) |
| return; |
| |
| dbg_printf(PRN_RES, "Set PLLB C%d:\n", chId); |
| |
| //set VCO freq here |
| diag_setVCO_B(vcoFreqIndex); |
| dbg_printf(PRN_RES, "VCO freq=%f\n", diag_vcoFreqs[vcoFreqIndex]); |
| //check to see if ppm1K is need |
| vcoFreq = diag_vcoFreqs[vcoFreqIndex]; |
| |
| if(ppm1K<0) |
| { |
| vcoFreq = vcoFreq*1000/1001; |
| } |
| if(ppm1K>0) |
| { |
| vcoFreq = vcoFreq*1001/1000; |
| } |
| |
| diag_set1KPPM_B(ppm1K, chId); |
| |
| //get the video freq |
| videoFreq = diag_videoFreqs[freqIndex]; |
| if(frameRate) |
| { |
| //60Hz vclk is 1001/1000 times 59.94Hz vclk |
| videoFreq = videoFreq*1001/1000; |
| } |
| |
| dbg_printf(PRN_RES, "Video freq=%f\n", videoFreq); |
| |
| //disable all dividers |
| diag_setHDMI_Div_B(0, chId); |
| diag_setAV_Div_B(0, 0, chId); |
| diag_setAV3_Div_B(0, 0, chId); |
| |
| //set the divider |
| if(overSampleRate>=10) |
| { |
| //use HDMI divider |
| divider = vcoFreq/videoFreq/overSampleRate; |
| dbg_printf(PRN_RES, "HDMI divider is %f %d\n", divider, (int)(divider+0.5)); |
| |
| diag_setHDMI_Div_B((int)(divider+0.5), chId); |
| dbg_printf(PRN_RES, "PLLB C%d=%f\n", chId, videoFreq*overSampleRate); |
| } |
| else |
| { |
| divider = vcoFreq*2/videoFreq/overSampleRate; |
| dbg_printf(PRN_RES, "AV divider is %f %d\n", divider/2, (int)((divider+0.5)/2)); |
| |
| if((((int)(divider+0.5)))&1) |
| { |
| //fractional divider, use AV2 and AV3 |
| //figure out AV3, AV3 = round(AV2/4)-1 |
| int divAV3 = ((int)((double)divider/4+0.5))-1; |
| |
| //this enables divAV channel |
| diag_setAV_Div_B(4, 0, chId); |
| |
| //add enable bit |
| divAV3 |= (1<<3); |
| diag_setAV3_Div_B((int)(divider+0.5), divAV3, chId); |
| } |
| else |
| { |
| //integer divider, use AV2 only |
| diag_setAV_Div_B(4, (int)(divider+0.5)/2, chId); |
| } |
| |
| dbg_printf(PRN_RES, "PLLB C%d=%f\n", chId, videoFreq*overSampleRate); |
| } |
| |
| gAVPLLB_Channel_OutputClock[chId] = (unsigned int)(videoFreq*overSampleRate*1000000); |
| |
| #endif |
| } |
| |
| |
| //freqIndex is the index into clock_freq[] array |
| int diag_clockFreq_A(int freqIndex, int chId) |
| { |
| |
| if(freqIndex >= (sizeof(clk_freqs) / sizeof(CLK_FREQ))) |
| { |
| dbg_printf(PRN_RES, "freq Index not found\n"); |
| return 1; |
| } |
| |
| if(diag_pll_A_VCO_Setting != clk_freqs[freqIndex].vco_freq_index) |
| { |
| dbg_printf(PRN_RES, "VCO frequency is changed to %f!\n", |
| diag_vcoFreqs[clk_freqs[freqIndex].vco_freq_index]); |
| |
| diag_setVCO_A(clk_freqs[freqIndex].vco_freq_index); |
| } |
| |
| //change offset |
| diag_setChanOffset_A(clk_freqs[freqIndex].freq_offset, chId); |
| |
| //change p_sync |
| diag_setDPll_A((clk_freqs[freqIndex].p_sync1!=0), |
| clk_freqs[freqIndex].p_sync1, |
| clk_freqs[freqIndex].p_sync2, chId); |
| |
| //disable all dividers |
| diag_setHDMI_Div_A(0, chId); |
| diag_setAV_Div_A(0, 0, chId); |
| diag_setAV3_Div_A(0, 0, chId); |
| |
| //update now div |
| diag_setAV_Div_A(clk_freqs[freqIndex].divAV1, clk_freqs[freqIndex].divAV2, chId); |
| diag_setAV3_Div_A(clk_freqs[freqIndex].divAV2, clk_freqs[freqIndex].divAV3, chId); |
| |
| |
| return 0; |
| |
| } |
| |
| int diag_clockFreq_B(int freqIndex, int chId) |
| { |
| #if (BERLIN_CHIP_VERSION != BERLIN_BG2_CD) && (BERLIN_CHIP_VERSION != BERLIN_BG2CDP) |
| if(freqIndex >= (sizeof(clk_freqs) / sizeof(CLK_FREQ))) |
| { |
| dbg_printf(PRN_RES, "freq Index not found\n"); |
| return 1; |
| } |
| |
| if(diag_pll_B_VCO_Setting != clk_freqs[freqIndex].vco_freq_index) |
| { |
| dbg_printf(PRN_RES, "VCO frequency is changed to %f!\n", |
| diag_vcoFreqs[clk_freqs[freqIndex].vco_freq_index]); |
| |
| diag_setVCO_B(clk_freqs[freqIndex].vco_freq_index); |
| } |
| |
| //change offset |
| diag_setChanOffset_B(clk_freqs[freqIndex].freq_offset, chId); |
| |
| //change p_sync |
| diag_setDPll_B((clk_freqs[freqIndex].p_sync1!=0), |
| clk_freqs[freqIndex].p_sync1, |
| clk_freqs[freqIndex].p_sync2, chId); |
| |
| //disable all dividers |
| diag_setHDMI_Div_B(0, chId); |
| diag_setAV_Div_B(0, 0, chId); |
| diag_setAV3_Div_B(0, 0, chId); |
| |
| //update now div |
| diag_setAV_Div_B(clk_freqs[freqIndex].divAV1, clk_freqs[freqIndex].divAV2, chId); |
| diag_setAV3_Div_B(clk_freqs[freqIndex].divAV2, clk_freqs[freqIndex].divAV3, chId); |
| |
| |
| return 0; |
| #endif |
| } |
| |
| int get_freqTabIndex(int vco_freq_index, int av_freq_index) |
| { |
| int i, tab_index=-1; |
| |
| for(i=0; i<(sizeof(clk_freqs) / sizeof(CLK_FREQ)); i++) |
| { |
| if(clk_freqs[i].vco_freq_index == vco_freq_index && clk_freqs[i].av_freq_index == av_freq_index) |
| { |
| tab_index = i; break; |
| } |
| } |
| return tab_index; |
| } |
| |
| int AVPLL_Set(int groupId, int chanId, int avFreqIndex) |
| { |
| int freqTabIndex; |
| |
| if(groupId==0) // PLL A |
| { |
| // Search freqIndex in lookup table by avFreqIndex and vco_freq_index. |
| freqTabIndex = get_freqTabIndex(diag_pll_A_VCO_Setting, avFreqIndex); |
| if(freqTabIndex == -1) |
| return -1; |
| diag_clockFreq_A(freqTabIndex, chanId); |
| } |
| else if(groupId==1) // PLL B |
| { |
| #if (BERLIN_CHIP_VERSION != BERLIN_BG2_CD) && (BERLIN_CHIP_VERSION != BERLIN_BG2CDP) |
| freqTabIndex = get_freqTabIndex(diag_pll_B_VCO_Setting, avFreqIndex); |
| if(freqTabIndex == -1) |
| return -1; |
| |
| diag_clockFreq_B(freqTabIndex, chanId); |
| #endif |
| } |
| |
| return 0; |
| } |
| |
| // secondary MCLK keeps 4x, other MCLK div4 to 1x |
| int AVPLL_SetDiv4() |
| { |
| #ifndef FPGA_TAILORED_BOARDVER |
| T32Gbl_ClkSwitch1 ClkSwitch1; |
| T32Gbl_clkSelect2 ClkSelect2; |
| #ifdef CONFIG_MV_AMP_INTERNAL_ADAC_DISABLE |
| T32Gbl_clkSelect3 ClkSelect3; |
| #endif |
| |
| GA_REG_WORD32_READ((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_ClkSwitch1), &ClkSwitch1.u32); |
| ClkSwitch1.uClkSwitch_audio0ClkSwitch = 1; // primary |
| ClkSwitch1.uClkSwitch_audio2ClkSwitch = 1; // mic |
| ClkSwitch1.uClkSwitch_audio3ClkSwitch = 1; // spdif |
| #ifdef CONFIG_MV_AMP_INTERNAL_ADAC_DISABLE |
| ClkSwitch1.uClkSwitch_audio1ClkSwitch = 1; // stereo |
| #endif |
| GA_REG_WORD32_WRITE((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_ClkSwitch1), (ClkSwitch1.u32)); |
| |
| GA_REG_WORD32_READ((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_clkSelect2), &ClkSelect2.u32); |
| ClkSelect2.uclkSelect_audio0ClkSel = Gbl_clkSelect_audio0ClkSel_d4; |
| ClkSelect2.uclkSelect_audio2ClkSel = Gbl_clkSelect_audio2ClkSel_d4; |
| ClkSelect2.uclkSelect_audio3ClkSel = Gbl_clkSelect_audio3ClkSel_d4; |
| GA_REG_WORD32_WRITE((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_clkSelect2), (ClkSelect2.u32)); |
| |
| #ifdef CONFIG_MV_AMP_INTERNAL_ADAC_DISABLE |
| GA_REG_WORD32_READ((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_clkSelect3), &ClkSelect3.u32); |
| ClkSelect3.uclkSelect_audio1ClkSel = Gbl_clkSelect_audio1ClkSel_d4; |
| GA_REG_WORD32_WRITE((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_clkSelect3), (ClkSelect3.u32)); |
| #endif |
| #endif |
| } |
| |
| |
| // S/W workaround is not required at BG2. |
| void AVPLL_EnableMicClk(int en) |
| { |
| #ifndef FPGA_TAILORED_BOARDVER |
| T32Gbl_clkEnable regClkEnable; |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_clkEnable), ®ClkEnable.u32); |
| if (en) { |
| en = 1; |
| } |
| regClkEnable.uclkEnable_audio2ClkEn = en; |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_clkEnable), regClkEnable.u32); |
| #endif |
| } |
| |
| /* PCR_TRACKING -- BG2 */ |
| // add read function here for adjustment, real adjustment to nominate frequency is cur-orig |
| void AVPLL_GetPPM(int grp, double *ppm_base, double *ppm_now) |
| { |
| double ppm0, ppm; |
| if(grp ==0) |
| { |
| ppm0 = org_ppm[0]; |
| ppm = cur_ppm[0]; |
| } |
| else // AVPLL B |
| { |
| ppm0 = org_ppm[1]; |
| ppm = cur_ppm[1]; |
| } |
| if(ppm_base) *ppm_base = ppm0; |
| if(ppm_now) *ppm_now = ppm; |
| } |
| |
| double AVPLL_AdjustPPM(double ppm_delta, int grp) |
| { |
| #ifndef FPGA_TAILORED_BOARDVER |
| volatile int i; |
| double ppm0, ppm; |
| |
| if(grp == 0) { // For AVPLL-A |
| T32Gbl_avPllCtl9 regData9; |
| |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl9), ®Data9.u32); |
| |
| if(avpll_inited[0] == 0) { |
| ppm0 = offset_2_ppm(regData9.uavPllCtl_avPllFreqOffsetC8_A); |
| cur_ppm[0] = org_ppm[0] = ppm0; |
| avpll_inited[0] = 1; |
| }else{ |
| ppm0 = org_ppm[0]; |
| } |
| |
| cur_ppm[0] += ppm_delta; |
| ppm = cur_ppm[0]; |
| |
| regData9.uavPllCtl_avPllFreqOffsetC8_A = ppm_2_offset(ppm, org_ppm[0]); |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl9), regData9.u32); |
| |
| regData9.uavPllCtl_avPllFreqOffsetReadyC_A = 0x80; |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl9), regData9.u32); |
| |
| for(i=0; i<10000; i++); |
| |
| regData9.uavPllCtl_avPllFreqOffsetReadyC_A = 0; |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl9), regData9.u32); |
| } else { // For AVPLL-B |
| #if (BERLIN_CHIP_VERSION != BERLIN_BG2_CD) && (BERLIN_CHIP_VERSION != BERLIN_BG2CDP) |
| T32Gbl_avPllCtl40 regData40; |
| |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl40), ®Data40.u32); |
| |
| if(avpll_inited[1] == 0) { |
| ppm0 = offset_2_ppm(regData40.uavPllCtl_avPllFreqOffsetC8_B); |
| cur_ppm[1] = org_ppm[1] = ppm0; |
| avpll_inited[1] = 1; |
| }else{ |
| ppm0 = org_ppm[1]; |
| } |
| |
| cur_ppm[1] += ppm_delta; |
| ppm = cur_ppm[1]; |
| |
| regData40.uavPllCtl_avPllFreqOffsetC8_B = ppm_2_offset(ppm, org_ppm[1]); |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl40), regData40.u32); |
| |
| regData40.uavPllCtl_avPllFreqOffsetReadyC_B = 0x80; |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl40), regData40.u32); |
| |
| for(i=0; i<10000; i++); |
| |
| regData40.uavPllCtl_avPllFreqOffsetReadyC_B = 0; |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_avPllCtl40), regData40.u32); |
| #endif |
| } |
| |
| MVLOG(MOD_AVS, DBG_MID, "-- cur_ppm: %.1lf org_ppm: %.1lf diff: %.1lf\n", ppm, ppm0, ppm - ppm0); |
| return ppm - ppm0; |
| #endif |
| } |
| |
| void AVPLL_InitClock(void) |
| { |
| #ifndef FPGA_TAILORED_BOARDVER |
| #if (BERLIN_CHIP_VERSION >= BERLIN_B_0) |
| T32Gbl_ClkSwitch1 ClkSwitch1; |
| T32Gbl_clkSelect2 ClkSelect2; |
| T32Gbl_I2S2_LRCKCntl LRCKCntl; |
| T32Gbl_I2S2_BCLKCntl BCLKCntl; |
| |
| GA_REG_WORD32_READ((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_ClkSwitch1), &ClkSwitch1.u32); |
| ClkSwitch1.uClkSwitch_audio0ClkSwitch = 0; // source clock |
| ClkSwitch1.uClkSwitch_audio0ClkD3Switch = 0; // non DIV3 clock |
| ClkSwitch1.uClkSwitch_audio1ClkSwitch = 0; // source clock |
| ClkSwitch1.uClkSwitch_audio1ClkD3Switch = 0; // non DIV3 clock |
| ClkSwitch1.uClkSwitch_audio2ClkSwitch = 0; // source clock |
| ClkSwitch1.uClkSwitch_audio2ClkD3Switch = 0; // non DIV3 clock |
| ClkSwitch1.uClkSwitch_audio3ClkSwitch = 0; // source clock |
| ClkSwitch1.uClkSwitch_audio3ClkD3Switch = 0; // non DIV3 clock |
| GA_REG_WORD32_WRITE((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_ClkSwitch1), (ClkSwitch1.u32)); |
| |
| GA_REG_WORD32_READ((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_clkSelect2), &ClkSelect2.u32); |
| ClkSelect2.uclkSelect_audio1ClkPllSel = Gbl_clkSelect_audio1ClkPllSel_AVPllA3; |
| GA_REG_WORD32_WRITE((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_clkSelect2), (ClkSelect2.u32)); |
| |
| |
| // Set LRClk and BCLK to Pull Down. |
| GA_REG_WORD32_READ((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_I2S2_LRCKCntl), (&LRCKCntl.u32)); |
| LRCKCntl.uI2S2_LRCKCntl_PD_EN = 1; |
| GA_REG_WORD32_WRITE((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_I2S2_LRCKCntl), (LRCKCntl.u32)); |
| |
| GA_REG_WORD32_READ((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_I2S2_BCLKCntl), (&BCLKCntl.u32)); |
| BCLKCntl.uI2S2_BCLKCntl_PD_EN = 1; |
| GA_REG_WORD32_WRITE((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_I2S2_BCLKCntl), (BCLKCntl.u32)); |
| |
| #endif |
| #endif |
| } |
| |
| #else |
| |
| unsigned int gauchAvpllBaseAddr[AVPLL_MAX] = {(MEMMAP_AVIO_GBL_BASE + RA_avioGbl_AVPLLA), (MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_AVPLLB)}; |
| unsigned int gauchChannelAddr[] = {RA_avPll_C1, RA_avPll_C2, RA_avPll_C3, RA_avPll_C4, RA_avPll_C5, RA_avPll_C6, RA_avPll_C7, RA_avPll_C8}; |
| |
| int diag_videoFreq(int avpllGroupId, int freqIndex, int hdmiMode, int frameRate, float overSampleRate, int chId); |
| |
| int diag_setDPll(int avpllGroupId, int enable, int p_sync1, int p_sync2, int chId) |
| { |
| #if HAS_AVPLL_B |
| if(avpllGroupId < AVPLL_A || avpllGroupId > AVPLL_B) |
| return AVPLL_E_BADPARAM; |
| #else |
| if (avpllGroupId != AVPLL_A) |
| return AVPLL_E_BADPARAM; |
| #endif |
| |
| T32avPllCh_CTRL1 stAvPllCtrl1; |
| T32avPllCh_CTRL2 stAvPllCtrl2; |
| T32avPll_CTRL3 stAvPllCtrl3; |
| double ppm_from_dpll = 0; |
| unsigned int uiAvPllBase = 0; |
| |
| uiAvPllBase = gauchAvpllBaseAddr[avpllGroupId]; |
| |
| //Disable DPLL first |
| BFM_HOST_Bus_Read32(uiAvPllBase + RA_avPll_CTRL3, &stAvPllCtrl3.u32); |
| stAvPllCtrl3.uCTRL3_EN_DPLL_C &= ~(1<<(chId-1)); |
| BFM_HOST_Bus_Write32(uiAvPllBase + RA_avPll_CTRL3, stAvPllCtrl3.u32); |
| |
| if(!p_sync1) |
| { |
| if(enable) |
| dbg_printf(PRN_RES, "Warning p_sync1 is 0\n"); |
| } |
| else |
| { |
| ppm_from_dpll = (double)p_sync2/p_sync1; |
| dbg_printf(PRN_RES, " DPLL PPM is %f\n", ppm_from_dpll); |
| } |
| |
| |
| BFM_HOST_Bus_Read32(uiAvPllBase + gauchChannelAddr[chId-1] + RA_avPllCh_CTRL1, &stAvPllCtrl1.u32); |
| stAvPllCtrl1.uCTRL1_P_SYNC1 = p_sync1; |
| BFM_HOST_Bus_Write32(uiAvPllBase + gauchChannelAddr[chId-1] + RA_avPllCh_CTRL1, stAvPllCtrl1.u32); |
| |
| BFM_HOST_Bus_Read32(uiAvPllBase + gauchChannelAddr[chId-1] + RA_avPllCh_CTRL2, &stAvPllCtrl2.u32); |
| stAvPllCtrl2.uCTRL2_P_SYNC2 = p_sync2; |
| BFM_HOST_Bus_Write32(uiAvPllBase + gauchChannelAddr[chId-1] + RA_avPllCh_CTRL2, stAvPllCtrl2.u32); |
| |
| if(enable) |
| { |
| //enable DPLL |
| BFM_HOST_Bus_Read32(uiAvPllBase + RA_avPll_CTRL3, &stAvPllCtrl3.u32); |
| stAvPllCtrl3.uCTRL3_EN_DPLL_C |= (1<<(chId-1)); |
| BFM_HOST_Bus_Write32(uiAvPllBase + RA_avPll_CTRL3, stAvPllCtrl3.u32); |
| } |
| |
| return AVPLL_E_OK; |
| } |
| |
| void diag_assertReset(int avpllGroupId) |
| { |
| T32avPll_CTRL0 stAvPllCtrl0; |
| unsigned int uiAvPllBase = 0; |
| |
| uiAvPllBase = gauchAvpllBaseAddr[avpllGroupId]; |
| |
| //assert reset |
| BFM_HOST_Bus_Read32(uiAvPllBase + RA_avPll_CTRL0 , &stAvPllCtrl0.u32); |
| stAvPllCtrl0.uCTRL0_RESET_PLL = 1; |
| BFM_HOST_Bus_Write32(uiAvPllBase + RA_avPll_CTRL0 , stAvPllCtrl0.u32); |
| } |
| |
| void diag_deassertReset(int avpllGroupId) |
| { |
| volatile int i; |
| T32avPll_CTRL0 stAvPllCtrl0; |
| unsigned int uiAvPllBase = 0; |
| |
| uiAvPllBase = gauchAvpllBaseAddr[avpllGroupId]; |
| |
| for(i=0; i<10000; i++); |
| //deassert reset |
| BFM_HOST_Bus_Read32(uiAvPllBase + RA_avPll_CTRL0 , &stAvPllCtrl0.u32); |
| stAvPllCtrl0.uCTRL0_RESET_PLL = 0; |
| BFM_HOST_Bus_Write32(uiAvPllBase + RA_avPll_CTRL0 , stAvPllCtrl0.u32); |
| } |
| |
| void diag_powerDown(int avpllGroupId) |
| { |
| T32avPll_CTRL0 stAvPllCtrl0; |
| T32avPll_CTRL2 stAvPllCtrl2; |
| |
| unsigned int uiAvPllBase = 0; |
| uiAvPllBase = gauchAvpllBaseAddr[avpllGroupId]; |
| |
| BFM_HOST_Bus_Read32(uiAvPllBase + RA_avPll_CTRL0 , &stAvPllCtrl0.u32); |
| BFM_HOST_Bus_Read32(uiAvPllBase + RA_avPll_CTRL2 , &stAvPllCtrl2.u32); |
| stAvPllCtrl0.uCTRL0_PU = 0; |
| stAvPllCtrl2.uCTRL2_PU_C = 0; |
| BFM_HOST_Bus_Write32(uiAvPllBase + RA_avPll_CTRL0 , stAvPllCtrl0.u32); |
| BFM_HOST_Bus_Write32(uiAvPllBase + RA_avPll_CTRL2 , stAvPllCtrl2.u32); |
| } |
| |
| void diag_powerUp(int avpllGroupId) |
| { |
| T32avPll_CTRL0 stAvPllCtrl0; |
| T32avPll_CTRL2 stAvPllCtrl2; |
| |
| unsigned int uiAvPllBase = 0; |
| uiAvPllBase = gauchAvpllBaseAddr[avpllGroupId]; |
| |
| BFM_HOST_Bus_Read32(uiAvPllBase + RA_avPll_CTRL0 , &stAvPllCtrl0.u32); |
| BFM_HOST_Bus_Read32(uiAvPllBase + RA_avPll_CTRL2 , &stAvPllCtrl2.u32); |
| stAvPllCtrl0.uCTRL0_PU = 1; |
| stAvPllCtrl2.uCTRL2_PU_C = 0x7F; |
| BFM_HOST_Bus_Write32(uiAvPllBase + RA_avPll_CTRL0 , stAvPllCtrl0.u32); |
| BFM_HOST_Bus_Write32(uiAvPllBase + RA_avPll_CTRL2 , stAvPllCtrl2.u32); |
| |
| } |
| |
| int diag_setVCO(int avpllGroupId, int vco_freq_index) |
| { |
| unsigned int uiAvPllBase = 0; |
| T32avPll_CTRL0 stAvPllCtrl0; |
| T32avPll_CTRL1 stAvPllCtrl1; |
| T32avPll_CTRL2 stAvPllCtrl2; |
| T32avPllCh_CTRL0 stAvPllChCtrl0; |
| |
| #if HAS_AVPLL_B |
| if(avpllGroupId < AVPLL_A || avpllGroupId > AVPLL_B) |
| return AVPLL_E_BADPARAM; |
| #else |
| if (avpllGroupId != AVPLL_A) |
| return AVPLL_E_BADPARAM; |
| #endif |
| |
| uiAvPllBase = gauchAvpllBaseAddr[avpllGroupId]; |
| |
| dbg_printf(PRN_INFO, "PLL group: %d, Idx:%d, VCO freq change to %f\n", avpllGroupId, vco_freq_index, diag_vcoFreqs[vco_freq_index]); |
| |
| //following three settings are done under reset to improve long term reliability |
| diag_assertReset(avpllGroupId); |
| BFM_HOST_Bus_Read32(uiAvPllBase + RA_avPll_CTRL0 , &stAvPllCtrl0.u32); |
| BFM_HOST_Bus_Read32(uiAvPllBase + RA_avPll_CTRL1 , &stAvPllCtrl1.u32); |
| |
| stAvPllCtrl0.uCTRL0_SPEED = diag_avpllRegSPEED[vco_freq_index]; |
| stAvPllCtrl1.uCTRL1_FBDIV = diag_avpllRegFBDIV[vco_freq_index]; |
| stAvPllCtrl0.uCTRL0_INTPI = diag_avpllRegINTPI[vco_freq_index]; |
| |
| BFM_HOST_Bus_Write32(uiAvPllBase + RA_avPll_CTRL0 , stAvPllCtrl0.u32); |
| BFM_HOST_Bus_Write32(uiAvPllBase + RA_avPll_CTRL1 , stAvPllCtrl1.u32); |
| diag_deassertReset(avpllGroupId); |
| |
| BFM_HOST_Bus_Read32(uiAvPllBase + gauchChannelAddr[7] + RA_avPllCh8_CTRL0 , &stAvPllChCtrl0.u32); |
| stAvPllChCtrl0.uCTRL0_FREQ_OFFSET = diag_avpllRegFREQ_OFFSET_C8[vco_freq_index]; |
| BFM_HOST_Bus_Write32(uiAvPllBase + gauchChannelAddr[7] + RA_avPllCh8_CTRL0 , stAvPllChCtrl0.u32); |
| |
| if(AVPLL_A == avpllGroupId) |
| diag_pll_A_VCO_Setting = vco_freq_index; |
| else |
| diag_pll_B_VCO_Setting = vco_freq_index; |
| |
| cur_ppm[avpllGroupId] = org_ppm[avpllGroupId] = offset_2_ppm(stAvPllChCtrl0.uCTRL0_FREQ_OFFSET); |
| avpll_inited[avpllGroupId] = 1; |
| |
| //toggle the offset_rdy bit |
| { |
| volatile int i; |
| |
| BFM_HOST_Bus_Read32(uiAvPllBase + RA_avPll_CTRL2 , &stAvPllCtrl2.u32); |
| stAvPllCtrl2.uCTRL2_FREQ_OFFSET_READY_C = (1<<7); |
| BFM_HOST_Bus_Write32(uiAvPllBase + RA_avPll_CTRL2 , stAvPllCtrl2.u32); |
| |
| //add some delay because need to be asserted by 30ns |
| for(i=0; i<10000; i++); |
| |
| BFM_HOST_Bus_Read32(uiAvPllBase + RA_avPll_CTRL2 , &stAvPllCtrl2.u32); |
| stAvPllCtrl2.uCTRL2_FREQ_OFFSET_READY_C = 0; |
| BFM_HOST_Bus_Write32(uiAvPllBase + RA_avPll_CTRL2 , stAvPllCtrl2.u32); |
| } |
| |
| return AVPLL_E_OK; |
| } |
| |
| int diag_setChanOffset(int avpllGroupId, int offset, int chId) |
| { |
| unsigned int uiAvPllBase = 0, reg_offset = 0; |
| double ppm_from_offset = 0; |
| T32avPll_CTRL2 stAvPllCtrl2; |
| T32avPllCh_CTRL0 stAvPllChCtrl0; |
| |
| #if HAS_AVPLL_B |
| if(avpllGroupId < AVPLL_A || avpllGroupId > AVPLL_B) |
| return AVPLL_E_BADPARAM; |
| #else |
| if(avpllGroupId != AVPLL_A) |
| return AVPLL_E_BADPARAM; |
| #endif |
| |
| uiAvPllBase = gauchAvpllBaseAddr[avpllGroupId]; |
| |
| if(offset<0) |
| { |
| reg_offset = (1<<18) | (-offset) ; |
| } |
| else |
| { |
| reg_offset = offset; |
| } |
| |
| dbg_printf(PRN_INFO, "set A%d offset to 0x%x\n", chId, reg_offset); |
| |
| if(offset != 0) |
| { |
| ppm_from_offset = 1/((double)offset/4194304+1); |
| dbg_printf(PRN_RES, "offset PPM is %f\n", ppm_from_offset); |
| } |
| |
| //set offset register |
| BFM_HOST_Bus_Read32(uiAvPllBase + gauchChannelAddr[chId-1] + RA_avPllCh_CTRL0, &stAvPllChCtrl0.u32); |
| stAvPllChCtrl0.uCTRL0_FREQ_OFFSET = reg_offset; |
| BFM_HOST_Bus_Write32(uiAvPllBase + gauchChannelAddr[chId-1] + RA_avPllCh_CTRL0, stAvPllChCtrl0.u32); |
| |
| //toggle the offset_rdy bit |
| { |
| volatile int i; |
| |
| BFM_HOST_Bus_Read32(uiAvPllBase + RA_avPll_CTRL2 , &stAvPllCtrl2.u32); |
| stAvPllCtrl2.uCTRL2_FREQ_OFFSET_READY_C = (1<<(chId-1)); |
| BFM_HOST_Bus_Write32(uiAvPllBase + RA_avPll_CTRL2 , stAvPllCtrl2.u32); |
| |
| //add some delay because need to be asserted by 30ns |
| for(i=0; i<10000; i++); |
| |
| BFM_HOST_Bus_Read32(uiAvPllBase + RA_avPll_CTRL2 , &stAvPllCtrl2.u32); |
| stAvPllCtrl2.uCTRL2_FREQ_OFFSET_READY_C = 0; |
| BFM_HOST_Bus_Write32(uiAvPllBase + RA_avPll_CTRL2 , stAvPllCtrl2.u32); |
| |
| } |
| return AVPLL_E_OK; |
| } |
| |
| |
| int diag_setHDMI_Div(int avpllGroupId, int divHDMI, int chId) |
| { |
| unsigned int uiAvPllBase = 0, div_reg = 0; |
| T32avPllCh_CTRL3 stAvPllChCtrl3; |
| |
| #if HAS_AVPLL_B |
| if(avpllGroupId < AVPLL_A || avpllGroupId > AVPLL_B) |
| return AVPLL_E_BADPARAM; |
| #else |
| if (avpllGroupId != AVPLL_A) |
| return AVPLL_E_BADPARAM; |
| #endif |
| |
| uiAvPllBase = gauchAvpllBaseAddr[avpllGroupId]; |
| |
| switch(divHDMI) |
| { |
| case 0: |
| div_reg = 0; //disable DIV_HDMI |
| break; |
| case 1: |
| div_reg = 4; //div by 1, by pass |
| break; |
| case 2: |
| div_reg = 5; //div by 2 |
| break; |
| case 4: |
| div_reg = 6; //div by 4 |
| break; |
| case 6: |
| div_reg = 7; //div by 6 |
| break; |
| default: |
| { |
| dbg_printf(PRN_RES, "Invalid divider for HDMI\n"); |
| return AVPLL_E_BADPARAM; |
| } |
| } |
| |
| BFM_HOST_Bus_Read32(uiAvPllBase + gauchChannelAddr[chId-1] + RA_avPllCh_CTRL3 , &stAvPllChCtrl3.u32); |
| stAvPllChCtrl3.uCTRL3_DIV_HDMI = div_reg; |
| BFM_HOST_Bus_Write32(uiAvPllBase + gauchChannelAddr[chId-1] + RA_avPllCh_CTRL3 , stAvPllChCtrl3.u32); |
| |
| return AVPLL_E_OK; |
| } |
| |
| |
| |
| //divAV1 is the register value, not the actual divider |
| //mapping is (binary): |
| //000 = bypass, the whole divAV channel will be bypassed |
| //100 = div by 1 |
| //101 = div by 2 |
| //110 = div by 5 |
| //111 = div by 5 |
| int diag_setAV_Div(int avpllGroupId, int divAV1, int divAV2, int chId) |
| { |
| unsigned int uiAvPllBase = 0; |
| T32avPllCh_CTRL3 stAvPllChCtrl3; |
| |
| #if HAS_AVPLL_B |
| if(avpllGroupId < AVPLL_A || avpllGroupId > AVPLL_B) |
| return AVPLL_E_BADPARAM; |
| #else |
| if(avpllGroupId != AVPLL_A) |
| return AVPLL_E_BADPARAM; |
| #endif |
| |
| uiAvPllBase = gauchAvpllBaseAddr[avpllGroupId]; |
| |
| if(divAV2 !=0 && (divAV2<4 || divAV2>127)) |
| { |
| dbg_printf(PRN_RES, "Invalid divider for AV1\n"); |
| return AVPLL_E_BADPARAM; |
| } |
| |
| //program DIV_AV1 and DIV_AV2 |
| BFM_HOST_Bus_Read32(uiAvPllBase + gauchChannelAddr[chId-1] + RA_avPllCh_CTRL3 , &stAvPllChCtrl3.u32); |
| stAvPllChCtrl3.uCTRL3_DIV_AV1 = divAV1; |
| stAvPllChCtrl3.uCTRL3_DIV_AV2 = divAV2; |
| BFM_HOST_Bus_Write32(uiAvPllBase + gauchChannelAddr[chId-1] + RA_avPllCh_CTRL3 , stAvPllChCtrl3.u32); |
| |
| return AVPLL_E_OK; |
| } |
| |
| |
| //Input is the hex code for AV2 and AV3, see table III |
| int diag_setAV3_Div(int avpllGroupId, int divAV2, int divAV3, int chId) |
| { |
| unsigned int uiAvPllBase = 0; |
| T32avPllCh_CTRL3 stAvPllChCtrl3; |
| |
| #if HAS_AVPLL_B |
| if(avpllGroupId < AVPLL_A || avpllGroupId > AVPLL_B) |
| return AVPLL_E_BADPARAM; |
| #else |
| if(avpllGroupId != AVPLL_A) |
| return AVPLL_E_BADPARAM; |
| #endif |
| |
| uiAvPllBase = gauchAvpllBaseAddr[avpllGroupId]; |
| |
| //program DIV_AV2, DIV_AV3 |
| BFM_HOST_Bus_Read32(uiAvPllBase + gauchChannelAddr[chId-1] + RA_avPllCh_CTRL3 , &stAvPllChCtrl3.u32); |
| stAvPllChCtrl3.uCTRL3_DIV_AV2 = divAV2; |
| stAvPllChCtrl3.uCTRL3_DIV_AV3 = divAV3; |
| BFM_HOST_Bus_Write32(uiAvPllBase + gauchChannelAddr[chId-1] + RA_avPllCh_CTRL3 , stAvPllChCtrl3.u32); |
| |
| return AVPLL_E_OK; |
| } |
| |
| |
| //this is done by using offset and dpll |
| //inc=1 means increase freq to 1001/1000 |
| //inc=0 means disable 1KPPM (by setting offset to 0 and disable DPLL) |
| //inc=-1 means decrease freq to 1000/1001 |
| int diag_set1KPPM(int avpllGroupId, int inc, int chId) |
| { |
| unsigned int uiAvPllBase = 0; |
| |
| #if HAS_AVPLL_B |
| if(avpllGroupId < AVPLL_A || avpllGroupId > AVPLL_B) |
| return AVPLL_E_BADPARAM; |
| #else |
| if(avpllGroupId != AVPLL_A) |
| return AVPLL_E_BADPARAM; |
| #endif |
| |
| uiAvPllBase = gauchAvpllBaseAddr[avpllGroupId]; |
| if(inc) |
| { |
| if(inc>0) |
| { |
| //increase by 1KPPM |
| diag_setChanOffset(avpllGroupId, OFFSET_1KPPM_INC, chId); |
| diag_setDPll(avpllGroupId, 1, 1000, 1001, chId); |
| } |
| else |
| { |
| //decrease by 1KPPM |
| diag_setChanOffset(avpllGroupId, OFFSET_1KPPM_DEC, chId); |
| diag_setDPll(avpllGroupId, 1, 1001, 1000, chId); |
| } |
| } |
| else |
| { |
| //set offset to 0 and disable DPLL |
| diag_setChanOffset(avpllGroupId, 0, chId); |
| diag_setDPll(avpllGroupId, 0, 0, 0, chId); |
| } |
| return AVPLL_E_OK; |
| } |
| |
| /* new reference in MHz, chan : chan_A 0, Chan_B 1 */ |
| void diag_changeRefFreq(int vco_freq_index, int grp) |
| { |
| if(grp ==0) |
| { |
| diag_setVCO(AVPLL_A, vco_freq_index); |
| } |
| else |
| { |
| #if HAS_AVPLL_B |
| diag_setVCO(AVPLL_B, vco_freq_index); |
| #else |
| dbg_printf(PRN_RES,"\n AVPLL_B is removed\n"); |
| #endif |
| } |
| } |
| |
| |
| void diag_setMasterSlaveB(int MasterSlaveB_A, int MasterSlaveB_B) |
| { |
| T32avPll_CTRL1 stAvPllCtrl1_0, stAvPllCtrl1_1; |
| |
| BFM_HOST_Bus_Read32(gauchAvpllBaseAddr[0] + BA_avPll_CTRL1_MASTER_SLAVEB, &stAvPllCtrl1_0.u32); |
| BFM_HOST_Bus_Read32(gauchAvpllBaseAddr[1] + BA_avPll_CTRL1_MASTER_SLAVEB, &stAvPllCtrl1_1.u32); |
| |
| stAvPllCtrl1_0.uCTRL1_MASTER_SLAVEB = MasterSlaveB_A; |
| stAvPllCtrl1_1.uCTRL1_MASTER_SLAVEB = MasterSlaveB_B; |
| |
| BFM_HOST_Bus_Write32(gauchAvpllBaseAddr[0] + BA_avPll_CTRL1_MASTER_SLAVEB, stAvPllCtrl1_0.u32); |
| BFM_HOST_Bus_Write32(gauchAvpllBaseAddr[1] + BA_avPll_CTRL1_MASTER_SLAVEB, stAvPllCtrl1_1.u32); |
| |
| } |
| |
| //this function will enable AVPLL A and B and turn on caliberation |
| void AVPLL_Enable(void) |
| { |
| T32avPll_CTRL0 stAvPllCtrl0_A, stAvPllCtrl0_B; |
| T32avPll_CTRL1 stAvPllCtrl1_A, stAvPllCtrl1_B; |
| T32avPll_CTRL2 stAvPllCtrl2_A, stAvPllCtrl2_B; |
| T32avPllCh_CTRL0 stAvPllChCtrl0_A, stAvPllChCtrl0_B; |
| T32avPllCh_CTRL0 stAvPllCh8Ctrl0_A, stAvPllCh8Ctrl0_B; |
| T32Gbl_PadSelect regPadSelect; |
| T32Gbl_clkEnable regClkEnable; |
| volatile int i; |
| int avpll_initialized=0; |
| unsigned char chId = 0; |
| unsigned int uiAvPll_A_BaseAddr = 0, uiAvPll_B_BaseAddr = 0; |
| |
| T32avPll_CTRL0 stAvPllCtrl0; |
| T32avPll_CTRL1 stAvPllCtrl1; |
| T32avPll_CTRL2 stAvPllCtrl2; |
| T32avPll_CTRL3 stAvPllCtrl3; |
| unsigned int reg1=0, reg2=0, reg3=0, reg4=0; |
| |
| uiAvPll_A_BaseAddr = gauchAvpllBaseAddr[0]; |
| uiAvPll_B_BaseAddr = gauchAvpllBaseAddr[1]; |
| |
| // recover the default values first, added by HY |
| stAvPllCtrl0.uCTRL0_RESET_PLL = 0; |
| stAvPllCtrl0.uCTRL0_PU = 1; |
| stAvPllCtrl0.uCTRL0_INTPI = 3; |
| stAvPllCtrl0.uCTRL0_VDDR_1P45V = 1; |
| stAvPllCtrl0.uCTRL0_VDDR_0P9V = 5; |
| stAvPllCtrl0.uCTRL0_VTHVCOCAL = 2; |
| stAvPllCtrl0.uCTRL0_RESERVE_PLL = 1; |
| stAvPllCtrl0.uCTRL0_KVCO_EXT = 7; |
| stAvPllCtrl0.uCTRL0_KVCO_EXT_EN = 0; |
| stAvPllCtrl0.uCTRL0_V2I_EXT = 0xf; |
| stAvPllCtrl0.uCTRL0_V2I_EXT_EN = 0; |
| stAvPllCtrl0.uCTRL0_SPEED = 0; |
| stAvPllCtrl0.uCTRL0_CLK_DET_EN = 1; |
| stAvPllCtrl0.RSVDx0_b31 = 0; |
| |
| stAvPllCtrl1.uCTRL1_REFDIV = 0; |
| stAvPllCtrl1.uCTRL1_FBDIV = 0; |
| stAvPllCtrl1.uCTRL1_ICP = 5;; |
| stAvPllCtrl1.uCTRL1_LOADCAP = 0; |
| stAvPllCtrl1.uCTRL1_PLL_CALI_START =0 ; |
| stAvPllCtrl1.uCTRL1_MASTER_SLAVEB = 1; |
| stAvPllCtrl1.uCTRL1_TEST_ANA = 0; |
| stAvPllCtrl1.RSVDx4_b27 = 0; |
| |
| stAvPllCtrl2.uCTRL2_FREQ_OFFSET_READY_C = 0; |
| stAvPllCtrl2.uCTRL2_EN_LP_C = 0; |
| stAvPllCtrl2.uCTRL2_PU_C = 1; |
| stAvPllCtrl2.uCTRL2_RESET_C = 0; |
| stAvPllCtrl2.RSVDx8_b30 = 0; |
| |
| stAvPllCtrl3.uCTRL3_EN_DPLL_C= 0; |
| stAvPllCtrl3.RSVDxC_b8 = 0 ; |
| |
| BFM_HOST_Bus_Write32(uiAvPll_A_BaseAddr + RA_avPll_CTRL0 , stAvPllCtrl0.u32); |
| BFM_HOST_Bus_Write32(uiAvPll_A_BaseAddr + RA_avPll_CTRL1 , stAvPllCtrl1.u32); |
| BFM_HOST_Bus_Write32(uiAvPll_A_BaseAddr + RA_avPll_CTRL2 , stAvPllCtrl2.u32); |
| BFM_HOST_Bus_Write32(uiAvPll_A_BaseAddr + RA_avPll_CTRL3 , stAvPllCtrl3.u32); |
| |
| BFM_HOST_Bus_Write32(uiAvPll_B_BaseAddr + RA_avPll_CTRL0 , stAvPllCtrl0.u32); |
| BFM_HOST_Bus_Write32(uiAvPll_B_BaseAddr + RA_avPll_CTRL1 , stAvPllCtrl1.u32); |
| BFM_HOST_Bus_Write32(uiAvPll_B_BaseAddr + RA_avPll_CTRL2 , stAvPllCtrl2.u32); |
| BFM_HOST_Bus_Write32(uiAvPll_B_BaseAddr + RA_avPll_CTRL3 , stAvPllCtrl3.u32); |
| |
| BFM_HOST_Bus_Read32(uiAvPll_A_BaseAddr + RA_avPll_CTRL0 , ®1); |
| BFM_HOST_Bus_Read32(uiAvPll_A_BaseAddr + RA_avPll_CTRL1 , ®2); |
| BFM_HOST_Bus_Read32(uiAvPll_B_BaseAddr + RA_avPll_CTRL0 , ®3); |
| BFM_HOST_Bus_Read32(uiAvPll_B_BaseAddr + RA_avPll_CTRL1 , ®4); |
| |
| dbg_printf("AVPLL A CTRL0:%x,AVPLL A CTRL1:%x,AVPLL B CTRL0:%x,AVPLL B CTRL1:%x,\n", reg1, reg2, reg3, reg4); |
| |
| //speed is not defaut value, then pll must has been initialized. |
| BFM_HOST_Bus_Read32(uiAvPll_B_BaseAddr + RA_avPll_CTRL0 , &stAvPllCtrl0_B.u32); |
| if(stAvPllCtrl0_B.uCTRL0_SPEED != diag_avpllRegSPEED[0]) |
| avpll_initialized=1; |
| |
| //turn on the reset_A and reset_B |
| //these should be always on |
| BFM_HOST_Bus_Read32(uiAvPll_A_BaseAddr + RA_avPll_CTRL2, &stAvPllCtrl2_A.u32); |
| BFM_HOST_Bus_Read32(uiAvPll_B_BaseAddr + RA_avPll_CTRL2, &stAvPllCtrl2_B.u32); |
| stAvPllCtrl2_A.uCTRL2_RESET_C = 0; |
| stAvPllCtrl2_B.uCTRL2_RESET_C = 0; |
| BFM_HOST_Bus_Write32(uiAvPll_A_BaseAddr + RA_avPll_CTRL2, stAvPllCtrl2_A.u32); |
| if(!avpll_initialized) |
| BFM_HOST_Bus_Write32(uiAvPll_B_BaseAddr + RA_avPll_CTRL2, stAvPllCtrl2_B.u32); |
| |
| //turn on offset |
| //these should be always on |
| for(chId=1; chId<=7; chId++) |
| { |
| BFM_HOST_Bus_Read32(uiAvPll_A_BaseAddr + gauchChannelAddr[chId - 1] + RA_avPllCh_CTRL0 , &stAvPllChCtrl0_A.u32); |
| BFM_HOST_Bus_Read32(uiAvPll_B_BaseAddr + gauchChannelAddr[chId - 1] + RA_avPllCh_CTRL0 , &stAvPllChCtrl0_B.u32); |
| stAvPllChCtrl0_A.uCTRL0_RESERVE = 1; |
| stAvPllChCtrl0_B.uCTRL0_RESERVE = 1; |
| BFM_HOST_Bus_Write32(uiAvPll_A_BaseAddr + gauchChannelAddr[chId - 1] + RA_avPllCh_CTRL0 , stAvPllChCtrl0_A.u32); |
| if(!avpll_initialized) |
| BFM_HOST_Bus_Write32(uiAvPll_B_BaseAddr + gauchChannelAddr[chId - 1] + RA_avPllCh_CTRL0 , stAvPllChCtrl0_B.u32); |
| } |
| |
| BFM_HOST_Bus_Read32(uiAvPll_A_BaseAddr + gauchChannelAddr[7] + RA_avPllCh8_CTRL0 , &stAvPllCh8Ctrl0_A.u32); |
| BFM_HOST_Bus_Read32(uiAvPll_B_BaseAddr + gauchChannelAddr[7] + RA_avPllCh8_CTRL0 , &stAvPllCh8Ctrl0_B.u32); |
| stAvPllCh8Ctrl0_A.uCTRL0_RESERVE = 1; |
| stAvPllCh8Ctrl0_B.uCTRL0_RESERVE = 1; |
| BFM_HOST_Bus_Write32(uiAvPll_A_BaseAddr + gauchChannelAddr[7] + RA_avPllCh8_CTRL0 , stAvPllCh8Ctrl0_A.u32); |
| if(!avpll_initialized) |
| BFM_HOST_Bus_Write32(uiAvPll_B_BaseAddr + gauchChannelAddr[7] + RA_avPllCh8_CTRL0 , stAvPllCh8Ctrl0_B.u32); |
| |
| //set p9vi and icp to correct value |
| BFM_HOST_Bus_Read32(uiAvPll_A_BaseAddr + RA_avPll_CTRL0 , &stAvPllCtrl0_A.u32); |
| BFM_HOST_Bus_Read32(uiAvPll_B_BaseAddr + RA_avPll_CTRL0 , &stAvPllCtrl0_B.u32); |
| BFM_HOST_Bus_Read32(uiAvPll_A_BaseAddr + RA_avPll_CTRL1 , &stAvPllCtrl1_A.u32); |
| BFM_HOST_Bus_Read32(uiAvPll_B_BaseAddr + RA_avPll_CTRL1 , &stAvPllCtrl1_B.u32); |
| stAvPllCtrl0_A.uCTRL0_VDDR_0P9V = 0x0A; |
| stAvPllCtrl0_B.uCTRL0_VDDR_0P9V = 0x0A; |
| stAvPllCtrl0_A.uCTRL0_VTHVCOCAL = 0x2; |
| stAvPllCtrl0_B.uCTRL0_VTHVCOCAL = 0x2; |
| stAvPllCtrl1_A.uCTRL1_ICP = 0x5; |
| stAvPllCtrl1_B.uCTRL1_ICP = 0x5; |
| BFM_HOST_Bus_Write32(uiAvPll_A_BaseAddr + RA_avPll_CTRL0 , stAvPllCtrl0_A.u32); |
| BFM_HOST_Bus_Write32(uiAvPll_A_BaseAddr + RA_avPll_CTRL1 , stAvPllCtrl1_A.u32); |
| if(!avpll_initialized) |
| { |
| BFM_HOST_Bus_Write32(uiAvPll_B_BaseAddr + RA_avPll_CTRL0 , stAvPllCtrl0_B.u32); |
| BFM_HOST_Bus_Write32(uiAvPll_B_BaseAddr + RA_avPll_CTRL1 , stAvPllCtrl1_B.u32); |
| } |
| |
| diag_assertReset(AVPLL_A); |
| #if HAS_AVPLL_B |
| if(!avpll_initialized) |
| diag_assertReset(AVPLL_B); |
| #endif |
| |
| diag_setVCO(AVPLL_A, AVPLL_VCO_FREQ_2_227G); |
| if(!avpll_initialized) |
| diag_setVCO(AVPLL_B, AVPLL_VCO_FREQ_1_620G); |
| //power up |
| diag_powerUp(AVPLL_A); |
| #if HAS_AVPLL_B |
| if(!avpll_initialized) |
| diag_powerUp(AVPLL_B); |
| #endif |
| |
| //reset, has delay inside function |
| diag_deassertReset(AVPLL_A); |
| #if HAS_AVPLL_B |
| if(!avpll_initialized) |
| diag_deassertReset(AVPLL_B); |
| #endif |
| |
| //caliberate |
| diag_calibrate(AVPLL_A); |
| #if HAS_AVPLL_B |
| if(!avpll_initialized) |
| diag_calibrate(AVPLL_B); |
| #endif |
| |
| //set up VCO frequency. |
| diag_setVCO(AVPLL_A, AVPLL_VCO_FREQ_2_227G); |
| #if HAS_AVPLL_B |
| if(!avpll_initialized) |
| diag_setVCO(AVPLL_B, AVPLL_VCO_FREQ_1_620G); |
| #endif |
| |
| dbg_printf(PRN_RES, "Enabled AvPLL A and B Channels\n"); |
| |
| //Enable Clokcs from AVPLL-A to channels |
| BFM_HOST_Bus_Read32((MEMMAP_AVIO_GBL_BASE + RA_avioGbl_AVPLLA_CLK_EN), ®ClkEnable.u32); |
| regClkEnable.u32 = 0x3F; |
| BFM_HOST_Bus_Write32((MEMMAP_AVIO_GBL_BASE + RA_avioGbl_AVPLLA_CLK_EN), regClkEnable.u32); |
| |
| dbg_printf(PRN_RES, "Enable DVIO Pad\n"); |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_PadSelect), ®PadSelect.u32); |
| regPadSelect.uPadSelect_DVIO_OEN = 1; |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_PadSelect), regPadSelect.u32); |
| |
| for (i=0; i<8; i++) { |
| gAVPLLA_Channel_OutputClock[i] = 0; |
| gAVPLLB_Channel_OutputClock[i] = 0; |
| } |
| |
| diag_videoFreq(AVPLL_A, 5, 0, 0, 1, 1); // set default video0clk to 148.5M |
| diag_videoFreq(AVPLL_A, 5, 0, 0, 1, 2); // set default video1clk to 148.5M |
| #if HAS_AVPLL_B |
| diag_videoFreq(AVPLL_B, 1, 2, 0, 1, 1); // set default video1clk to 148.5M |
| #endif |
| |
| } |
| |
| int diag_calibrate(int avpllGroupId) |
| { |
| volatile int i; |
| unsigned int uiAvPllBase = 0; |
| T32avPll_CTRL1 stAvPllCtrl1; |
| |
| #if HAS_AVPLL_B |
| if(avpllGroupId < AVPLL_A || avpllGroupId > AVPLL_B) |
| return AVPLL_E_BADPARAM; |
| #else |
| if(avpllGroupId != AVPLL_A) |
| return AVPLL_E_BADPARAM; |
| #endif |
| |
| uiAvPllBase = gauchAvpllBaseAddr[avpllGroupId]; |
| |
| //turn off caliberation |
| BFM_HOST_Bus_Read32(uiAvPllBase + RA_avPll_CTRL1, &stAvPllCtrl1.u32); |
| stAvPllCtrl1.uCTRL1_PLL_CALI_START = 0;; |
| BFM_HOST_Bus_Write32(uiAvPllBase + RA_avPll_CTRL1, stAvPllCtrl1.u32); |
| |
| //add some delay |
| for(i=0; i<10000; i++); |
| |
| BFM_HOST_Bus_Read32(uiAvPllBase + RA_avPll_CTRL1, &stAvPllCtrl1.u32); |
| stAvPllCtrl1.uCTRL1_PLL_CALI_START = 1; |
| BFM_HOST_Bus_Write32(uiAvPllBase + RA_avPll_CTRL1, stAvPllCtrl1.u32); |
| return AVPLL_E_OK; |
| } |
| |
| int diag_avpllFreq(int avpllGroupId, int chId) |
| { |
| double vco_freq; |
| double freq_from_dpll, freq_from_offset; |
| int offset, sync1, sync2, divHDMI, divAV1, divAV2, divAV3; |
| int enDPLL; |
| unsigned int uiAvPllBase = 0; |
| T32avPllCh_CTRL0 stAvPllChCtrl0; |
| T32avPllCh_CTRL1 stAvPllChCtrl1; |
| T32avPllCh_CTRL2 stAvPllChCtrl2; |
| T32avPllCh_CTRL3 stAvPllChCtrl3; |
| T32avPll_CTRL3 stAvPllCtrl3; |
| |
| #if HAS_AVPLL_B |
| if(avpllGroupId < AVPLL_A || avpllGroupId > AVPLL_B) |
| return AVPLL_E_BADPARAM; |
| #else |
| if(avpllGroupId != AVPLL_A) |
| return AVPLL_E_BADPARAM; |
| #endif |
| |
| uiAvPllBase = gauchAvpllBaseAddr[avpllGroupId]; |
| |
| if(avpllGroupId == AVPLL_A) |
| vco_freq = diag_vcoFreqs[diag_pll_A_VCO_Setting]; |
| else |
| vco_freq = diag_vcoFreqs[diag_pll_B_VCO_Setting]; |
| |
| BFM_HOST_Bus_Read32(uiAvPllBase + RA_avPll_CTRL3, &stAvPllCtrl3.u32); |
| enDPLL = stAvPllCtrl3.uCTRL3_EN_DPLL_C & (1<<(chId-1)); |
| |
| //find offset, sync1, sync2, divHDMI, divAV1, divAV2, divAV3 for this channel |
| BFM_HOST_Bus_Read32(uiAvPllBase + gauchChannelAddr[chId-1] + RA_avPllCh_CTRL0, &stAvPllChCtrl0.u32); |
| BFM_HOST_Bus_Read32(uiAvPllBase + gauchChannelAddr[chId-1] + RA_avPllCh_CTRL1, &stAvPllChCtrl1.u32); |
| BFM_HOST_Bus_Read32(uiAvPllBase + gauchChannelAddr[chId-1] + RA_avPllCh_CTRL2, &stAvPllChCtrl2.u32); |
| BFM_HOST_Bus_Read32(uiAvPllBase + gauchChannelAddr[chId-1] + RA_avPllCh_CTRL3, &stAvPllChCtrl3.u32); |
| offset = stAvPllChCtrl0.uCTRL0_FREQ_OFFSET; |
| sync1 = stAvPllChCtrl1.uCTRL1_P_SYNC1; |
| sync2 = stAvPllChCtrl2.uCTRL2_P_SYNC2; |
| divHDMI= stAvPllChCtrl3.uCTRL3_DIV_HDMI; |
| divAV1 = stAvPllChCtrl3.uCTRL3_DIV_AV1; |
| divAV2 = stAvPllChCtrl3.uCTRL3_DIV_AV2; |
| divAV3 = stAvPllChCtrl3.uCTRL3_DIV_AV3; |
| |
| |
| if(enDPLL != 0) |
| freq_from_dpll = vco_freq*sync2/sync1; |
| else |
| freq_from_dpll = vco_freq; |
| |
| if(offset& (1<<18)) |
| { |
| offset = - (offset & ((1<<18)-1)); |
| } |
| freq_from_offset = vco_freq/((double)offset/4194304+1); |
| |
| //figure out which divider used |
| if(divHDMI != 0) |
| { |
| divHDMI &= 0x3; |
| dbg_printf(PRN_RES, "divHDMI on: %d\n", divHDMI); |
| |
| freq_from_dpll = freq_from_dpll/divHDMICode[divHDMI]; |
| freq_from_offset = freq_from_offset/divHDMICode[divHDMI]; |
| } |
| |
| if(divAV1 != 0) |
| { |
| divAV1 &= 0x3; |
| dbg_printf(PRN_RES, "divAV1 on: %d\n", divAV1); |
| |
| freq_from_dpll = freq_from_dpll/divAV1Code[divAV1]; |
| freq_from_offset = freq_from_offset/divAV1Code[divAV1]; |
| } |
| |
| if(divAV2 != 0) |
| { |
| if(divAV3 == 0) |
| { |
| dbg_printf(PRN_RES, "divAV2 on: %d\n", divAV2); |
| freq_from_dpll = freq_from_dpll/divAV2; |
| freq_from_offset = freq_from_offset/divAV2; |
| } |
| else |
| { |
| dbg_printf(PRN_RES, "divAV2 on: %d\n", divAV2); |
| dbg_printf(PRN_RES, "divAV3 on: %d\n", divAV3); |
| if( (((int)((double)divAV2/4+.5))-1) != (divAV3&0x7)) |
| { |
| dbg_printf(PRN_RES, "Invalid divAV2 and divAV3 combination\n"); |
| } |
| freq_from_dpll = freq_from_dpll*2/divAV2; |
| freq_from_offset = freq_from_offset*2/divAV2; |
| } |
| } |
| |
| dbg_printf(PRN_RES, "PLLA C%d Freq is: %fMHz(Offset) %fMHz(DPLL)\n", chId, freq_from_offset, freq_from_dpll); |
| |
| #if 0 |
| if (chId == 1) |
| avpllA1 = freq_from_dpll; |
| #endif |
| current_freq[avpllGroupId][chId] = freq_from_dpll; |
| |
| return AVPLL_E_OK; |
| } |
| |
| |
| int diag_vcoFreq(int avpllGroupId) |
| { |
| double ref_freq=25.0; |
| double freq_from_offset; |
| int offset, fbDiv; |
| unsigned int uiAvPllBase = 0; |
| T32avPllCh_CTRL0 stAvPllChCtrl0; |
| T32avPll_CTRL1 stAvPllCtrl1; |
| |
| #if HAS_AVPLL_B |
| if(avpllGroupId < AVPLL_A || avpllGroupId > AVPLL_B) |
| return AVPLL_E_BADPARAM; |
| #else |
| if(avpllGroupId != AVPLL_A) |
| return AVPLL_E_BADPARAM; |
| #endif |
| |
| uiAvPllBase = gauchAvpllBaseAddr[avpllGroupId]; |
| |
| BFM_HOST_Bus_Read32(uiAvPllBase + RA_avPll_C8 + RA_avPllCh_CTRL0, &stAvPllChCtrl0.u32); |
| offset = stAvPllChCtrl0.uCTRL0_FREQ_OFFSET; |
| |
| BFM_HOST_Bus_Read32(uiAvPllBase + RA_avPll_CTRL1 , &stAvPllCtrl1.u32); |
| fbDiv = stAvPllCtrl1.uCTRL1_FBDIV; |
| |
| if(offset& (1<<18)) |
| { |
| offset = - (offset & ((1<<18)-1)); |
| } |
| //note that the offset formula for VCO(C8) is different from C1-C7 |
| //according to John Ma, the formula is the same, just that ref_freq is CKOUT |
| //and VCO freq is CKIN |
| freq_from_offset = ref_freq*((double)offset/4194304+1); |
| |
| freq_from_offset = freq_from_offset*fbDiv; |
| |
| dbg_printf(PRN_RES, "PLLA VCO Freq is: %f\n", freq_from_offset); |
| |
| return AVPLL_E_OK; |
| } |
| |
| int diag_getVCOFreq(int hdmiMode, int freqIndex) |
| { |
| return (vcoSelectionTable[hdmiMode][freqIndex]); |
| } |
| |
| |
| int diag_getChannelOutputFreq(int AVPLLIndex,int chID) |
| { |
| if (chID<0 || chID>7) |
| return 0; |
| |
| if (AVPLLIndex == 0) //AVPLL-A |
| return (gAVPLLA_Channel_OutputClock[chID]); |
| else |
| return (gAVPLLB_Channel_OutputClock[chID]); |
| } |
| |
| |
| int AVPLL_GetVcoFreq(int hdmiMode, int freqIndex) |
| { |
| int uiVcoFreq = 0; |
| |
| uiVcoFreq = diag_getVCOFreq(hdmiMode, freqIndex); |
| |
| return uiVcoFreq; |
| } |
| |
| int AVPLL_GetChannelOutputFreq(int AVPLLIndex, int chID) |
| { |
| int uiChannelOutFreq = 0; |
| |
| if (chID<0 || chID>7) |
| return 0; |
| |
| uiChannelOutFreq = diag_getChannelOutputFreq(AVPLLIndex, chID); |
| |
| return uiChannelOutFreq; |
| } |
| |
| |
| //freq_index, 0 to 5, the 6 VCLKs |
| //hdmiMode, HDMI_8BIT_MODE, HDMI_10BIT_MODE, HDMI_12BIT_MODE |
| //frameRate, FRAME_RATE_59P94 FRAME_RATE_60 |
| //overSampleRate, 1, 2, 4, 8, 10, 12.5, 15 |
| int diag_videoFreq(int avpllGroupId, int freqIndex, int hdmiMode, int frameRate, float overSampleRate, int chId) |
| { |
| |
| unsigned int uiAvPllBase = 0; |
| |
| #if HAS_AVPLL_B |
| if(avpllGroupId < AVPLL_A || avpllGroupId > AVPLL_B) |
| return AVPLL_E_BADPARAM; |
| #else |
| if(avpllGroupId != AVPLL_A) |
| return AVPLL_E_BADPARAM; |
| #endif |
| |
| uiAvPllBase = gauchAvpllBaseAddr[avpllGroupId]; |
| |
| int vcoFreqIndex=vcoSelectionTable[hdmiMode][freqIndex]; |
| double vcoFreq, videoFreq; |
| int ppm1K=ppm1kSelectionTable[frameRate][freqIndex]; |
| double divider; |
| |
| if (chId<0 || chId>7) |
| return; |
| |
| dbg_printf(PRN_RES, "Set PLLA C%d:\n", chId); |
| //set VCO freq here |
| diag_setVCO(avpllGroupId, vcoFreqIndex); |
| dbg_printf(PRN_RES, "VCO freq=%f\n", diag_vcoFreqs[vcoFreqIndex]); |
| |
| //check to see if ppm1K is need |
| vcoFreq = diag_vcoFreqs[vcoFreqIndex]; |
| if(ppm1K<0) |
| { |
| vcoFreq = vcoFreq*1000/1001; |
| } |
| |
| if(ppm1K>0) |
| { |
| vcoFreq = vcoFreq*1001/1000; |
| } |
| diag_set1KPPM(avpllGroupId, ppm1K, chId); |
| |
| //get the video freq |
| videoFreq = diag_videoFreqs[freqIndex]; |
| if(frameRate) |
| { |
| //60Hz vclk is 1001/1000 times 59.94Hz vclk |
| videoFreq = videoFreq*1001/1000; |
| } |
| |
| dbg_printf(PRN_RES, "Video freq=%f\n", videoFreq); |
| |
| //disable all dividers |
| diag_setHDMI_Div(avpllGroupId, 0, chId); |
| diag_setAV_Div(avpllGroupId, 0, 0, chId); //divAV1 is for divide by 1, 0 will disable the whole divAV chain |
| diag_setAV3_Div(avpllGroupId, 0, 0, chId); |
| |
| //set the divider |
| if(overSampleRate>=10) |
| { |
| //use HDMI divider |
| divider = vcoFreq/videoFreq/overSampleRate; |
| dbg_printf(PRN_RES, "HDMI divider is %f %d\n", divider, (int)(divider+0.5)); |
| |
| diag_setHDMI_Div(avpllGroupId, (int)(divider+0.5), chId); |
| dbg_printf(PRN_RES, "PLLA C%d=%f\n", chId, videoFreq*overSampleRate); |
| } |
| else |
| { |
| divider = vcoFreq*2/videoFreq/overSampleRate; |
| dbg_printf(PRN_RES, "AV divider is %f %d\n", divider/2, (int)(divider+0.5)/2); |
| |
| if(((int)(divider+0.5))&1) |
| { |
| //fractional divider, use AV2 and AV3 |
| //figure out AV3, AV3 = round(AV2/4)-1 |
| int divAV3 = ((int)((double)divider/4+0.5))-1; |
| |
| //this enables divAV channel |
| diag_setAV_Div(avpllGroupId, 4, 0, chId); |
| |
| //add enable bit |
| divAV3 |= (1<<3); |
| diag_setAV3_Div(avpllGroupId, (int)(divider+0.5), divAV3, chId); |
| } |
| else |
| { |
| //integer divider, use AV2 only |
| diag_setAV_Div(avpllGroupId, 4, (int)(divider+0.5)/2, chId); |
| } |
| |
| dbg_printf(PRN_RES, "PLLA C%d=%f\n", chId, videoFreq*overSampleRate); |
| } |
| |
| if(AVPLL_A == avpllGroupId) |
| gAVPLLA_Channel_OutputClock[chId] = (unsigned int)(videoFreq*overSampleRate*1000000); |
| else |
| gAVPLLB_Channel_OutputClock[chId] = (unsigned int)(videoFreq*overSampleRate*1000000); |
| |
| return AVPLL_E_OK; |
| } |
| |
| |
| //freqIndex is the index into clock_freq[] array |
| int diag_clockFreq(int avpllGroupId, int freqIndex, int chId) |
| { |
| unsigned int uiAvPllBase = 0; |
| int diag_pll_VCO_Setting = 0; |
| |
| #if HAS_AVPLL_B |
| if(avpllGroupId < AVPLL_A || avpllGroupId > AVPLL_B) |
| return AVPLL_E_BADPARAM; |
| #else |
| if(avpllGroupId != AVPLL_A) |
| return AVPLL_E_BADPARAM; |
| #endif |
| |
| uiAvPllBase = gauchAvpllBaseAddr[avpllGroupId]; |
| |
| |
| if(avpllGroupId == AVPLL_A) |
| diag_pll_VCO_Setting = diag_pll_A_VCO_Setting; |
| else |
| diag_pll_VCO_Setting = diag_pll_B_VCO_Setting; |
| |
| if(freqIndex >= (sizeof(clk_freqs) / sizeof(CLK_FREQ))) |
| { |
| dbg_printf(PRN_RES, "freq Index not found\n"); |
| return 1; |
| } |
| |
| if(diag_pll_VCO_Setting != clk_freqs[freqIndex].vco_freq_index) |
| { |
| dbg_printf(PRN_RES, "VCO frequency is changed to %f!\n", |
| diag_vcoFreqs[clk_freqs[freqIndex].vco_freq_index]); |
| |
| diag_setVCO(avpllGroupId, clk_freqs[freqIndex].vco_freq_index); |
| } |
| |
| //change offset |
| diag_setChanOffset(avpllGroupId, clk_freqs[freqIndex].freq_offset, chId); |
| |
| //change p_sync |
| diag_setDPll(avpllGroupId, (clk_freqs[freqIndex].p_sync1!=0), |
| clk_freqs[freqIndex].p_sync1, |
| clk_freqs[freqIndex].p_sync2, chId); |
| |
| //disable all dividers |
| diag_setHDMI_Div(avpllGroupId, 0, chId); |
| diag_setAV_Div(avpllGroupId, 0, 0, chId); |
| diag_setAV3_Div(avpllGroupId, 0, 0, chId); |
| |
| //update now div |
| diag_setAV_Div(avpllGroupId, clk_freqs[freqIndex].divAV1, clk_freqs[freqIndex].divAV2, chId); |
| diag_setAV3_Div(avpllGroupId, clk_freqs[freqIndex].divAV2, clk_freqs[freqIndex].divAV3, chId); |
| |
| return 0; |
| } |
| |
| |
| //freq_index, 0 to 5, the 6 VCLKs |
| //hdmiMode, HDMI_8BIT_MODE, HDMI_10BIT_MODE, HDMI_12BIT_MODE |
| //frameRate, FRAME_RATE_59P94 FRAME_RATE_60 |
| //overSampleRate, 1, 2, 4, 8, 10, 12.5, 15 |
| int AVPLL_SetVideoFreq(int avpllGroupId, int freqIndex, int hdmiMode, int frameRate, float overSampleRate, int chId) |
| { |
| unsigned int uiErrCode = 0; |
| |
| if(hdmiMode < HDMI_8BIT_MODE || hdmiMode > HDMI_MAX_MODE) |
| return AVPLL_E_BADPARAM; |
| |
| #if HAS_AVPLL_B |
| if(avpllGroupId < AVPLL_A || avpllGroupId > AVPLL_B) |
| return AVPLL_E_BADPARAM; |
| #else |
| if(avpllGroupId != AVPLL_A) |
| return AVPLL_E_BADPARAM; |
| #endif |
| |
| uiErrCode = diag_videoFreq(avpllGroupId, freqIndex, hdmiMode, frameRate, overSampleRate, chId); |
| |
| return uiErrCode; |
| } |
| |
| int get_freqTabIndex(int vco_freq_index, int av_freq_index) |
| { |
| int i, tab_index=-1; |
| |
| for(i=0; i<(sizeof(clk_freqs) / sizeof(CLK_FREQ)); i++) |
| { |
| if(clk_freqs[i].vco_freq_index == vco_freq_index && clk_freqs[i].av_freq_index == av_freq_index) |
| { |
| tab_index = i; break; |
| } |
| } |
| |
| return tab_index; |
| } |
| |
| int AVPLL_Set(int groupId, int chanId, int avFreqIndex) |
| { |
| int freqTabIndex; |
| |
| if(groupId==0) // PLL A |
| { |
| // Search freqIndex in lookup table by avFreqIndex and vco_freq_index. |
| freqTabIndex = get_freqTabIndex(diag_pll_A_VCO_Setting, avFreqIndex); |
| if(freqTabIndex == -1) |
| return -1; |
| diag_clockFreq(AVPLL_A, freqTabIndex, chanId); |
| } |
| #if HAS_AVPLL_B |
| else if(groupId==1) // PLL B |
| { |
| freqTabIndex = get_freqTabIndex(diag_pll_B_VCO_Setting, avFreqIndex); |
| if(freqTabIndex == -1) |
| return -1; |
| |
| diag_clockFreq(AVPLL_B, freqTabIndex, chanId); |
| } |
| #endif |
| |
| return 0; |
| } |
| |
| //Fix Me -- (Satya) The below registers are not found |
| // secondary MCLK keeps 4x, other MCLK div4 to 1x |
| int AVPLL_SetDiv4() |
| { |
| T32avioGbl_ACLK0_CTRL stClk0Switch; |
| T32avioGbl_ACLK2_CTRL stClk2Switch; |
| T32avioGbl_ACLK3_CTRL stClk3Switch; |
| #ifdef CONFIG_MV_AMP_INTERNAL_ADAC_DISABLE |
| T32avioGbl_ACLK1_CTRL stClk1Switch; |
| #endif |
| |
| GA_REG_WORD32_READ((MEMMAP_AVIO_GBL_BASE + RA_avioGbl_ACLK0_CTRL), &stClk0Switch.u32); |
| GA_REG_WORD32_READ((MEMMAP_AVIO_GBL_BASE + RA_avioGbl_ACLK2_CTRL), &stClk2Switch.u32); |
| GA_REG_WORD32_READ((MEMMAP_AVIO_GBL_BASE + RA_avioGbl_ACLK3_CTRL), &stClk3Switch.u32); |
| |
| stClk0Switch.uACLK0_CTRL_clkSwitch = 1; // primary |
| stClk2Switch.uACLK2_CTRL_clkSwitch = 1; // mic |
| stClk3Switch.uACLK3_CTRL_clkSwitch = 1; // spdif |
| |
| #ifdef CONFIG_MV_AMP_INTERNAL_ADAC_DISABLE |
| GA_REG_WORD32_READ((MEMMAP_AVIO_GBL_BASE + RA_avioGbl_ACLK1_CTRL), &stClk1Switch.u32); |
| stClk1Switch.uACLK1_CTRL_clkSwitch = 1; // stereo |
| GA_REG_WORD32_WRITE((MEMMAP_AVIO_GBL_BASE + RA_avioGbl_ACLK1_CTRL), stClk1Switch.u32); |
| #endif |
| GA_REG_WORD32_WRITE((MEMMAP_AVIO_GBL_BASE + RA_avioGbl_ACLK0_CTRL), stClk0Switch.u32); |
| GA_REG_WORD32_WRITE((MEMMAP_AVIO_GBL_BASE + RA_avioGbl_ACLK2_CTRL), stClk2Switch.u32); |
| GA_REG_WORD32_WRITE((MEMMAP_AVIO_GBL_BASE + RA_avioGbl_ACLK3_CTRL), stClk3Switch.u32); |
| |
| |
| GA_REG_WORD32_READ((MEMMAP_AVIO_GBL_BASE + RA_avioGbl_ACLK0_CTRL), &stClk0Switch.u32); |
| GA_REG_WORD32_READ((MEMMAP_AVIO_GBL_BASE + RA_avioGbl_ACLK2_CTRL), &stClk2Switch.u32); |
| GA_REG_WORD32_READ((MEMMAP_AVIO_GBL_BASE + RA_avioGbl_ACLK3_CTRL), &stClk3Switch.u32); |
| |
| stClk0Switch.uACLK0_CTRL_clkSel = avioGbl_ACLK0_CTRL_clkSel_d4; |
| stClk2Switch.uACLK2_CTRL_clkSel = avioGbl_ACLK2_CTRL_clkSel_d4; |
| stClk3Switch.uACLK3_CTRL_clkSel = avioGbl_ACLK3_CTRL_clkSel_d4; |
| |
| GA_REG_WORD32_WRITE((MEMMAP_AVIO_GBL_BASE + RA_avioGbl_ACLK0_CTRL), stClk0Switch.u32); |
| GA_REG_WORD32_WRITE((MEMMAP_AVIO_GBL_BASE + RA_avioGbl_ACLK2_CTRL), stClk2Switch.u32); |
| GA_REG_WORD32_WRITE((MEMMAP_AVIO_GBL_BASE + RA_avioGbl_ACLK3_CTRL), stClk3Switch.u32); |
| |
| #ifdef CONFIG_MV_AMP_INTERNAL_ADAC_DISABLE |
| GA_REG_WORD32_READ((MEMMAP_AVIO_GBL_BASE + RA_avioGbl_ACLK1_CTRL), &stClk1Switch.u32); |
| stClk1Switch.uACLK1_CTRL_clkSel = avioGbl_ACLK1_CTRL_clkSel_d4; |
| GA_REG_WORD32_WRITE((MEMMAP_AVIO_GBL_BASE + RA_avioGbl_ACLK1_CTRL), stClk1Switch.u32); |
| #endif |
| } |
| |
| |
| //Fix Me -- (Satya) The below registers are not found |
| // S/W workaround is not required at BG2. |
| void AVPLL_EnableMicClk(int en) |
| { |
| /* T32avioGbl_AVPLLA_CLK_EN regClkEnable; |
| BFM_HOST_Bus_Read32((MEMMAP_AVIO_GBL_BASE + RA_avioGbl_AVPLLA_CLK_EN), ®ClkEnable.u32); |
| if (en) { |
| en = 1; |
| } |
| regClkEnable.uAVPLLA_CLK_EN_ctrl = en; |
| BFM_HOST_Bus_Write32((MEMMAP_AVIO_GBL_BASE + RA_avioGbl_AVPLLA_CLK_EN), regClkEnable.u32);*/ |
| return; |
| } |
| |
| /* PCR_TRACKING -- BG2 */ |
| // add read function here for adjustment, real adjustment to nominate frequency is cur-orig |
| void AVPLL_GetPPM(int grp, double *ppm_base, double *ppm_now) |
| { |
| double ppm0, ppm; |
| if(grp ==0) |
| { |
| ppm0 = org_ppm[0]; |
| ppm = cur_ppm[0]; |
| } |
| else // AVPLL B |
| { |
| ppm0 = org_ppm[1]; |
| ppm = cur_ppm[1]; |
| } |
| if(ppm_base) *ppm_base = ppm0; |
| if(ppm_now) *ppm_now = ppm; |
| } |
| |
| |
| double AVPLL_AdjustPPM(double ppm_delta, int grp) |
| { |
| volatile int i; |
| double ppm0, ppm; |
| unsigned int uiAvPllBase = 0; |
| |
| // For AVPLL-A |
| if(grp == 0) |
| uiAvPllBase = gauchAvpllBaseAddr[AVPLL_A]; |
| else |
| #if HAS_AVPLL_B |
| uiAvPllBase = gauchAvpllBaseAddr[AVPLL_B]; |
| #else |
| return 0; |
| #endif |
| |
| T32avPllCh8_CTRL0 stAvPllChCtrl0; |
| T32avPll_CTRL2 stAvPllCtrl2; |
| uiAvPllBase = gauchAvpllBaseAddr[AVPLL_A]; |
| |
| |
| BFM_HOST_Bus_Read32(uiAvPllBase + RA_avPll_C8 + RA_avPllCh8_CTRL0, &stAvPllChCtrl0.u32); |
| |
| if(avpll_inited[grp] == 0) { |
| ppm0 = offset_2_ppm(stAvPllChCtrl0.uCTRL0_FREQ_OFFSET); |
| cur_ppm[grp] = org_ppm[grp] = ppm0; |
| avpll_inited[grp] = 1; |
| }else{ |
| ppm0 = org_ppm[grp]; |
| } |
| |
| cur_ppm[grp] += ppm_delta; |
| ppm = cur_ppm[grp]; |
| |
| stAvPllChCtrl0.uCTRL0_FREQ_OFFSET = ppm_2_offset(ppm, org_ppm[grp]); |
| BFM_HOST_Bus_Write32(uiAvPllBase + RA_avPll_C8 + RA_avPllCh8_CTRL0, stAvPllChCtrl0.u32); |
| |
| BFM_HOST_Bus_Read32(uiAvPllBase + RA_avPll_CTRL2, &stAvPllCtrl2.u32); |
| stAvPllCtrl2.uCTRL2_FREQ_OFFSET_READY_C = 0x80; |
| BFM_HOST_Bus_Write32(uiAvPllBase + RA_avPll_CTRL2, stAvPllCtrl2.u32); |
| |
| for(i=0; i<10000; i++); |
| |
| stAvPllCtrl2.uCTRL2_FREQ_OFFSET_READY_C = 0; |
| BFM_HOST_Bus_Write32(uiAvPllBase + RA_avPll_CTRL2, stAvPllCtrl2.u32); |
| |
| MVLOG(MOD_AVS, DBG_MID, "-- cur_ppm: %.1lf org_ppm: %.1lf diff: %.1lf\n", ppm, ppm0, ppm - ppm0); |
| return ppm - ppm0; |
| } |
| |
| void AVPLL_InitClock(void) |
| { |
| T32Gbl_I2S2_LRCKCntl LRCKCntl; |
| T32Gbl_I2S2_BCLKCntl BCLKCntl; |
| T32avioGbl_ACLK0_CTRL stClk0Switch; |
| T32avioGbl_ACLK1_CTRL stClk1Switch; |
| T32avioGbl_ACLK2_CTRL stClk2Switch; |
| T32avioGbl_ACLK3_CTRL stClk3Switch; |
| |
| GA_REG_WORD32_READ((MEMMAP_AVIO_GBL_BASE + RA_avioGbl_ACLK0_CTRL), &stClk0Switch.u32); |
| GA_REG_WORD32_READ((MEMMAP_AVIO_GBL_BASE + RA_avioGbl_ACLK1_CTRL), &stClk1Switch.u32); |
| GA_REG_WORD32_READ((MEMMAP_AVIO_GBL_BASE + RA_avioGbl_ACLK2_CTRL), &stClk2Switch.u32); |
| GA_REG_WORD32_READ((MEMMAP_AVIO_GBL_BASE + RA_avioGbl_ACLK3_CTRL), &stClk3Switch.u32); |
| |
| stClk0Switch.uACLK0_CTRL_clkSwitch = 0; // source clock |
| stClk0Switch.uACLK0_CTRL_clkD3Switch = 0; // non DIV3 clock |
| stClk1Switch.uACLK1_CTRL_clkSwitch = 0; |
| stClk1Switch.uACLK1_CTRL_clkD3Switch = 0; |
| stClk2Switch.uACLK2_CTRL_clkSwitch = 0; |
| stClk2Switch.uACLK2_CTRL_clkD3Switch = 0; |
| stClk3Switch.uACLK3_CTRL_clkSwitch = 0; |
| stClk3Switch.uACLK3_CTRL_clkD3Switch = 0; |
| |
| |
| GA_REG_WORD32_WRITE((MEMMAP_AVIO_GBL_BASE + RA_avioGbl_ACLK0_CTRL), stClk0Switch.u32); |
| GA_REG_WORD32_WRITE((MEMMAP_AVIO_GBL_BASE + RA_avioGbl_ACLK1_CTRL), stClk1Switch.u32); |
| GA_REG_WORD32_WRITE((MEMMAP_AVIO_GBL_BASE + RA_avioGbl_ACLK2_CTRL), stClk2Switch.u32); |
| GA_REG_WORD32_WRITE((MEMMAP_AVIO_GBL_BASE + RA_avioGbl_ACLK3_CTRL), stClk3Switch.u32); |
| |
| |
| GA_REG_WORD32_READ((MEMMAP_AVIO_GBL_BASE + RA_avioGbl_ACLK1_CTRL), &stClk1Switch.u32); |
| stClk1Switch.uACLK1_CTRL_pllSel = 1; //Select A3 |
| GA_REG_WORD32_WRITE((MEMMAP_AVIO_GBL_BASE + RA_avioGbl_ACLK1_CTRL), stClk1Switch.u32); |
| |
| // Set LRClk and BCLK to Pull Down. |
| GA_REG_WORD32_READ((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_I2S2_LRCKCntl), (&LRCKCntl.u32)); |
| LRCKCntl.uI2S2_LRCKCntl_PD_EN = 1; |
| GA_REG_WORD32_WRITE((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_I2S2_LRCKCntl), (LRCKCntl.u32)); |
| |
| GA_REG_WORD32_READ((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_I2S2_BCLKCntl), (&BCLKCntl.u32)); |
| BCLKCntl.uI2S2_BCLKCntl_PD_EN = 1; |
| GA_REG_WORD32_WRITE((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_I2S2_BCLKCntl), (BCLKCntl.u32)); |
| } |
| |
| int resetAvPll(int avpllGroupId) |
| { |
| |
| unsigned int uiAvPllBase = 0; |
| |
| #if HAS_AVPLL_B |
| if(avpllGroupId < AVPLL_A || avpllGroupId > AVPLL_B) |
| return AVPLL_E_BADPARAM; |
| #else |
| if(avpllGroupId != AVPLL_A) |
| return AVPLL_E_BADPARAM; |
| #endif |
| |
| uiAvPllBase = gauchAvpllBaseAddr[avpllGroupId]; |
| |
| diag_assertReset(avpllGroupId); |
| diag_deassertReset(avpllGroupId); |
| |
| return AVPLL_E_OK; |
| } |
| |
| |
| //freqIndex is the index into clk_freqs_computed[] array |
| int diag_clockFreq_computed(int avpllGroupId, int freqIndex, int chId) |
| { |
| #if 0 |
| int diag_pll_VCO_Setting; |
| unsigned int uiAvPllBase = 0; |
| |
| if(avpllGroupId < AVPLL_A || avpllGroupId > AVPLL_B) |
| return AVPLL_E_BADPARAM; |
| |
| uiAvPllBase = gauchAvpllBaseAddr[avpllGroupId]; |
| |
| |
| if(avpllGroupId == AVPLL_A) |
| diag_pll_VCO_Setting=diag_pll_A_VCO_Setting; |
| else |
| diag_pll_VCO_Setting=diag_pll_B_VCO_Setting; |
| |
| if(freqIndex >= (sizeof(clk_freqs_computed) / sizeof(CLK_FREQ))) |
| { |
| dbg_printf(PRN_RES, "VCO Freq Index not found\n"); |
| return 1; |
| } |
| |
| if(clk_freqs_computed[freqIndex].invalid) |
| { |
| dbg_printf(PRN_RES, "Frequency entry is invalid!\n"); |
| return 1; |
| } |
| |
| if(diag_pll_VCO_Setting != clk_freqs_computed[freqIndex].vco_freq_index) |
| { |
| dbg_printf(PRN_RES, "VCO frequency is changed to %f!\n", |
| diag_vcoFreqs[clk_freqs_computed[freqIndex].vco_freq_index]); |
| |
| diag_setVCO(uiAvPllBase, clk_freqs_computed[freqIndex].vco_freq_index); |
| } |
| |
| //change offset |
| diag_setChanOffset(uiAvPllBase, clk_freqs_computed[freqIndex].freq_offset, chId); |
| |
| //change p_sync |
| diag_setDPll(uiAvPllBase, (clk_freqs_computed[freqIndex].p_sync1!=0), |
| clk_freqs_computed[freqIndex].p_sync1, |
| clk_freqs_computed[freqIndex].p_sync2, chId); |
| |
| //disable all dividers |
| diag_setHDMI_Div(uiAvPllBase, 0, chId); |
| diag_setAV_Div(uiAvPllBase, 0, 0, chId); |
| diag_setAV3_Div(uiAvPllBase, 0, 0, chId); |
| |
| //update now div |
| diag_setAV_Div(uiAvPllBase, clk_freqs_computed[freqIndex].divAV1, clk_freqs_computed[freqIndex].divAV2, chId); |
| diag_setAV3_Div(uiAvPllBase, clk_freqs_computed[freqIndex].divAV2, clk_freqs_computed[freqIndex].divAV3, chId); |
| |
| //dbg_printf(PRN_RES, "set A%d to %fMHz\n", chId, clk_freqs_computed[freqIndex].clkout_freq); |
| |
| return 0; |
| #endif |
| } |
| |
| |
| #endif // <- #if (BERLIN_CHIP_VERSION < BERLIN_BG2_Q) |
| #endif // <- #if defined(BERLIN) |
| |
| #endif |