⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uhal.c

📁 自已写的lwip+ucos程序已调通
💻 C
字号:
/* ARM board targetting source file.
   file name: uhal.c
   date: 2000. 2. 14
   made by COiNS
*/

#include <stdarg.h>
#include <string.h>
#include "uhal.h"
#include "../arm44box/44b.h"
//#include "ne2kif.h"
#include "err.h"

//#######################
//mclk 66000000
//66000000hz/4= 16500000
///16500000/100= 165000
// 1/165000*SEC==> SEC*165

#define	_TICK	1000				//  1/1000 sec
//#define _TICK	100					//  1/100 sec
//#define _TICK	10					//  1/10 sec
#define _CLOCK	(165*(1000/_TICK))



#define MAX_TBUF	2048
static char tbuf[MAX_TBUF]= {0, };	//for uHALr_printf

//for debugging
void BreakPoint(void);
void DebugUNDEF(void);
void DebugSWI(void);
void DebugABORT(void);
void DebugFIQ(void);

//utilities
void Uart_SendByte(int data);


//timer interrupt handler routine
extern void TickHandler(void);
extern void UserIRQ(void);

//for interrupt enable or disable
extern void ARMDisableInt(void);
extern void ARMEnableInt(void);


//Output through LCD or serial port to print information.
extern int vsprintf(const char *format, ...);
int uHALr_printf(const char *format, ...)
{
	va_list v_list;
	char *ptr;
	int i= 0;


	va_start(v_list, format);     // Initialize variable arguments. 
	vsprintf(tbuf, format, v_list ); 
	va_end(v_list);


	ptr= tbuf;
	while( (*ptr) && i<MAX_TBUF) {
		Uart_SendByte(*ptr);
		ptr++;	i++;
	}//while

	return 1;
}//uHALr_printf


/*** Called by ARMTargetInit() ***/
//disable memory management unit.
void uHALr_ResetMMU(void)
{
}//uHALrResetMMU


void (*pre_isr)(void);
void *(*post_isr)(void);
//Define pre & post-process routines for Interrupt.
void uHALir_DefineIRQ(void *is, void *iq, void *n)
{
	pre_isr= (void (*)(void))is;
	post_isr= (void *(*)(void))iq;
}//uHALir_DefineIRQ


//Initialze interrupts.
void uHALr_InitInterrupts(void)
{
	// Non-vectored,IRQ disable,FIQ disable    
    rINTCON=0x1;	  

	// All=IRQ mode
    rINTMOD=0x0;	  

	// All interrupt is masked.
    rINTMSK=BIT_GLOBAL;	  
    
    
	//set interrupt vector routine
//	pISR_RESET					//reserved
	pISR_UNDEF= (unsigned) DebugUNDEF;
	pISR_SWI= (unsigned) DebugSWI;
	pISR_PABORT= (unsigned) DebugABORT;
	pISR_DABORT= (unsigned) DebugABORT;
	pISR_RESERVED= (unsigned) BreakPoint;		//not used
//	pISR_IRQ= (unsigned) 0;			//reserved
	pISR_FIQ= (unsigned) DebugFIQ;
	
	pISR_ADC= (unsigned) BreakPoint;
	pISR_RTC= (unsigned) BreakPoint;
	pISR_UTXD1= (unsigned) BreakPoint;
	pISR_UTXD0= (unsigned) BreakPoint;
	pISR_SIO= (unsigned) BreakPoint;
	pISR_IIC= (unsigned) BreakPoint;
	pISR_URXD1= (unsigned) BreakPoint;
	pISR_URXD0= (unsigned) BreakPoint;
	pISR_TIMER5= (unsigned) BreakPoint;
	pISR_TIMER4= (unsigned) BreakPoint;
	pISR_TIMER3= (unsigned) BreakPoint;
	pISR_TIMER2= (unsigned) BreakPoint;
	pISR_TIMER1= (unsigned) BreakPoint;
	pISR_TIMER0= (unsigned) BreakPoint;
	pISR_UERR01= (unsigned) BreakPoint;
	pISR_WDT= (unsigned) BreakPoint;
	pISR_BDMA1= (unsigned) BreakPoint;
	pISR_BDMA0= (unsigned) BreakPoint;
	pISR_ZDMA1= (unsigned) BreakPoint;
	pISR_ZDMA0= (unsigned) BreakPoint;
	pISR_TICK= (unsigned) BreakPoint;
	pISR_EINT4567= (unsigned) BreakPoint;
	//pISR_EINT3= (unsigned) BreakPoint;

	pISR_EINT3= (unsigned) UserIRQ;
	pISR_EINT2= (unsigned) BreakPoint;
	pISR_EINT1= (unsigned) BreakPoint;
	pISR_EINT0= (unsigned) BreakPoint;
	

	//handler setting
	pISR_TIMER0= (unsigned) TickHandler;

}//uHALr_InitInterrupts



