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

uCOS

开发平台:

C/C++

  1. /**********************************************
  2.   NAME: pwr_c.c
  3.   DESC: 2410 power consumption measurement code
  4.   HISTORY:
  5.   04.09.2002:purnnamu: first release for 2410
  6.   06.02.2003:DonGo: Modified for 2440
  7.  **********************************************/
  8.  
  9. #include <stdlib.h>
  10. #include <string.h>
  11. #include "def.h"
  12. #include "option.h"
  13. #include "2440addr.h"
  14. #include "2440lib.h"
  15. #include "2440slib.h"
  16. #include "pwr_c.h"
  17. #include "mmu.h"
  18. #include "lcdlib.h"
  19. //Options for current measurement
  20. #define QUICK_SORT (1)
  21. #define DHRYSTONE21    (2)
  22. #define CPU_WORK QUICK_SORT //DHRYSTONE21 
  23. void PWR_Lcd_Tft_16Bit_240320_On(void);
  24. static void Lcd_Port_Init(void);
  25. void PWR_StartTimer(void);
  26. void StartDmaMem2Mem(void);
  27. void PWR_StartIIS(void);
  28. int compare1(const void *a,const void *b);
  29. int compare2(const void *a,const void *b);
  30. #define NUM_SORT_DATA 1024
  31. static int dim2[NUM_SORT_DATA];  //128KB,which is bigger than D-Cache(16KB)
  32. extern U32 Mps_Val[][4];
  33. U32 TMP_FCLK=400000000;
  34. extern int No_Of_Mps_Val;
  35. extern Calc_Clock(int print_msg);
  36. extern U32 Mdiv, Pdiv, Sdiv, Fclk, Hclk, Pclk, Hdivn, Pdivn, Hclk_Ratio, Pclk_Ratio, Ref_Cnt;
  37. void MeasurePowerConsumption(void)
  38. {
  39. int i,j, hdiv_val, pdiv_val, select;
  40. volatile int a,b,c;
  41. Uart_Printf("[Measure the power consumption of S3C2440]n");
  42. MMU_Init();
  43. #if 0
  44. Uart_Printf("(1)203MHz,(2)305MHz,(3)400MHz(1:4:8),(4)400MHz(1:3:6),(5)533MHzn");
  45. Uart_Printf("Select Clock Frequency to test(0 or Enter to skip) : ");
  46. select = Uart_GetIntNum();
  47. // Clock setting
  48. ChangeUPllValue(56,2,2); // 48MHz
  49. switch(select) {
  50. case 1: // 203.2MHz
  51. ChangeClockDivider(12,12); // 1:2:4
  52. ChangeMPllValue(246,13,0);
  53. break;
  54. case 2: // 305MHz
  55. ChangeClockDivider(13,12); // 1:3:6
  56. ChangeMPllValue(119,3,0);
  57. break;
  58. case 3: // 400MHz, 1:4:8
  59. ChangeClockDivider(14,12);
  60. ChangeMPllValue(92,1,0);
  61. break;
  62. case 4: // 400MHz, 1:3:6
  63. ChangeClockDivider(13,12); // 1:4:8
  64. ChangeMPllValue(92,1,0);
  65. break;
  66. case 5: // 533MHz
  67. ChangeClockDivider(14,12); // 1:4:8
  68. ChangeMPllValue(214,3,0);
  69. break;
  70. case 0:
  71. default:
  72. break;
  73. }
  74. #endif
  75. Calc_Clock(1);
  76. UPDATE_REFRESH(Hclk);
  77. //Uart_Init(Pclk, 115200);
  78. // Clock off unused block.
  79. rCLKCON &= ~( (1<<19) | (1<<18) | (0<<17) | (1<<16) | 
  80. (1<<15) | (0<<14) | (0<<13) | (0<<12) | 
  81. (0<<11) | (0<<10) | (1<<9) | (0<<8) | 
  82. (0<<7) | (0<<6) | (0<<5) | (1<<4) );
  83. Uart_Printf("Add Mem to Mem DMA(y/n) ? ");
  84. if(Uart_Getch()=='y') {
  85. Uart_Printf("n- DMA Mem to Mem(1024 words).n");
  86. StartDmaMem2Mem();
  87. }
  88. Uart_Printf("n");
  89. Uart_Printf("- Run 5-Timers (130KHz).n");
  90. PWR_StartTimer();
  91. Uart_Printf("- TFT-LCD 240x320 16bit is running.n");
  92. Lcd_PowerEnable(0,1);
  93. PWR_Lcd_Tft_16Bit_240320_On();
  94. Uart_Printf("- IIS(DMA2) is running(CDCLK=16.9Mhz,LRCK=44.1Khz).n");
  95. PWR_StartIIS();
  96. #if CPU_WORK==QUICK_SORT
  97. //qsort;
  98. for(i=0;i<NUM_SORT_DATA;i++) dim2[i]=i;
  99. Uart_Printf("- CPU JOB:quick sort of 65536 integer data.n");
  100. Uart_Printf("status:  ");
  101. i=0;
  102. while(1)
  103. {
  104. qsort(dim2,NUM_SORT_DATA,sizeof(int),compare1);
  105. qsort(dim2,NUM_SORT_DATA,sizeof(int),compare2);
  106. Uart_Printf("b%1d", i++%10);
  107. if(Uart_GetKey()) break;
  108. }
  109. #else
  110. Uart_Printf("- CPU JOB:Dhrystone 2.1 code.n");
  111. Uart_Printf("status:  ");
  112. i=0;
  113. while(1)
  114. {
  115. dhrystone21();
  116. Uart_Printf("b%1d", i++%10);
  117. if(Uart_GetKey()) break;
  118. }
  119. #endif
  120. Uart_Printf("nExitn");
  121. }
  122. int compare1(const void *a,const void *b)
  123. {
  124. if(*(int *)a>*(int *)b)
  125. return 1;
  126. else if(*(int *)a==*(int *)b)
  127. return 0;
  128. else 
  129. return -1;
  130. }
  131. int compare2(const void *a,const void *b)
  132. {
  133. if(*(int *)a>*(int *)b)
  134. return -1;
  135. else if(*(int *)a==*(int *)b)
  136. return 0;
  137. else 
  138. return 1;
  139. }
  140. void DoQsort(void) //function for SLOW mode current current consumption
  141. {
  142. qsort(dim2,NUM_SORT_DATA,sizeof(int),compare1);
  143. qsort(dim2,NUM_SORT_DATA,sizeof(int),compare2);
  144. }
  145. static unsigned save_rGPCUP,save_rGPCDAT,save_rGPCCON;
  146. static unsigned save_rGPDUP,save_rGPDDAT,save_rGPDCON; 
  147. static void Lcd_Port_Init(void)
  148. {
  149. save_rGPCCON=rGPCCON;
  150. save_rGPCDAT=rGPCDAT;
  151. save_rGPCUP=rGPCUP;
  152. save_rGPDCON=rGPDCON;
  153. save_rGPDDAT=rGPDDAT;
  154. save_rGPDUP=rGPDUP;
  155. rGPCUP=0xffffffff; // Disable Pull-up register
  156. rGPCCON=0xaaaaaaaa; //Initialize VD[7:0],LCDVF[2:0],VM,VFRAME,VLINE,VCLK,LEND 
  157. rGPDUP=0xffffffff; // Disable Pull-up register
  158. rGPDCON=0xaaaaaaaa; //Initialize VD[23:8]
  159. }
  160. void PWR_Lcd_Tft_16Bit_240320_On(void)
  161. {
  162. Lcd_Port_Init();
  163. // Lcd_Init(MODE_TFT_16BIT_240320);
  164. Glib_Init(MODE_TFT_16BIT_240320);
  165. //Uart_Printf("TFT 64K-color(16bit) LCD on.n");
  166. //Lcd_Lpc3600Enable();
  167. Lcd_Lcc3600Enable();
  168. Lcd_PowerEnable(0, 1);
  169. Lcd_EnvidOnOff(1);
  170. Glib_ClearScr(0, MODE_TFT_16BIT_240320);
  171. Glib_FilledRectangle(0,0,119,159,0xf800); // R
  172. Glib_FilledRectangle(120,0,240,159,0x07e0); // G
  173. Glib_FilledRectangle(0,160,119,320,0x001f); // B
  174. Glib_FilledRectangle(120,160,240,320,0xffff); // W
  175. }
  176. void PWR_Lcd_Tft_16Bit_640480_On(void)
  177. {
  178. Lcd_Port_Init();
  179. // Lcd_Init(MODE_TFT_16BIT_640480);
  180. Glib_Init(MODE_TFT_16BIT_640480);
  181. Lcd_Lcc3600Enable(); // Enable LCC3600
  182. Lcd_PowerEnable(0, 1);
  183. Lcd_EnvidOnOff(1);
  184. Glib_ClearScr(0, MODE_TFT_16BIT_640480);
  185. Glib_FilledRectangle(0,0,119,159,0xf800); // R
  186. Glib_FilledRectangle(120,0,240,159,0x07e0); // G
  187. Glib_FilledRectangle(0,160,119,320,0x001f); // B
  188. Glib_FilledRectangle(120,160,240,320,0xffff);// W
  189. Glib_FilledRectangle(0+240,0+240,119+320,159+320,0xf800); // R
  190. Glib_FilledRectangle(120+240,0+240,240+320,159+320,0x07e0); // G
  191. Glib_FilledRectangle(0+240,160+240,119+320,320+320,0x001f); // B
  192. Glib_FilledRectangle(120+240,160+240,240+320,320+320,0xffff);// W
  193. }
  194. void PWR_StartTimer(void)
  195. {
  196. //Uart_Printf("All 5 timers are running(130KHz).n");
  197. rTCFG0=0x8080;   //Prescaler=128; 
  198. rTCFG1=0x11111;  //Devider=1/4; Period: 66.7MHz/12/4 = 130KHz.
  199. rTCNTB0=0x8000;
  200. rTCMPB0=0x4000;
  201. rTCNTB1=0x8000;
  202. rTCMPB1=0x4000;
  203. rTCNTB2=0x8000;
  204. rTCMPB2=0x4000;
  205. rTCNTB3=0x8000;
  206. rTCMPB3=0x4000;
  207. rTCNTB4=0x8000;
  208. rTCON=0x6aaa0a; // Auto reload.
  209. rTCON=0x599909; //run
  210. }
  211. static int buf1[1024],buf2[1024];
  212. void __irq PWR_IsrDma0(void)
  213. {
  214. ClearPending(BIT_DMA0);
  215. rDMASKTRIG0=0x3; 
  216. //Uart_Printf("$");
  217. }
  218. void StartDmaMem2Mem(void)
  219. {
  220. //Uart_Printf("seamless DMA0 SDRAM->SDRAM transfer is running.n");
  221. pISR_DMA0=(unsigned int)PWR_IsrDma0;
  222. rINTMSK=rINTMSK&~(BIT_DMA0);
  223.  
  224. rDISRC0=(U32)buf1;
  225. rDISRCC0=(0<<1)|(0<<0); //src=AHB,increment
  226. rDIDST0=(U32)buf2;
  227. rDIDSTC0=(0<<1)|(0<<0); //dst=AHB,increment
  228. rDCON0=(1<<31)|(1<<29)|(1<<27)|(2<<20)|(1024);
  229. //handshake,done int. enable,whole mode,DSZ=word,TC=1024
  230. rDMASKTRIG0=0x3; 
  231. }
  232. static U16 buf3[4096];
  233. void __irq PWR_IsrDma2(void)
  234. {
  235. ClearPending(BIT_DMA2);
  236. //Uart_Printf("#");
  237. }
  238. void PWR_StartIIS(void)
  239. {
  240. U32 iis_div_val=3;
  241. //Uart_Printf("IIS(DMA2) is running(CDCLK=16.9Mhz,LRCK=44.1Khz).n");
  242. pISR_DMA2=(unsigned int)PWR_IsrDma2;
  243. rINTMSK=rINTMSK&~(BIT_DMA2);
  244. rGPECON=rGPECON&~(3<<8|3<<4|3<<2|3<<0)|(2<<8|2<<4|2<<2|2<<0); //I2SSDO,CDCLK,I2SSCLK,I2SLRCK
  245. rDISRC2=(U32)buf3; 
  246. rDISRCC2=(0<<1)+(0<<0);//src=AHB,increment
  247. rDIDST2=((U32) IISFIFO );
  248. rDIDSTC2=(1<<1)+(1<<0); //APB,fix
  249. rDCON2=(1<<31)|(0<<30)|(1<<29)|(0<<28)|(0<<27)|(0<<24)|(1<<23)|(0<<22)|(1<<20)|(4096);
  250. //handshake, sync PCLK, TC int, single tx, single service, I2SSDO, I2S request, 
  251. //auto-reload, half-word,
  252. rDMASKTRIG2=(1<<1)+0; //DMA2 channel on, no-sw trigger 
  253. iis_div_val = (U32)(((float)Pclk/16934400.0)+0.5)-1;
  254. rIISPSR=(iis_div_val<<5)|(iis_div_val<<0); //IIS_LRCK=44.1Khz @384fs,PCLK=50 or 66.7Mhz.
  255. rIISCON=(1<<5)+(1<<2)+(1<<1);
  256. //Tx DMA enable,Rx idle,prescaler enable
  257. rIISMOD=(2<<6)|(1<<3)|(1<<2)|(1<<0);
  258. //Master,Tx,L-ch=low,iis,16bit ch.,CDCLK=384fs,IISCLK=32fs
  259. rIISFCON=(1<<15)+(1<<13); //Tx DMA,Tx FIFO enable
  260. rIISCON |=0x1;
  261. }