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
28
29
30
31
32
33
34
35
36
37
38
39
40
41#include <common.h>
42#include <command.h>
43#include <malloc.h>
44#include <stdio_dev.h>
45#include <timestamp.h>
46#include <version.h>
47#include <net.h>
48#include <serial.h>
49#include <nand.h>
50#include <onenand_uboot.h>
51#include <mmc.h>
52
53#ifdef CONFIG_DRIVER_SMC91111
54#include "../drivers/net/smc91111.h"
55#endif
56#ifdef CONFIG_DRIVER_LAN91C96
57#include "../drivers/net/lan91c96.h"
58#endif
59
60DECLARE_GLOBAL_DATA_PTR;
61
62ulong monitor_flash_len;
63
64#ifdef CONFIG_HAS_DATAFLASH
65extern int AT91F_DataflashInit(void);
66extern void dataflash_print_info(void);
67#endif
68
69#ifndef CONFIG_IDENT_STRING
70#define CONFIG_IDENT_STRING ""
71#endif
72
73const char version_string[] =
74 U_BOOT_VERSION" (" U_BOOT_DATE " - " U_BOOT_TIME ")"CONFIG_IDENT_STRING;
75
76#ifdef CONFIG_DRIVER_CS8900
77extern void cs8900_get_enetaddr (void);
78#endif
79
80#ifdef CONFIG_DRIVER_RTL8019
81extern void rtl8019_get_enetaddr (uchar * addr);
82#endif
83
84#if defined(CONFIG_HARD_I2C) || \
85 defined(CONFIG_SOFT_I2C)
86#include <i2c.h>
87#endif
88
89
90
91
92static ulong mem_malloc_start = 0;
93static ulong mem_malloc_end = 0;
94static ulong mem_malloc_brk = 0;
95
96static
97void mem_malloc_init (ulong dest_addr)
98{
99 mem_malloc_start = dest_addr;
100 mem_malloc_end = dest_addr + CONFIG_SYS_MALLOC_LEN;
101 mem_malloc_brk = mem_malloc_start;
102
103 memset ((void *) mem_malloc_start, 0,
104 mem_malloc_end - mem_malloc_start);
105}
106
107void *sbrk (ptrdiff_t increment)
108{
109 ulong old = mem_malloc_brk;
110 ulong new = old + increment;
111
112 if ((new < mem_malloc_start) || (new > mem_malloc_end)) {
113 return (NULL);
114 }
115 mem_malloc_brk = new;
116
117 return ((void *) old);
118}
119
120
121
122
123
124
125
126void inline __coloured_LED_init (void) {}
127void inline coloured_LED_init (void) __attribute__((weak, alias("__coloured_LED_init")));
128void inline __red_LED_on (void) {}
129void inline red_LED_on (void) __attribute__((weak, alias("__red_LED_on")));
130void inline __red_LED_off(void) {}
131void inline red_LED_off(void) __attribute__((weak, alias("__red_LED_off")));
132void inline __green_LED_on(void) {}
133void inline green_LED_on(void) __attribute__((weak, alias("__green_LED_on")));
134void inline __green_LED_off(void) {}
135void inline green_LED_off(void)__attribute__((weak, alias("__green_LED_off")));
136void inline __yellow_LED_on(void) {}
137void inline yellow_LED_on(void)__attribute__((weak, alias("__yellow_LED_on")));
138void inline __yellow_LED_off(void) {}
139void inline yellow_LED_off(void)__attribute__((weak, alias("__yellow_LED_off")));
140void inline __blue_LED_on(void) {}
141void inline blue_LED_on(void)__attribute__((weak, alias("__blue_LED_on")));
142void inline __blue_LED_off(void) {}
143void inline blue_LED_off(void)__attribute__((weak, alias("__blue_LED_off")));
144
145
146
147
148
149
150
151
152
153#if defined(CONFIG_ARM_DCC) && !defined(CONFIG_BAUDRATE)
154#define CONFIG_BAUDRATE 115200
155#endif
156static int init_baudrate (void)
157{
158 char tmp[64];
159 int i = getenv_r ("baudrate", tmp, sizeof (tmp));
160 gd->bd->bi_baudrate = gd->baudrate = (i > 0)
161 ? (int) simple_strtoul (tmp, NULL, 10)
162 : CONFIG_BAUDRATE;
163
164 return (0);
165}
166
167static int display_banner (void)
168{
169 printf ("\n\n%s\n\n", version_string);
170 debug ("U-Boot code: %08lX -> %08lX BSS: -> %08lX\n",
171 _armboot_start, _bss_start, _bss_end);
172#ifdef CONFIG_MODEM_SUPPORT
173 debug ("Modem Support enabled\n");
174#endif
175#ifdef CONFIG_USE_IRQ
176 debug ("IRQ Stack: %08lx\n", IRQ_STACK_START);
177 debug ("FIQ Stack: %08lx\n", FIQ_STACK_START);
178#endif
179
180 return (0);
181}
182
183
184
185
186
187
188
189
190static int display_dram_config (void)
191{
192 int i;
193
194#ifdef DEBUG
195 puts ("RAM Configuration:\n");
196
197 for(i=0; i<CONFIG_NR_DRAM_BANKS; i++) {
198 printf ("Bank #%d: %08lx ", i, gd->bd->bi_dram[i].start);
199 print_size (gd->bd->bi_dram[i].size, "\n");
200 }
201#else
202 ulong size = 0;
203
204 for (i=0; i<CONFIG_NR_DRAM_BANKS; i++) {
205 size += gd->bd->bi_dram[i].size;
206 }
207 puts("DRAM: ");
208 print_size(size, "\n");
209#endif
210
211 return (0);
212}
213
214#ifndef CONFIG_SYS_NO_FLASH
215static void display_flash_config (ulong size)
216{
217 puts ("Flash: ");
218 print_size (size, "\n");
219}
220#endif
221
222#if defined(CONFIG_HARD_I2C) || defined(CONFIG_SOFT_I2C)
223static int init_func_i2c (void)
224{
225 puts ("I2C: ");
226 i2c_init (CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SLAVE);
227 puts ("ready\n");
228 return (0);
229}
230#endif
231
232#if defined(CONFIG_CMD_PCI) || defined (CONFIG_PCI)
233#include <pci.h>
234static int arm_pci_init(void)
235{
236 pci_init();
237 return 0;
238}
239#endif
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264typedef int (init_fnc_t) (void);
265
266int print_cpuinfo (void);
267
268init_fnc_t *init_sequence[] = {
269#if defined(CONFIG_ARCH_CPU_INIT)
270 arch_cpu_init,
271#endif
272 board_init,
273#if defined(CONFIG_USE_IRQ)
274 interrupt_init,
275#endif
276 timer_init,
277 env_init,
278 init_baudrate,
279 serial_init,
280 console_init_f,
281 display_banner,
282#if defined(CONFIG_DISPLAY_CPUINFO)
283 print_cpuinfo,
284#endif
285#if defined(CONFIG_DISPLAY_BOARDINFO)
286 checkboard,
287#endif
288#if defined(CONFIG_HARD_I2C) || defined(CONFIG_SOFT_I2C)
289 init_func_i2c,
290#endif
291 dram_init,
292#if defined(CONFIG_CMD_PCI) || defined (CONFIG_PCI)
293 arm_pci_init,
294#endif
295 display_dram_config,
296 NULL,
297};
298
299void start_armboot (void)
300{
301 init_fnc_t **init_fnc_ptr;
302 char *s;
303#if defined(CONFIG_VFD) || defined(CONFIG_LCD)
304 unsigned long addr;
305#endif
306
307
308 gd = (gd_t*)(_armboot_start - CONFIG_SYS_MALLOC_LEN - sizeof(gd_t));
309
310 __asm__ __volatile__("": : :"memory");
311
312 memset ((void*)gd, 0, sizeof (gd_t));
313 gd->bd = (bd_t*)((char*)gd - sizeof(bd_t));
314 memset (gd->bd, 0, sizeof (bd_t));
315
316 gd->flags |= GD_FLG_RELOC;
317
318 monitor_flash_len = _bss_start - _armboot_start;
319
320 for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) {
321 if ((*init_fnc_ptr)() != 0) {
322 hang ();
323 }
324 }
325
326
327 mem_malloc_init (_armboot_start - CONFIG_SYS_MALLOC_LEN);
328
329#ifndef CONFIG_SYS_NO_FLASH
330
331 display_flash_config (flash_init ());
332#endif
333
334#ifdef CONFIG_VFD
335# ifndef PAGE_SIZE
336# define PAGE_SIZE 4096
337# endif
338
339
340
341
342 addr = (_bss_end + (PAGE_SIZE - 1)) & ~(PAGE_SIZE - 1);
343 vfd_setmem (addr);
344 gd->fb_base = addr;
345#endif
346
347#ifdef CONFIG_LCD
348
349 if (!gd->fb_base) {
350# ifndef PAGE_SIZE
351# define PAGE_SIZE 4096
352# endif
353
354
355
356
357 addr = (_bss_end + (PAGE_SIZE - 1)) & ~(PAGE_SIZE - 1);
358 lcd_setmem (addr);
359 gd->fb_base = addr;
360 }
361#endif
362
363#if defined(CONFIG_CMD_NAND)
364 puts ("NAND: ");
365 nand_init();
366#endif
367
368#if defined(CONFIG_CMD_ONENAND)
369 onenand_init();
370#endif
371
372#ifdef CONFIG_HAS_DATAFLASH
373 AT91F_DataflashInit();
374 dataflash_print_info();
375#endif
376
377
378 env_relocate ();
379
380#ifdef CONFIG_VFD
381
382 drv_vfd_init();
383#endif
384
385#ifdef CONFIG_SERIAL_MULTI
386 serial_initialize();
387#endif
388
389
390 gd->bd->bi_ip_addr = getenv_IPaddr ("ipaddr");
391
392 stdio_init ();
393
394 jumptable_init ();
395
396#if defined(CONFIG_API)
397
398 api_init ();
399#endif
400
401 console_init_r ();
402
403#if defined(CONFIG_ARCH_MISC_INIT)
404
405 arch_misc_init ();
406#endif
407#if defined(CONFIG_MISC_INIT_R)
408
409 misc_init_r ();
410#endif
411
412
413 enable_interrupts ();
414
415
416#ifdef CONFIG_DRIVER_TI_EMAC
417
418extern void davinci_eth_set_mac_addr (const u_int8_t *addr);
419 if (getenv ("ethaddr")) {
420 uchar enetaddr[6];
421 eth_getenv_enetaddr("ethaddr", enetaddr);
422 davinci_eth_set_mac_addr(enetaddr);
423 }
424#endif
425
426#ifdef CONFIG_DRIVER_CS8900
427
428 cs8900_get_enetaddr ();
429#endif
430
431#if defined(CONFIG_DRIVER_SMC91111) || defined (CONFIG_DRIVER_LAN91C96)
432
433 if (getenv ("ethaddr")) {
434 uchar enetaddr[6];
435 eth_getenv_enetaddr("ethaddr", enetaddr);
436 smc_set_mac_addr(enetaddr);
437 }
438#endif
439
440
441 if ((s = getenv ("loadaddr")) != NULL) {
442 load_addr = simple_strtoul (s, NULL, 16);
443 }
444#if defined(CONFIG_CMD_NET)
445 if ((s = getenv ("bootfile")) != NULL) {
446 copy_filename (BootFile, s, sizeof (BootFile));
447 }
448#endif
449
450#ifdef BOARD_LATE_INIT
451 board_late_init ();
452#endif
453
454#ifdef CONFIG_GENERIC_MMC
455 puts ("MMC: ");
456 mmc_initialize (gd->bd);
457#endif
458
459#if defined(CONFIG_CMD_NET)
460#if defined(CONFIG_NET_MULTI)
461 puts ("Net: ");
462#endif
463 eth_initialize(gd->bd);
464#if defined(CONFIG_RESET_PHY_R)
465 debug ("Reset Ethernet PHY\n");
466 reset_phy();
467#endif
468#endif
469
470 for (;;) {
471 main_loop ();
472 }
473
474
475}
476
477void hang (void)
478{
479 puts ("### ERROR ### Please RESET the board ###\n");
480 for (;;);
481}
482