From 548738b4d43af841ff58c787bce297ac6a8bf7d1 Mon Sep 17 00:00:00 2001 From: Heiko Schocher Date: Thu, 7 Jan 2010 08:55:40 +0100 Subject: [PATCH] cmd_eeprom: I2C updates - 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 now define, how to reach this EEPROM. Signed-off-by: Heiko Schocher --- README | 13 +++++++++ common/cmd_eeprom.c | 14 +++++----- common/env_eeprom.c | 66 +++++++++++++++++++++++++++++++++++++++++---- include/common.h | 2 ++ 4 files changed, 84 insertions(+), 11 deletions(-) diff --git a/README b/README index 22e35c39b..7affe10fb 100644 --- a/README +++ b/README @@ -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 #include #include +#if defined(CONFIG_I2C_ENV_EEPROM_BUS) +#include +#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)