www.pudn.com > S3C44B0X_USB.rar > console.c


#include  
 
#include "44b0x.h" 
#include "DataType.h" 
#include "console.h" 
 
extern unsigned int MCLK; 
 
void Delay(U32 time) 
{ 
	while(time--); 
} 
 
 
 
/************************* UART ****************************/ 
 
 
void UartInit(int ch, int baud) 
{ 
	U8 a; 
	 
	if(!ch) 
	{ 
		rUFCON0 = 0x0;     //禁止使用FIFO 
    	rUMCON0 = 0x0;     //禁止使用FIFO 
    	rULCON0 = 0x3;     //正常无奇偶校验,一个停止位,8个数据位 
    	rUCON0 = 0x45;    //TX RX 都用PULSE非LEVEL中断    
    
	    //rx=edge,tx=level,disable timeout int.,enable rx error int.,normal,interrupt or polling 
	    //rUBRDIV0 = (int)(MCLK/16./baud+0.5)-1; 
	    rUBRDIV0 = MCLK/(16*baud); 
	    a = rURXH0; 
	} 
	else 
	{ 
		rUFCON1 = 0x0;     //禁止使用FIFO 
	    rUMCON1 = 0x0;     //禁止使用FIFO 
    	rULCON1 = 0x3;     //正常无奇偶校验,一个停止位,8个数据位 
	    rUCON1 = 0x45;        
	    //rx=edge,tx=level,disable timeout int.,enable rx error int.,normal,interrupt or polling	     
	    //baud *= 16;	     
	    //rUBRDIV1 = MCLK/baud+((MCLK%baud)>=(baud/2))?1:0; 
	    rUBRDIV1 = MCLK/(baud*16); 
	    a = rURXH1; 
	}	 
} 
 
void UartSend(int ch, char data) 
{ 
	if(!ch) 
	{ 
		if(data=='\n') 
		{ 
			while(!(rUTRSTAT0&0x2));			 
										//改动延时时间1--10 
			Delay(10);					//由于超级终端反应较慢,有一个微小延迟 
			WrUTXH0('\r'); 
		} 
		while(!(rUTRSTAT0&0x2));		//等待知道THR变空 
										//改动延时时间1--10 
		Delay(10); 
		rUTXH0 = data; 
   	} 
	else 
	{ 
		if(data=='\n') 
		{ 
			while(!(rUTRSTAT1&0x2)); 
										//改动延时时间1--10 
			Delay(10);					//由于超级终端反应较慢,有一个微小延迟 
			rUTXH1 = '\r'; 
		} 
		while(!(rUTRSTAT1&0x2));		//等待知道THR变空 
										//改动延时时间1--10 
		Delay(10); 
		rUTXH1 = data; 
    }	 
} 
 
int UartReceive(int ch) 
{ 
	if(!ch) 
    {	     
		while(!(rUTRSTAT0&0x1));		//等待直到接受到一个数据 
		return rURXH0; 
    } 
    else 
    { 
		while(!(rUTRSTAT1&0x1));		//等待直到接受到一个数据 
		return	rURXH1; 
    } 
} 
 
int UartRxStat(int ch) 
{ 
	if(!ch)    	     
		return (rUTRSTAT0&0x1);     
    else     
		return (rUTRSTAT1&0x1);		     
} 
 
int UartGetch(int ch) 
{ 
	 if(!ch) 
    {	     
		if(rUTRSTAT0&0x1)		//如果收到字符就返回该字符 
    	    return rURXH0; 
		else 
			return -1;			//如果没有收到字符就返回0 
    } 
    else 
    { 
		if(rUTRSTAT1&0x1)		//如果收到字符就返回该字符 
		    return rURXH1; 
		else 
			return -1;			//如果没有收到字符就返回0 
    } 
} 
 
int UartGetkey(int ch) 
{ 
	return ch?rURXH1:rURXH0;  
} 
 
void UartSendString(int ch, char *pt) 
{ 
    while(*pt) 
		UartSend(ch, *pt++); 
} 
 
/************************************************/ 
void console_init(int baud) 
{ 
	UartInit(CONSOLE_UART, baud); 
} 
 
void putch(char data) 
{ 
	UartSend(CONSOLE_UART, data); 
} 
 
void puts(char *str) 
{ 
	while(*str) 
		UartSend(CONSOLE_UART, *str++); 
} 
 
int getch() 
{ 
	return UartReceive(CONSOLE_UART); 
} 
 
int getkey() 
{ 
	return UartGetkey(CONSOLE_UART); 
} 
 
int kbhit() 
{ 
	return UartRxStat(CONSOLE_UART); 
} 
 
 
#ifdef	__SDT_COMPILER 
typedef char *__va_list[1]; 
 
#else 
typedef int *__va_list[1]; 
#endif 
 
int vsprintf(char * /*s*/, const char * /*format*/, __va_list /*arg*/); 
 
void printf(char *fmt, ...) 
{ 
	va_list ap; 
    char string[256];     
 
    va_start(ap, fmt); 
    vsprintf(string, fmt, ap); 
    UartSendString(CONSOLE_UART, string); 
    va_end(ap); 
}