diff options
Diffstat (limited to 'firmware')
-rw-r--r-- | firmware/boot.lds | 32 | ||||
-rw-r--r-- | firmware/crt0.S | 5 | ||||
-rw-r--r-- | firmware/kernel.c | 19 |
3 files changed, 55 insertions, 1 deletions
diff --git a/firmware/boot.lds b/firmware/boot.lds index 78dd40bf92..56383d7723 100644 --- a/firmware/boot.lds +++ b/firmware/boot.lds | |||
@@ -69,7 +69,7 @@ INPUT(crt0.o) | |||
69 | #define FLASHSIZE 256K - ROM_START | 69 | #define FLASHSIZE 256K - ROM_START |
70 | #endif | 70 | #endif |
71 | 71 | ||
72 | #ifndef CPU_PP | 72 | #if !defined(CPU_PP) && (CONFIG_CPU!=S3C2440) |
73 | MEMORY | 73 | MEMORY |
74 | { | 74 | { |
75 | DRAM : ORIGIN = DRAMORIG, LENGTH = DRAMSIZE | 75 | DRAM : ORIGIN = DRAMORIG, LENGTH = DRAMSIZE |
@@ -117,6 +117,36 @@ SECTIONS | |||
117 | _end = .; | 117 | _end = .; |
118 | } | 118 | } |
119 | } | 119 | } |
120 | #elif (CONFIG_CPU==S3C2440) | ||
121 | { | ||
122 | . = DRAMORIG + 0x8000; | ||
123 | .text : { | ||
124 | *(.init.text) | ||
125 | *(.text) | ||
126 | } | ||
127 | .data : { | ||
128 | *(.icode) | ||
129 | *(.irodata) | ||
130 | *(.idata) | ||
131 | *(.data) | ||
132 | _dataend = . ; | ||
133 | } | ||
134 | .stack : | ||
135 | { | ||
136 | *(.stack) | ||
137 | _stackbegin = .; | ||
138 | stackbegin = .; | ||
139 | . += 0x2000; | ||
140 | _stackend = .; | ||
141 | stackend = .; | ||
142 | } | ||
143 | .bss : { | ||
144 | _edata = .; | ||
145 | *(.bss); | ||
146 | *(.ibss); | ||
147 | _end = .; | ||
148 | } | ||
149 | } | ||
120 | #else | 150 | #else |
121 | { | 151 | { |
122 | .vectors : | 152 | .vectors : |
diff --git a/firmware/crt0.S b/firmware/crt0.S index 1c52658c7c..96e08be9f1 100644 --- a/firmware/crt0.S +++ b/firmware/crt0.S | |||
@@ -303,6 +303,11 @@ boot_table: | |||
303 | .space 400 | 303 | .space 400 |
304 | #endif /* PP specific */ | 304 | #endif /* PP specific */ |
305 | /* Code for ARM bootloader targets other than iPod go here */ | 305 | /* Code for ARM bootloader targets other than iPod go here */ |
306 | |||
307 | #if CONFIG_CPU == S3C2440 | ||
308 | bl main | ||
309 | #endif | ||
310 | |||
306 | #else /* BOOTLOADER */ | 311 | #else /* BOOTLOADER */ |
307 | 312 | ||
308 | /* Set up stack for IRQ mode */ | 313 | /* Set up stack for IRQ mode */ |
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 | /**************************************************************************** |