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

uCOS

开发平台:

C/C++

  1. #include <string.h>
  2. #include <stdio.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. /************************** Manual register setting *****************************/
  10. char sbuf[80], scmd1[20], scmd2[20], scmd3[20], scmd4[20];
  11. //char *sbuf, *scmd1, *scmd2, *scmd3, *scmd4;
  12. U32 cmd2, cmd3, cmd4;
  13. char pre_scmd[10][80];
  14. const void *command_set[][2] = {
  15. (void *)Memory_Dump, "dump",
  16. (void *)Multimem_Write, "mw",
  17. (void *)Halfword_Read, "hr",
  18. (void *)Halfword_Write, "hw",
  19. (void *)Halfword_Write_Multi, "hwm",
  20. (void *)Word_Write, "w",
  21. (void *)Word_Write_Or, "ow",
  22. (void *)Word_Read, "r",
  23. (void *)Fill_Memory, "fi",
  24. // Add the test function. add manset_Usage too.
  25. 0,0,0
  26. };
  27. void Manset_Usage(void)
  28. {
  29. int i;
  30. Uart_Printf("dump:memory dump(ex:dump addr length)n");
  31. Uart_Printf("mw:multiple write.n");
  32. Uart_Printf("hr:halfword read.n");
  33. Uart_Printf("hw:halfword write.n");
  34. Uart_Printf("hwm:halfword write multi.n");
  35. Uart_Printf("w:word write.n");
  36. Uart_Printf("ow:word write with OR logic.n");
  37. Uart_Printf("r:word read.n");
  38. Uart_Printf("fi:memory fill(ex:fi addr length value).n");
  39. Uart_Printf("P: execute previous command.n");
  40. }
  41. void Manual_Register_Set(void)
  42. {
  43. U32 i=0, j=0;
  44. Uart_Printf("Manual regiter set. (q)uit.n");
  45. Uart_Printf("Usage(?): >> <command> <opr1> (<opr2>)n");
  46. Manset_Usage();
  47. while (1) {
  48. Uart_Printf(">> ");
  49. Uart_GetString(sbuf);
  50. if(*sbuf==NULL) continue;
  51. else if(*sbuf=='P') Execute_Precmd();
  52. else if(*sbuf==ESC_KEY) break;
  53. else if(*sbuf==ESC_KEY) {
  54. Manset_Usage();
  55. } else {
  56. Get_Cmd(sbuf);
  57. for(i=0; (int)(command_set[i][0])!=NULL; i++) {
  58. if(!strcmp((command_set[i][1]), scmd1)) {
  59. ((void (*)(void)) (command_set[i][0]))();
  60. for(j=MAX_PRECMD_SIZE-1; j>0; j--) {
  61. //if((int)pre_scmd[j][0]==NULL) continue;
  62. strcpy(pre_scmd[j], pre_scmd[j-1]);
  63. }
  64. strcpy(pre_scmd[j], sbuf);
  65. break;
  66. }
  67. }
  68. } // end of if(*sbuf==NULL)...
  69. }
  70. }
  71. void Get_Cmd(char incmd[])
  72. {
  73. int cmd_level=0, i, j, overlap=0;
  74. scmd1[0]='';
  75. scmd2[0]='';
  76. scmd3[0]='';
  77. scmd4[0]='';
  78. for(j=0, i=0; incmd[i]!=NULL; i++) {
  79. if(incmd[i] != ' ' && incmd[i] != 0x09 && incmd[i] != ',') {
  80. overlap=0;
  81. switch(cmd_level) {
  82. case 0:
  83. scmd1[j] = incmd[i];
  84. scmd1[j+1]='';
  85. //if(DEBUG_LEVEL>0) Uart_Printf("(%c)", scmd1[j]);
  86. break;
  87. case 1:
  88. scmd2[j] = incmd[i];
  89. scmd2[j+1]='';
  90. //if(DEBUG_LEVEL>0) Uart_Printf("%c", scmd2[j]);
  91. break;
  92. case 2:
  93. scmd3[j] = incmd[i];
  94. scmd3[j+1]='';
  95. //if(DEBUG_LEVEL>0) Uart_Printf("[%c]", scmd3[j]);
  96. break;
  97. case 3:
  98. scmd4[j] = incmd[i];
  99. scmd4[j+1]='';
  100. //if(DEBUG_LEVEL>0) Uart_Printf("[%c]", cmd4[j]);
  101. break;
  102. }
  103. j++;
  104. } else {
  105. j=0;
  106. if(overlap==0) {
  107. cmd_level++;
  108. }
  109. overlap=1;
  110. }
  111. }
  112. // Make argument.
  113. cmd2 = Get_Num(scmd2); // atox(scmd2);
  114. cmd3 = Get_Num(scmd3); // : Character to hexa(decimal)
  115. cmd4 = Get_Num(scmd4); // : Character to hexa(decimal)
  116. if(cmd2==0xffffffff) cmd2=0;
  117. if(cmd3==0xffffffff) cmd3=0;
  118. if(cmd4==0xffffffff) cmd4=0;
  119. }
  120. U32 Get_Num(char *string)
  121. {
  122.     int base=10;
  123.     int minus=0;
  124.     int lastIndex;
  125.     int result=0;
  126.     int i;
  127.     if(string[0]=='-')
  128.     {
  129. minus=1;
  130. string++;
  131.     }
  132.     if(string[0]=='0' && (string[1]=='x' || string[1]=='X'))
  133.     {
  134. base=16;
  135. string+=2;
  136.     }
  137.     lastIndex=strlen(string)-1;
  138.     if(lastIndex<0)return -1;
  139.     if( string[lastIndex]=='h' || string[lastIndex]=='H' )
  140.     {
  141. base=16;
  142. string[lastIndex]=0;
  143. lastIndex--;
  144.     }
  145.     if(base==10)
  146.     {
  147. result=atoi(string);
  148. result=minus ? (-1*result):result;
  149.     }
  150.     else
  151.     {
  152. for(i=0;i<=lastIndex;i++)
  153. {
  154.     if(isalpha(string[i]))
  155.     {
  156. if(isupper(string[i]))
  157.     result=(result<<4)+string[i]-'A'+10;
  158. else
  159.     result=(result<<4)+string[i]-'a'+10;
  160.     }
  161.     else
  162.     {
  163. result=(result<<4)+string[i]-'0';
  164.     }
  165. }
  166. result=minus ? (-1*result):result;
  167.     }
  168.     return result;
  169. }
  170. void Execute_Precmd(void)
  171. {
  172. int cnt=0, i=0, cmd_sel=0, exec_cmd=1;
  173. char ch;
  174. for(i=0; i<MAX_PRECMD_SIZE && pre_scmd[i][0]!=NULL; i++) {
  175. Uart_Printf("%d: [%s]n", i, pre_scmd[i]);
  176. }
  177. if(i==0) return;
  178. Uart_Printf("select num(-1 to exit)? ");
  179. cmd_sel = Uart_GetIntNum();
  180. if(cmd_sel != -1) {
  181. Uart_Printf("n>> %s", pre_scmd[cmd_sel]);
  182. Uart_Printf("n");
  183. Get_Cmd(pre_scmd[cmd_sel]); // Make sbuf -> scmd...
  184. for(i=0; (int)(command_set[i][0])!=NULL; i++) {
  185. if(!strcmp((command_set[i][1]), scmd1)) {
  186. ((void (*)(void)) (command_set[i][0]))();
  187. break;
  188. }
  189. }
  190. }
  191. }
  192. void Uart_AppendString(char *string)
  193. {
  194.     char *string2 = string;
  195.     char c;
  196. string = (string + strlen(string));
  197.     while((c = Uart_Getch())!='r') {
  198.         if(c=='b') {
  199.             if( (int)string2 < (int)string ) {
  200.                 Uart_Printf("b b");
  201.                 string--;
  202.             }
  203.         } else {
  204.             *string++ = c;
  205.             Uart_SendByte(c);
  206.         }
  207.     }
  208.     *string='';
  209.     Uart_SendByte('n');
  210. }
  211. //================================================================
  212. void Memory_Dump(void)
  213. {
  214. int i;
  215. Uart_Printf("memory dumpn");
  216. for(i=0; i<cmd3; i+=4) {
  217. Uart_Printf("  %08xh: %08xhn", (cmd2+i), *(U32 *)(cmd2+i));
  218. if(Uart_GetKey()!=NULL) {
  219.   Uart_Printf("Break at %xn", cmd2+i);
  220.   break;
  221.   }
  222. }
  223. }
  224. void Multimem_Write(void)
  225. {
  226. U32 i, itmp;
  227. char tmps[20];
  228. if(cmd2%4) cmd2=(cmd2/4)*4;
  229. Uart_Printf("Multiple memory write (q)uit.n");
  230. for(i=0; ; ) {
  231. Uart_Printf("  %08xh ? ", cmd2+i);
  232. Uart_GetString(tmps);
  233. if(*tmps=='q') break;
  234. itmp = Get_Num(tmps);
  235.   if(itmp!=-1) *(U32 *)(cmd2+i) = itmp;
  236. i+=4;
  237. }
  238. }
  239. void Fill_Memory(void)
  240. {
  241. U32 i, itmp;
  242. char tmps[20];
  243. if(cmd2%4) cmd2=(cmd2/4)*4;
  244. Uart_Printf("Fill memory[%08xh - %08xh with %xh].n", cmd2, cmd2 + cmd3, cmd4);
  245. for(i=0; i<cmd3; i+=4) {
  246.   *(U32 *)(cmd2+i) = cmd4;
  247.   if(Uart_GetKey()!=NULL) {
  248.   Uart_Printf("Break at %xn", cmd2+i);
  249.   break;
  250.   }
  251. }
  252. }
  253. void Halfword_Read(void)
  254. {
  255. Uart_Printf("  [%08xh:%04xh]n", cmd2, *(U16 *)cmd2);
  256. }
  257. void Halfword_Write(void)
  258. {
  259. *(U16 *)cmd2 = (U16)cmd3;
  260. Uart_Printf("  [%08xh<-%04xh]n", cmd2, (U16)cmd3);
  261. }
  262. void Halfword_Write_Multi(void)
  263. {
  264. char *string;
  265. short int  indata;
  266. Uart_Printf("  Addr:%08xhn", cmd2);
  267. while(1) {
  268. Uart_Printf("  data: ");
  269. indata = Uart_GetIntNum();
  270. if(indata==-1) break;
  271. *(U16 *)cmd2 = indata;
  272. Uart_Printf("  [%08xh<-%04xh]n", cmd2, indata);
  273. }
  274. }
  275. void Word_Write(void)
  276. {
  277. if(cmd2%4) cmd2=(cmd2/4)*4;
  278. *(U32 *)cmd2 = (U32)cmd3;
  279. Uart_Printf("  [%08xh<-%08xh]n", cmd2, cmd3);
  280. }
  281. void Word_Write_Or(void)
  282. {
  283. if(cmd2%4) cmd2=(cmd2/4)*4;
  284. *(U32 *)cmd2 |= (U32)cmd3;
  285. Uart_Printf("  [%08xh |= %08xh]n", cmd2, cmd3);
  286. }
  287. void Word_Read(void)
  288. {
  289. if(cmd2%4) cmd2=(cmd2/4)*4;
  290. Uart_Printf("  [%08xh:%08xh]n", cmd2, *(U32 *)cmd2);
  291. }
  292. void user_delay(unsigned int cnt)
  293. {
  294. int i, j;
  295. for(j=0; j<cnt; j++)
  296. for(i=0; i<500; i++);
  297. }
  298. /***************************************************************************/
  299. /**************************** Clock calculation ********************************/
  300. // Clock calculation. Current clock information calc.
  301. // Register value : MPLLCON(Mdiv, Pdiv, Sdiv), CLKDIVN(Hdivn, Pdivn).
  302. // Hclk = Fclk/Hclk_Ratio, Pclk = Fclk/Hclk_Ratio/Pclk_Ratio.
  303. // Refresh count(Ref_Cnt) = 2048+1-(Hclk*7.8)
  304. void Calc_Clock(int print_msg);
  305. U32 Mdiv, Pdiv, Sdiv, Fclk, Hclk, Pclk, Hdivn, Pdivn, Hclk_Ratio, Pclk_Ratio, Ref_Cnt;
  306. // Register value : Mdiv, Pdiv, Sdiv, Hdivn, Pdivn.
  307. // Hclk = Fclk/Hclk_Ratio, Pclk = Fclk/Hclk_Ratio/Pclk_Ratio.
  308. #define LCDCLK (5000000) //5MHz
  309. void Calc_Clock(int print_msg)
  310. {
  311. unsigned int mpll_val, sval, lcd_clk_val, tmpi;
  312. // Get MPS value from register.
  313. mpll_val = rMPLLCON;
  314. Mdiv = (mpll_val&(0xff<<12))>>12;
  315. Pdiv = (mpll_val&(0x3f<<4))>>4;
  316. Sdiv = (mpll_val&0x3);
  317. // Get HDIVN, PDIVN value from register.
  318. Hdivn = ((rCLKDIVN&0x6)>>1);
  319. Pdivn = (rCLKDIVN&1);
  320. // Get the HCLK and PCLK ratio
  321. switch(Hdivn) {
  322. case 0: Hclk_Ratio=1; break;
  323. case 1: Hclk_Ratio=2; break;
  324. case 2: Hclk_Ratio=4; break;
  325. case 3: Hclk_Ratio=3; break;
  326. }
  327. switch(Pdivn) {
  328. case 0: Pclk_Ratio=1; break;
  329. case 1: Pclk_Ratio=2; break;
  330. }
  331. tmpi = rCAMDIVN&(3<<8);
  332. if(tmpi!=0) {
  333. if(Hclk_Ratio==3 || Hclk_Ratio==4)
  334. Hclk_Ratio *= 2;
  335. }
  336. // Get sval for calc Fout.
  337. //sval=(int)pow(2,Sdiv);
  338. switch(Sdiv) {
  339. case 0: sval = 1; break;
  340. case 1: sval = 2; break;
  341. case 2: sval = 4; break;
  342. case 3: sval = 8; break;
  343. default: sval = 0; break;
  344. }
  345. // Calc Fclk, Hclk, Pclk
  346. #if CPU2440A==TRUE
  347. Fclk=(U32)( (((float)Mdiv+8)*FIN*2.0)/( ((float)Pdiv+2)*(float)sval) ); // pll2188x.
  348. #else
  349. Fclk=(U32)( (((float)Mdiv+8)*FIN)/( ((float)Pdiv+2)*(float)sval) ); // pll2115x
  350. #endif
  351. Hclk =(U32)( ((float)Fclk/(float)Hclk_Ratio) );
  352. Pclk = (U32)( (((float)Fclk/(float)Hclk_Ratio)/(float)Pclk_Ratio));
  353. // Calc refresh count.
  354. Ref_Cnt = 2048+1-(U32)( (float)( ((float)Hclk*7.8)/MEGA) );
  355. Uart_TxEmpty(1);
  356. Uart_Init(Pclk, 115200);
  357. if(print_msg!=0) {
  358. Uart_Printf("MPLLVal [M:%xh(%d),P:%xh,S:%xh]n", Mdiv, Mdiv, Pdiv, Sdiv);
  359. Uart_Printf("F/H/PCLK=[1:%d:%d=", Hclk_Ratio, Hclk_Ratio*Pclk_Ratio);
  360. //Uart_Printf("%4.3f:%4.3f:%4.3f MHz]n", (float)Fclk/MEGA, (float)Hclk/MEGA, (float)Pclk/MEGA);
  361. Uart_Printf("%4.1f:%4.1f:%4.1f MHz]n", (float)Fclk/MEGA, (float)Hclk/MEGA, (float)Pclk/MEGA);
  362. Uart_Printf("Refcnt:%dn", Ref_Cnt);
  363. }
  364. lcd_clk_val = (Hclk/(2.0*LCDCLK)+0.5)-1;
  365. rLCDCON1 = (rLCDCON1 & ~(0x3ff<<8)) | lcd_clk_val<<8;
  366. //Uart_Printf("CLKVAL:%dn", lcd_clk_val);
  367. }
  368. /***************************************************************************/
  369. //*************************[ Ticker ]********************************
  370. unsigned int Init_Ticker(int divider)  //0:16us,1:32us 2:64us 3:128us
  371. {
  372. unsigned int Div_us;
  373.     rWTCON = ((Pclk/1000000-1)<<8)|(divider<<3);  //Watch-dog timer control register
  374.     rWTDAT = 0xffff;  //Watch-dog timer data register
  375.     rWTCNT = 0xffff;  //Watch-dog count register
  376. pISR_WDT_AC97=(int)Ticker_int;
  377. ClearPending(BIT_WDT_AC97);
  378. rSUBSRCPND=(BIT_SUB_WDT);
  379. rINTMSK&=~(BIT_WDT_AC97);
  380. rINTSUBMSK&=~(BIT_SUB_WDT);
  381. switch(divider) {
  382. case 0: Div_us=16; break;
  383. case 1: Div_us=32; break;
  384. case 2: Div_us=64; break;
  385. case 3: Div_us=128; break;
  386. default: Div_us=0; break;
  387. }
  388. return Div_us;
  389. }
  390. //=================================================================
  391. int Ticker_Stop(void)
  392. {
  393.     rWTCON = ((Pclk/1000000-1)<<8);
  394.     return (0xffff - rWTCNT);
  395. }
  396. static void __irq Ticker_int(void)
  397. {
  398. rINTSUBMSK|=(BIT_SUB_WDT); // Just for the safety
  399. rSUBSRCPND=(BIT_SUB_WDT); // Clear Sub int pending
  400. ClearPending(BIT_WDT_AC97); // Clear master pending
  401. Uart_Printf("Error: Ticker timer reaches 0.n");
  402. }