//Initialize timer that is used OS.
void uHALr_InitTimers(void)
{
	//dead zone=0, pre0= 100
	rTCFG0= 0x00000064;
	//all interrupt, mux0= 1/4
	rTCFG1= 0x00000001;

	//set T0 count
	rTCNTB0= _CLOCK;

	//update T0
    rTCON= 0x00000002;

	//T0,auto reload and start
	rTCON= 0x00000009;
}//uHALr_InitTimers




/*** Called by ARMTargetStart() ***/

//Request the system timer.
//return value 1:success   0:fail
int uHALr_RequestSystemTimer(void *tick, const unsigned char *str)
{
	return 1;
}//uHALr_RequestSystemTimer


//Start system timer & enable the interrupt.
void uHALr_InstallSystemTimer(void)
{
	//Non-vectored,IRQ enable,FIQ disable 
    	rINTCON=0x1;
//rINTCON=0x5;


	//Non maksed TIMER0
	//##############################
	rINTMSK=~( BIT_TIMER0 | BIT_GLOBAL | BIT_EINT3);	//Default value=0x7ffffff
}//uHALr_InstallSystemTimer


//////////////////////////////////////////////////////////////////
//utilities 
//////////////////////////////////////////////////////////////////
void Delay(int time)
// time=0: adjust the Delay function by WatchDog timer.
// 100us resolution.
{
    int i,adjust=0;
    int delayLoopCount= 400;
 
	
	if(time==0) {
		time=200;adjust=1;
		delayLoopCount=400;
		rWTCON=((MCLK/1000000-1)<<8)|(2<<3);
		rWTDAT=0xffff;
		rWTCNT=0xffff;	 
		rWTCON=((MCLK/1000000-1)<<8)|(2<<3)|(1<<5); // 1/64/(65+1),nRESET,interrupt  disable
    }//if
    for(;time>0;time--)
		for(i=0;i<delayLoopCount;i++);

    if(adjust==1) {
		rWTCON=((MCLK/1000000-1)<<8)|(2<<3);
		i=0xffff-rWTCNT;   //  1count/16us
		delayLoopCount=8000000/(i*64);	//400*100/(i*64/200)   
    }//if
}//Delay


static int whichUart=0;

void Uart_Select(int ch)
{
    whichUart=ch;
}

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');
		}//if
		while(!(rUTRSTAT0 & 0x2)); //Wait until THR is empty.
		Delay(10);
		WrUTXH0(data);
	}//if
	else {
		if(data=='\n') {
			while(!(rUTRSTAT1 & 0x2));
			Delay(10);	//because the slow response of hyper_terminal 
			rUTXH1='\r';
		}//if
		while(!(rUTRSTAT1 & 0x2));  //Wait until THR is empty.
		Delay(10);
		rUTXH1=data;
	}//else
}//Uart_SendByte


