1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27#include <common.h>
28#include <devices.h>
29#include <watchdog.h>
30#include <net.h>
31#ifdef CONFIG_STATUS_LED
32#include <status_led.h>
33#endif
34
35DECLARE_GLOBAL_DATA_PTR;
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51extern void malloc_bin_reloc (void);
52typedef int (init_fnc_t) (void);
53
54
55
56
57static ulong mem_malloc_start = 0;
58static ulong mem_malloc_end = 0;
59static ulong mem_malloc_brk = 0;
60
61
62
63
64static void mem_malloc_init (void)
65{
66 mem_malloc_start = CFG_MALLOC_BASE;
67 mem_malloc_end = mem_malloc_start + CFG_MALLOC_LEN;
68 mem_malloc_brk = mem_malloc_start;
69 memset ((void *) mem_malloc_start,
70 0,
71 mem_malloc_end - mem_malloc_start);
72}
73
74void *sbrk (ptrdiff_t increment)
75{
76 ulong old = mem_malloc_brk;
77 ulong new = old + increment;
78
79 if ((new < mem_malloc_start) || (new > mem_malloc_end)) {
80 return (NULL);
81 }
82 mem_malloc_brk = new;
83 return ((void *) old);
84}
85
86
87
88
89
90
91init_fnc_t *init_sequence[] = {
92
93#if defined(CONFIG_BOARD_EARLY_INIT_F)
94 board_early_init_f,
95#endif
96
97 env_init,
98 serial_init,
99 console_init_f,
100 display_options,
101 checkcpu,
102 checkboard,
103 NULL,
104};
105
106
107
108void board_init (void)
109{
110 bd_t *bd;
111 init_fnc_t **init_fnc_ptr;
112 char *s, *e;
113 int i;
114
115
116
117
118 gd = (gd_t *)CFG_GBL_DATA_OFFSET;
119
120 __asm__ __volatile__("": : :"memory");
121
122 memset( gd, 0, CFG_GBL_DATA_SIZE );
123
124 gd->bd = (bd_t *)(gd+1);
125 gd->baudrate = CONFIG_BAUDRATE;
126 gd->cpu_clk = CONFIG_SYS_CLK_FREQ;
127
128 bd = gd->bd;
129 bd->bi_memstart = CFG_SDRAM_BASE;
130 bd->bi_memsize = CFG_SDRAM_SIZE;
131 bd->bi_flashstart = CFG_FLASH_BASE;
132#if defined(CFG_SRAM_BASE) && defined(CFG_SRAM_SIZE)
133 bd->bi_sramstart= CFG_SRAM_BASE;
134 bd->bi_sramsize = CFG_SRAM_SIZE;
135#endif
136 bd->bi_baudrate = CONFIG_BAUDRATE;
137
138 for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) {
139 WATCHDOG_RESET ();
140 if ((*init_fnc_ptr) () != 0) {
141 hang ();
142 }
143 }
144
145 WATCHDOG_RESET ();
146 bd->bi_flashsize = flash_init();
147
148 WATCHDOG_RESET ();
149 mem_malloc_init();
150 malloc_bin_reloc();
151 env_relocate();
152
153 bd->bi_ip_addr = getenv_IPaddr ("ipaddr");
154 s = getenv ("ethaddr");
155 for (i = 0; i < 6; ++i) {
156 bd->bi_enetaddr[i] = s ? simple_strtoul (s, &e, 16) : 0;
157 if (s) s = (*e) ? e + 1 : e;
158 }
159
160 WATCHDOG_RESET ();
161 devices_init();
162 jumptable_init();
163 console_init_r();
164
165
166
167 WATCHDOG_RESET ();
168 interrupt_init ();
169
170#ifdef CONFIG_STATUS_LED
171 status_led_set(STATUS_LED_BOOT, STATUS_LED_BLINKING);
172#endif
173
174
175 for (;;) {
176 WATCHDOG_RESET ();
177 main_loop ();
178 }
179}
180
181
182
183
184void hang (void)
185{
186#ifdef CONFIG_STATUS_LED
187 status_led_set(STATUS_LED_BOOT, STATUS_LED_OFF);
188 status_led_set(STATUS_LED_RED, STATUS_LED_BLINKING);
189#endif
190 puts("### ERROR ### Please reset board ###\n");
191 for (;;);
192}
193
194unsigned long do_go_exec (ulong (*entry)(int, char *[]), int argc, char *argv[])
195{
196
197
198
199
200 argv[-1] = (char *)gd;
201 return entry (argc, argv);
202}
203