#include #include "timers.h" #define TIMER 0x900D0000 unsigned timer_ctl_bkp[2], timer_load_bkp[2]; void timer_init(unsigned timer) { if (is_cx) { volatile unsigned *timer_ctl = (unsigned *) (TIMER + 0x08 + 0x20 * timer); volatile unsigned *timer_load = (unsigned *) (TIMER + 0x20 * timer); timer_ctl_bkp[timer] = *timer_ctl; timer_load_bkp[timer] = *timer_load; *timer_ctl &= ~(1 << 7); *timer_ctl = 0b01100011; *timer_ctl |= (1 << 7); } else { volatile unsigned *timer_ctl = (unsigned *) (TIMER + 0x08 + 0x0C * timer); volatile unsigned *timer_divider = (unsigned *) (TIMER + 0x04 + 0x0C * timer); timer_ctl_bkp[timer] = *timer_ctl; timer_load_bkp[timer] = *timer_divider; *timer_ctl = 0; *timer_divider = 0; } } void timer_restore(unsigned timer) { if (is_cx) { volatile unsigned *timer_ctl = (unsigned *) (TIMER + 0x08 + 0x20 * timer); volatile unsigned *timer_load = (unsigned *) (TIMER + 0x20 * timer); *timer_ctl &= ~(1 << 7); *timer_ctl = timer_ctl_bkp[timer] & ~(1 << 7); *timer_load = timer_load_bkp[timer]; *timer_ctl = timer_ctl_bkp[timer]; } else { volatile unsigned *timer_ctl = (unsigned *) (TIMER + 0x08 + 0x0C * timer); volatile unsigned *timer_divider = (unsigned *) (TIMER + 0x04 + 0x0C * timer); *timer_ctl = timer_ctl_bkp[timer]; *timer_divider = timer_load_bkp[timer]; } } void timer_load(unsigned timer, unsigned value) { if (is_cx) { volatile unsigned *timer_load = (unsigned *) (TIMER + 0x20 * timer); *timer_load = value; } else { volatile unsigned *timer_value = (unsigned *) (TIMER + 0x0C * timer); *timer_value = value; } } unsigned timer_read(unsigned timer) { if (is_cx) { volatile unsigned *timer_value = (unsigned *) (TIMER + 0x04 + 0x20 * timer); return *timer_value; } else { volatile unsigned *timer_value = (unsigned *) (TIMER + 0x0C * timer); return *timer_value; } }