📄 pll.c
字号:
void Test_ARMClock(void)
{
rCLKOUTCON =rCLKOUTCON&~(7<<12)|(2<<12); //CLKOUT 2:ARMCLK 3:HCLK, 4:PCLK
rSPCON&=~(1<<17); // CLKOUT enable
printf("[ARMCLK Source & Clock Divisor test]\n");
printf("[Now ARMCLK:HCLK:PCLK= 204:102:51 ]\n");
printf("Probe CLKOUT(TP1) & check Clock speed !!!\n\n");
printf("Test Sequence\n");
printf("1:MPLL CLK(204MHz) ==> 2:EXTERNAL CLK(12MHz) ==> 3:DIVIDED EXTERNAL CLK(3MHz)\n");
printf("==> 4:MPLL CLK(204MHz) ==> 5:SYSCLK/2(101MHz) ==> 6:SYSCLK/2 & DVS ON(51MHz)\n");
printf("==> 7:MPLL CLK(204MHz)\n\n");
printf("Hit the any key to start test !!! \n");
getchar();
////////////////////////// 1:MPLL CLK(204MHz) /////////////////////////////////
Delay(10000);
///////////////////////// 2:EXTERNAL CLK(12MHz) /////////////////////////////
rCLKSRCCON&=~(1<<4);
ChangeSDRAMParameter(FIN/2);
Delay(1000);
//////////////////////// 3:DIVIDED EXTERNAL CLK(3MHz) ///////////////////////
rCLKSRCCON|=(1<<3);
ChangeSDRAMParameter(FIN/8);
rCLKSRCCON=rCLKSRCCON&~(7<<0)|(2<<0);
Delay(250);
//////////////////////// 4:MPLL CLK(204MHz) //////////////////////////////////
rCLKSRCCON=rCLKSRCCON&~(0xf<<0)|(1<<4);
ChangeSDRAMParameter(HCLK);
Delay(10000);
//////////////////////// 5:SYSCLK/2(101MHz) ///////////////////////////////////
rCLKDIVCON|=(1<<16);
ChangeSDRAMParameter(HCLK/2);
Delay(5000);
//////////////////////// 6:SYSCLK/2 & DVS ON(51MHz) ///////////////////////////
rCLKDIVCON|=(1<<17);
Delay(2500);
//////////////////////// 7:MPLL CLK(204MHz) ///////////////////////////////////
rCLKDIVCON&=~((1<<17)|(1<<16));
ChangeSDRAMParameter(HCLK);
printf("ARMCLK change test OK!!! \n");
}
void Test_Clk_divide(void)
{
//////////////////////// HCLK Divide test ////////////////////////////
rCLKOUTCON =rCLKOUTCON&~(7<<12)|(3<<12); //CLKOUT 2:ARMCLK 3:HCLK, 4:PCLK
rSPCON&=~(1<<17); // CLKOUT enable
printf("\nMPLL=%.2fMHz, ARMCLK=%.2fMHz (%d:%d:%d), HCLK=%.2fMHz, PCLK=%.2fMHz\n\n",(float)MPLL/1.0e6,(float)ARMCLK/1.0e6,ARMCLKdiv+1,(ARMCLKdiv+1)*(HCLKdiv+1),(ARMCLKdiv+1)*(HCLKdiv+1)*(PCLKdiv+1),(float)HCLK/1.0e6,(float)PCLK/1.0e6);
printf("[HCLK Divide test]\n");
printf("[Now ARMCLK:HCLK:PCLK= 120:120:60 ]\n");
printf("Probe CLKOUT(TP1) & check Clock speed !!!\n\n");
////////////////////////////////////////////////////////////////////////////////////
PreChangeSDRAMParameter();
SetMPLL( 52, 1, 0); // 240 MHz
SetCLKDIV( 1, 0, 1);
GlobalCLK();
ChangeSDRAMParameter(HCLK);
////////////////////////// 1:1 HCLK /////////////////////////////////
rCLKDIVCON=rCLKDIVCON&~(0x7)|(1<<2)|(0);
GlobalCLK();
ChangeSDRAMParameter(HCLK);
Init_LogicalConsole();
printf("\nMPLL=%.2fMHz, ARMCLK=%.2fMHz (%d:%d:%d), HCLK=%.2fMHz, PCLK=%.2fMHz\n\n",(float)MPLL/1.0e6,(float)ARMCLK/1.0e6,ARMCLKdiv+1,(ARMCLKdiv+1)*(HCLKdiv+1),(ARMCLKdiv+1)*(HCLKdiv+1)*(PCLKdiv+1),(float)HCLK/1.0e6,(float)PCLK/1.0e6);
MemoryTest();
////////////////////////// 1:2 HCLK /////////////////////////////////
rCLKDIVCON=rCLKDIVCON&~(0x7)|(1<<2)|(1);
GlobalCLK();
ChangeSDRAMParameter(HCLK);
Init_LogicalConsole();
printf("\nMPLL=%.2fMHz, ARMCLK=%.2fMHz (%d:%d:%d), HCLK=%.2fMHz, PCLK=%.2fMHz\n\n",(float)MPLL/1.0e6,(float)ARMCLK/1.0e6,ARMCLKdiv+1,(ARMCLKdiv+1)*(HCLKdiv+1),(ARMCLKdiv+1)*(HCLKdiv+1)*(PCLKdiv+1),(float)HCLK/1.0e6,(float)PCLK/1.0e6);
MemoryTest();
////////////////////////// 1:3 HCLK /////////////////////////////////
rCLKDIVCON=rCLKDIVCON&~(0x7)|(1<<2)|(2);
GlobalCLK();
ChangeSDRAMParameter(HCLK);
Init_LogicalConsole();
printf("\nMPLL=%.2fMHz, ARMCLK=%.2fMHz (%d:%d:%d), HCLK=%.2fMHz, PCLK=%.2fMHz\n\n",(float)MPLL/1.0e6,(float)ARMCLK/1.0e6,ARMCLKdiv+1,(ARMCLKdiv+1)*(HCLKdiv+1),(ARMCLKdiv+1)*(HCLKdiv+1)*(PCLKdiv+1),(float)HCLK/1.0e6,(float)PCLK/1.0e6);
MemoryTest();
////////////////////////// 1:4 HCLK /////////////////////////////////
rCLKDIVCON=rCLKDIVCON&~(0x7)|(1<<2)|(3);
GlobalCLK();
ChangeSDRAMParameter(HCLK);
Init_LogicalConsole();
printf("\nMPLL=%.2fMHz, ARMCLK=%.2fMHz (%d:%d:%d), HCLK=%.2fMHz, PCLK=%.2fMHz\n\n",(float)MPLL/1.0e6,(float)ARMCLK/1.0e6,ARMCLKdiv+1,(ARMCLKdiv+1)*(HCLKdiv+1),(ARMCLKdiv+1)*(HCLKdiv+1)*(PCLKdiv+1),(float)HCLK/1.0e6,(float)PCLK/1.0e6);
MemoryTest();
rCLKDIVCON=rCLKDIVCON&~(0x7)|(1<<2)|(1);
SetMPLL(42,1,0);
SetCLKDIV( 0, 1, 1);
GlobalCLK();
ChangeSDRAMParameter(HCLK);
Init_LogicalConsole();
printf("MPLL=%.2fMHz, ARMCLK=%.2fMHz (%d:%d:%d), HCLK=%.2fMHz, PCLK=%.2fMHz\n\n",(float)MPLL/1.0e6,(float)ARMCLK/1.0e6,ARMCLKdiv+1,(ARMCLKdiv+1)*(HCLKdiv+1),(ARMCLKdiv+1)*(HCLKdiv+1)*(PCLKdiv+1),(float)HCLK/1.0e6,(float)PCLK/1.0e6);
printf("HCLK change test OK!!! \n");
/////////////////////////// PCLK Divide test ///////////////////////////////
rCLKOUTCON =rCLKOUTCON&~(7<<12)|(4<<12); //CLKOUT 2:ARMCLK 3:HCLK, 4:PCLK
SetMPLL( 52, 1, 1);
rCLKDIVCON=rCLKDIVCON&~(0x7)|(1<<2)|(0);
GlobalCLK();
ChangeSDRAMParameter(HCLK);
Init_LogicalConsole();
printf("MPLL=%.2fMHz, ARMCLK=%.2fMHz (%d:%d:%d), HCLK=%.2fMHz, PCLK=%.2fMHz\n\n",(float)MPLL/1.0e6,(float)ARMCLK/1.0e6,ARMCLKdiv+1,(ARMCLKdiv+1)*(HCLKdiv+1),(ARMCLKdiv+1)*(HCLKdiv+1)*(PCLKdiv+1),(float)HCLK/1.0e6,(float)PCLK/1.0e6);
printf("\n\n\n[PCLK Divide test]\n");
printf("[Now ARMCLK:HCLK:PCLK= 120:120:60 ]\n");
printf("Probe CLKOUT(TP1) & check Clock speed !!!\n\n");
printf("Test Sequence\n");
printf("1:1 PCLK(60MHz) ==> 1:2 PCLK(30MHz)\n");
printf("Hit the any key to start test !!! \n");
getchar();
////////////////////////// 1:1 PCLK(60MHz) /////////////////////////////////
rCLKDIVCON=rCLKDIVCON&~(0x7)|(0<<2)|(1);
Delay(10000);
////////////////////////// 1:2 PCLK(30MHz) /////////////////////////////////
rCLKDIVCON=rCLKDIVCON&~(0x7)|(1<<2)|(1);
Delay(10000);
SetMPLL(42,1,0);
SetCLKDIV( 0, 1, 1);
GlobalCLK();
ChangeSDRAMParameter(HCLK);
Init_LogicalConsole();
printf("MPLL=%.2fMHz, ARMCLK=%.2fMHz (%d:%d:%d), HCLK=%.2fMHz, PCLK=%.2fMHz\n\n",(float)MPLL/1.0e6,(float)ARMCLK/1.0e6,ARMCLKdiv+1,(ARMCLKdiv+1)*(HCLKdiv+1),(ARMCLKdiv+1)*(HCLKdiv+1)*(PCLKdiv+1),(float)HCLK/1.0e6,(float)PCLK/1.0e6);
printf("PCLK change test OK!!! \n");
}
void Test_HoldMode(void)
{
printf("[Power Saving Mode by Stopping Each Block]\n");
printf("Check the current cunsumption. Type any key to proceed.\n");
printf("All Clocks On.\n");
rCLKDIVCON&=~(0x3<<14);
rHCLKCON=(1<<31)|(1<<30)|(1<<29)|(1<<28)|(1<<27)|(1<<26)|(1<<25)|(1<<24)|(1<<23)\
// L2RAM1 L2RAM2 DDR1 DDR2 CSI NFLASH SROM Matrix M DMA1
|(1<<22)|(1<<21)|(1<<20)|(1<<19)|(1<<18)|(1<<17)|(1<<16)|(1<<15)|(1<<14)\
// M DMA0 MBX DSP OTG IrDA MODEM UHost DBLOCK VLX
|(1<<13)|(1<<12)|(1<<11)|(1<<10)|(1<<9)|(1<<8)|(1<<7)|(1<<6)|(1<<5)\
// LCD CAMIF POST DCTQ MC ME DDMA3 DDMA2 DDMA1
|(1<<4)|(1<<3)|(1<<2)|(1<<1)|(1<<0);
// DDMA0 DMA3 DMA2 DMA1 DMA0
rPCLKCON=(1<<31)|(1<<30)|(1<<29)|(1<<28)|(1<<27)|(1<<26)|(1<<25)|(1<<24)|(1<<23)\
// DDMA3 DDMA2 DDMA1 DDMA0 DMA3 DMA2 DMA1 DMA0 MDMA1
|(1<<22)|(1<<21)|(1<<20)|(1<<19)|(1<<18)|(1<<17)|(1<<16)|(1<<15)|(1<<14)\
// MDMA0 CSI GPIO Key RTC WDT PWM DSP PCM
|(1<<13)|(1<<12)|(1<<11)|(1<<10)|(1<<9)|(1<<8)|(1<<7)|(1<<6)|(1<<5)\
// I2S AC97 reserved SDIO Mstick reserved SPI Udevice
|(1<<4)|(1<<3)|(1<<2)|(1<<1)|(1<<0);
// I2C IrDA Uart2 Uart1 Uart0
rSCLKCON=(0x1ff<<23)|(1<<22)|(1<<21)|(1<<20)|(1<<19)|(1<<18)|(1<<17)|(1<<16)|(1<<15)|(1<<14)\
// I2SCLK LCD UART MBX 3D MBX Dmemory Dsystem L2RAM1 L2RAM0
|(1<<13)|(1<<12)|(1<<11)|(1<<10)|(1<<9)|(1<<8)|(1<<7)|(1<<6)|(1<<5)\
// DDR1 DDR0 CSI OTG12 CAMIF Deblock VLX POST DCTQ
|(1<<4)|(1<<3)|(1<<2)|(1<<1)|(1<<0);
// ME IrDA OTG Host Device
getchar();
printf("L2RAM Off.\n"); //7mA
rHCLKCON&=~(0x3<<30);
// rPCLKCON&=~(0x3<<30);
rSCLKCON&=~(0x3<<14);
getchar();
printf("DDR Off.\n"); // DDR1 //2mA
rHCLKCON&=~(0x1<<29);
// rPCLKCON&=~(0x3<<30);
rSCLKCON&=~(0x1<<13);
getchar();
printf("CSI Off.\n"); // 1mA
rHCLKCON&=~(0x1<<27);
rPCLKCON&=~(0x1<<21);
rSCLKCON&=~(0x1<<11);
getchar();
printf("Nand flash Off.\n"); // 1mA
rHCLKCON&=~(0x1<<26);
// rPCLKCON&=~(0x1<<21);
// rSCLKCON&=~(0x1<<11);
getchar();
printf("MODEM Off.\n"); // 2mA
rHCLKCON&=~((0x3<<22)|(0x1<<17));
rPCLKCON&=~(0x3<<22);
// rSCLKCON&=~(0x1<<11);
getchar();
printf("MBX Off.\n"); // 51MHz (46mA), 102MHz(80mA)
rHCLKCON&=~(0x1<<21);
// rPCLKCON&=~(0x1<<21);
rSCLKCON&=~(0x3<<18);
getchar();
printf("DSP Off.\n"); // include DSP DMA //30mA
rHCLKCON&=~((0x1<<20)|(0xf<<4));
rPCLKCON&=~((0xf<<28)|(0x1<<15));
rSCLKCON&=~(0x3<<16);
getchar();
printf("USB OTG Off.\n"); // 10mA
rHCLKCON&=~(0x1<<19);
// rPCLKCON&=~(0x1<<21);
rSCLKCON&=~((0x1<<2)|(0x1<<10));
getchar();
printf("USB HOST Off.\n"); // 3mA
rHCLKCON&=~(0x1<<16);
// rPCLKCON&=~(0x1<<21);
rSCLKCON&=~(0x1<<1);
getchar();
printf("USB Device Off.\n"); // 1mA
// rHCLKCON&=~(0x1<<27);
rPCLKCON&=~(0x1<<5);
rSCLKCON&=~(0x1<<0);
getchar();
printf("IrDA Off.\n"); // 0mA
rHCLKCON&=~(0x1<<18);
rPCLKCON&=~(0x1<<3);
rSCLKCON&=~(0x1<<3);
getchar();
printf("MPEG4 DCTQ Off.\n"); // 25mA
rHCLKCON&=~(0x1<<10);
// rPCLKCON&=~(0x1<<21);
rSCLKCON&=~(0x1<<5);
getchar();
printf("MPEG4 MC Off.\n"); // 4mA
rHCLKCON&=~(0x1<<9);
// rPCLKCON&=~(0x1<<21);
// rSCLKCON&=~(0x1<<5);
getchar();
printf("MPEG4 ME Off.\n"); // 8mA
rHCLKCON&=~(0x1<<8);
// rPCLKCON&=~(0x1<<21);
rSCLKCON&=~(0x1<<4);
getchar();
printf("DEBLOCK Off.\n"); // 2mA
rHCLKCON&=~(0x1<<15);
// rPCLKCON&=~(0x1<<21);
rSCLKCON&=~(0x1<<8);
getchar();
printf("VLX Off.\n"); // 6mA
rHCLKCON&=~(0x1<<14);
// rPCLKCON&=~(0x1<<21);
rSCLKCON&=~(0x1<<7);
getchar();
printf("POST Off.\n"); // 4mA
rHCLKCON&=~(0x1<<11);
// rPCLKCON&=~(0x1<<21);
rSCLKCON&=~(0x1<<6);
getchar();
printf("LCD Off.\n"); // 7mA
rHCLKCON&=~(0x1<<13);
// rPCLKCON&=~(0x1<<21);
rSCLKCON&=~(0x1<<21);
getchar();
printf("CAMERA Off.\n"); // 10mA
rHCLKCON&=~(0x1<<12);
// rPCLKCON&=~(0x1<<21);
rSCLKCON&=~(0x1<<9);
getchar();
printf("DMA Off.\n"); // 2mA
rHCLKCON&=~(0xf<<0);
rPCLKCON&=~(0xf<<24);
// rSCLKCON&=~(0x1<<5);
getchar();
printf("Key pad Off.\n"); // 0mA
// rHCLKCON&=~(0x1<<10);
rPCLKCON&=~(0x1<<19);
// rSCLKCON&=~(0x1<<5);
getchar();
printf("RTC Off.\n"); // 0mA
// rHCLKCON&=~(0x1<<10);
rPCLKCON&=~(0x1<<18);
// rSCLKCON&=~(0x1<<5);
getchar();
printf("Watch Dog Timer Off.\n"); // 0mA
// rHCLKCON&=~(0x1<<10);
rPCLKCON&=~(0x1<<17);
// rSCLKCON&=~(0x1<<5);
getchar();
printf("PWM Timer Off.\n"); // 1mA
// rHCLKCON&=~(0x1<<10);
rPCLKCON&=~(0x1<<16);
// rSCLKCON&=~(0x1<<5);
getchar();
printf("PCM Off.\n"); // 2mA
// rHCLKCON&=~(0x1<<10);
rPCLKCON&=~(0x1<<14);
// rSCLKCON&=~(0x1<<5);
getchar();
printf("I2S.\n"); // 0mA
// rHCLKCON&=~(0x1<<10);
rPCLKCON&=~(0x1<<13);
rSCLKCON&=~(0x1<<22);
getchar();
printf("AC97 Off.\n"); // 1mA
// rHCLKCON&=~(0x1<<10);
rPCLKCON&=~(0x1<<12);
// rSCLKCON&=~(0x1<<5);
getchar();
printf("SDIO Off.\n"); // 1mA
// rHCLKCON&=~(0x1<<10);
rPCLKCON&=~(0x1<<9);
// rSCLKCON&=~(0x1<<5);
getchar();
printf("Memory Stick Off.\n"); // 1mA
// rHCLKCON&=~(0x1<<10);
rPCLKCON&=~(0x1<<8);
// rSCLKCON&=~(0x1<<5);
getchar();
printf("SPI Off.\n"); // 0mA
// rHCLKCON&=~(0x1<<10);
rPCLKCON&=~(0x1<<6);
// rSCLKCON&=~(0x1<<5);
getchar();
printf("I2C Off.\n"); // 1mA
// rHCLKCON&=~(0x1<<10);
rPCLKCON&=~(0x1<<4);
// rSCLKCON&=~(0x1<<5);
getchar();
printf("Uart Off.\n"); // 2mA
// rHCLKCON&=~(0x1<<10);
rPCLKCON&=~(0x3<<1);
// rSCLKCON&=~(0x1<<5);
getchar();
printf("All Clocks On.\n");
rHCLKCON=(0xffffffff);
rPCLKCON=(0xffffffff);
rSCLKCON=(0xffffffff);
}
void Test_Dclk(void)
{
int s_clk, Dclk_div, Dclk_cmp;
unsigned int Dclk;
printf(" DCLK Test \n");
printf(" 0: PCLK=51MHz 1: USBCLK=48MHz\n");
printf("Select the DCLK Source clock: 0 or 1\n");
s_clk=GetIntNum();
printf(" Input the DCLKDIV (DCLKDIV+1)\n");
Dclk_div=GetIntNum();
printf(" Input the DCLKCMP(DCLKCMP+1)\n");
Dclk_cmp=GetIntNum();
rCLKOUTCON=(0x5<<12)|((Dclk_cmp)<<8)|((Dclk_div)<<4)|(s_clk<<1)|(0x1<<0);
rSPCON&=~(1<<17); // CLKOUT enable
if(s_clk==0)
Dclk = (unsigned int)( (float)(51000000)/(float)(Dclk_div+1));
else if (s_clk==1)
Dclk = (unsigned int)( (float)(48000000)/(float)(Dclk_div+1));
printf("\n[Dclk: %4.1f MHz]\n", (float)Dclk/1.0e6);
printf("High level duration: %d\n", Dclk_div-Dclk_cmp);
printf("High level duration: %d\n", Dclk_cmp+1);
printf("Hit the any key to exit !!!");
getchar();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -