| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283 |
- #include <os.h>
- #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;
- }
- }
|