mirror of
				https://github.com/smaeul/u-boot.git
				synced 2025-11-04 05:50:17 +00:00 
			
		
		
		
	A large number of boards incorrectly used getenv() in their board init code running before relocation. In some cases this caused U-Boot to hang when certain environment variables grew too long. Fix the code to use getenv_r(). Signed-off-by: Wolfgang Denk <wd@denx.de> Cc: Stefan Roese <sr@denx.de> Cc: The LEOX team <team@leox.org> Cc: Michael Schwingen <michael@schwingen.org> Cc: Georg Schardt <schardt@team-ctech.de> Cc: Werner Pfister <Pfister_Werner@intercontrol.de> Cc: Dirk Eibach <eibach@gdsys.de> Cc: Peter De Schrijver <p2@mind.be> Cc: John Zhan <zhanz@sinovee.com> Cc: Rishi Bhattacharya <rishi@ti.com> Cc: Peter Tyser <ptyser@xes-inc.com>
		
			
				
	
	
		
			710 lines
		
	
	
		
			17 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			710 lines
		
	
	
		
			17 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/*
 | 
						|
 * amirix.c: ppcboot platform support for AMIRIX board
 | 
						|
 *
 | 
						|
 * Copyright 2002 Mind NV
 | 
						|
 * Copyright 2003 AMIRIX Systems Inc.
 | 
						|
 *
 | 
						|
 * http://www.mind.be/
 | 
						|
 * http://www.amirix.com/
 | 
						|
 *
 | 
						|
 * Author : Peter De Schrijver (p2@mind.be)
 | 
						|
 *          Frank Smith (smith@amirix.com)
 | 
						|
 *
 | 
						|
 * Derived from : Other platform support files in this tree, ml2
 | 
						|
 *
 | 
						|
 * This software may be used and distributed according to the terms of
 | 
						|
 * the GNU General Public License (GPL) version 2, incorporated herein by
 | 
						|
 * reference. Drivers based on or derived from this code fall under the GPL
 | 
						|
 * and must retain the authorship, copyright and this license notice. This
 | 
						|
 * file is not a complete program and may only be used when the entire
 | 
						|
 * program is licensed under the GPL.
 | 
						|
 *
 | 
						|
 */
 | 
						|
 | 
						|
#include <common.h>
 | 
						|
#include <command.h>
 | 
						|
#include <netdev.h>
 | 
						|
#include <asm/processor.h>
 | 
						|
 | 
						|
#include "powerspan.h"
 | 
						|
#include "ap1000.h"
 | 
						|
 | 
						|
int board_pre_init (void)
 | 
						|
{
 | 
						|
	return 0;
 | 
						|
}
 | 
						|
 | 
						|
/** serial number and platform display at startup */
 | 
						|
