📄 board.c
字号:
debug ("Stack Pointer at: %08lx\n", addr_sp); /* * Save local variables to board info struct */ bd->bi_memstart = CFG_SDRAM_BASE; /* start of DRAM memory */ bd->bi_memsize = gd->ram_size; /* size of DRAM memory in bytes */ bd->bi_mbar_base = CFG_MBAR; /* base of internal registers */ bd->bi_bootflags = bootflag; /* boot / reboot flag (for LynxOS) */ WATCHDOG_RESET (); bd->bi_intfreq = gd->cpu_clk; /* Internal Freq, in Hz */ bd->bi_busfreq = gd->bus_clk; /* Bus Freq, in Hz */ bd->bi_baudrate = gd->baudrate; /* Console Baudrate */#ifdef CFG_EXTBDINFO strncpy (bd->bi_s_version, "1.2", sizeof (bd->bi_s_version)); strncpy (bd->bi_r_version, U_BOOT_VERSION, sizeof (bd->bi_r_version));#endif WATCHDOG_RESET ();#ifdef CONFIG_POST post_bootmode_init(); post_run (NULL, POST_ROM | post_bootmode_get(0));#endif WATCHDOG_RESET(); memcpy (id, (void *)gd, sizeof (gd_t)); debug ("Start relocate of code from %08x to %08lx\n", CFG_MONITOR_BASE, addr); relocate_code (addr_sp, id, addr); /* NOTREACHED - jump_to_ram() does not return */}/************************************************************************ * * This is the next part if the initialization sequence: we are now * running from RAM and have a "normal" C environment, i. e. global * data can be written, BSS has been cleared, the stack size in not * that critical any more, etc. * ************************************************************************ */void board_init_r (gd_t *id, ulong dest_addr){ cmd_tbl_t *cmdtp; char *s, *e; bd_t *bd; int i; extern void malloc_bin_reloc (void);#ifndef CFG_ENV_IS_NOWHERE extern char * env_name_spec;#endif#ifndef CFG_NO_FLASH ulong flash_size;#endif gd = id; /* initialize RAM version of global data */ bd = gd->bd; gd->flags |= GD_FLG_RELOC; /* tell others: relocation done */ debug ("Now running in RAM - U-Boot at: %08lx\n", dest_addr); WATCHDOG_RESET (); gd->reloc_off = dest_addr - CFG_MONITOR_BASE; monitor_flash_len = (ulong)&__init_end - dest_addr; /* * We have to relocate the command table manually */ for (cmdtp = &__u_boot_cmd_start; cmdtp != &__u_boot_cmd_end; cmdtp++) { ulong addr; addr = (ulong) (cmdtp->cmd) + gd->reloc_off;#if 0 printf ("Command \"%s\": 0x%08lx => 0x%08lx\n", cmdtp->name, (ulong) (cmdtp->cmd), addr);#endif cmdtp->cmd = (int (*)(struct cmd_tbl_s *, int, int, char *[]))addr; addr = (ulong)(cmdtp->name) + gd->reloc_off; cmdtp->name = (char *)addr; if (cmdtp->usage) { addr = (ulong)(cmdtp->usage) + gd->reloc_off; cmdtp->usage = (char *)addr; }#ifdef CFG_LONGHELP if (cmdtp->help) { addr = (ulong)(cmdtp->help) + gd->reloc_off; cmdtp->help = (char *)addr; }#endif } /* there are some other pointer constants we must deal with */#ifndef CFG_ENV_IS_NOWHERE env_name_spec += gd->reloc_off;#endif WATCHDOG_RESET ();#ifdef CONFIG_LOGBUFFER logbuff_init_ptrs ();#endif#ifdef CONFIG_POST post_output_backlog (); post_reloc ();#endif WATCHDOG_RESET();#if 0 /* instruction cache enabled in cpu_init_f() for faster relocation */ icache_enable (); /* it's time to enable the instruction cache */#endif /* * Setup trap handlers */ trap_init (0);#if !defined(CFG_NO_FLASH) puts ("FLASH: "); if ((flash_size = flash_init ()) > 0) {# ifdef CFG_FLASH_CHECKSUM print_size (flash_size, ""); /* * Compute and print flash CRC if flashchecksum is set to 'y' * * NOTE: Maybe we should add some WATCHDOG_RESET()? XXX */ s = getenv ("flashchecksum"); if (s && (*s == 'y')) { printf (" CRC: %08lX", crc32 (0, (const unsigned char *) CFG_FLASH_BASE, flash_size) ); } putc ('\n');# else /* !CFG_FLASH_CHECKSUM */ print_size (flash_size, "\n");# endif /* CFG_FLASH_CHECKSUM */ } else { puts (failed); hang (); } bd->bi_flashstart = CFG_FLASH_BASE; /* update start of FLASH memory */ bd->bi_flashsize = flash_size; /* size of FLASH memory (final value) */ bd->bi_flashoffset = 0;#else /* CFG_NO_FLASH */ bd->bi_flashsize = 0; bd->bi_flashstart = 0; bd->bi_flashoffset = 0;#endif /* !CFG_NO_FLASH */ WATCHDOG_RESET (); /* initialize higher level parts of CPU like time base and timers */ cpu_init_r (); WATCHDOG_RESET (); /* initialize malloc() area */ mem_malloc_init (); malloc_bin_reloc ();#ifdef CONFIG_SPI# if !defined(CFG_ENV_IS_IN_EEPROM) spi_init_f ();# endif spi_init_r ();#endif /* relocate environment function pointers etc. */ env_relocate (); /* * Fill in missing fields of bd_info. * We do this here, where we have "normal" access to the * environment; we used to do this still running from ROM, * where had to use getenv_r(), which can be pretty slow when * the environment is in EEPROM. */ s = getenv ("ethaddr"); for (i = 0; i < 6; ++i) { bd->bi_enetaddr[i] = s ? simple_strtoul (s, &e, 16) : 0; if (s) s = (*e) ? e + 1 : e; } /* IP Address */ bd->bi_ip_addr = getenv_IPaddr ("ipaddr"); WATCHDOG_RESET (); /** leave this here (after malloc(), environment and PCI are working) **/ /* Initialize devices */ devices_init (); /* Initialize the jump table for applications */ jumptable_init (); /* Initialize the console (after the relocation and devices init) */ console_init_r ();#if defined(CONFIG_MISC_INIT_R) /* miscellaneous platform dependent initialisations */ misc_init_r ();#endif#if (CONFIG_COMMANDS & CFG_CMD_KGDB) WATCHDOG_RESET (); puts ("KGDB: "); kgdb_init ();#endif debug ("U-Boot relocated to %08lx\n", dest_addr); /* * Enable Interrupts */ interrupt_init (); /* Must happen after interrupts are initialized since * an irq handler gets installed */ timer_init();#ifdef CONFIG_SERIAL_SOFTWARE_FIFO serial_buffered_init();#endif#ifdef CONFIG_STATUS_LED status_led_set (STATUS_LED_BOOT, STATUS_LED_BLINKING);#endif udelay (20); set_timer (0); /* Insert function pointers now that we have relocated the code */ /* Initialize from environment */ if ((s = getenv ("loadaddr")) != NULL) { load_addr = simple_strtoul (s, NULL, 16); }#if (CONFIG_COMMANDS & CFG_CMD_NET) if ((s = getenv ("bootfile")) != NULL) { copy_filename (BootFile, s, sizeof (BootFile)); }#endif /* CFG_CMD_NET */ WATCHDOG_RESET ();#if (CONFIG_COMMANDS & CFG_CMD_DOC) WATCHDOG_RESET (); puts ("DOC: "); doc_init ();#endif#if (CONFIG_COMMANDS & CFG_CMD_NAND) WATCHDOG_RESET (); puts ("NAND: "); nand_init(); /* go init the NAND */#endif#if (CONFIG_COMMANDS & CFG_CMD_NET) && defined(FEC_ENET) WATCHDOG_RESET(); eth_init(bd);#endif#ifdef CONFIG_POST post_run (NULL, POST_RAM | post_bootmode_get(0));#endif#ifdef CONFIG_LAST_STAGE_INIT WATCHDOG_RESET (); /* * Some parts can be only initialized if all others (like * Interrupts) are up and running (i.e. the PC-style ISA * keyboard). */ last_stage_init ();#endif#if (CONFIG_COMMANDS & CFG_CMD_BEDBUG) WATCHDOG_RESET (); bedbug_init ();#endif#if defined(CONFIG_PRAM) || defined(CONFIG_LOGBUFFER) /* * Export available size of memory for Linux, * taking into account the protected RAM at top of memory */ { ulong pram; uchar memsz[32];#ifdef CONFIG_PRAM char *s; if ((s = getenv ("pram")) != NULL) { pram = simple_strtoul (s, NULL, 10); } else { pram = CONFIG_PRAM; }#else pram=0;#endif#ifdef CONFIG_LOGBUFFER /* Also take the logbuffer into account (pram is in kB) */ pram += (LOGBUFF_LEN+LOGBUFF_OVERHEAD)/1024;#endif sprintf (memsz, "%ldk", (bd->bi_memsize / 1024) - pram); setenv ("mem", memsz); }#endif#ifdef CONFIG_MODEM_SUPPORT { extern int do_mdm_init; do_mdm_init = gd->do_mdm_init; }#endif#ifdef CONFIG_WATCHDOG /* disable watchdog if environment is set */ if ((s = getenv ("watchdog")) != NULL) { if (strncmp (s, "off", 3) == 0) { WATCHDOG_DISABLE (); } }#endif /* CONFIG_WATCHDOG*/ /* Initialization complete - start the monitor */ /* main_loop() can return to retry autoboot, if so just run it again. */ for (;;) { WATCHDOG_RESET (); main_loop (); } /* NOTREACHED - no way out of command loop except booting */}void hang(void){ puts ("### ERROR ### Please RESET the board ###\n"); for (;;);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -