44blib.c
上传用户:jinguanrq
上传日期:2022-06-04
资源大小:724k
文件大小:10k
源码类别:

uCOS

开发平台:

C/C++

  1. #include "44b.h"
  2. #include "44blib.h"
  3. #include "def.h"
  4. #include "option.h"
  5. #include "stdlib.h"
  6. #include <stdarg.h>
  7. #include <string.h>
  8. #include <stdio.h>
  9. #include <ctype.h>
  10. #define STACKSIZE    0xa00 //SVC satck size(do not use user stack)//
  11. #define HEAPEND     (_ISR_STARTADDRESS-STACKSIZE-0x500) // = 0xc7ff000//
  12. //SVC Stack Area:0xc(e)7ff000-0xc(e)7ffaff//
  13. //extern char Image_RW_Limit[];
  14. volatile unsigned char *downPt;
  15. unsigned int fileSize;
  16. //void *mallocPt=Image_RW_Limit;
  17. void *mallocPt=(char*)0x0c070000;
  18. void (*restart)(void)=(void (*)(void))0x0;
  19. void (*run)(void)=(void (*)(void))DOWNLOAD_ADDRESS;
  20. //--------------------------------SYSTEM---------------------------------//
  21. static int delayLoopCount=400;
  22. void Delay(int time)
  23. // time=0: adjust the Delay function by WatchDog timer.//
  24. // time>0: the number of loop time//
  25. // 100us resolution.//
  26. {
  27. int i,adjust=0;
  28. if(time==0)
  29. {
  30. time=200;
  31. adjust=1;
  32. delayLoopCount=400;
  33. rWTCON=((MCLK/1000000-1)<<8)|(2<<3); // 1M/64,Watch-dog,nRESET,interrupt disable//
  34. rWTDAT=0xffff;
  35. rWTCNT=0xffff;  
  36. rWTCON=((MCLK/1000000-1)<<8)|(2<<3)|(1<<5); // 1M/64,Watch-dog enable,nRESET,interrupt disable //
  37. }
  38. for(;time>0;time--)
  39. for(i=0;i<delayLoopCount;i++);
  40. if(adjust==1)
  41. {
  42. rWTCON=((MCLK/1000000-1)<<8)|(2<<3);
  43. i=0xffff-rWTCNT;   //  1count/16us?????????//
  44. delayLoopCount=8000000/(i*64); //400*100/(i*64/200)   //
  45. }
  46. }
  47. void DelayMs(int ms_time)
  48. {
  49. int i;
  50. for( i = 0 ; i < 1000*ms_time ; i++ )
  51. ;
  52. }
  53. /*********************************************************************************************
  54. * name: DelayTime
  55. * func: delay time
  56. * para: none
  57. * ret: none
  58. * modify:
  59. * comment:
  60. *********************************************************************************************/
  61. void DelayTime(int num)
  62. {
  63. int i;
  64. for( i = 0 ; i < num ; i++ )
  65. ;
  66. }
  67. //------------------------PORTS------------------------------//
  68. void Port_Init(void)
  69. {
  70. //CAUTION:Follow the configuration order for setting the ports. 
  71. // 1) setting value 
  72. // 2) setting control register 
  73. // 3) configure pull-up resistor.  
  74. //16bit data bus configuration  
  75. // PORT A GROUP
  76. // BIT  9 8 7 6 5 4 3 2 1 0
  77. //  A24 A23 A22 A21 A20 A19 A18 A17 A16 A0
  78. // 0 1 1 1 1 1 1 1 1 1
  79. rPCONA = 0x1ff;
  80. // PORT B GROUP
  81. // BIT  10 9 8 7 6 5 4 3 2 1 0
  82. // /CS5 /CS4 /CS3 /CS2 /CS1 GPB5 GPB4 /SRAS /SCAS SCLK SCKE
  83. // EXT NIC USB IDE SMC NC NC Sdram Sdram Sdram Sdram
  84. //      1,  1,    1,    1,     1,     0,       0,     1,     1,     1,    1
  85. rPDATB = 0x7ff; // P9-LED1 P10-LED2
  86. rPCONB = 0x1cf;
  87.     
  88. // PORT C GROUP
  89. // BUSWIDTH=16
  90. //  PC15 14 13 12 11 10 9 8
  91. // I I RXD1 TXD1 I I I I
  92. // NC NC Uart1 Uart1 NC NC NC NC
  93. // 00 00 11 11 00 00 00 00
  94. //  PC7 6 5 4 3 2 1 0
  95. //   I I I I I I I I
  96. //   NC NC NC NC IISCLK IISDI IISDO IISLRCK
  97. //   00 00 00 00 11 11 11 11
  98. rPDATC = 0xff00;
  99. rPCONC = 0x0ff0ffff;
  100. rPUPC  = 0x30ff; //PULL UP RESISTOR should be enabled to I/O
  101. // PORT D GROUP
  102. // PORT D GROUP(I/O OR LCD)
  103. // BIT7 6 5 4 3 2 1 0
  104. // VF VM VLINE VCLK VD3 VD2 VD1 VD0
  105. // 00 00 00 00 00 00 00 00
  106. rPDATD= 0xff;
  107. rPCOND= 0xaaaa;
  108. rPUPD = 0x0;
  109. // These pins must be set only after CPU's internal LCD controller is enable
  110. // PORT E GROUP 
  111. // Bit 8 7 6 5 4 3 2 1 0
  112. //   CODECLK LED4 LED5 LED6 LED7 BEEP RXD0 TXD0 LcdDisp
  113. //   10 01 01 01 01 01 10 10 01
  114. rPDATE = 0x1ff;
  115. rPCONE = 0x25529;
  116. rPUPE = 0x6;
  117. // PORT F GROUP
  118. // Bit8 7 6 5  4 3 2 1 0
  119. // IISCLK IISDI IISDO IISLRCK Input Input Input IICSDA IICSCL
  120. // 100 100 100 100 00 00 00 10 10
  121. rPDATF = 0x0;
  122. rPCONF = 0x252a;
  123. rPUPF  = 0x0;
  124. // PORT G GROUP
  125. // BIT7 6 5 4 3 2 1 0
  126. //  INT7 INT6 INT5 INT4 INT3 INT2 INT1 INT0
  127. // S3 S4 S5 S6 NIC EXT IDE USB
  128. // 11      11      11      11      11      11      11      11
  129. rPDATG = 0xff;
  130. rPCONG = 0xffff;
  131. rPUPG  = 0x0; //should be enabled  
  132. rSPUCR = 0x7;   //D15-D0 pull-up disable
  133. /*定义非Cache区*/
  134. rNCACHBE0=((unsigned)(Non_Cache_End>>12)<<16)|(Non_Cache_Start>>12); 
  135. /*所有的外部硬件中断为低电平触发*/
  136. rEXTINT=0x0;
  137. }
  138. /************************* UART ****************************/
  139. static int whichUart=0;
  140. void Uart_Init(int mclk,int baud)
  141. {
  142.     int i;
  143.     if(mclk==0)
  144. mclk=MCLK;
  145.     rUFCON0=0x0;     //FIFO disable
  146.     rUFCON1=0x0;
  147.     rUMCON0=0x0;
  148.     rUMCON1=0x0;
  149. //UART0
  150.     rULCON0=0x3;     //Normal,No parity,1 stop,8 bit
  151.     rUCON0=0x245;    //rx=edge,tx=level,disable timeout int.,enable rx error int.,normal,interrupt or polling
  152.     rUBRDIV0=( (int)(mclk/16./baud + 0.5) -1 );
  153. //UART1
  154.     rULCON1=0x3;
  155.     rUCON1=0x245;
  156.     rUBRDIV1=( (int)(mclk/16./baud + 0.5) -1 );
  157.     for(i=0;i<100;i++);
  158. }
  159. void Uart_Select(int ch)
  160. {
  161.     whichUart=ch;
  162. }
  163. void Uart_TxEmpty(int ch)
  164. {
  165.     if(ch==0)
  166. while(!(rUTRSTAT0 & 0x4)); //wait until tx shifter is empty.
  167.     else
  168.      while(!(rUTRSTAT1 & 0x4)); //wait until tx shifter is empty.
  169. }
  170. char Uart_Getch(void)
  171. {
  172.     if(whichUart==0)
  173.     {     
  174. while(!(rUTRSTAT0 & 0x1)); //Receive data read
  175. return RdURXH0();
  176.     }
  177.     else
  178.     {
  179. while(!(rUTRSTAT1 & 0x1)); //Receive data ready
  180. return rURXH1;
  181.     }
  182. }
  183. char Uart_GetKey(void)
  184. {
  185.     if(whichUart==0)
  186.     {     
  187. if(rUTRSTAT0 & 0x1)    //Receive data ready
  188.          return RdURXH0();
  189. else
  190.     return 0;
  191.     }
  192.     else
  193.     {
  194. if(rUTRSTAT1 & 0x1)    //Receive data ready
  195.     return rURXH1;
  196. else
  197.     return 0;
  198.     }
  199. }
  200. void Uart_GetString(char *string)
  201. {
  202.     char *string2=string;
  203.     char c;
  204.     while((c=Uart_Getch())!='r')
  205.     {
  206. if(c=='b')
  207. {
  208.     if( (int)string2 < (int)string )
  209.     {
  210. Uart_Printf("b b");
  211. string--;
  212.     }
  213. }
  214. else 
  215. {
  216.     *string++=c;
  217.     Uart_SendByte(c);
  218. }
  219.     }
  220.     *string='';
  221.     Uart_SendByte('n');
  222. }
  223. int Uart_GetIntNum(void)
  224. {
  225.     char str[30];
  226.     char *string=str;
  227.     int base=10;
  228.     int minus=0;
  229.     int lastIndex;
  230.     int result=0;
  231.     int i;
  232.     
  233.     Uart_GetString(string);
  234.     
  235.     if(string[0]=='-')
  236.     {
  237.         minus=1;
  238.         string++;
  239.     }
  240.     
  241.     if(string[0]=='0' && (string[1]=='x' || string[1]=='X'))
  242.     {
  243. base=16;
  244. string+=2;
  245.     }
  246.     
  247.     lastIndex=strlen(string)-1;
  248.     if( string[lastIndex]=='h' || string[lastIndex]=='H' )
  249.     {
  250. base=16;
  251. string[lastIndex]=0;
  252. lastIndex--;
  253.     }
  254.     if(base==10)
  255.     {
  256. result=atoi(string);
  257. result=minus ? (-1*result):result;
  258.     }
  259.     else
  260.     {
  261. for(i=0;i<=lastIndex;i++)
  262. {
  263.          if(isalpha(string[i]))
  264. {
  265. if(isupper(string[i]))
  266. result=(result<<4)+string[i]-'A'+10;
  267. else
  268.     result=(result<<4)+string[i]-'a'+10;
  269. }
  270. else
  271. {
  272. result=(result<<4)+string[i]-'0';
  273. }
  274. }
  275. result=minus ? (-1*result):result;
  276.     }
  277.     return result;
  278. }
  279. void Uart_SendByte(int data)
  280. {
  281. if(whichUart==0)
  282.     {
  283. if(data=='n')
  284. {
  285.     while(!(rUTRSTAT0 & 0x2));
  286.     Delay(10); //because the slow response of hyper_terminal 
  287.     WrUTXH0('r');
  288. }
  289. while(!(rUTRSTAT0 & 0x2));  //Wait until THR is empty.
  290. Delay(10);
  291. WrUTXH0(data);
  292.     }
  293. else
  294.     {
  295. if(data=='n')
  296. {
  297. while(!(rUTRSTAT1 & 0x2));
  298. Delay(10); //because the slow response of hyper_terminal 
  299. rUTXH1='r';
  300. }
  301. while(!(rUTRSTAT1 & 0x2));  //Wait until THR is empty.
  302. Delay(10);
  303. rUTXH1=data;
  304.     }
  305. }
  306. void Uart_SendString(char *pt)
  307. {
  308.     while(*pt)
  309. Uart_SendByte(*pt++);
  310. }
  311. //if you don't use vsprintf(), the code size is reduced very much.
  312. void Uart_Printf(char *fmt,...)
  313. {
  314.     va_list ap;
  315.     char string[256];
  316.     va_start(ap,fmt);
  317.     vsprintf(string,fmt,ap);
  318.     Uart_SendString(string);
  319.     va_end(ap);
  320. }
  321. /************************* Timer ********************************/
  322. void Timer_Start(int divider)  //0:16us,1:32us 2:64us 3:128us
  323. {
  324.     rWTCON=((MCLK/1000000-1)<<8)|(divider<<3);
  325.     rWTDAT=0xffff;
  326.     rWTCNT=0xffff;   
  327.     // 1/16/(65+1),nRESET & interrupt  disable
  328.     rWTCON=((MCLK/1000000-1)<<8)|(divider<<3)|(1<<5);
  329. }
  330. int Timer_Stop(void)
  331. {
  332.     rWTCON=((MCLK/1000000-1)<<8);
  333.     return (0xffff-rWTCNT);
  334. }
  335. void Beep(int BeepStatus)
  336. {
  337. if (BeepStatus==0)
  338. rPDATE=rPDATE|0x8;
  339. else
  340. rPDATE=rPDATE&0x1f7;
  341. }
  342. /************************* PLL ********************************/
  343. void ChangePllValue(int mdiv,int pdiv,int sdiv)
  344. {
  345.     rPLLCON=(mdiv<<12)|(pdiv<<4)|sdiv;
  346. }
  347. /************************* General Library **********************/
  348. void * malloc(unsigned nbyte) 
  349. /*Very simple; Use malloc() & free() like Stack*/
  350. //void *mallocPt=Image$$RW$$Limit;
  351. {
  352.     void *returnPt=mallocPt;
  353.     mallocPt= (int *)mallocPt+nbyte/4+((nbyte%4)>0); //to align 4byte
  354.     if( (int)mallocPt > HEAPEND )
  355.     {
  356. mallocPt=returnPt;
  357. return NULL;
  358.     }
  359.     return returnPt;
  360. }
  361. void free(void *pt)
  362. {
  363.     mallocPt=pt;
  364. }
  365. void Cache_Flush(void)
  366. {
  367.     int i,saveSyscfg;
  368.     
  369.     saveSyscfg=rSYSCFG;
  370.     rSYSCFG=SYSCFG_0KB;        
  371.     for(i=0x10004000;i<0x10004800;i+=16)    
  372.     {    
  373. *((int *)i)=0x0;    
  374.     }
  375.     rSYSCFG=saveSyscfg;      
  376. }
  377. /* 8led control register address */
  378. #define LED8ADDR (*(volatile unsigned char *)(0x2140000))
  379. void sys_init()// Interrupt,Port and UART
  380. {
  381. Port_Init(); /* Initial 44B0X's I/O port */
  382.     /* enable interrupt */
  383. rINTMOD=0x0;
  384. rINTCON=0x1;
  385. rEXTINT = 0x22222222;                  // level mode
  386.     rI_ISPC = 0xffffffff; /* clear all interrupt pend */
  387. rEXTINTPND = 0xf; // clear EXTINTPND reg
  388.     LED8ADDR = 0 ;
  389.     Delay(0);
  390.     Led_Display(0xf);
  391. Uart_Init(0,115200); /* Initial Serial port 1 */
  392. }