pll.c
上传用户:zbk8730
上传日期:2017-08-10
资源大小:12168k
文件大小:8k
源码类别:

uCOS

开发平台:

C/C++

  1. /*****************************************
  2.   NAME: pll.c
  3.   DESC: PLL & Maximum frequency test.
  4.   HISTORY:
  5.   03.21.2002:purnnamu: first release for S3C2410X
  6.   06.02.2003:DonGo: Modified for S3C2440X
  7.   Jan.e.2004:DonGo: Modified for S3C2440A
  8.  *****************************************/
  9. #include <math.h>
  10. #include <stdlib.h>
  11. #include "def.h"
  12. #include "option.h"
  13. #include "2440addr.h"
  14. #include "2440lib.h"
  15. #include "2440slib.h" 
  16. #include "pll.h"
  17. #include "memtest.h"
  18. extern Calc_Clock(int print_msg);
  19. extern U32 Mdiv, Pdiv, Sdiv, Fclk, Hclk, Pclk, Hdivn, Pdivn, Hclk_Ratio, Pclk_Ratio, Ref_Cnt;
  20. void Sram_Test(void);
  21. #if FIN==12000000
  22. volatile U32 Mps_Val[][4]={
  23. // FCLK,  M,  P,  S.
  24. {271500000, 173,  2, 2},
  25. {304000000,   68,  1, 1},
  26. {338400000, 133,  3, 1},
  27. {372000000,   85,  1, 1},
  28. {406430000, 127,  2, 1},
  29. {451200000, 180,  3, 1},
  30. {496000000, 116,  1, 1},
  31. {532800000, 125,  1, 1},
  32. {542400000, 218,  3, 1}
  33. };
  34. #else
  35. volatile U32 Mps_Val[][4]={
  36. // FCLK,  M,  P,  S.
  37. {266716800, 118,  2, 2},
  38. {296352000,   97,  1, 2},
  39. {331914240,   90,  3, 1},
  40. {370440000, 167,  6, 1},
  41. {399651840, 110,  3, 1},
  42. {431827200,   94,  2, 1},
  43. /*{470776320, 131,  3, 1},
  44. {500774400, 199,  5, 1},
  45. {530611200,   86,  1, 1},
  46. {541900800, 120,  2, 1}
  47. */
  48. };
  49. #endif
  50. int No_Of_Mps_Val=sizeof(Mps_Val)/16;
  51. void Test_PLL(void)
  52. {
  53. int temp, voltage=120;
  54. int i,j, mdiv, pdiv, sdiv, sval, fclk, hdiv_val, pdiv_val;
  55. U32 prev_fclk;
  56. U32 mpllcon_bk, clkdivn_bk, camdivn_bk;
  57. // clock register backup.
  58. mpllcon_bk = rMPLLCON;
  59. clkdivn_bk = rCLKDIVN;
  60. camdivn_bk = rCAMDIVN;
  61. Uart_Printf("[PLL frequency change test 100,000 times]n");
  62. //Uart_TxEmpty(1);
  63. rLOCKTIME=((U32)(1807*0.8)<<12)|((U32)(1807*0.8)<<0); 
  64. //rLOCKTIME=((U32)(12048)<<16)|((U32)(12048)<<0); 
  65. // 1807 is 150us at 12Mhz
  66. j=0;
  67. while(1) 
  68. {
  69. if(Uart_GetKey()==ESC_KEY) 
  70. break;
  71. if(j>100000) 
  72. break;
  73. i= j%No_Of_Mps_Val;
  74. fclk = Mps_Val[i][0];
  75. //Uart_Printf("[%d]FCLK=%d [Mps_Val=%xh,%xh,%xh]n", j, Mps_Val[i][0],Mps_Val[i][1],Mps_Val[i][2],Mps_Val[i][3]);
  76. Uart_Printf("[%d] ", j);
  77. Uart_TxEmpty(1);
  78. if(Mps_Val[i][0]<=350000000)
  79. {
  80. hdiv_val=12; 
  81. pdiv_val=12;
  82. voltage=110;
  83. }
  84. else if(Mps_Val[i][0]<= 440000000) 
  85. {
  86. hdiv_val=13; 
  87. pdiv_val=12;
  88. voltage=120;
  89. }
  90. else
  91. {
  92. hdiv_val=14; 
  93. pdiv_val=12;
  94. voltage=135;
  95. }
  96. Led_Display(j%2);
  97. //Uart_Printf("[FCLK:HCLK:PCLK=1:%d:%d=", hdiv_val%10, (hdiv_val%10)*(pdiv_val%10));
  98. //Uart_Printf("%4.1f:%4.1f:%4.1f MHz]n", (float)fclk/MEGA, (float)fclk/MEGA/(hdiv_val%10), (float)fclk/MEGA/((hdiv_val%10)*(pdiv_val%10)));
  99. Uart_Printf("Voltage:%4.2f[V]n", (float)voltage/100);
  100. Max1718_Set(voltage);
  101. Delay(10);
  102. if(prev_fclk<Mps_Val[i][0]) {
  103. Led_Display(0x1);
  104. ChangeClockDivider(hdiv_val, pdiv_val);
  105. Led_Display(0x2);
  106. ChangeMPllValue(Mps_Val[i][1],Mps_Val[i][2],Mps_Val[i][3]);
  107. else 
  108. {
  109. Led_Display(0x2);
  110. ChangeMPllValue(Mps_Val[i][1],Mps_Val[i][2],Mps_Val[i][3]);
  111. Led_Display(0x1);
  112. ChangeClockDivider(hdiv_val, pdiv_val);
  113. }
  114. Calc_Clock(1);
  115. Led_Display(0x4);
  116. UPDATE_REFRESH(Hclk);
  117. Led_Display(0x8);
  118. #if 1
  119. Mem_Test(1);
  120. #endif
  121. prev_fclk = Mps_Val[i][0];
  122. j++;
  123. }  
  124. Uart_Printf("nMPLL change test OK.n");
  125. Uart_Printf("nReturn to Previous setting.n");
  126. rMPLLCON = mpllcon_bk;
  127. rCLKDIVN = clkdivn_bk;
  128. rCAMDIVN = camdivn_bk;
  129. Calc_Clock(1);
  130. }
  131. // lock time: user lock time setting time[us],
  132. // lock_count: register setting value for wanted locktime.
  133. #define TIME_OF_XTAL ((float)MEGA/(float)FIN) //us
  134. U32 Calc_Locktime(U32 lock_time)
  135. {
  136. U32 lock_count=0;
  137. lock_count = (U32)((float)lock_time/((float)TIME_OF_XTAL));
  138. return lock_count;
  139. }
  140. void Test_Locktime(void)
  141. {
  142. int temp;
  143. int i,j, mdiv, pdiv, sdiv, sval, fclk, hdiv_val, pdiv_val;
  144. U32 lock_time=300, lock_count=12048; //Unit is us.
  145. U32 mpllcon_bk;
  146. // clock register backup.
  147. mpllcon_bk = rMPLLCON;
  148. Uart_Printf("[PLL Lock time test 100,000 times]n");
  149. Uart_Printf("Lock time range: 300us - %d [us]n", (U32)(0xffff*TIME_OF_XTAL));
  150. Uart_Printf("Input Lock time[us]: ");
  151. lock_time = Uart_GetIntNum();
  152. lock_count = Calc_Locktime(lock_time); // lock_time [us]
  153. rLOCKTIME=((U32)(lock_count)<<16)|((U32)(lock_count)<<0); 
  154. Uart_Printf("Locktime register value is %d(%xh).n", rLOCKTIME&0xffff, rLOCKTIME&0xffff);
  155. Uart_Printf("Clock will be locked after LED7 is ON.n");
  156. i=0;
  157. //ChangeClockDivider(12,12); // 1:2:4
  158. while(1) 
  159. {
  160. if(Uart_GetKey()!=0x0) 
  161. break;
  162. if(i>100000) 
  163. break;
  164. if(i%2) 
  165. {
  166. Led_Display(0x8);
  167. rMPLLCON = mpllcon_bk;
  168. else 
  169. {
  170. Led_Display(0x0);
  171. rMPLLCON = mpllcon_bk;
  172. }
  173. //Delay(1000);
  174. i++;
  175. }
  176. Uart_Printf("[PLL Lock time test %d times end]n",i-1);
  177. }
  178. void Manual_Change_Pll(void)
  179. {
  180. U32 pdiv, mdiv, sdiv, sval, fclk, hdiv_val, pdiv_val, voltage=120;
  181. int i, fclk_sel;
  182. float ffclk;
  183. Uart_Printf("[Running change test of M/P/S value]n");
  184. for(i=0; i<sizeof(Mps_Val)/16; i++) {
  185. if(i%2==0) Uart_Printf("n");
  186. Uart_Printf("%2d: FCLK=%4.1f [%xh(%d),%xh,%xh] ", i, (float)Mps_Val[i][0]/MEGA,Mps_Val[i][1],Mps_Val[i][1],Mps_Val[i][2],Mps_Val[i][3]);
  187. }
  188. Uart_Printf("n");
  189. #if 1
  190. Uart_Printf("Select FCLK No(0-%d): ", sizeof(Mps_Val)/16-1);
  191. fclk_sel=Uart_GetIntNum();
  192. mdiv = Mps_Val[fclk_sel][1];
  193. pdiv = Mps_Val[fclk_sel][2];
  194. sdiv = Mps_Val[fclk_sel][3];
  195. #else
  196. Uart_Printf("Input M vlaue : ");
  197. mdiv=Uart_GetIntNum();
  198. Uart_Printf("Input P vlaue : ");
  199. pdiv=Uart_GetIntNum();
  200. Uart_Printf("Input S vlaue : ");
  201. sdiv=Uart_GetIntNum();
  202. #endif
  203. Uart_Printf("Select FCLK : HCLK(1:1=11,1:2=12,1:3=13,1:4=14,...) : ");
  204. hdiv_val=Uart_GetIntNum();
  205. Uart_Printf("Select HCLK : PCLK(1:1=11,1:2=12) : ");
  206. pdiv_val=Uart_GetIntNum();
  207. sval=(int)pow(2,sdiv);
  208. ffclk = (U32) ( (((float)mdiv+8)*FIN*2.0)/(((float)pdiv+2)*(float)sval)); // pll2188x.
  209. Uart_Printf("Now change PLL value...(%dhz)[mps=%xh(%d), %d, %d]n", (U32)ffclk, mdiv,mdiv, pdiv, sdiv);
  210. Uart_Printf("Voltage: ");
  211. voltage = Uart_GetIntNum();
  212. Max1718_Set(voltage);
  213. Delay(10);
  214. ChangeClockDivider(hdiv_val, pdiv_val);
  215. ChangeMPllValue(mdiv,pdiv,sdiv);
  216. Calc_Clock(1);
  217. UPDATE_REFRESH(Hclk);
  218. Uart_Init(Pclk, 115200);
  219. #if 1
  220. //Uart_Getch();
  221. Uart_Printf("Memory test (y/n)? ");
  222. if(Uart_Getch()=='y') {
  223. while(1) {
  224. Mem_Test(1);
  225. if(Uart_GetKey()!=0x0) break;
  226. //Uart_SendByte((int)'.');
  227. }
  228. }
  229. #endif
  230.  }
  231. void Manual_Change_Pll_Iostrength(void)
  232. {
  233. Manual_Change_Pll();
  234. Test_IO_Strength();
  235. #if 1
  236. //Uart_Getch();
  237. while(1) {
  238. Mem_Test(1);
  239. if(Uart_GetKey()!=0x0) break;
  240. }
  241. #endif
  242. }
  243. void Test_PllOnOff(void)
  244. {
  245. int i,j;
  246. unsigned int saveREFRESH;
  247. Uart_Printf("[PLL On/Off test, 10000 times]n");
  248. Uart_TxEmpty(1); //To avoid being crushed the character
  249. rLOCKTIME=((U32)(1807*0.8)<<12)|((U32)(1807*0.8)<<0); 
  250. // 1807 is 150us at 12Mhz
  251. Uart_Printf("count:                    ");
  252. for(j=0;j<10000;j++) {
  253. Led_Display(0x2);
  254. rCLKSLOW=(1<<7)|(1<<5)|(1<<4)|(0<<0); //FCLK=FIN/1,SLOW mode,MPLL=off,UPLL=off
  255. saveREFRESH=rREFRESH;
  256. rREFRESH=(1<<23)|(U32)(2048+1-12*7.8); //HCLK = 12MHz, Trp=2clk,Trc=4clk
  257. rCLKSLOW=(1<<7)|(0<<5)|(1<<4)|(0<<0);//PLL on,MPLL=on,UPLL=on
  258. for(i=0;i<2048/4;i++); //S/W MPLL lock-time
  259. Led_Display(0x0);
  260. rCLKSLOW=(1<<7)|(0<<5)|(0<<4)|(0<<0);//NORMAL mode,PLL on,MPLL=on,UPLL=on
  261. rREFRESH=saveREFRESH;
  262. if(j%500==0)
  263. {
  264. Uart_Printf("bbbbbb%6d", j);
  265. Uart_TxEmpty(1); //To avoid being crushed the character
  266. }
  267. }
  268. Uart_Printf("bbbbbb%6d", j);
  269. }