int checkboard (void)
 | 
						|
{
 | 
						|
	char buf[64];
 | 
						|
	int l = getenv_f("serial#", buf, sizeof(buf));
 | 
						|
 | 
						|
	/* After a loadace command, the SystemAce control register is left in a wonky state. */
 | 
						|
	/* this code did not work in board_pre_init */
 | 
						|
	unsigned char *p = (unsigned char *) AP1000_SYSACE_REGBASE;
 | 
						|
 | 
						|
	p[SYSACE_CTRLREG0] = 0x0;
 | 
						|
 | 
						|
	/* add platform and device to banner */
 | 
						|
	switch (get_device ()) {
 | 
						|
	case AP1xx_AP107_TARGET:
 | 
						|
		puts (AP1xx_AP107_TARGET_STR);
 | 
						|
		break;
 | 
						|
	case AP1xx_AP120_TARGET:
 | 
						|
		puts (AP1xx_AP120_TARGET_STR);
 | 
						|
		break;
 | 
						|
	case AP1xx_AP130_TARGET:
 | 
						|
		puts (AP1xx_AP130_TARGET_STR);
 | 
						|
		break;
 | 
						|
	case AP1xx_AP1070_TARGET:
 | 
						|
		puts (AP1xx_AP1070_TARGET_STR);
 | 
						|
		break;
 | 
						|
	case AP1xx_AP1100_TARGET:
 | 
						|
		puts (AP1xx_AP1100_TARGET_STR);
 | 
						|
		break;
 | 
						|
	default:
 | 
						|
		puts (AP1xx_UNKNOWN_STR);
 | 
						|
		break;
 | 
						|
	}
 | 
						|
	puts (AP1xx_TARGET_STR);
 | 
						|
	puts (" with ");
 | 
						|
 | 
						|
	switch (get_platform ()) {
 | 
						|
	case AP100_BASELINE_PLATFORM:
 | 
						|
	case AP1000_BASELINE_PLATFORM:
 | 
						|
		puts (AP1xx_BASELINE_PLATFORM_STR);
 | 
						|
		break;
 | 
						|
	case AP1xx_QUADGE_PLATFORM:
 | 
						|
		puts (AP1xx_QUADGE_PLATFORM_STR);
 | 
						|
		break;
 | 
						|
	case AP1xx_MGT_REF_PLATFORM:
 | 
						|
		puts (AP1xx_MGT_REF_PLATFORM_STR);
 | 
						|
		break;
 | 
						|
	case AP1xx_STANDARD_PLATFORM:
 | 
						|
		puts (AP1xx_STANDARD_PLATFORM_STR);
 | 
						|
		break;
 | 
						|
	case AP1xx_DUAL_PLATFORM:
 | 
						|
		puts (AP1xx_DUAL_PLATFORM_STR);
 | 
						|
		break;
 | 
						|
	case AP1xx_BASE_SRAM_PLATFORM:
 | 
						|
		puts (AP1xx_BASE_SRAM_PLATFORM_STR);
 | 
						|
		break;
 | 
						|
	case AP1xx_PCI_PCB_TESTPLATFORM:
 | 
						|
	case AP1000_PCI_PCB_TESTPLATFORM:
 | 
						|
		puts (AP1xx_PCI_PCB_TESTPLATFORM_STR);
 | 
						|
		break;
 | 
						|
	case AP1xx_DUAL_GE_MEZZ_TESTPLATFORM:
 | 
						|
		puts (AP1xx_DUAL_GE_MEZZ_TESTPLATFORM_STR);
 | 
						|
		break;
 | 
						|
	case AP1xx_SFP_MEZZ_TESTPLATFORM:
 | 
						|
		puts (AP1xx_SFP_MEZZ_TESTPLATFORM_STR);
 | 
						|
		break;
 | 
						|
	default:
 | 
						|
		puts (AP1xx_UNKNOWN_STR);
 | 
						|
		break;
 | 
						|
	}
 | 
						|
 | 
						|
	if ((get_platform () & AP1xx_TESTPLATFORM_MASK) != 0) {
 | 
						|
		puts (AP1xx_TESTPLATFORM_STR);
 | 
						|
	} else {
 | 
						|
		puts (AP1xx_PLATFORM_STR);
 | 
						|
	}
 | 
						|
 | 
						|
	putc ('\n');
 | 
						|
 | 
						|
	puts ("Serial#: ");
 | 
						|
 | 
						|
	if (l < 0) {
 | 
						|
		printf ("### No HW ID - assuming AMIRIX");
 | 
						|
	} else {
 | 
						|
		int i;
 | 
						|
 | 
						|
		for (i = 0; i < l; ++i) {
 | 
						|
			if (buf[i] == ' ') {
 | 
						|
				buf[i] = '\0';
 | 
						|
				break;
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		puts(buf);
 | 
						|
	}
 | 
						|
 | 
						|
	putc ('\n');
 | 
						|
 | 
						|
	return (0);
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
phys_size_t initdram (int board_type)
 | 
						|
{
 | 
						|
	char buf[64];
 | 
						|
	int i = getenv_f("dramsize", buf, sizeof(buf));
 | 
						|
 | 
						|
	if (i > 0) {
 | 
						|
		char *s = buf;
 | 
						|
		if ((s[0] == '0') && ((s[1] == 'x') || (s[1] == 'X'))) {
 | 
						|
			s += 2;
 | 
						|
		}
 | 
						|
		return (long int)simple_strtoul (s, NULL, 16);
 | 
						|
	} else {
 | 
						|
		/* give all 64 MB */
 | 
						|
		return 64 * 1024 * 1024;
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
unsigned int get_platform (void)
 | 
						|
{
 | 
						|
	unsigned int *revision_reg_ptr = (unsigned int *) AP1xx_FPGA_REV_ADDR;
 | 
						|
 | 
						|
	return (*revision_reg_ptr & AP1xx_PLATFORM_MASK);
 | 
						|
}
 | 
						|
 | 
						|
unsigned int get_device (void)
 | 
						|
{
 | 
						|
	unsigned int *revision_reg_ptr = (unsigned int *) AP1xx_FPGA_REV_ADDR;
 | 
						|
 | 
						|
	return (*revision_reg_ptr & AP1xx_TARGET_MASK);
 | 
						|
}
 | 
						|
 | 
						|
#if 0				/* loadace is not working; it appears to be a hardware issue with the system ace. */
 | 
						|
/*
 | 
						|
   This function loads FPGA configurations from the SystemACE CompactFlash
 | 
						|
*/
 | 
						|
int do_loadace (cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])
 | 
						|
{
 | 
						|
	unsigned char *p = (unsigned char *) AP1000_SYSACE_REGBASE;
 | 
						|
	int cfg;
 | 
						|
 | 
						|
	if ((p[SYSACE_STATREG0] & 0x10) == 0) {
 | 
						|
		p[SYSACE_CTRLREG0] = 0x80;
 | 
						|
		printf ("\nNo CompactFlash Detected\n\n");
 | 
						|
		p[SYSACE_CTRLREG0] = 0x00;
 | 
						|
		return 1;
 | 
						|
	}
 | 
						|
 | 
						|
	/* reset configuration controller: |  0x80 */
 | 
						|
	/* select cpflash                  & ~0x40 */
 | 
						|
	/* cfg start                       |  0x20 */
 | 
						|
	/* wait for cfgstart               & ~0x10 */
 | 
						|
	/* force cfgmode:                  |  0x08 */
 | 
						|
	/* do no force cfgaddr:            & ~0x04 */
 | 
						|
	/* clear mpulock:                  & ~0x02 */
 | 
						|
	/* do not force lock request       & ~0x01 */
 | 
						|
 | 
						|
	p[SYSACE_CTRLREG0] = 0x80 | 0x20 | 0x08;
 | 
						|
	p[SYSACE_CTRLREG1] = 0x00;
 | 
						|
 | 
						|
	/* force config address if arg2 exists */
 | 
						|
	if (argc == 2) {
 | 
						|
		cfg = simple_strtoul (argv[1], NULL, 10);
 | 
						|
 | 
						|
		if (cfg > 7) {
 | 
						|
			printf ("\nInvalid Configuration\n\n");
 | 
						|
			p[SYSACE_CTRLREG0] = 0x00;
 | 
						|
			return 1;
 | 
						|
		}
 | 
						|
		/* Set config address */
 | 
						|
		p[SYSACE_CTRLREG1] = (cfg << 5);
 | 
						|
		/* force cfgaddr */
 | 
						|
		p[SYSACE_CTRLREG0] |= 0x04;
 | 
						|
 | 
						|
	} else {
 | 
						|
		cfg = (p[SYSACE_STATREG1] & 0xE0) >> 5;
 | 
						|
	}
 | 
						|
 | 
						|
	/* release configuration controller */
 | 
						|
	printf ("\nLoading V2PRO with config %d...\n", cfg);
 | 
						|
	p[SYSACE_CTRLREG0] &= ~0x80;
 | 
						|
 | 
						|
 | 
						|
	while ((p[SYSACE_STATREG1] & 0x01) == 0) {
 | 
						|
 | 
						|
		if (p[SYSACE_ERRREG0] & 0x80) {
 | 
						|
			/* attempting to load an invalid configuration makes the cpflash */
 | 
						|
			/* appear to be removed. Reset here to avoid that problem */
 | 
						|
			p[SYSACE_CTRLREG0] = 0x80;
 | 
						|
			printf ("\nConfiguration %d Read Error\n\n", cfg);
 | 
						|
			p[SYSACE_CTRLREG0] = 0x00;
 | 
						|
			return 1;
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	p[SYSACE_CTRLREG0] |= 0x20;
 | 
						|
 | 
						|
	return 0;
 | 
						|
}
 | 
						|
#endif
 | 
						|
 | 
						|
/** Console command to display and set the software reconfigure byte
 | 
						|
  * <pre>
 | 
						|
  * swconfig        - display the current value of the software reconfigure byte
 | 
						|
  * swconfig [#]    - change the software reconfigure byte to #
 | 
						|
  * </pre>
 | 
						|
  * @param  *cmdtp  [IN] as passed by run_command (ignored)
 | 
						|
  * @param  flag    [IN] as passed by run_command (ignored)
 | 
						|
  * @param  argc    [IN] as passed by run_command if 1, display, if 2 change
 | 
						|
  * @param  *argv[] [IN] contains the parameters to use
 | 
						|
  * @return
 | 
						|
  * <pre>
 | 
						|
  *      0 if passed
 | 
						|
  *     -1 if failed
 | 
						|
  * </pre>
 | 
						|
  */
 | 
						|
int do_swconfigbyte (cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])
 | 
						|
{
 | 
						|
	unsigned char *sector_buffer = NULL;
 | 
						|
	unsigned char input_char;
 | 
						|
	int write_result;
 | 
						|
	unsigned int input_uint;
 | 
						|
 | 
						|
	/* display value if no argument */
 | 
						|
	if (argc < 2) {
 | 
						|
		printf ("Software configuration byte is currently: 0x%02x\n",
 | 
						|
			*((unsigned char *) (SW_BYTE_SECTOR_ADDR +
 | 
						|
					     SW_BYTE_SECTOR_OFFSET)));
 | 
						|
		return 0;
 | 
						|
	} else if (argc > 3) {
 | 
						|
		printf ("Too many arguments\n");
 | 
						|
		return -1;
 | 
						|
	}
 | 
						|
 | 
						|
	/* if 3 arguments, 3rd argument is the address to use */
 | 
						|
	if (argc == 3) {
 | 
						|
		input_uint = simple_strtoul (argv[1], NULL, 16);
 | 
						|
		sector_buffer = (unsigned char *) input_uint;
 | 
						|
	} else {
 | 
						|
		sector_buffer = (unsigned char *) DEFAULT_TEMP_ADDR;
 | 
						|
	}
 | 
						|
 | 
						|
	input_char = simple_strtoul (argv[1], NULL, 0);
 | 
						|
	if ((input_char & ~SW_BYTE_MASK) != 0) {
 | 
						|
		printf ("Input of 0x%02x will be masked to 0x%02x\n",
 | 
						|
			input_char, (input_char & SW_BYTE_MASK));
 | 
						|
		input_char = input_char & SW_BYTE_MASK;
 | 
						|
	}
 | 
						|
 | 
						|
	memcpy (sector_buffer, (void *) SW_BYTE_SECTOR_ADDR,
 | 
						|
		SW_BYTE_SECTOR_SIZE);
 | 
						|
	sector_buffer[SW_BYTE_SECTOR_OFFSET] = input_char;
 | 
						|
 | 
						|
 | 
						|
	printf ("Erasing Flash...");
 | 
						|
	if (flash_sect_erase
 | 
						|
	    (SW_BYTE_SECTOR_ADDR,
 | 
						|
	     (SW_BYTE_SECTOR_ADDR + SW_BYTE_SECTOR_OFFSET))) {
 | 
						|
		return -1;
 | 
						|
	}
 | 
						|
 | 
						|
	printf ("Writing to Flash... ");
 | 
						|
	write_result =
 | 
						|
		flash_write ((char *)sector_buffer, SW_BYTE_SECTOR_ADDR,
 | 
						|
			     SW_BYTE_SECTOR_SIZE);
 | 
						|
	if (write_result != 0) {
 | 
						|
		flash_perror (write_result);
 | 
						|
		return -1;
 | 
						|
	} else {
 | 
						|
		printf ("done\n");
 | 
						|
		printf ("Software configuration byte is now: 0x%02x\n",
 | 
						|
			*((unsigned char *) (SW_BYTE_SECTOR_ADDR +
 | 
						|
					     SW_BYTE_SECTOR_OFFSET)));
 | 
						|
	}
 | 
						|
 | 
						|
	return 0;
 | 
						|
}
 | 
						|
 | 
						|
#define ONE_SECOND 1000000
 | 
						|
 | 
						|
int do_pause (cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])
 | 
						|
{
 | 
						|
	int pause_time;
 | 
						|
	unsigned int delay_time;
 | 
						|
	int break_loop = 0;
 | 
						|
 | 
						|
	/* display value if no argument */
 | 
						|
	if (argc < 2) {
 | 
						|
		pause_time = 1;
 | 
						|
	}
 | 
						|
 | 
						|
	else if (argc > 2) {
 | 
						|
		printf ("Too many arguments\n");
 | 
						|
		return -1;
 | 
						|
	} else {
 | 
						|
		pause_time = simple_strtoul (argv[1], NULL, 0);
 | 
						|
	}
 | 
						|
 | 
						|
	printf ("Pausing with a poll time of %d, press any key to reactivate\n", pause_time);
 | 
						|
	delay_time = pause_time * ONE_SECOND;
 | 
						|
	while (break_loop == 0) {
 | 
						|
		udelay (delay_time);
 | 
						|
		if (serial_tstc () != 0) {
 | 
						|
			break_loop = 1;
 | 
						|
			/* eat user key presses */
 | 
						|
			while (serial_tstc () != 0) {
 | 
						|
				serial_getc ();
 | 
						|
			}
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	return 0;
 | 
						|
}
 | 
						|
 | 
						|
int do_swreconfig (cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])
 | 
						|
{
 | 
						|
	printf ("Triggering software reconfigure (software config byte is 0x%02x)...\n",
 | 
						|
		*((unsigned char *) (SW_BYTE_SECTOR_ADDR + SW_BYTE_SECTOR_OFFSET)));
 | 
						|
	udelay (1000);
 | 
						|
	*((unsigned char *) AP1000_CPLD_BASE) = 1;
 | 
						|
 | 
						|
	return 0;
 | 
						|
}
 | 
						|
 | 
						|
#define GET_DECIMAL(low_byte) ((low_byte >> 5) * 125)
 | 
						|
#define TEMP_BUSY_BIT   0x80
 | 
						|
#define TEMP_LHIGH_BIT  0x40
 | 
						|
#define TEMP_LLOW_BIT   0x20
 | 
						|
#define TEMP_EHIGH_BIT  0x10
 | 
						|
#define TEMP_ELOW_BIT   0x08
 | 
						|
#define TEMP_OPEN_BIT   0x04
 | 
						|
#define TEMP_ETHERM_BIT 0x02
 | 
						|
#define TEMP_LTHERM_BIT 0x01
 | 
						|
 | 
						|
int do_temp_sensor (cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])
 | 
						|
{
 | 
						|
	char cmd;
 | 
						|
	int ret_val = 0;
 | 
						|
	unsigned char temp_byte;
 | 
						|
	int temp;
 | 
						|
	int temp_low;
 | 
						|
	int low;
 | 
						|
	int low_low;
 | 
						|
	int high;
 | 
						|
	int high_low;
 | 
						|
	int therm;
 | 
						|
	unsigned char user_data[4] = { 0 };
 | 
						|
	int user_data_count = 0;
 | 
						|
	int ii;
 | 
						|
 | 
						|
	if (argc > 1) {
 | 
						|
		cmd = argv[1][0];
 | 
						|
	} else {
 | 
						|
		cmd = 's';	/* default to status */
 | 
						|
	}
 | 
						|
 | 
						|
	user_data_count = argc - 2;
 | 
						|
	for (ii = 0; ii < user_data_count; ii++) {
 | 
						|
		user_data[ii] = simple_strtoul (argv[2 + ii], NULL, 0);
 | 
						|
	}
 | 
						|
	switch (cmd) {
 | 
						|
	case 's':
 | 
						|
		if (I2CAccess
 | 
						|
		    (0x2, I2C_SENSOR_DEV, I2C_SENSOR_CHIP_SEL,
 | 
						|
		     &temp_byte, I2C_READ) != 0) {
 | 
						|
			goto fail;
 | 
						|
		}
 | 
						|
		printf ("Status    : 0x%02x  ", temp_byte);
 | 
						|
		if (temp_byte & TEMP_BUSY_BIT)
 | 
						|
			printf ("BUSY ");
 | 
						|
 | 
						|
		if (temp_byte & TEMP_LHIGH_BIT)
 | 
						|
			printf ("LHIGH ");
 | 
						|
 | 
						|
		if (temp_byte & TEMP_LLOW_BIT)
 | 
						|
			printf ("LLOW ");
 | 
						|
 | 
						|
		if (temp_byte & TEMP_EHIGH_BIT)
 | 
						|
			printf ("EHIGH ");
 | 
						|
 | 
						|
		if (temp_byte & TEMP_ELOW_BIT)
 | 
						|
			printf ("ELOW ");
 | 
						|
 | 
						|
		if (temp_byte & TEMP_OPEN_BIT)
 | 
						|
			printf ("OPEN ");
 | 
						|
 | 
						|
		if (temp_byte & TEMP_ETHERM_BIT)
 | 
						|
			printf ("ETHERM ");
 | 
						|
 | 
						|
		if (temp_byte & TEMP_LTHERM_BIT)
 | 
						|
			printf ("LTHERM");
 | 
						|
 | 
						|
		printf ("\n");
 | 
						|
 | 
						|
		if (I2CAccess
 | 
						|
		    (0x3, I2C_SENSOR_DEV, I2C_SENSOR_CHIP_SEL,
 | 
						|
		     &temp_byte, I2C_READ) != 0) {
 | 
						|
			goto fail;
 | 
						|
		}
 | 
						|
		printf ("Config    : 0x%02x  ", temp_byte);
 | 
						|
 | 
						|
		if (I2CAccess
 | 
						|
		    (0x4, I2C_SENSOR_DEV, I2C_SENSOR_CHIP_SEL,
 | 
						|
		     &temp_byte, I2C_READ) != 0) {
 | 
						|
			printf ("\n");
 | 
						|
			goto fail;
 | 
						|
		}
 | 
						|
		printf ("Conversion: 0x%02x\n", temp_byte);
 | 
						|
		if (I2CAccess
 | 
						|
		    (0x22, I2C_SENSOR_DEV, I2C_SENSOR_CHIP_SEL,
 | 
						|
		     &temp_byte, I2C_READ) != 0) {
 | 
						|
			goto fail;
 | 
						|
		}
 | 
						|
		printf ("Cons Alert: 0x%02x  ", temp_byte);
 | 
						|
 | 
						|
		if (I2CAccess
 | 
						|
		    (0x21, I2C_SENSOR_DEV, I2C_SENSOR_CHIP_SEL,
 | 
						|
		     &temp_byte, I2C_READ) != 0) {
 | 
						|
			printf ("\n");
 | 
						|
			goto fail;
 | 
						|
		}
 | 
						|
		printf ("Therm Hyst: %d\n", temp_byte);
 | 
						|
 | 
						|
		if (I2CAccess
 | 
						|
		    (0x0, I2C_SENSOR_DEV, I2C_SENSOR_CHIP_SEL,
 | 
						|
		     &temp_byte, I2C_READ) != 0) {
 | 
						|
			goto fail;
 | 
						|
		}
 | 
						|
		temp = temp_byte;
 | 
						|
		if (I2CAccess
 | 
						|
		    (0x6, I2C_SENSOR_DEV, I2C_SENSOR_CHIP_SEL,
 | 
						|
		     &temp_byte, I2C_READ) != 0) {
 | 
						|
			goto fail;
 | 
						|
		}
 | 
						|
		low = temp_byte;
 | 
						|
		if (I2CAccess
 | 
						|
		    (0x5, I2C_SENSOR_DEV, I2C_SENSOR_CHIP_SEL,
 | 
						|
		     &temp_byte, I2C_READ) != 0) {
 | 
						|
			goto fail;
 | 
						|
		}
 | 
						|
		high = temp_byte;
 | 
						|
		if (I2CAccess
 | 
						|
		    (0x20, I2C_SENSOR_DEV, I2C_SENSOR_CHIP_SEL,
 | 
						|
		     &temp_byte, I2C_READ) != 0) {
 | 
						|
			goto fail;
 | 
						|
		}
 | 
						|
		therm = temp_byte;
 | 
						|
		printf ("Local Temp: %2d     Low: %2d     High: %2d     THERM: %2d\n", temp, low, high, therm);
 | 
						|
 | 
						|
		if (I2CAccess
 | 
						|
		    (0x1, I2C_SENSOR_DEV, I2C_SENSOR_CHIP_SEL,
 | 
						|
		     &temp_byte, I2C_READ) != 0) {
 | 
						|
			goto fail;
 | 
						|
		}
 | 
						|
		temp = temp_byte;
 | 
						|
		if (I2CAccess
 | 
						|
		    (0x10, I2C_SENSOR_DEV, I2C_SENSOR_CHIP_SEL,
 | 
						|
		     &temp_byte, I2C_READ) != 0) {
 | 
						|
			goto fail;
 | 
						|
		}
 | 
						|
		temp_low = temp_byte;
 | 
						|
		if (I2CAccess
 | 
						|
		    (0x8, I2C_SENSOR_DEV, I2C_SENSOR_CHIP_SEL,
 | 
						|
		     &temp_byte, I2C_READ) != 0) {
 | 
						|
			goto fail;
 | 
						|
		}
 | 
						|
		low = temp_byte;
 | 
						|
		if (I2CAccess
 | 
						|
		    (0x14, I2C_SENSOR_DEV, I2C_SENSOR_CHIP_SEL,
 | 
						|
		     &temp_byte, I2C_READ) != 0) {
 | 
						|
			goto fail;
 | 
						|
		}
 | 
						|
		low_low = temp_byte;
 | 
						|
		if (I2CAccess
 | 
						|
		    (0x7, I2C_SENSOR_DEV, I2C_SENSOR_CHIP_SEL,
 | 
						|
		     &temp_byte, I2C_READ) != 0) {
 | 
						|
			goto fail;
 | 
						|
		}
 | 
						|
		high = temp_byte;
 | 
						|
		if (I2CAccess
 | 
						|
		    (0x13, I2C_SENSOR_DEV, I2C_SENSOR_CHIP_SEL,
 | 
						|
		     &temp_byte, I2C_READ) != 0) {
 | 
						|
			goto fail;
 | 
						|
		}
 | 
						|
		high_low = temp_byte;
 | 
						|
		if (I2CAccess
 | 
						|
		    (0x19, I2C_SENSOR_DEV, I2C_SENSOR_CHIP_SEL,
 | 
						|
		     &temp_byte, I2C_READ) != 0) {
 | 
						|
			goto fail;
 | 
						|
		}
 | 
						|
		therm = temp_byte;
 | 
						|
		if (I2CAccess
 | 
						|
		    (0x11, I2C_SENSOR_DEV, I2C_SENSOR_CHIP_SEL,
 | 
						|
		     &temp_byte, I2C_READ) != 0) {
 | 
						|
			goto fail;
 | 
						|
		}
 | 
						|
		printf ("Ext Temp  : %2d.%03d Low: %2d.%03d High: %2d.%03d THERM: %2d Offset: %2d\n", temp, GET_DECIMAL (temp_low), low, GET_DECIMAL (low_low), high, GET_DECIMAL (high_low), therm, temp_byte);
 | 
						|
		break;
 | 
						|
	case 'l':		/* alter local limits : low, high, therm */
 | 
						|
		if (argc < 3) {
 | 
						|
			goto usage;
 | 
						|
		}
 | 
						|
 | 
						|
		/* low */
 | 
						|
		if (I2CAccess
 | 
						|
		    (0xC, I2C_SENSOR_DEV, I2C_SENSOR_CHIP_SEL,
 | 
						|
		     &user_data[0], I2C_WRITE) != 0) {
 | 
						|
			goto fail;
 | 
						|
		}
 | 
						|
 | 
						|
		if (user_data_count > 1) {
 | 
						|
			/* high */
 | 
						|
			if (I2CAccess
 | 
						|
			    (0xB, I2C_SENSOR_DEV, I2C_SENSOR_CHIP_SEL,
 | 
						|
			     &user_data[1], I2C_WRITE) != 0) {
 | 
						|
				goto fail;
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		if (user_data_count > 2) {
 | 
						|
			/* therm */
 | 
						|
			if (I2CAccess
 | 
						|
			    (0x20, I2C_SENSOR_DEV,
 | 
						|
			     I2C_SENSOR_CHIP_SEL, &user_data[2],
 | 
						|
			     I2C_WRITE) != 0) {
 | 
						|
				goto fail;
 | 
						|
			}
 | 
						|
		}
 | 
						|
		break;
 | 
						|
	case 'e':		/* alter external limits: low, high, therm, offset */
 | 
						|
		if (argc < 3) {
 | 
						|
			goto usage;
 | 
						|
		}
 | 
						|
 | 
						|
		/* low */
 | 
						|
		if (I2CAccess
 | 
						|
		    (0xE, I2C_SENSOR_DEV, I2C_SENSOR_CHIP_SEL,
 | 
						|
		     &user_data[0], I2C_WRITE) != 0) {
 | 
						|
			goto fail;
 | 
						|
		}
 | 
						|
 | 
						|
		if (user_data_count > 1) {
 | 
						|
			/* high */
 | 
						|
			if (I2CAccess
 | 
						|
			    (0xD, I2C_SENSOR_DEV, I2C_SENSOR_CHIP_SEL,
 | 
						|
			     &user_data[1], I2C_WRITE) != 0) {
 | 
						|
				goto fail;
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		if (user_data_count > 2) {
 | 
						|
			/* therm */
 | 
						|
			if (I2CAccess
 | 
						|
			    (0x19, I2C_SENSOR_DEV,
 | 
						|
			     I2C_SENSOR_CHIP_SEL, &user_data[2],
 | 
						|
			     I2C_WRITE) != 0) {
 | 
						|
				goto fail;
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		if (user_data_count > 3) {
 | 
						|
			/* offset */
 | 
						|
			if (I2CAccess
 | 
						|
			    (0x11, I2C_SENSOR_DEV,
 | 
						|
			     I2C_SENSOR_CHIP_SEL, &user_data[3],
 | 
						|
			     I2C_WRITE) != 0) {
 | 
						|
				goto fail;
 | 
						|
			}
 | 
						|
		}
 | 
						|
		break;
 | 
						|
	case 'c':		/* alter config settings: config, conv, cons alert, therm hyst */
 | 
						|
		if (argc < 3) {
 | 
						|
			goto usage;
 | 
						|
		}
 | 
						|
 | 
						|
		/* config */
 | 
						|
		if (I2CAccess
 | 
						|
		    (0x9, I2C_SENSOR_DEV, I2C_SENSOR_CHIP_SEL,
 | 
						|
		     &user_data[0], I2C_WRITE) != 0) {
 | 
						|
			goto fail;
 | 
						|
		}
 | 
						|
 | 
						|
		if (user_data_count > 1) {
 | 
						|
			/* conversion */
 | 
						|
			if (I2CAccess
 | 
						|
			    (0xA, I2C_SENSOR_DEV, I2C_SENSOR_CHIP_SEL,
 | 
						|
			     &user_data[1], I2C_WRITE) != 0) {
 | 
						|
				goto fail;
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		if (user_data_count > 2) {
 | 
						|
			/* cons alert */
 | 
						|
			if (I2CAccess
 | 
						|
			    (0x22, I2C_SENSOR_DEV,
 | 
						|
			     I2C_SENSOR_CHIP_SEL, &user_data[2],
 | 
						|
			     I2C_WRITE) != 0) {
 | 
						|
				goto fail;
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		if (user_data_count > 3) {
 | 
						|
			/* therm hyst */
 | 
						|
			if (I2CAccess
 | 
						|
			    (0x21, I2C_SENSOR_DEV,
 | 
						|
			     I2C_SENSOR_CHIP_SEL, &user_data[3],
 | 
						|
			     I2C_WRITE) != 0) {
 | 
						|
				goto fail;
 | 
						|
			}
 | 
						|
		}
 | 
						|
		break;
 | 
						|
	default:
 | 
						|
		goto usage;
 | 
						|
	}
 | 
						|
 | 
						|
	goto done;
 | 
						|
fail:
 | 
						|
	printf ("Access to sensor failed\n");
 | 
						|
	ret_val = -1;
 | 
						|
	goto done;
 | 
						|
usage:
 | 
						|
	printf ("Usage:\n%s\n", cmdtp->help);
 | 
						|
 | 
						|
done:
 | 
						|
	return ret_val;
 | 
						|
}
 | 
						|
 | 
						|
U_BOOT_CMD (temp, 6, 0, do_temp_sensor,
 | 
						|
	    "interact with the temperature sensor",
 | 
						|
	    "temp [s]\n"
 | 
						|
	    "        - Show status.\n"
 | 
						|
	    "temp l LOW [HIGH] [THERM]\n"
 | 
						|
	    "        - Set local limits.\n"
 | 
						|
	    "temp e LOW [HIGH] [THERM] [OFFSET]\n"
 | 
						|
	    "        - Set external limits.\n"
 | 
						|
	    "temp c CONFIG [CONVERSION] [CONS. ALERT] [THERM HYST]\n"
 | 
						|
	    "        - Set config options.\n"
 | 
						|
	    "\n"
 | 
						|
	    "All values can be decimal or hex (hex preceded with 0x).\n"
 | 
						|
	    "Only whole numbers are supported for external limits.");
 | 
						|
 | 
						|
#if 0
 | 
						|
U_BOOT_CMD (loadace, 2, 0, do_loadace,
 | 
						|
	    "load fpga configuration from System ACE compact flash",
 | 
						|
	    "N\n"
 | 
						|
	    "    - Load configuration N (0-7) from System ACE compact flash\n"
 | 
						|
	    "loadace\n" "    - loads default configuration");
 | 
						|
#endif
 | 
						|
 | 
						|
U_BOOT_CMD (swconfig, 2, 0, do_swconfigbyte,
 | 
						|
	    "display or modify the software configuration byte",
 | 
						|
	    "N [ADDRESS]\n"
 | 
						|
	    "    - set software configuration byte to N, optionally use ADDRESS as\n"
 | 
						|
	    "      location of buffer for flash copy\n"
 | 
						|
	    "swconfig\n" "    - display software configuration byte");
 | 
						|
 | 
						|
U_BOOT_CMD (pause, 2, 0, do_pause,
 | 
						|
	    "sleep processor until any key is pressed with poll time of N seconds",
 | 
						|
	    "N\n"
 | 
						|
	    "    - sleep processor until any key is pressed with poll time of N seconds\n"
 | 
						|
	    "pause\n"
 | 
						|
	    "    - sleep processor until any key is pressed with poll time of 1 second");
 | 
						|
 | 
						|
U_BOOT_CMD (swrecon, 1, 0, do_swreconfig,
 | 
						|
	    "trigger a board reconfigure to the software selected configuration",
 | 
						|
	    "\n"
 | 
						|
	    "    - trigger a board reconfigure to the software selected configuration");
 | 
						|
 | 
						|
int board_eth_init(bd_t *bis)
 | 
						|
{
 | 
						|
	return pci_eth_init(bis);
 | 
						|
}
 |