diff options
author | Heiko Schocher | 2010-01-07 08:55:40 +0100 |
---|---|---|
committer | Wolfgang Denk | 2010-01-18 00:42:37 +0100 |
commit | 548738b4d43af841ff58c787bce297ac6a8bf7d1 (patch) | |
tree | 2d703671e76278a06143bc68e0436ae59e642552 /common/env_eeprom.c | |
parent | b63815e31355b44e65899b361da1d8ef6940ab90 (diff) |
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 <hs@denx.de>
Diffstat (limited to 'common/env_eeprom.c')
-rw-r--r-- | common/env_eeprom.c | 66 |
1 files changed, 61 insertions, 5 deletions
diff --git a/common/env_eeprom.c b/common/env_eeprom.c index 1578d61e6bc..30de4e9cac7 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; |