⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 board.c

📁 PowerPC U-boot源码
💻 C
📖 第 1 页 / 共 2 页
字号:
	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 + -