diff options
| author | wdenk <wdenk> | 2003-04-27 22:52:51 +0000 | 
|---|---|---|
| committer | wdenk <wdenk> | 2003-04-27 22:52:51 +0000 | 
| commit | 4532cb696eb717419022dbaa8d408e7df7df7b68 (patch) | |
| tree | 2b791870499676f1c93b1e8bcc94ace26787ad8e /lib_ppc/board.c | |
| parent | 02c9bed451b36f3b1f11d5fe617da4fe4b9f9ab7 (diff) | |
| download | olio-uboot-2014.01-4532cb696eb717419022dbaa8d408e7df7df7b68.tar.xz olio-uboot-2014.01-4532cb696eb717419022dbaa8d408e7df7df7b68.zip | |
* LWMON extensions:
  - Splashscreen support
  - modem support
  - sysmon support
  - temperature dependend enabling of LCD
* Allow booting from old "PPCBoot" disk partitions
* Add support for TQM8255 Board / MPC8255 CPU
Diffstat (limited to 'lib_ppc/board.c')
| -rw-r--r-- | lib_ppc/board.c | 108 | 
1 files changed, 108 insertions, 0 deletions
| diff --git a/lib_ppc/board.c b/lib_ppc/board.c index eb67942d7..4b1edeec0 100644 --- a/lib_ppc/board.c +++ b/lib_ppc/board.c @@ -308,6 +308,9 @@ init_fnc_t *init_sequence[] = {  #if defined(CONFIG_DTT)		/* Digital Thermometers and Thermostats */  	dtt_init,  #endif +#ifdef CONFIG_POST +	post_init_f, +#endif  	INIT_FUNC_WATCHDOG_RESET  	init_func_ram,  #if defined(CFG_DRAM_TEST) @@ -976,6 +979,13 @@ void board_init_r (gd_t *id, ulong dest_addr)  	}  #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. */ @@ -993,6 +1003,104 @@ void hang (void)  	for (;;);  } +#ifdef CONFIG_MODEM_SUPPORT +/* called from main loop (common/main.c) */ +extern void  dbg(const char *fmt, ...); +int mdm_init (void) +{ +	char env_str[16]; +	char *init_str; +	int i; +	extern char console_buffer[]; +	static inline void mdm_readline(char *buf, int bufsiz); +	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; +} + +/* '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; +		} +	} +} +#endif +  #if 0 /* We could use plain global data, but the resulting code is bigger */  /*   * Pointer to initial global data area |