www.pudn.com > LinkDrvDemo.rar > utils.c


//********************************************************************* 
//  File Name: utils.c  
//  Author  : YangLi 
//  E-mail  : yl@water.ac.cn                                             
//  Version : 1.0                                                                
//  BeiJing ZHONGKEHAIXUN Science & Technology Co. Ltd.            
//  Copyright 2005 
//********************************************************************* 
 
#include  
#include  
#include "utils.h" 
 
 
void init_Tiger(void) 
{ 
     
    __builtin_sysreg_write(__SYSCON, 0x001A79E7);  // Set SYSCON Register 
    __builtin_sysreg_write(__SDRCON, 0x5213);	   // Set SDRCON Register 
												//0x5233 or 0x5203 or 0x5213 
 } 
 
void prep_leds(void) 
{ 
    __builtin_sysreg_write(__SQCTLST, (FLG2O|FLG3O)); // make flags 2 and 3 outputs 
} 
 
void set_flags_as_output(int mask) 
{ 
	if(mask & FLG0O) 
	{ 
        __builtin_sysreg_write(__SQCTLST, FLG0O); // make flag 0 output	 
	} 
 
	if(mask & FLG1O) 
	{ 
        __builtin_sysreg_write(__SQCTLST, FLG1O); // make flag 1 output	 
	} 
} 
 
void toggle_leds(int mask) 
{ 
	if(mask & FLG2) 
	{ 
	    if(__builtin_sysreg_read(__SQCTL) & FLG2) 
	    { 
	        __builtin_sysreg_write(__SQCTLCL, ~FLG2); //clear the flag bit 
	    } 
	    else 
	    { 
	        __builtin_sysreg_write(__SQCTLST, FLG2); // set the flag bit 
	    } 
	} 
 
	if(mask & FLG3) 
	{ 
	    if(__builtin_sysreg_read(__SQCTL) & FLG3) 
	    { 
	        __builtin_sysreg_write(__SQCTLCL, ~FLG3); //clear the flag bit 
	    } 
	    else 
	    { 
	        __builtin_sysreg_write(__SQCTLST, FLG3); // set the flag bit 
	    } 
	} 
} 
 
void toggle_flags(int mask) 
{ 
	if(mask & FLG0) 
	{ 
	    if(__builtin_sysreg_read(__SQCTL) & FLG0) 
	    { 
	        __builtin_sysreg_write(__SQCTLCL, ~FLG0); //clear the flag bit 
	    } 
	    else 
	    { 
	        __builtin_sysreg_write(__SQCTLST, FLG0); // set the flag bit 
	    } 
	} 
 
	if(mask & FLG1) 
	{ 
	    if(__builtin_sysreg_read(__SQCTL) & FLG1) 
	    { 
	        __builtin_sysreg_write(__SQCTLCL, ~FLG1); //clear the flag bit 
	    } 
	    else 
	    { 
	        __builtin_sysreg_write(__SQCTLST, FLG1); // set the flag bit 
	    } 
	} 
} 
 
void leds_off(int mask) 
{ 
    __builtin_sysreg_write(__SQCTLCL, ~(mask)); 
} 
 
void leds_on(int mask) 
{ 
    __builtin_sysreg_write(__SQCTLST, mask); 
} 
 
void clr_flags(int mask) 
{ 
    __builtin_sysreg_write(__SQCTLCL, ~(mask)); 
} 
 
void set_flags(int mask) 
{ 
    __builtin_sysreg_write(__SQCTLST, mask); 
} 
 
void init_timer(int timer, unsigned int hi, unsigned int lo) 
{ 
	if (timer == 0)  
	{ 
		__builtin_sysreg_write(__TMRIN0H, hi);	    // set timer0 high count 
		__builtin_sysreg_write(__TMRIN0L, lo);	    // set timer0 low count 
	} 
	else if (timer == 1) 
	{ 
		__builtin_sysreg_write(__TMRIN1H, hi);	    // set timer1 high count 
		__builtin_sysreg_write(__TMRIN1L, lo);	    // set timer1 low count 
	} 
} 
 
unsigned int start_timer(int timer) 
{ 
	if (timer == 0)  
	{ 
		__builtin_sysreg_write(__SQCTLST, TMR0RN);	// start timer0 
		return (__builtin_sysreg_read(__TIMER0L));		 
	} 
	else if (timer == 1)  
	{ 
		__builtin_sysreg_write(__SQCTLST, TMR1RN);	// start timer1 
		return (__builtin_sysreg_read(__TIMER1L));		 
	} 
	return 0; 
} 
 
unsigned int stop_timer(int timer) 
{ 
	if (timer == 0)  
	{ 
		__builtin_sysreg_write(__SQCTLCL, ~TMR0RN);	// start timer0 
		return (__builtin_sysreg_read(__TIMER0L));		 
	} 
	else if (timer == 1)  
	{ 
		__builtin_sysreg_write(__SQCTLCL, ~TMR1RN);	// start timer1 
		return (__builtin_sysreg_read(__TIMER1L));		 
	} 
	return 0; 
} 
 
unsigned int get_timer(int timer, unsigned int *hi, unsigned int *lo) 
{ 
	if (timer == 0)  
	{ 
		*hi = __builtin_sysreg_read(__TIMER0H); 
		*lo = __builtin_sysreg_read(__TIMER0L);		 
	} 
	else if (timer == 1) 
	{ 
		*hi = __builtin_sysreg_read(__TIMER1H); 
		*lo = __builtin_sysreg_read(__TIMER1L);		 
	} 
	return (*lo); 
} 
 
void irq_set_trigger(int irq, int type) 
{ 
 
    int mask = (irq == 0) ? IRQ0E : 
               (irq == 1) ? IRQ1E : 
               (irq == 2) ? IRQ2E : IRQ3E; 
 
    if(type == EDGE) 
    { 
	    __builtin_sysreg_write(__SQCTLST, mask);	// edge trigger 
    } 
    else 
    { 
	    __builtin_sysreg_write(__SQCTLCL, ~mask);	// level trigger 
    } 
} 
 
void delay(void) 
{ 
	unsigned int i; 
	for(i=0;i<0x100;i++); 
}