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

uCOS

开发平台:

C/C++

  1. //===================================================================
  2. // File Name : Dvstest.c
  3. // Function  : S3C2440A 
  4. // Date      : Feb 02, 2004
  5. // Version   : 0.0
  6. // History
  7. //  0.00: Feb.xx.2004:DonGo: first draft version for DVS.
  8. //===================================================================
  9. #include <stdio.h>
  10. #include <string.h>
  11. #include <stdlib.h>
  12. #include "def.h"
  13. #include "option.h"
  14. #include "2440addr.h"
  15. #include "2440lib.h"
  16. #include "userlib.h"
  17. #include "lcdlib.h"
  18. #include "glib.h"
  19. #include "2440lcd.h"
  20. #include "dvstest.h"
  21. #define BIT_DVS_ON (1<<12)
  22. #define DVS_VOLTL 100
  23. #define DVS_VOLTH 120
  24. // regulator voltage out settling time = 28us/0.1V.
  25. // 0.2V:56us, 0.3V:84us, 0.4V:112us, 0.5V:140us
  26. // 0.25V:70us, 0.35V:98us, 0.45V:126us, 0.55V:154us.
  27. extern U32 FCLK1;
  28. extern void CLKDIV124(void);
  29. extern void CLKDIV144(void);
  30. U32 Vcount=0, Timer_cnt0=0;
  31. short int Idle_flag=0; // assume,  0:Normal, 1:Idle.
  32. short int Div_flag=124;
  33. short int intr_flag=0;
  34. // one-timer clock= 81 usec. 
  35. U32 timer_val_arr[4] = {296, 617, 802, 1284};
  36. //U32 timer_val_arr[4] = {1284, 1284, 1284, 1284};
  37. // 296, 617, 802, 1284 -> 24ms, 50ms, 65ms, 104ms for each.
  38. short int timer_select=0;
  39. #define XADDR _NONCACHE_STARTADDRESS
  40. #define IDLE_EN 0 // enable idle at timer interrupt.
  41. extern U32 Mdiv, Pdiv, Sdiv, Fclk, Hclk, Pclk, Hdivn, Pdivn, Hclk_Ratio, Pclk_Ratio, Ref_Cnt;
  42. void Dvs_Test(void)
  43. {
  44. volatile int i, n;
  45. Uart_Printf("Dvs test.n");
  46. rGPGCON = (rGPGCON & ~(3<<22)) | (1<<22); // set GPG11 output for idle state.
  47. rBANKSIZE = (rBANKSIZE & ~(3<<4)) | (0<<4) | (1<<7); //SCKE_EN, SCLK_EN = disable.
  48. Uart_Printf("Change core speed to 266MHz.n");
  49. #if FIN==12000000
  50. ChangeClockDivider(13, 12); // 1:3:6
  51. #if CPU2440A==1
  52. ChangeMPllValue(127,2,1); // 406MHz
  53. #else // 2440X
  54. ChangeMPllValue(127,2,0); // 406MHz
  55. #endif
  56. #else // 16.9344Mhz
  57. ChangeClockDivider(13, 12);
  58. #if CPU2440A==1
  59. ChangeMPllValue(110,3,1); // 400MHz
  60. #else // 2440X
  61. ChangeMPllValue(110,3,0); // 400MHz
  62. #endif
  63. #endif
  64. Calc_Clock(1);
  65. UPDATE_REFRESH(Hclk);
  66. Uart_Init(Pclk, 115200);
  67. Uart_Printf("Check Clkout0:FCLK, Clkout1:HCLK.n");
  68. // Clkout0: FCLK.
  69. Clk0_Enable(2);
  70. // Clkout1: HCLK.
  71. Clk1_Enable(3);
  72. #if ADS10==TRUE
  73. srand(0);
  74. #endif
  75. Led_Display(0); // clear all leds.
  76. Timer_Setting();
  77. Set_Lcd_Tft_16Bit_240320_Dvs();
  78. Uart_Printf("Tcnt, Vcnt, Idle_flag.n");
  79. Uart_Printf("%8d,%8d,%1dn", Timer_cnt0, Vcount, Idle_flag);
  80. while(1) {
  81. //Uart_Printf("bbbbbbbbbbbbbbbbbbb");
  82. Uart_Printf("%8d,%8d,%1dn", Timer_cnt0, Vcount, Idle_flag);
  83. for(i=0; i<1024*32; i+=4) {
  84. //*(U32 *)(XADDR+i) = i;
  85. //*(U32 *)(XADDR+i);
  86. }
  87. if(Uart_GetKey()==ESC_KEY) break;
  88. }
  89. rINTMSK = BIT_ALLMSK;
  90. }
  91. ////////////////////////////// HCLK change test start  ///////////////////////////////
  92. //========================================================
  93. // Timer Interrupt Request 
  94. //========================================================
  95. void __irq Timer0_intr(void)
  96. {
  97. int i;
  98. //if(Timer_cnt0%2) Led_Onoff(LED1,ON);
  99. //else Led_Onoff(LED1,OFF);
  100. ClearPending(BIT_TIMER0)
  101. if(rLCDSRCPND & 2) {
  102. rLCDSRCPND=2; // Clear LCD SUB Interrupt source pending
  103. rLCDINTPND=2; // Clear LCD SUB Interrupt pending
  104. ClearPending(BIT_LCD);
  105. }
  106. #if ADS10==TRUE
  107. i= (rand()%700) + 61; // 0.081ms/cnt
  108. #else
  109. i= 370; // 0.081ms/cnt -> 370cnt==300ms.
  110. #endif
  111. rTCNTB0 = i;
  112. //rTCNTB0 = timer_val_arr[Timer_cnt0%4];
  113. // Load timer cnt value
  114. rTCON = 1<<3| 1<<1;
  115. // Timer start.
  116. rTCON = 1<<3| 1<<0;
  117. if(Timer_cnt0%2) {
  118. Idle_flag = 1; // Idle mode
  119. rINTMSK &= ~(BIT_LCD); // unmask.
  120. #if IDLE_EN==1
  121. Led_Onoff(LED4, OFF);
  122. rCLKCON |= 1<<2; // Enter Idle mode.
  123.     for(i=0;i<10;i++);
  124. //wait until S3C2400X enters IDLE mode.
  125.         //wait EINT0 interrupt or RTC alarm interrupt
  126.         rCLKCON&=~(1<<2);
  127. Led_Onoff(LED4, ON);
  128.      //turn-off IDLE bit. IDLE bit should be turned off after wake-up.
  129.      #endif
  130. } else {
  131. Idle_flag = 0; // Normal mode
  132. rINTMSK &= ~(BIT_LCD); // unmask.
  133. }
  134. Timer_cnt0++;
  135. }
  136. void __irq Lcd_Int_Frame_ForDvs(void)
  137. {
  138. int i;
  139. rINTMSK |= (BIT_LCD);
  140. if((rLCDCON5 & (0x3<<15))) 
  141. { // if Not VSYNC period
  142. Uart_Printf("-");
  143. else 
  144. { // if in VSYNC period
  145. if( Idle_flag==1) 
  146. { // Idle -> Clkdiv=1:4:4
  147. rLCDCON1 &= ~(0x1); // ENVID off.
  148. #if CPU2440A==1
  149. rCAMDIVN = (rCAMDIVN & ~(3<<8)) | (1<<8); // 1:3:6 -> 1:6:12
  150. rCLKDIVN &= ~(1<<0); // 1:6:12 -> 1:6:6
  151. #else 
  152. CLKDIV144();
  153. #endif
  154. #if CPU2440A==1
  155. rCAMDIVN |= BIT_DVS_ON; // (1<<12), DVS off.
  156. rGPGDAT &= ~(1<<11);
  157. #endif
  158. Max1718_Set(DVS_VOLTL);
  159. UPDATE_REFRESH(Hclk/2);
  160. rLCDCON1 = (rLCDCON1 & ~(0x3ff<<8)) | (4<<8) | 1; // ENVID on. 5MHz VCLK, 60fps
  161. Vcount++;
  162.    
  163. rLCDSRCPND=2; // Clear LCD SUB Interrupt source pending
  164. rLCDINTPND=2; // Clear LCD SUB Interrupt pending
  165. ClearPending(BIT_LCD);
  166. if(rSRCPND & BIT_TIMER0) {
  167. rSRCPND = BIT_TIMER0;    //Clear pending bit
  168. rINTPND = BIT_TIMER0;
  169. }
  170. #if IDLE_EN==1
  171. rCLKCON |= 1<<2; // Enter Idle mode.
  172. for(i=0;i<10;i++);
  173. //wait until S3C2400 enters IDLE mode.
  174. //wait EINT0 interrupt or RTC alarm interrupt
  175. rCLKCON&=~(1<<2);
  176. //turn-off IDLE bit. IDLE bit should be turned off after wake-up.
  177.      #endif
  178. else  // If Normal mode...
  179. {
  180. rLCDCON1 &= ~(0x1); // ENVID off.
  181. Max1718_Set(DVS_VOLTH);
  182. for(i=0; i<2000;i++) rGSTATUS0;
  183. UPDATE_REFRESH(Hclk);
  184. #if CPU2440A==1
  185. rCAMDIVN &= ~BIT_DVS_ON; // (0<<12), DVS off, FCLK=MPLLout
  186. rGPGDAT |= (1<<11);
  187. #endif
  188. #if CPU2440A==1
  189. rCLKDIVN |= (1<<0); // 1:6:6 -> 1:6:12
  190. rCAMDIVN = (rCAMDIVN & ~(3<<8)); // 1:6:12 -> 1:3:6
  191. #else
  192. CLKDIV124(); // Normal -> Clkdiv=1:2:4
  193. #endif
  194. rLCDCON1 = (rLCDCON1 & ~(0x3ff<<8)) | (9<<8) | 1; // ENVID on.5MHz VCLK, 60fps
  195. Vcount++;
  196.    
  197. rLCDSRCPND=2; // Clear LCD SUB Interrupt source pending
  198. rLCDINTPND=2; // Clear LCD SUB Interrupt pending
  199. ClearPending(BIT_LCD);
  200. if(rSRCPND & BIT_TIMER0) {
  201. rSRCPND = BIT_TIMER0;    //Clear pending bit
  202. rINTPND = BIT_TIMER0;
  203. }
  204. }
  205. } // endof if((rLCDCON5 & (0x3<<15))) {
  206. }
  207. ////////////////////////////// HCLK change test end  ///////////////////////////////
  208. void Set_Lcd_Tft_16Bit_240320_Dvs(void)
  209. {
  210.     int i,j,k;
  211. Uart_Printf("[Set LCD]n");
  212.     Lcd_Port_Init();
  213.  //   Lcd_Init(MODE_TFT_16BIT_240320);
  214.     Glib_Init(MODE_TFT_16BIT_240320);
  215. Lcd_Lcc3600Enable(); // Enable LCC3600
  216.     Lcd_PowerEnable(0, 1);
  217.     Lcd_EnvidOnOff(1);
  218.     
  219.     Glib_ClearScr(0, MODE_TFT_16BIT_240320);
  220.     Glib_FilledRectangle(0,0,119,159,0xf800);
  221.     Glib_FilledRectangle(120,0,239,159,0x07e0);
  222.     Glib_FilledRectangle(0,160,119,320,0x001f);
  223.     Glib_FilledRectangle(120,160,239,320,0xffff);
  224.     Glib_FilledRectangle(100,100,150,200,0x5555);
  225.     rLCDCON1 &= ~(0x1); // ENVID off.
  226. rLCDCON1 = (rLCDCON1 & ~(0x3ff<<8)) | (9<<8) | 1; // ENVID on. 5MHz 60fps
  227. // ON PWREN signal
  228. rLCDCON5 = (rLCDCON5 & ~(1<<3)) ; // PWREN disable
  229. rGPGCON = (rGPGCON & ~(0x3<<8)) | 0x1<<8; // GPG4, PWR_EN -> Output.
  230. rGPGDAT&=(~(1<<4)); // GPG4=Low
  231. Delay(50); // GPG4=Low
  232. rGPGDAT|=(1<<4); //GPG4=High
  233. //--------LCD frame interrupt setting ------------------------------------START
  234. pISR_LCD=(unsigned)Lcd_Int_Frame_ForDvs;
  235. rINTMSK &= ~(BIT_LCD);
  236. rLCDINTMSK=(1<<2)|(0<<1)|(1); // 8Words Trigger Level,Unmask Frame int,mask Fifo int
  237. //--------LCD frame interrupt setting ------------------------------------END
  238. }
  239. void Led_Onoff(int Led_No, int On_Off)
  240. {
  241. // GPF7  GPF6   GPF5   GPF4
  242. //nLED_8 nLED4 nLED_2 nLED_1
  243. if(On_Off==ON) rGPFDAT = (rGPFDAT & ~Led_No);
  244. else rGPFDAT = (rGPFDAT | Led_No);
  245. }
  246. void Timer_Setting(void)
  247. {
  248. float cnt_val=0.0;
  249.     Uart_Printf("[ Timer 0 Interrupt setting]n");
  250. // Uart_Printf("[Timer interval: %4.1f, %4.1f, %4.1f, %4.1f[ms].n", 
  251. // timer_val_arr[0]*0.081, timer_val_arr[1]*0.081, timer_val_arr[2]*0.081, timer_val_arr[3]*0.081);
  252. // 296, 617, 802, 1284 -> 24ms, 50ms, 65ms, 104ms for eac
  253. rGPBCON = rGPBCON& ~(0x03) | 0x2;
  254. rCLKCON |= 1<<8; // PWM timer PCLK clock enable.
  255.     pISR_TIMER0 = (int)Timer0_intr;
  256. // Timer interupt start.
  257. rINTMSK &= ~BIT_TIMER0;
  258. rTCFG0 = 0xff; // Prescaler0 = 0xff=256.
  259. // Timer input clock freq = PCLK/(Prescaler0+1)/divider value.
  260. // where, PCLK = 50.7MHz
  261. rTCFG1 = 0<<20 | 3<<0; // MUX0 = 1/16
  262. // Timer input clock frequency = PCLK/(prescaler value+1)/(divider value)
  263. // 1clock = 81us.
  264.     rTCNTB0 = timer_val_arr[0];
  265.     rTCMPB0 = 0;
  266. // Load timer cnt value
  267. rTCON = 1<<3| 1<<1;
  268. // Timer start.
  269. rTCON = 1<<3| 1<<0;
  270. }