Dan ELKOUBY преди 11 години
родител
ревизия
3ec16d187e
променени са 1 файла, в които са добавени 83 реда и са изтрити 0 реда
  1. 83 0
      timers.c

+ 83 - 0
timers.c

@@ -0,0 +1,83 @@
+#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;
+	}
+}
+