void Led_Display(int LedStatus)
{
    //rPDATE=(rPDATE & 0xf0)|(data&0xf);
	rPCONE	= 0x556b;	
	rPUPE	= 0x6;
    if((LedStatus&0x01)==0x01)		//PE7状态设置
		rPDATE=rPDATE&0x17f;
	else
		rPDATE=rPDATE|0x80;
	
	if((LedStatus&0x02)==0x02)		//PE6状态设置
		rPDATE=rPDATE&0x1bf;
	else
		rPDATE=rPDATE|0x40;

	if((LedStatus&0x04)==0x04)		//PE5状态设置
		rPDATE=rPDATE&0x1df;
	else
		rPDATE=rPDATE|0x20;

	if((LedStatus&0x08)==0x08)		//PE4状态设置
		rPDATE=rPDATE&0x1ef;
	else
		rPDATE=rPDATE|0x10;	
}//Led_Display
//------------------------PORTS------------------------------//void Port_Init(void){	//CAUTION:Follow the configuration order for setting the ports. 	// 1) setting value 	 // 2) setting control register 	 // 3) configure pull-up resistor.  	//16bit data bus configuration  	// PORT A GROUP	/*  BIT 9		8		7		6		5		4		3		2		1		0            */	/*  GPA9		GPA8	ADDR22	ADDR21	GPA5	ADDR19	ADDR18	ADDR17	ADDR16	ADDR0   */	      	/*  0,			0,		1,          1,           0,      1,          1,          1,          1,           1           */	/*        GPA9->SMCALE*/	/*        GPA8->SMCCLE*/	/*        GPA5->SMCCE*/	/*       GPE0->SMCRB*/	rPCONA = 0x1ff;		// PORT B GROUP	/*  BIT 10        9    8    7     6	  5     4       3     2	    1	    0	    */	/*      /CS5      /CS4 /CS3 /CS2  /CS1  nWBE3   nWBE2   /SRAS /SCAS SCLK  SCKE      */	/*      (Reserve) IDE  USB  FLASH SRAM  No care No Care Sdram Sdram Sdram Sdram     */	/*      1,        1,   1,   1,    1,    0,       0,     1,    1,    1,   1          */	rPDATB = 0x7ff;	rPCONB = 0x1cf;    	//PORT C GROUP	//BUSWIDTH=16                                                                       */	/*  PC    15		14		13		12		11		10		9		8                       */	/*          O		O		RXD1	TXD1	I		O		nDREQ1	nDACK1(used as output IO)                       */	/*          LCD_BK	LCDDSP	Uart1	Uart1	tchPen	tchScrCS	USB		USB                 */	/*          01		01		11		11		00		01		00		01                      */	/*  PC	7		6		5		4		3		2		1		0*/	/*		O		O		O		I		I		I		I		I*/	/*		VD4		VD5		VD6		VD7		key		key		key		key*/	/*		11		11		11		11		00		00		00		00*/	rPDATC = 0xff00;	//All IO is high	rPCONC = 0x0ff0ffff;		rPUPC  = 0x30ff;	//PULL UP RESISTOR should be enabled to I/O	//PORT D GROUP for KeyBoard	/*  PORT D GROUP(I/O OR LCD)                                                        */	/*  BIT 7  6  5  4  3  2  1  0                                                      */	/*      I  I  I  I  O  O  O  O                                                      */	/*      00 00 00 00 01 01 01 01                                                     */		rPDATD=  0xff;	rPCOND= 0xaaaa;	rPUPD = 0x0;		//PORT E GROUP 	/*  Bit	 	8		7		6		5		4		3		2		1		0	*/	/*	CODECLK	O		O		O		O		Res		RXD0	TXD0	SMRB(I)	*/	/*		10		01		01		01		01		00		10		10		00	*/	rPDATE = 0x1ff;	rPCONE = 0x25529;	rPUPE  = 0x6;	//PORT F GROUP	/*  Bit 8			7		6		5		4	3		2		1      0                       */   	/*      SIOCLK SIORxD GPF6input  SIOTxD Input	Input	                              Input                  Input          IICSDA IICSCL                  */	/*      011		        011	        000		000	        00	 00	       	00		10     10                      */	/*-----------------qhy--------                                                                                                                                */	/*      000		        000	         000		000              00	 00         	00		10     10                      */ 	rPDATF = 0x1ff;	rPCONF = 0xa;//0x24900a;	rPUPF  = 0x0;//0x1e3;	//PORT G GROUP	/*  BIT 7   	6   	5   	4   	3   	2   	1   	0    	 */	/*      INT7    INT6    INT5    INT4    INT3    INT2    INT1    INT0     */	/*      11      11      11      11      11      11      11      11       */	rPDATG = 0xff;	rPCONG = 0xffff;	rPUPG  = 0x0;	//should be enabled  	rSPUCR=0x7;  //D15-D0 pull-up disable	/*定义非Cache区*/	rNCACHBE0=((Non_Cache_End>>12)<<16) | (Non_Cache_Start>>12); 	/*所有的外部硬件中断为低电平触发*/	rEXTINT=0x4000;
	}
void SysENInterrupt(unsigned ISPC_BIT)//, void (*handler)(void))
{

	rINTMSK &=~( ISPC_BIT | BIT_GLOBAL);	//Default value=0x7ffffff
}
void SysDISInterrupt(unsigned ISPC_BIT)//, void (*handler)(void))
{

	rINTMSK |= ISPC_BIT;	//Default value=0x7ffffff
}
//////////////////////////////////////////////////////////////////
//routines for debugging
//////////////////////////////////////////////////////////////////
void OutDebug(unsigned int num)
{
	uHALr_printf("\r\n***STACK***:%d\r\n", num);
}//OutDebug

void BreakPoint(void)
{
	uHALr_printf("!!!Enter break point.");	

	while(1) {
		//Led_Display(0xf);
		//Delay(1000);

		//Led_Display(0x0);
		//Delay(1000);
	}//while
}//BreakPoint


extern int I_COUNT= 0;
void DebugUNDEF(void)
{
	uHALr_printf("!!!Enter UNDEFINED. %d\r\n", I_COUNT);	


	BreakPoint();
}


void DebugSWI(void)
{
	uHALr_printf("!!!Enter SWI. %d\r\n", I_COUNT);	
	BreakPoint();
}

void DebugABORT(void)
{
	uHALr_printf("!!!Enter ABORT %d\r\n", I_COUNT);	
	BreakPoint();
}

void DebugFIQ(void)
{
	uHALr_printf("!!!Enter FIQ. %d\r\n", I_COUNT);	
	BreakPoint();
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -