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

uCOS

开发平台:

C/C++

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include "def.h"
  5. #include "option.h"
  6. #include "2440addr.h"
  7. #include "2440lib.h"
  8. #include "userlib.h"
  9. #include "lcdlib.h"
  10. #include "glib.h"
  11. #include "2440lcd.h"
  12. #include "dvstest.h"
  13. #include "user_test2.h"
  14. extern void Calc_Clock(int print_msg);
  15. extern U32 Mdiv, Pdiv, Sdiv, Fclk, Hclk, Pclk, Hdivn, Pdivn, Hclk_Ratio, Pclk_Ratio, Ref_Cnt;
  16. ////////////////////////////// user_test2() start///////////////////////////////
  17. void User_Test2(void)
  18. {
  19. Uart_Printf("nUser_Test2.n");
  20. }
  21. ////////////////////////////////// dvs test ////////////////////////////////////////
  22. extern void CLKDIV124(void);
  23. extern void CLKDIV144(void);
  24. #define BIT_DVS_ON (1<<12)
  25. #define DVS_VOLTL 80
  26. #define DVS_VOLTH 120
  27. void DvsTimer_Setting(void);
  28. void __irq DvsTimer0_intr(void);
  29. void Firm_DVS_Onoff(void)
  30. {
  31. volatile int i, n, cnt=0;
  32. Uart_Printf("DVS test.n");
  33. rBANKSIZE = (rBANKSIZE & ~(3<<4)) | (0<<4) | (1<<7); //SCKE_EN, SCLK_EN = disable.
  34. Uart_Printf("Change core speed to 400MHz.n");
  35. #if FIN==12000000
  36. ChangeClockDivider(13, 12);
  37. #if CPU2440A==1
  38. ChangeMPllValue(127,2,1); // 406MHz
  39. #else
  40. ChangeMPllValue(127,2,0); // 406MHz
  41. #endif
  42. #else // 16.9344Mhz
  43. ChangeClockDivider(13, 12);
  44. #if CPU2440A==1
  45. ChangeMPllValue(110,3,1); // 400MHz
  46. #else
  47. ChangeMPllValue(110,3,0); // 400MHz
  48. #endif
  49. #endif
  50. Calc_Clock(1);
  51. UPDATE_REFRESH(Hclk);
  52. Uart_Init(Pclk, 115200);
  53. Uart_Printf("Check Clkout0:FCLK, Clkout1:HCLK.n");
  54. // Clkout0: FCLK.
  55. Clk0_Enable(2); // 0:MPLLin, 1:UPLL, 2:FCLK, 3:HCLK, 4:PCLK, 5:DCLK0
  56. // Clkout1: HCLK.
  57. Clk1_Enable(3); // 0:MPLLout, 1:UPLL, 2:RTC, 3:HCLK, 4:PCLK, 5:DCLK1
  58. DvsTimer_Setting();
  59. Uart_Printf("start.n");
  60. while(1) {
  61. #if 1
  62. // 1. Entering Idle mode ...
  63. // (1) Strengthen HCLK.
  64. rCAMDIVN = (rCAMDIVN & ~(3<<8)) | (1<<8); // 1:3:6 -> 1:6:12
  65. rCLKDIVN &= ~(1<<0); // 1:6:12 -> 1:6:6
  66. // (2) Set DVS flag
  67. rCAMDIVN |= BIT_DVS_ON; // (1<<12)
  68. // -> the FCLK will be the same as HCLK(67Mhz).
  69. // (3) Drop the core voltage
  70. Max1718_Set(DVS_VOLTL);
  71. // (4) t_DVS, delay while dropping the core voltage...
  72. //for(i=0; i<2000; i++); // SMDK2440: 28us/0.1V.
  73. // (5) set Idle bit.
  74. // timer setting...
  75. rTCNTB0 = 30;
  76. rTCON = 1<<3| 1<<1; // load timer.
  77. rTCON = 1<<3| 1<<0; // start timer.
  78. rCLKCON |= 1<<2; // Enter Idle mode.
  79. for(i=0;i<10;i++);
  80. //...
  81. //... in Idle mode...
  82. //...
  83. // 2. Wake up from Idle mode...
  84. rCLKCON&=~(1<<2); // must clear this bit after wake-up from idle mode.
  85. rTCON = 0;
  86. //(1) Return Core voltage
  87. Max1718_Set(DVS_VOLTH);
  88. Led_Display(0x6);
  89. // (2) t_DVS, delay while dropping the core voltage...
  90. for(i=0; i<2000; i++); // SMDK2440: 28us/0.1V.
  91. Led_Display(0x7);
  92. // (3) Return Hclk
  93. rCLKDIVN |= (1<<0); // 1:6:6 -> 1:6:12
  94. rCAMDIVN = (rCAMDIVN & ~(3<<8)); // 1:6:12 -> 1:3:6
  95. if(!(cnt++%10)) Uart_Printf("cnt:%d.n", cnt);
  96. //Delay(10);
  97. #else
  98. // Only for CLKDIV test.
  99. // * Strengthen HCLK.
  100. //rCAMDIVN = (rCAMDIVN & ~(3<<8)) | (1<<8); // 1:3:6 -> 1:6:12
  101. //rCLKDIVN &= ~(1<<0); // 1:6:12 -> 1:6:6
  102. rCLKDIVN=(rCLKDIVN&~(7<<0))|(7<<0); // for bug of 2440x, 1:3:6
  103. rCLKDIVN=(rCLKDIVN&~(7<<0))|(5<<0); // for 2440x, 1:4:8
  104. //CLKDIV144();
  105. Led_Display(1);
  106. // * Drop the core voltage
  107. Max1718_Set(DVS_VOLTL);
  108. // * set Idle bit.
  109. rTCNTB0 = 30; // Timer setting for wake-up from idle mode.
  110. rTCON = 1<<3| 1<<1; // load timer.
  111. rTCON = 1<<3| 1<<0; // start timer.
  112. rCLKCON |= 1<<2; // Enter Idle mode.
  113. for(i=0;i<10;i++);
  114. //...
  115. //... in Idle mode...
  116. //...
  117. // 2. Wake up from Idle mode...
  118. rCLKCON&=~(1<<2); // must clear this bit after wake-up from idle mode.
  119. rTCON = 0;
  120. //* Return Core voltage
  121. Max1718_Set(DVS_VOLTH);
  122. // * t_DVS, delay while dropping the core voltage...
  123. for(i=0; i<2000; i++); // SMDK2440: 28us/0.1V.
  124. // * Return Hclk
  125. //rCLKDIVN |= (1<<0); // 1:6:6 -> 1:6:12
  126. //rCAMDIVN = (rCAMDIVN & ~(3<<8)); // 1:6:12 -> 1:3:6
  127. rCLKDIVN=(rCLKDIVN&~(7<<0))|(3<<0); // for 2440x, 1:2:4
  128. //CLKDIV124();
  129. Led_Display(0);
  130. Delay(200);
  131. #endif
  132. if(Uart_GetKey()==ESC_KEY) break;
  133. }
  134. }
  135. void DvsTimer_Setting(void)
  136. {
  137. float cnt_val=0.0;
  138.     Uart_Printf("[ Timer 0 Interrupt setting]n");
  139. // Uart_Printf("[Timer interval: %4.1f, %4.1f, %4.1f, %4.1f[ms].n", 
  140. // timer_val_arr[0]*0.081, timer_val_arr[1]*0.081, timer_val_arr[2]*0.081, timer_val_arr[3]*0.081);
  141. // 296, 617, 802, 1284 -> 24ms, 50ms, 65ms, 104ms for eac
  142. rGPBCON = rGPBCON& ~(0x03) | 0x2;
  143. rCLKCON |= 1<<8; // PWM timer PCLK clock enable.
  144. pISR_TIMER0 = (int)DvsTimer0_intr;
  145. // Timer interupt start.
  146. rINTMSK &= ~BIT_TIMER0;
  147. rTCFG0 = 0xff; // Prescaler0 = 0xff=256.
  148. // Timer input clock freq = PCLK/(Prescaler0+1)/divider value.
  149. // where, PCLK = 50.7MHz
  150. rTCFG1 = 0<<20 | 3<<0; // MUX0 = 1/16
  151. // Timer input clock frequency = PCLK/(prescaler value+1)/(divider value)
  152. // 1clock = 81us.
  153. rTCNTB0 = 300;// 296, 617, 802, 1284 -> 24ms, 50ms, 65ms, 104ms for each.
  154. rTCMPB0 = 0;
  155. // Load timer cnt value
  156. rTCON = 1<<3| 1<<1;
  157. // Timer start.
  158. //rTCON = 1<<3| 1<<0;
  159. }
  160. void __irq DvsTimer0_intr(void)
  161. {
  162. ClearPending(BIT_TIMER0)
  163. }
  164. void DVS_Onoff_Man(void)
  165. {
  166. int i=0; 
  167. char c;
  168. Uart_Printf("Change core speed to 400MHz.n");
  169. #if FIN==12000000
  170. ChangeClockDivider(13, 12);
  171. #if CPU2440A==1
  172. ChangeMPllValue(127,2,1); // 406MHz
  173. #else
  174. ChangeMPllValue(127,2,0); // 406MHz
  175. #endif
  176. #else // 16.9344Mhz
  177. ChangeClockDivider(13, 12);
  178. #if CPU2440A==1
  179. ChangeMPllValue(110,3,1); // 400MHz
  180. #else
  181. ChangeMPllValue(110,3,0); // 400MHz
  182. #endif
  183. #endif
  184. Calc_Clock(1);
  185. UPDATE_REFRESH(Hclk);
  186. Uart_Init(Pclk, 115200);
  187. Uart_Printf("Check Clkout0:FCLK, Clkout1:HCLK.n");
  188. // Clkout0: FCLK.
  189. Clk0_Enable(2);
  190. // Clkout1: HCLK.
  191. Clk1_Enable(3);
  192. Uart_Printf("Press key to on/off dvs_on bit.n");
  193. do {
  194. c=Uart_Getch();
  195. rCAMDIVN |= BIT_DVS_ON;
  196. Uart_Printf("DVS=ON(0x%d).n", rCAMDIVN);
  197. c=Uart_Getch();
  198. rCAMDIVN &= ~BIT_DVS_ON;
  199. Uart_Printf("DVS=OFF(0x%d).n", rCAMDIVN);
  200. } while(c!='q');
  201. }