diff options
| -rw-r--r-- | README | 13 | ||||
| -rw-r--r-- | common/cmd_eeprom.c | 14 | ||||
| -rw-r--r-- | common/env_eeprom.c | 66 | ||||
| -rw-r--r-- | include/common.h | 2 | 
4 files changed, 84 insertions, 11 deletions
| @@ -2447,6 +2447,19 @@ to save the current settings.  	- CONFIG_SYS_EEPROM_SIZE:  	  The size in bytes of the EEPROM device. +	- CONFIG_ENV_EEPROM_IS_ON_I2C +	  define this, if you have I2C and SPI activated, and your +	  EEPROM, which holds the environment, is on the I2C bus. + +	- CONFIG_I2C_ENV_EEPROM_BUS +	  if you have an Environment on an EEPROM reached over +	  I2C muxes, you can define here, how to reach this +	  EEPROM. For example: + +	  #define CONFIG_I2C_ENV_EEPROM_BUS       "pca9547:70:d\0" + +	  EEPROM which holds the environment, is reached over +	  a pca9547 i2c mux with address 0x70, channel 3.  - CONFIG_ENV_IS_IN_DATAFLASH: diff --git a/common/cmd_eeprom.c b/common/cmd_eeprom.c index 102efaf5b..519b510c7 100644 --- a/common/cmd_eeprom.c +++ b/common/cmd_eeprom.c @@ -79,7 +79,7 @@ int do_eeprom ( cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])  		ulong cnt  = simple_strtoul (argv[4], NULL, 16);  #endif /* CONFIG_SYS_I2C_MULTI_EEPROMS */ -# ifndef CONFIG_SPI +# if !defined(CONFIG_SPI) || defined(CONFIG_ENV_EEPROM_IS_ON_I2C)  		eeprom_init ();  # endif /* !CONFIG_SPI */ @@ -118,7 +118,7 @@ int do_eeprom ( cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])   *   0x00000nxx for EEPROM address selectors and page number at n.   */ -#ifndef CONFIG_SPI +#if !defined(CONFIG_SPI) || defined(CONFIG_ENV_EEPROM_IS_ON_I2C)  #if !defined(CONFIG_SYS_I2C_EEPROM_ADDR_LEN) || CONFIG_SYS_I2C_EEPROM_ADDR_LEN < 1 || CONFIG_SYS_I2C_EEPROM_ADDR_LEN > 2  #error CONFIG_SYS_I2C_EEPROM_ADDR_LEN must be 1 or 2  #endif @@ -176,7 +176,7 @@ int eeprom_read (unsigned dev_addr, unsigned offset, uchar *buffer, unsigned cnt  			len = maxlen;  #endif -#ifdef CONFIG_SPI +#if defined(CONFIG_SPI) && !defined(CONFIG_ENV_EEPROM_IS_ON_I2C)  		spi_read (addr, alen, buffer, len);  #else  		if (i2c_read (addr[0], offset, alen-1, buffer, len) != 0) @@ -272,7 +272,7 @@ int eeprom_write (unsigned dev_addr, unsigned offset, uchar *buffer, unsigned cn  			len = maxlen;  #endif -#ifdef CONFIG_SPI +#if defined(CONFIG_SPI) && !defined(CONFIG_ENV_EEPROM_IS_ON_I2C)  		spi_write (addr, alen, buffer, len);  #else  #if defined(CONFIG_SYS_EEPROM_X40430) @@ -374,7 +374,7 @@ int eeprom_write (unsigned dev_addr, unsigned offset, uchar *buffer, unsigned cn  	return rcode;  } -#ifndef CONFIG_SPI +#if !defined(CONFIG_SPI) || defined(CONFIG_ENV_EEPROM_IS_ON_I2C)  int  eeprom_probe (unsigned dev_addr, unsigned offset)  { @@ -403,7 +403,8 @@ eeprom_probe (unsigned dev_addr, unsigned offset)  void eeprom_init  (void)  { -#if defined(CONFIG_SPI) + +#if defined(CONFIG_SPI) && !defined(CONFIG_ENV_EEPROM_IS_ON_I2C)  	spi_init_f ();  #endif  #if defined(CONFIG_HARD_I2C) || \ @@ -411,6 +412,7 @@ void eeprom_init  (void)  	i2c_init (CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SLAVE);  #endif  } +  /*-----------------------------------------------------------------------   */ diff --git a/common/env_eeprom.c b/common/env_eeprom.c index 1578d61e6..30de4e9ca 100644 --- a/common/env_eeprom.c +++ b/common/env_eeprom.c @@ -28,18 +28,73 @@  #include <command.h>  #include <environment.h>  #include <linux/stddef.h> +#if defined(CONFIG_I2C_ENV_EEPROM_BUS) +#include <i2c.h> +#endif  DECLARE_GLOBAL_DATA_PTR;  env_t *env_ptr = NULL;  char * env_name_spec = "EEPROM"; +int env_eeprom_bus = -1; + +static int eeprom_bus_read (unsigned dev_addr, unsigned offset, uchar *buffer, +				unsigned cnt) +{ +	int rcode; +#if defined(CONFIG_I2C_ENV_EEPROM_BUS) +	int old_bus = i2c_get_bus_num(); + +	if (gd->flags & GD_FLG_RELOC) { +		if (env_eeprom_bus == -1) { +			I2C_MUX_DEVICE *dev = NULL; +			dev = i2c_mux_ident_muxstring( +				(uchar *)CONFIG_I2C_ENV_EEPROM_BUS); +			if (dev != NULL) { +				env_eeprom_bus = dev->busid; +			} else +				printf ("error adding env eeprom bus.\n"); +		} +		if (old_bus != env_eeprom_bus) { +			i2c_set_bus_num(env_eeprom_bus); +			old_bus = env_eeprom_bus; +		} +	} else { +		rcode = i2c_mux_ident_muxstring_f( +				(uchar *)CONFIG_I2C_ENV_EEPROM_BUS); +	} +#endif + +	rcode = eeprom_read (dev_addr, offset, buffer, cnt); +#if defined(CONFIG_I2C_ENV_EEPROM_BUS) +	if (old_bus != env_eeprom_bus) +		i2c_set_bus_num(old_bus); +#endif +	return rcode; +} + +static int eeprom_bus_write (unsigned dev_addr, unsigned offset, uchar *buffer, +				unsigned cnt) +{ +	int rcode; +#if defined(CONFIG_I2C_ENV_EEPROM_BUS) +	int old_bus = i2c_get_bus_num(); + +	rcode = i2c_mux_ident_muxstring_f((uchar *)CONFIG_I2C_ENV_EEPROM_BUS); +#endif +	rcode = eeprom_write (dev_addr, offset, buffer, cnt); +#if defined(CONFIG_I2C_ENV_EEPROM_BUS) +	i2c_set_bus_num(old_bus); +#endif +	return rcode; +}  uchar env_get_char_spec (int index)  {  	uchar c; -	eeprom_read (CONFIG_SYS_DEF_EEPROM_ADDR, +	eeprom_bus_read (CONFIG_SYS_DEF_EEPROM_ADDR,  		     CONFIG_ENV_OFFSET+index+offsetof(env_t,data),  		     &c, 1); @@ -48,7 +103,7 @@ uchar env_get_char_spec (int index)  void env_relocate_spec (void)  { -	eeprom_read (CONFIG_SYS_DEF_EEPROM_ADDR, +	eeprom_bus_read (CONFIG_SYS_DEF_EEPROM_ADDR,  		     CONFIG_ENV_OFFSET,  		     (uchar*)env_ptr,  		     CONFIG_ENV_SIZE); @@ -56,7 +111,7 @@ void env_relocate_spec (void)  int saveenv(void)  { -	return eeprom_write (CONFIG_SYS_DEF_EEPROM_ADDR, +	return eeprom_bus_write (CONFIG_SYS_DEF_EEPROM_ADDR,  			     CONFIG_ENV_OFFSET,  			     (uchar *)env_ptr,  			     CONFIG_ENV_SIZE); @@ -77,7 +132,7 @@ int env_init(void)  	eeprom_init ();	/* prepare for EEPROM read/write */  	/* read old CRC */ -	eeprom_read (CONFIG_SYS_DEF_EEPROM_ADDR, +	eeprom_bus_read (CONFIG_SYS_DEF_EEPROM_ADDR,  		     CONFIG_ENV_OFFSET+offsetof(env_t,crc),  		     (uchar *)&crc, sizeof(ulong)); @@ -87,7 +142,8 @@ int env_init(void)  	while (len > 0) {  		int n = (len > sizeof(buf)) ? sizeof(buf) : len; -		eeprom_read (CONFIG_SYS_DEF_EEPROM_ADDR, CONFIG_ENV_OFFSET+off, buf, n); +		eeprom_bus_read (CONFIG_SYS_DEF_EEPROM_ADDR, +				CONFIG_ENV_OFFSET + off, buf, n);  		new = crc32 (new, buf, n);  		len -= n;  		off += n; diff --git a/include/common.h b/include/common.h index 8197508b6..391790a41 100644 --- a/include/common.h +++ b/include/common.h @@ -336,7 +336,9 @@ extern void  pic_write (uchar reg, uchar val);  #if defined(CONFIG_SPI) || !defined(CONFIG_SYS_I2C_EEPROM_ADDR)  # define CONFIG_SYS_DEF_EEPROM_ADDR 0  #else +#if !defined(CONFIG_ENV_EEPROM_IS_ON_I2C)  # define CONFIG_SYS_DEF_EEPROM_ADDR CONFIG_SYS_I2C_EEPROM_ADDR +#endif  #endif /* CONFIG_SPI || !defined(CONFIG_SYS_I2C_EEPROM_ADDR) */  #if defined(CONFIG_SPI) |