diff options
Diffstat (limited to 'firmware/kernel.c')
-rw-r--r-- | firmware/kernel.c | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/firmware/kernel.c b/firmware/kernel.c index 7c5c74c662..1c8bf9dd81 100644 --- a/firmware/kernel.c +++ b/firmware/kernel.c | |||
@@ -56,6 +56,21 @@ void kernel_init(void) | |||
56 | 56 | ||
57 | void sleep(int ticks) | 57 | void sleep(int ticks) |
58 | { | 58 | { |
59 | #if CONFIG_CPU == S3C2440 && defined(BOOTLOADER) | ||
60 | int counter; | ||
61 | TCON &= ~(1 << 20); // stop timer 4 | ||
62 | // TODO: this constant depends on dividers settings inherited from | ||
63 | // firmware. Set them explicitly somwhere. | ||
64 | TCNTB4 = 12193 * ticks / HZ; | ||
65 | TCON |= 1 << 21; // set manual bit | ||
66 | TCON &= ~(1 << 21); // reset manual bit | ||
67 | TCON &= ~(1 << 22); //autoreload Off | ||
68 | TCON |= (1 << 20); // start timer 4 | ||
69 | do { | ||
70 | counter = TCNTO4; | ||
71 | } while(counter > 0); | ||
72 | |||
73 | #else | ||
59 | /* Always sleep at least 1 tick */ | 74 | /* Always sleep at least 1 tick */ |
60 | int timeout = current_tick + ticks + 1; | 75 | int timeout = current_tick + ticks + 1; |
61 | 76 | ||
@@ -63,12 +78,16 @@ void sleep(int ticks) | |||
63 | sleep_thread(); | 78 | sleep_thread(); |
64 | } | 79 | } |
65 | wake_up_thread(); | 80 | wake_up_thread(); |
81 | #endif | ||
66 | } | 82 | } |
67 | 83 | ||
68 | void yield(void) | 84 | void yield(void) |
69 | { | 85 | { |
86 | #if CONFIG_CPU == S3C2440 && defined(BOOTLOADER) | ||
87 | #else | ||
70 | switch_thread(); | 88 | switch_thread(); |
71 | wake_up_thread(); | 89 | wake_up_thread(); |
90 | #endif | ||
72 | } | 91 | } |
73 | 92 | ||
74 | /**************************************************************************** | 93 | /**************************************************************************** |