📄 board.c
字号:
gd->flags |= GD_FLG_RELOC; /* tell others: relocation done */#if defined(CONFIG_RELOC_FIXUP_WORKS) gd->reloc_off = 0; mem_malloc_end = dest_addr;#else gd->reloc_off = dest_addr - CFG_MONITOR_BASE;#endif#ifdef CONFIG_SERIAL_MULTI serial_initialize();#endif debug ("Now running in RAM - U-Boot at: %08lx\n", dest_addr); #ifdef CFG_DRAM_TEST /*ram test running in ram*/ testdram_relc((uint *)IN_RAM_START,(gd->ram_size)-1); #endif WATCHDOG_RESET ();#if defined(CONFIG_BOARD_EARLY_INIT_R) board_early_init_r ();#endif 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 defined(CONFIG_IP860) || defined(CONFIG_PCU_E) || \ defined (CONFIG_FLAGADM) || defined(CONFIG_MPC83XX) icache_enable (); /* it's time to enable the instruction cache */#endif#if defined(CFG_INIT_RAM_LOCK) && defined(CONFIG_E500) unlock_ram_in_cache(); /* it's time to unlock D-cache in e500 */#endif#if defined(CONFIG_BAB7xx) || defined(CONFIG_CPC45) /* * Do PCI configuration on BAB7xx and CPC45 _before_ the flash * gets initialised, because we need the ISA resp. PCI_to_LOCAL bus * bridge there. */ pci_init ();#endif#if defined(CONFIG_BAB7xx) /* * Initialise the ISA bridge */ initialise_w83c553f ();#endif asm ("sync ; isync"); /* * Setup trap handlers */ trap_init (dest_addr);#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) */#if defined(CFG_UPDATE_FLASH_SIZE) /* Make a update of the Memctrl. */ update_flash_size (flash_size);#endif# if defined(CONFIG_PCU_E) || defined(CONFIG_OXC) || defined(CONFIG_RMU) /* flash mapped at end of memory map */ bd->bi_flashoffset = TEXT_BASE + flash_size; printf(" TEXT_BASE:0x%x,flashoffset is 0x%x\n",TEXT_BASE,bd->bi_flashoffset); /* add by zjj # elif CFG_MONITOR_BASE == CFG_FLASH_BASE bd->bi_flashoffset = monitor_flash_len; /* reserved area for startup monitor */# else bd->bi_flashoffset = 0;# endif#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#if defined(CONFIG_CMD_NAND) WATCHDOG_RESET (); puts ("NAND: "); nand_init(); /* go init the NAND */#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. */#if defined(CFG_EXTBDINFO)#if defined(CONFIG_405GP) || defined(CONFIG_405EP)#if defined(CONFIG_I2CFAST) /* * set bi_iic_fast for linux taking environment variable * "i2cfast" into account */ { char *s = getenv ("i2cfast"); if (s && ((*s == 'y') || (*s == 'Y'))) { bd->bi_iic_fast[0] = 1; bd->bi_iic_fast[1] = 1; } else { bd->bi_iic_fast[0] = 0; bd->bi_iic_fast[1] = 0; } }#else bd->bi_iic_fast[0] = 0; bd->bi_iic_fast[1] = 0;#endif /* CONFIG_I2CFAST */#endif /* CONFIG_405GP, CONFIG_405EP */#endif /* CFG_EXTBDINFO */#if defined(CONFIG_SC3) sc3_read_eeprom();#endif s = getenv ("ethaddr");#if defined (CONFIG_MBX) || \ defined (CONFIG_RPXCLASSIC) || \ defined(CONFIG_IAD210) || \ defined(CONFIG_V38B) if (s == NULL) board_get_enetaddr (bd->bi_enetaddr); else#endif for (i = 0; i < 6; ++i) { bd->bi_enetaddr[i] = s ? simple_strtoul (s, &e, 16) : 0; if (s) s = (*e) ? e + 1 : e; }#ifdef CONFIG_HERMES if ((gd->board_type >> 16) == 2) bd->bi_ethspeed = gd->board_type & 0xFFFF; else bd->bi_ethspeed = 0xFFFF;#endif#ifdef CONFIG_NX823 load_sernum_ethaddr ();#endif#ifdef CONFIG_HAS_ETH1 /* handle the 2nd ethernet address */ s = getenv ("eth1addr"); for (i = 0; i < 6; ++i) { bd->bi_enet1addr[i] = s ? simple_strtoul (s, &e, 16) : 0; if (s) s = (*e) ? e + 1 : e; }#endif#ifdef CONFIG_HAS_ETH2 /* handle the 3rd ethernet address */ s = getenv ("eth2addr");#if defined(CONFIG_XPEDITE1K) || defined(CONFIG_METROBOX) || defined(CONFIG_KAREF) if (s == NULL) board_get_enetaddr(bd->bi_enet2addr); else#endif for (i = 0; i < 6; ++i) { bd->bi_enet2addr[i] = s ? simple_strtoul (s, &e, 16) : 0; if (s) s = (*e) ? e + 1 : e; }#endif#ifdef CONFIG_HAS_ETH3 /* handle 4th ethernet address */ s = getenv("eth3addr");#if defined(CONFIG_XPEDITE1K) || defined(CONFIG_METROBOX) || defined(CONFIG_KAREF) if (s == NULL) board_get_enetaddr(bd->bi_enet3addr); else#endif for (i = 0; i < 6; ++i) { bd->bi_enet3addr[i] = s ? simple_strtoul (s, &e, 16) : 0; if (s) s = (*e) ? e + 1 : e; }#endif#ifdef CFG_ID_EEPROM mac_read_from_eeprom();#endif#if defined(CONFIG_TQM8xxL) || defined(CONFIG_TQM8260) || \ defined(CONFIG_TQM8272) || \ defined(CONFIG_CCM) || defined(CONFIG_KUP4K) || \ defined(CONFIG_KUP4X) || defined(CONFIG_PCS440EP) load_sernum_ethaddr ();#endif /* IP Address */ bd->bi_ip_addr = getenv_IPaddr ("ipaddr"); WATCHDOG_RESET ();#if defined(CONFIG_PCI) && !defined(CONFIG_BAB7xx) && !defined(CONFIG_CPC45) /* * Do pci configuration */ pci_init ();#endif/** 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_CCM) || \ defined(CONFIG_COGENT) || \ defined(CONFIG_CPCI405) || \ defined(CONFIG_EVB64260) || \ defined(CONFIG_KUP4K) || \ defined(CONFIG_KUP4X) || \ defined(CONFIG_LWMON) || \ defined(CONFIG_PCU_E) || \ defined(CONFIG_SC3) || \ defined(CONFIG_W7O) || \ defined(CONFIG_MISC_INIT_R) /* miscellaneous platform dependent initialisations */ misc_init_r ();#endif#ifdef CONFIG_HERMES if (bd->bi_ethspeed != 0xFFFF) hermes_start_lxt980 ((int) bd->bi_ethspeed);#endif#if defined(CONFIG_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 */#ifdef CONFIG_SERIAL_SOFTWARE_FIFO serial_buffered_init();#endif#if defined(CONFIG_STATUS_LED) && defined(STATUS_LED_BOOT) status_led_set (STATUS_LED_BOOT, STATUS_LED_BLINKING);#endif udelay (20); set_timer (0); /* Initialize from environment */ if ((s = getenv ("loadaddr")) != NULL) { load_addr = simple_strtoul (s, NULL, 16); }#if defined(CONFIG_CMD_NET) if ((s = getenv ("bootfile")) != NULL) { copy_filename (BootFile, s, sizeof (BootFile)); }#endif WATCHDOG_RESET ();#if defined(CONFIG_CMD_SCSI) WATCHDOG_RESET (); puts ("SCSI: "); scsi_init ();#endif#if defined(CONFIG_CMD_DOC) WATCHDOG_RESET (); puts ("DOC: "); doc_init ();#endif#if defined(CONFIG_CMD_NET)#if defined(CONFIG_NET_MULTI) WATCHDOG_RESET (); puts ("Net: ");#endif eth_initialize (bd);#endif#if defined(CONFIG_CMD_NET) && ( \ defined(CONFIG_CCM) || \ defined(CONFIG_ELPT860) || \ defined(CONFIG_EP8260) || \ defined(CONFIG_IP860) || \ defined(CONFIG_IVML24) || \ defined(CONFIG_IVMS8) || \ defined(CONFIG_MPC8260ADS) || \ defined(CONFIG_MPC8266ADS) || \ defined(CONFIG_MPC8560ADS) || \ defined(CONFIG_PCU_E) || \ defined(CONFIG_RPXSUPER) || \ defined(CONFIG_STXGP3) || \ defined(CONFIG_SPD823TS) || \ defined(CONFIG_RESET_PHY_R) ) WATCHDOG_RESET (); debug ("Reset Ethernet PHY\n"); reset_phy ();#endif#ifdef CONFIG_POST post_run (NULL, POST_RAM | post_bootmode_get(0));#endif#if defined(CONFIG_CMD_PCMCIA) \ && !defined(CONFIG_CMD_IDE) WATCHDOG_RESET (); puts ("PCMCIA:"); pcmcia_init ();#endif#if defined(CONFIG_CMD_IDE) WATCHDOG_RESET ();# ifdef CONFIG_IDE_8xx_PCCARD puts ("PCMCIA:");# else puts ("IDE: ");#endif#if defined(CONFIG_START_IDE) if (board_start_ide()) ide_init ();#else ide_init ();#endif#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 defined(CONFIG_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 ((char *)memsz, "%ldk", (bd->bi_memsize / 1024) - pram); setenv ("mem", (char *)memsz); }#endif#ifdef CONFIG_PS2KBD puts ("PS/2: "); kbd_init();#endif#ifdef CONFIG_MODEM_SUPPORT { extern int do_mdm_init; do_mdm_init = gd->do_mdm_init; }#endif /* 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"); show_boot_progress(-30); for (;;);}#ifdef CONFIG_MODEM_SUPPORT/* called from main loop (common/main.c) *//* 'inline' - We have to do it fast */static inline void mdm_readline(char *buf, int bufsiz){ char c; char *p; int n; n = 0; p = buf; for(;;) { c = serial_getc(); /* dbg("(%c)", c); */ switch(c) { case '\r': break; case '\n': *p = '\0'; return; default: if(n++ > bufsiz) { *p = '\0'; return; /* sanity check */ } *p = c; p++; break; } }}extern void dbg(const char *fmt, ...);int mdm_init (void){ char env_str[16]; char *init_str; int i; extern char console_buffer[]; extern void enable_putc(void); extern int hwflow_onoff(int); enable_putc(); /* enable serial_putc() */#ifdef CONFIG_HWFLOW init_str = getenv("mdm_flow_control"); if (init_str && (strcmp(init_str, "rts/cts") == 0)) hwflow_onoff (1); else hwflow_onoff(-1);#endif for (i = 1;;i++) { sprintf(env_str, "mdm_init%d", i); if ((init_str = getenv(env_str)) != NULL) { serial_puts(init_str); serial_puts("\n"); for(;;) { mdm_readline(console_buffer, CFG_CBSIZE); dbg("ini%d: [%s]", i, console_buffer); if ((strcmp(console_buffer, "OK") == 0) || (strcmp(console_buffer, "ERROR") == 0)) { dbg("ini%d: cmd done", i); break; } else /* in case we are originating call ... */ if (strncmp(console_buffer, "CONNECT", 7) == 0) { dbg("ini%d: connect", i); return 0; } } } else break; /* no init string - stop modem init */ udelay(100000); } udelay(100000); /* final stage - wait for connect */ for(;i > 1;) { /* if 'i' > 1 - wait for connection message from modem */ mdm_readline(console_buffer, CFG_CBSIZE); dbg("ini_f: [%s]", console_buffer); if (strncmp(console_buffer, "CONNECT", 7) == 0) { dbg("ini_f: connected"); return 0; } } return 0;}#endif#if 0 /* We could use plain global data, but the resulting code is bigger *//* * Pointer to initial global data area * * Here we initialize it. */#undef XTRN_DECLARE_GLOBAL_DATA_PTR#define XTRN_DECLARE_GLOBAL_DATA_PTR /* empty = allocate here */DECLARE_GLOBAL_DATA_PTR = (gd_t *) (CFG_INIT_RAM_ADDR + CFG_GBL_DATA_OFFSET);#endif /* 0 *//************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -