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++); }