aboutsummaryrefslogtreecommitdiff
path: root/kernel/time/mcu
diff options
context:
space:
mode:
authorJakob Odersky <jodersky@gmail.com>2014-01-24 20:10:45 +0100
committerJakob Odersky <jodersky@gmail.com>2014-01-24 20:10:45 +0100
commit6cdf34b0e87bc915de39a6d5817980a825a720da (patch)
tree1b8710106c0201ecad5e199099b4f084795b96ea /kernel/time/mcu
downloadmux-6cdf34b0e87bc915de39a6d5817980a825a720da.tar.gz
mux-6cdf34b0e87bc915de39a6d5817980a825a720da.tar.bz2
mux-6cdf34b0e87bc915de39a6d5817980a825a720da.zip
initial commit
Diffstat (limited to 'kernel/time/mcu')
-rw-r--r--kernel/time/mcu/atmega2560/timer.c31
1 files changed, 31 insertions, 0 deletions
diff --git a/kernel/time/mcu/atmega2560/timer.c b/kernel/time/mcu/atmega2560/timer.c
new file mode 100644
index 0000000..663df02
--- /dev/null
+++ b/kernel/time/mcu/atmega2560/timer.c
@@ -0,0 +1,31 @@
+#include <avr/interrupt.h>
+#include "sched/sched.h"
+#include "time/timer.h"
+
+void timer_init() {
+ cli();
+ TCCR3A = 0;
+ TCCR3B = 0;
+ TCCR3C = 0;
+
+ TCCR3B = (1 << WGM32); // turn on CTC mode:
+ TCCR3B |= (1 << CS32) | (0 << CS31) | (1 << CS30); // set to 1024 prescaler
+ OCR3A = 770;
+ sei();
+}
+
+void timer_start() {
+ TIMSK3 |= (1 << OCIE3A);
+}
+
+void timer_stop() {
+ TIMSK3 &= ~(1 << OCIE3A);
+}
+
+ISR(TIMER3_COMPA_vect, ISR_NAKED) {
+ SAVE_CONTEXT();
+ sched_tick();
+ sei();
+ RESTORE_CONTEXT();
+ asm volatile ("reti");
+}