summaryrefslogtreecommitdiff
path: root/firmware/target/arm/s3c2440/gigabeat-fx/kernel-meg-fx.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/target/arm/s3c2440/gigabeat-fx/kernel-meg-fx.c')
-rw-r--r--firmware/target/arm/s3c2440/gigabeat-fx/kernel-meg-fx.c51
1 files changed, 43 insertions, 8 deletions
diff --git a/firmware/target/arm/s3c2440/gigabeat-fx/kernel-meg-fx.c b/firmware/target/arm/s3c2440/gigabeat-fx/kernel-meg-fx.c
index 9df90a2344..39e4efab49 100644
--- a/firmware/target/arm/s3c2440/gigabeat-fx/kernel-meg-fx.c
+++ b/firmware/target/arm/s3c2440/gigabeat-fx/kernel-meg-fx.c
@@ -1,13 +1,49 @@
1#include "config.h"
2#include "system.h"
1#include "kernel.h" 3#include "kernel.h"
4#include "timer.h"
2#include "thread.h" 5#include "thread.h"
3 6
4#include <stdio.h>
5#include "lcd.h"
6
7extern void (*tick_funcs[MAX_NUM_TICK_TASKS])(void); 7extern void (*tick_funcs[MAX_NUM_TICK_TASKS])(void);
8 8
9void timer4(void) { 9void tick_start(unsigned int interval_in_ms)
10 int i; 10{
11 /*
12 * Based on default PCLK of 49.1568MHz - scaling chosen to give
13 * remainder-free result for tick interval of 10ms (100Hz)
14 * Timer input clock frequency =
15 * fPCLK / {prescaler value+1} / {divider value}
16 * TIMER_FREQ = 49156800 / 2
17 * 13300 = TIMER_FREQ / 231 / 8
18 * 49156800 = 19*(11)*(7)*7*5*5*(3)*2*2*2*2*2*2
19 * 231 = 11*7*3
20 */
21
22 /* stop timer 4 */
23 TCON &= ~(1 << 20);
24 /* Set the count for timer 4 */
25 TCNTB4 = (TIMER_FREQ / 231 / 8) * interval_in_ms / 1000;
26 /* Set the the prescaler value for timers 2,3, and 4 */
27 TCFG0 = (TCFG0 & ~0xff00) | ((231-1) << 8);
28 /* MUX4 = 1/16 */
29 TCFG1 = (TCFG1 & ~0xff0000) | 0x030000;
30 /* set manual bit */
31 TCON |= 1 << 21;
32 /* reset manual bit */
33 TCON &= ~(1 << 21);
34 /* interval mode */
35 TCON |= 1 << 22;
36 /* start timer 4 */
37 TCON |= (1 << 20);
38
39 /* timer 4 unmask interrupts */
40 INTMSK &= ~TIMER4_MASK;
41}
42
43void TIMER4(void)
44{
45 int i;
46
11 /* Run through the list of tick tasks */ 47 /* Run through the list of tick tasks */
12 for(i = 0; i < MAX_NUM_TICK_TASKS; i++) 48 for(i = 0; i < MAX_NUM_TICK_TASKS; i++)
13 { 49 {
@@ -19,7 +55,6 @@ void timer4(void) {
19 55
20 current_tick++; 56 current_tick++;
21 57
22 /* following needs to be fixed. */ 58 SRCPND = TIMER4_MASK;
23 /*wake_up_thread();*/ 59 INTPND = TIMER4_MASK;
24} 60}
25