www.pudn.com > ARM+SL811.rar > 44blib.c
#include#include #include #include #include #include "..\target\44b.h" #include "..\target\44blib.h" #include "..\target\def.h" #include "..\target\option.h" #define STACKSIZE 0xa00 //SVC satck size(do not use user stack)// #define HEAPEND (_ISR_STARTADDRESS-STACKSIZE-0x500) // = 0xc7ff000// //SVC Stack Area:0xc(e)7ff000-0xc(e)7ffaff// extern char Image$$RW$$Limit[]; volatile unsigned char *downPt; unsigned int fileSize; void *mallocPt=Image$$RW$$Limit; void (*restart)(void)=(void (*)(void))0x0; void (*run)(void)=(void (*)(void))DOWNLOAD_ADDRESS; //--------------------------------SYSTEM---------------------------------// static int delayLoopCount=400; void Delay(int time) // time=0: adjust the Delay function by WatchDog timer.// // time>0: the number of loop time// // 100us resolution.// { int i,adjust=0; if(time==0) { time=200; adjust=1; delayLoopCount=400; rWTCON=((MCLK/1000000-1)<<8)|(2<<3); // 1M/64,Watch-dog,nRESET,interrupt disable// rWTDAT=0xffff; rWTCNT=0xffff; rWTCON=((MCLK/1000000-1)<<8)|(2<<3)|(1<<5); // 1M/64,Watch-dog enable,nRESET,interrupt disable // } for(;time>0;time--) for(i=0;i >12)<<16)|(Non_Cache_Start>>12); /*均为低电平触发,Exint3设置为上升沿触发----modify at 04-12-11*/ rEXTINT=0x0|(1<<14); //Misc //USBN9603's A0 pin -> CPU's A1 //IDE's CS0 -> CPU's A2 //IDE's CS1 -> CPU's A1 //IDE's A2 -> CPU's A3 //IDE's A1 -> CPU's A5 //IDE's A0 -> CPU's A4 } /************************* UART ****************************/ static int whichUart=0; void Uart_Init(int mclk,int baud) { int i; if(mclk==0) mclk=MCLK; rUFCON0=0x0; //FIFO disable rUFCON1=0x0; rUMCON0=0x0; rUMCON1=0x0; //UART0 rULCON0=0x3; //Normal,No parity,1 stop,8 bit rUCON0=0x245; //rx=edge,tx=level,disable timeout int.,enable rx error int.,normal,interrupt or polling rUBRDIV0=( (int)(mclk/16./baud + 0.5) -1 ); //UART1 rULCON1=0x3; rUCON1=0x245; rUBRDIV1=( (int)(mclk/16./baud + 0.5) -1 ); for(i=0;i<100;i++); } void Uart_Select(int ch) { whichUart=ch; } void Uart_TxEmpty(int ch) { if(ch==0) while(!(rUTRSTAT0 & 0x4)); //wait until tx shifter is empty. else while(!(rUTRSTAT1 & 0x4)); //wait until tx shifter is empty. } char Uart_Getch(void) { if(whichUart==0) { while(!(rUTRSTAT0 & 0x1)); //Receive data read return RdURXH0(); } else { while(!(rUTRSTAT1 & 0x1)); //Receive data ready return RdURXH1(); } } char Uart_WaiteKey(unsigned long timeout, int *error_p) { char c; int state; if(whichUart==0) { while(!(rUTRSTAT0 & 0x1)) //Receive data ready { if(!timeout) break; else timeout--; } if(timeout==0) { c=0; state=-1; } else { c=RdURXH0(); state=0; } } else { while(!(rUTRSTAT1 & 0x1)) //Receive data ready { if(!timeout) break; else timeout--; } if(timeout==0) { c=0; state=-1; } else { c=RdURXH0(); state=0; } } *error_p=state; return(c); } char Uart_GetKey(void) { if(whichUart==0) { if(rUTRSTAT0 & 0x1) //Receive data ready return RdURXH0(); else return 0; } else { if(rUTRSTAT1 & 0x1) //Receive data ready return RdURXH1(); else return 0; } } void Uart_GetString(char *string) { char *string2=string; char c; while((c=Uart_Getch())!='\r') { if(c=='\b') { if( (int)string2 < (int)string ) { Uart_Printf("\b \b"); string--; } } else { *string++=c; Uart_SendByte(c); } } *string='\0'; Uart_SendByte('\n'); } int Uart_GetIntNum(void) { char str[30]; char *string=str; int base=10; int minus=0; int lastIndex; int result=0; int i; Uart_GetString(string); if(string[0]=='-') { minus=1; string++; } if(string[0]=='0' && (string[1]=='x' || string[1]=='X')) { base=16; string+=2; } lastIndex=strlen(string)-1; if( string[lastIndex]=='h' || string[lastIndex]=='H' ) { base=16; string[lastIndex]=0; lastIndex--; } if(base==10) { result=_atoi_(string); result=minus ? (-1*result):result; } else { for(i=0;i<=lastIndex;i++) { if(isalpha(string[i])) { if(isupper(string[i])) result=(result<<4)+string[i]-'A'+10; else result=(result<<4)+string[i]-'a'+10; } else { result=(result<<4)+string[i]-'0'; } } result=minus ? (-1*result):result; } return result; } void Uart_SendByte(int data) { if(whichUart==0) { if(data=='\n') { while(!(rUTRSTAT0 & 0x2)); Delay(10); //because the slow response of hyper_terminal WrUTXH0('\r'); } while(!(rUTRSTAT0 & 0x2)); //Wait until THR is empty. Delay(10); WrUTXH0(data); } else { if(data=='\n') { while(!(rUTRSTAT1 & 0x2)); Delay(10); //because the slow response of hyper_terminal rUTXH1='\r'; } while(!(rUTRSTAT1 & 0x2)); //Wait until THR is empty. Delay(10); rUTXH1=data; } } void Uart_SendString(char *pt) { while(*pt) Uart_SendByte(*pt++); } //if you don't use vsprintf(), the code size is reduced very much. void Uart_Printf(char *fmt,...) { va_list ap; char string[256]; va_start(ap,fmt); vsprintf(string,fmt,ap); Uart_SendString(string); va_end(ap); } int Uart_RxReady(void) { if(whichUart) return (rUTRSTAT1 & 0x1); //Receive data ready else return (rUTRSTAT0 & 0x1); //Receive data ready } /******************** S3C44B0X EV. BOARD LED **********************/ void Led_Display(int LedStatus) { if((LedStatus&0x01)==0x01) rPDATE=rPDATE&0x17f; else rPDATE=rPDATE|0x80; if((LedStatus&0x02)==0x02) rPDATE=rPDATE&0x1bf; else rPDATE=rPDATE|0x40; if((LedStatus&0x04)==0x04) rPDATE=rPDATE&0x1df; else rPDATE=rPDATE|0x20; if((LedStatus&0x08)==0x08) rPDATE=rPDATE&0x1ef; else rPDATE=rPDATE|0x10; } void Beep(int BeepStatus) { if (BeepStatus==0) rPDATE=rPDATE|0x8; else rPDATE=rPDATE&0x1f7; } /************************* Timer ********************************/ void Timer_Start(int divider) //0:16us,1:32us 2:64us 3:128us { rWTCON=((MCLK/1000000-1)<<8)|(divider<<3); rWTDAT=0xffff; rWTCNT=0xffff; // 1/16/(65+1),nRESET & interrupt disable rWTCON=((MCLK/1000000-1)<<8)|(divider<<3)|(1<<5); } int Timer_Stop(void) { rWTCON=((MCLK/1000000-1)<<8); return (0xffff-rWTCNT); } /************************* PLL ********************************/ void ChangePllValue(int mdiv,int pdiv,int sdiv) { rPLLCON=(mdiv<<12)|(pdiv<<4)|sdiv; } /************************* General Library **********************/ void * _malloc_(unsigned nbyte) /*Very simple; Use _malloc_() & _free_() like Stack*/ //void *mallocPt=Image$$RW$$Limit; { void *returnPt=mallocPt; mallocPt= (int *)mallocPt+nbyte/4+((nbyte%4)>0); //to align 4byte if( (int)mallocPt > HEAPEND ) { mallocPt=returnPt; return NULL; } return returnPt; } void _free_(void *pt) { mallocPt=pt; } void Cache_Flush(void) { int i,saveSyscfg; saveSyscfg=rSYSCFG; rSYSCFG=SYSCFG_0KB; for(i=0x10004000;i<0x10004800;i+=16) { *((int *)i)=0x0; } rSYSCFG=saveSyscfg; } unsigned char Readkey(void) { unsigned char ch1,ch2; ch1=(rPDATG&0xf0); //Uart_Printf("\n key=%d",ch1); if(ch1!=0xf0) { Delay(10); ch2=(rPDATG&0xf0); //Uart_Printf("\n key=%d",ch2); if(ch1==ch2)//Confirm the key { Beep(0x01); Delay(20); while((rPDATG&0xf0)!=0xf0); Beep(0x00); if (ch1==0x70) return('S'); else if(ch1==0xb0) return('C'); else if(ch1==0xd0) return('E'); else if(ch1==0xe0) return('O'); } } return(0); } void _disable_(void) { rI_ISPC=BIT_EINT0; rINTMSK|=(BIT_EINT0|BIT_GLOBAL);//0x01<<26; //rINTCON=0x2|rINTCON; } void _enable_(void) { rI_ISPC=BIT_EINT0; rINTMSK&=(~(BIT_EINT0|BIT_GLOBAL)); //rINTCON=0xfffffff9&rINTCON; } int _atoi_(char *str) { int n=0; char c=1; while((c=*str++)&&(c>=0x30)&&(c<=0x39)) n = n*10 + c-'0'; return(n); }