Main.c
上传用户:jankzhpno
上传日期:2022-08-03
资源大小:4763k
文件大小:9k
源码类别:

Windows CE

开发平台:

Visual C++

  1. /****************************************************************
  2.  NAME: u2440mon.c
  3.  DESC: u2440mon entry point,menu,download
  4.  HISTORY:
  5.  Mar.25.2002:purnnamu: S3C2400X profile.c is ported for S3C2410X.
  6.  Mar.27.2002:purnnamu: DMA is enabled.
  7.  Apr.01.2002:purnnamu: isDownloadReady flag is added.
  8.  Apr.10.2002:purnnamu: - Selecting menu is available in the waiting loop. 
  9.                          So, isDownloadReady flag gets not needed
  10.                        - UART ch.1 can be selected for the console.
  11.  Aug.20.2002:purnnamu: revision number change 0.2 -> R1.1       
  12.  Sep.03.2002:purnnamu: To remove the power noise in the USB signal, the unused CLKOUT0,1 is disabled.
  13.  ****************************************************************/
  14. #define GLOBAL_CLK 1
  15. #include <stdlib.h>
  16. #include <string.h>
  17. #include "def.h"
  18. #include "option.h"
  19. #include "2440addr.h"
  20. #include "2440lib.h"
  21. #include "2440slib.h"
  22. #include "mmu.h"
  23. #include "profile.h"
  24. #include "memtest.h"
  25. extern char Image$$RO$$Limit[];
  26. extern char Image$$RO$$Base[];
  27. extern char Image$$RW$$Limit[];
  28. extern char Image$$RW$$Base[];
  29. extern char Image$$ZI$$Limit[];
  30. extern char Image$$ZI$$Base[];
  31. void Isr_Init(void);
  32. void HaltUndef(void);
  33. void HaltSwi(void);
  34. void HaltPabort(void);
  35. void HaltDabort(void);
  36. void ClearMemory(void);
  37. void Clk0_Enable(int clock_sel);
  38. void Clk1_Enable(int clock_sel);
  39. void Clk0_Disable(void);
  40. void Clk1_Disable(void);
  41. //extern void TFT_LCD_Init(void);
  42. //extern void TFT_LCD_Test(void);
  43. extern void TFT_LCD_Init(void);
  44. extern void TFT_LCD_Test(void);
  45. extern void Test_Touchpanel(void) ;
  46. extern void Test_Adc(void) ; //adc test
  47. extern void KeyScan_Test(void) ;
  48. extern void RTC_Display(void) ;
  49. extern void Test_IrDA_Tx(void) ;
  50. extern void PlayMusicTest(void) ;
  51. extern void RecordTest( void ) ;
  52. extern void Test_Iic(void) ;
  53. extern void Test_SDI(void) ;
  54. extern void Camera_Test( void ) ;
  55. volatile U32 downloadAddress;
  56. void (*restart)(void)=(void (*)(void))0x0;
  57. volatile unsigned char *downPt;
  58. volatile U32 downloadFileSize;
  59. volatile U16 checkSum;
  60. volatile unsigned int err=0;
  61. volatile U32 totalDmaCount;
  62. volatile int isUsbdSetConfiguration;
  63. int download_run=0;
  64. U32 tempDownloadAddress;
  65. int menuUsed=0;
  66. extern char Image$$RW$$Limit[];
  67. U32 *pMagicNum=(U32 *)Image$$RW$$Limit;
  68. int consoleNum;
  69. static U32 cpu_freq;
  70. static U32 UPLL;
  71. static void cal_cpu_bus_clk(void)
  72. {
  73. U32 val;
  74. U8 m, p, s;
  75. val = rMPLLCON;
  76. m = (val>>12)&0xff;
  77. p = (val>>4)&0x3f;
  78. s = val&3;
  79. //(m+8)*FIN*2 不要超出32位数!
  80. FCLK = ((m+8)*(FIN/100)*2)/((p+2)*(1<<s))*100;
  81. val = rCLKDIVN;
  82. m = (val>>1)&3;
  83. p = val&1;
  84. val = rCAMDIVN;
  85. s = val>>8;
  86. switch (m) {
  87. case 0:
  88. HCLK = FCLK;
  89. break;
  90. case 1:
  91. HCLK = FCLK>>1;
  92. break;
  93. case 2:
  94. if(s&2)
  95. HCLK = FCLK>>3;
  96. else
  97. HCLK = FCLK>>2;
  98. break;
  99. case 3:
  100. if(s&1)
  101. HCLK = FCLK/6;
  102. else
  103. HCLK = FCLK/3;
  104. break;
  105. }
  106. if(p)
  107. PCLK = HCLK>>1;
  108. else
  109. PCLK = HCLK;
  110. if(s&0x10)
  111. cpu_freq = HCLK;
  112. else
  113. cpu_freq = FCLK;
  114. val = rUPLLCON;
  115. m = (val>>12)&0xff;
  116. p = (val>>4)&0x3f;
  117. s = val&3;
  118. UPLL = ((m+8)*FIN)/((p+2)*(1<<s));
  119. UCLK = (rCLKDIVN&8)?(UPLL>>1):UPLL;
  120. }
  121. void Temp_function() { Uart_Printf("nPlease input 1-16 to select test!!!n"); }
  122. struct {
  123. void (*fun)(void);
  124. char *tip;
  125. }CmdTip[] = {
  126. { Temp_function, "Please input 1-16 to select test" } ,
  127. { BUZZER_PWM_Test, "Test PWM" } ,
  128. { RTC_Display, "RTC time display" } ,
  129. { Test_Adc, "Test ADC" } ,
  130. { KeyScan_Test, "Test interrupt and key scan" } ,
  131. { Test_Touchpanel, "Test Touchpanel" } ,
  132. { TFT_LCD_Test, "Test TFT-LCD or VGA1024x768 module" } ,
  133. { Test_Iic, "Test IIC EEPROM, if use QQ2440, please remove the LCD" } ,
  134. { PlayMusicTest, "UDA1341 play music" } ,
  135. { Test_SDI, "Test SD Card" } ,
  136. { Camera_Test, "Test CMOS Camera"},
  137. { 0, 0}
  138. };
  139. void Main(void)
  140. {
  141. char *mode;
  142. int i;
  143. U8 key;
  144. U32 mpll_val = 0 ;
  145. //U32 divn_upll = 0 ;
  146.     
  147. #if ADS10   
  148. // __rt_lib_init(); //for ADS 1.0
  149. #endif
  150. Port_Init();
  151. Isr_Init();
  152. i = 2 ; //don't use 100M!
  153. //boot_params.cpu_clk.val = 3;
  154. switch ( i ) {
  155. case 0: //200
  156. key = 12;
  157. mpll_val = (92<<12)|(4<<4)|(1);
  158. break;
  159. case 1: //300
  160. key = 13;
  161. mpll_val = (67<<12)|(1<<4)|(1);
  162. break;
  163. case 2: //400
  164. key = 14;
  165. mpll_val = (92<<12)|(1<<4)|(1);
  166. break;
  167. case 3: //440!!!
  168. key = 14;
  169. mpll_val = (102<<12)|(1<<4)|(1);
  170. break;
  171. default:
  172. key = 14;
  173. mpll_val = (92<<12)|(1<<4)|(1);
  174. break;
  175. }
  176. //init FCLK=400M, so change MPLL first
  177. ChangeMPllValue((mpll_val>>12)&0xff, (mpll_val>>4)&0x3f, mpll_val&3);
  178. ChangeClockDivider(key, 12);
  179. cal_cpu_bus_clk();
  180. consoleNum = 0; // Uart 1 select for debug.
  181. Uart_Init( 0,115200 );
  182. Uart_Select( consoleNum );
  183. Beep(2000, 100);
  184. Uart_SendByte('n');
  185. Uart_Printf("<***********************************************>n");
  186. Uart_Printf("           SBC2440 Test Program VER1.0n");
  187. Uart_Printf("                www.arm9.netn");
  188. Uart_Printf("      Build time is: %s  %sn", __DATE__ , __TIME__  );
  189.     Uart_Printf( "          Image$$RO$$Base  = 0x%xn", Image$$RO$$Base );
  190. Uart_Printf( "          Image$$RO$$Limit = 0x%xn", Image$$RO$$Limit );
  191. Uart_Printf( "          Image$$RW$$Base  = 0x%xn", Image$$RW$$Base );
  192. Uart_Printf( "          Image$$RW$$Limit = 0x%xn", Image$$RW$$Limit );
  193.     Uart_Printf( "          Image$$ZI$$Base  = 0x%xn", Image$$ZI$$Base );
  194.     Uart_Printf( "          Image$$ZI$$Limit = 0x%xn", Image$$ZI$$Limit );
  195. Uart_Printf("<***********************************************>n");
  196. rMISCCR=rMISCCR&~(1<<3); // USBD is selected instead of USBH1 
  197. rMISCCR=rMISCCR&~(1<<13); // USB port 1 is enabled.
  198. //
  199. //  USBD should be initialized first of all.
  200. //
  201. // isUsbdSetConfiguration=0;
  202. // rd_dm9000_id(); //
  203. // rGPBCON &= ~(3<<20); //CF_CARD Power
  204. // rGPBCON |= 1<<20;
  205. // rGPBDAT |= 1<<10;
  206. // rDSC0 = 0x155;
  207. // rDSC1 = 0x15555555;
  208. rDSC0 = 0x2aa;
  209. rDSC1 = 0x2aaaaaaa;
  210. //Enable NAND, USBD, PWM TImer, UART0,1 and GPIO clock,
  211. //the others must be enabled in OS!!!
  212. rCLKCON = 0xfffff0;
  213. //MMU_EnableICache();
  214. MMU_Init(); //
  215. //Uart_Printf("NOR Flash ID is 0x%08xn", GetFlashID());
  216. pISR_SWI=(_ISR_STARTADDRESS+0xf0); //for pSOS
  217. Led_Display(0x66);
  218. #if USBDMA
  219. mode="DMA";
  220. #else
  221. mode="Int";
  222. #endif
  223. // CLKOUT0/1 select.
  224. //Uart_Printf("CLKOUT0:MPLL in, CLKOUT1:RTC clock.n");
  225. //Clk0_Enable(0); // 0:MPLLin, 1:UPLL, 2:FCLK, 3:HCLK, 4:PCLK, 5:DCLK0
  226. //Clk1_Enable(2); // 0:MPLLout, 1:UPLL, 2:RTC, 3:HCLK, 4:PCLK, 5:DCLK1
  227. Clk0_Disable();
  228. Clk1_Disable();
  229. mpll_val = rMPLLCON;
  230. TFT_LCD_Init();
  231. // TFT_LCD_Init();
  232. download_run=1; //The default menu is the Download & Run mode.
  233. while(1)
  234. {
  235. U8 idx;
  236. Uart_Printf("nPlease select function : n");
  237. for(i=0; CmdTip[i].fun!=0; i++)
  238. Uart_Printf("%d : %sn", i, CmdTip[i].tip);
  239. idx = Uart_GetIntNum_GJ() ;
  240. if(idx<i)
  241. {
  242. (*CmdTip[idx].fun)();
  243. Delay(20);
  244. Uart_Init( 0,115200 );
  245. }
  246. }   
  247. }
  248. void Isr_Init(void)
  249. {
  250. pISR_UNDEF=(unsigned)HaltUndef;
  251. pISR_SWI  =(unsigned)HaltSwi;
  252. pISR_PABORT=(unsigned)HaltPabort;
  253. pISR_DABORT=(unsigned)HaltDabort;
  254. rINTMOD=0x0;   // All=IRQ mode
  255. rINTMSK=BIT_ALLMSK;   // All interrupt is masked.
  256. //pISR_URXD0=(unsigned)Uart0_RxInt;
  257. //rINTMSK=~(BIT_URXD0);   //enable UART0 RX Default value=0xffffffff
  258. //#if 1
  259. // pISR_USBD =(unsigned)IsrUsbd;
  260. // pISR_DMA2 =(unsigned)IsrDma2;
  261. //#else
  262. // pISR_IRQ =(unsigned)IsrUsbd;
  263. //Why doesn't it receive the big file if use this. (???)
  264. //It always stops when 327680 bytes are received.
  265. //#endif
  266. // ClearPending(BIT_DMA2);
  267. // ClearPending(BIT_USBD);
  268. //rINTMSK&=~(BIT_USBD);  
  269.    
  270. //pISR_FIQ,pISR_IRQ must be initialized
  271. }
  272. void HaltUndef(void)
  273. {
  274. Uart_Printf("Undefined instruction exception!!!n");
  275. while(1);
  276. }
  277. void HaltSwi(void)
  278. {
  279. Uart_Printf("SWI exception!!!n");
  280. while(1);
  281. }
  282. void HaltPabort(void)
  283. {
  284. Uart_Printf("Pabort exception!!!n");
  285. while(1);
  286. }
  287. void HaltDabort(void)
  288. {
  289. Uart_Printf("Dabort exception!!!n");
  290. while(1);
  291. }
  292. void ClearMemory(void)
  293. {
  294. //int i;
  295. //U32 data;
  296. int memError=0;
  297. U32 *pt;
  298. Uart_Printf("Clear Memory (%xh-%xh):WR",_RAM_STARTADDRESS,HEAPEND);
  299. pt=(U32 *)_RAM_STARTADDRESS;
  300. while((U32)pt < HEAPEND)
  301. {
  302. *pt=(U32)0x0;
  303. pt++;
  304. }
  305. if(memError==0)Uart_Printf("bbO.K.n");
  306. }
  307. void Clk0_Enable(int clock_sel)
  308. { // 0:MPLLin, 1:UPLL, 2:FCLK, 3:HCLK, 4:PCLK, 5:DCLK0
  309. rMISCCR = rMISCCR&~(7<<4) | (clock_sel<<4);
  310. rGPHCON = rGPHCON&~(3<<18) | (2<<18);
  311. }
  312. void Clk1_Enable(int clock_sel)
  313. { // 0:MPLLout, 1:UPLL, 2:RTC, 3:HCLK, 4:PCLK, 5:DCLK1
  314. rMISCCR = rMISCCR&~(7<<8) | (clock_sel<<8);
  315. rGPHCON = rGPHCON&~(3<<20) | (2<<20);
  316. }
  317. void Clk0_Disable(void)
  318. {
  319. rGPHCON = rGPHCON&~(3<<18); // GPH9 Input
  320. }
  321. void Clk1_Disable(void)
  322. {
  323. rGPHCON = rGPHCON&~(3<<20); // GPH10 Input
  324. }