X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=env%2Feeprom.c;h=e8126cfe3974695787e5cd11fe00fc9860d29406;hb=718f7bf7ca31277fbe5fdf49b6fa897736b7f36d;hp=5f63a6cd4a98d71f9b10a924da02000e87667ed1;hpb=0649cd0d4908d9b983a0361b8665938ef25701be;p=oweals%2Fu-boot.git diff --git a/env/eeprom.c b/env/eeprom.c index 5f63a6cd4a..e8126cfe39 100644 --- a/env/eeprom.c +++ b/env/eeprom.c @@ -1,17 +1,19 @@ +// SPDX-License-Identifier: GPL-2.0+ /* * (C) Copyright 2000-2010 * Wolfgang Denk, DENX Software Engineering, wd@denx.de. * * (C) Copyright 2001 Sysgo Real-Time Solutions, GmbH * Andreas Heppel - * - * SPDX-License-Identifier: GPL-2.0+ */ #include #include -#include +#include +#include +#include #include +#include #if defined(CONFIG_I2C_ENV_EEPROM_BUS) #include #endif @@ -21,10 +23,6 @@ DECLARE_GLOBAL_DATA_PTR; -env_t *env_ptr; - -char *env_name_spec = "EEPROM"; - static int eeprom_bus_read(unsigned dev_addr, unsigned offset, uchar *buffer, unsigned cnt) { @@ -65,13 +63,16 @@ static int eeprom_bus_write(unsigned dev_addr, unsigned offset, return rcode; } -uchar env_get_char_spec(int index) +/** Call this function from overridden env_get_char_spec() if you need + * this functionality. + */ +int env_eeprom_get_char(int index) { uchar c; unsigned int off = CONFIG_ENV_OFFSET; #ifdef CONFIG_ENV_OFFSET_REDUND - if (gd->env_valid == 2) + if (gd->env_valid == ENV_REDUND) off = CONFIG_ENV_OFFSET_REDUND; #endif eeprom_bus_read(CONFIG_SYS_DEF_EEPROM_ADDR, @@ -80,7 +81,7 @@ uchar env_get_char_spec(int index) return c; } -void env_relocate_spec(void) +static int env_eeprom_load(void) { char buf_env[CONFIG_ENV_SIZE]; unsigned int off = CONFIG_ENV_OFFSET; @@ -126,23 +127,25 @@ void env_relocate_spec(void) if (!crc_ok[0] && !crc_ok[1]) { gd->env_addr = 0; - gd->env_valid = 0; + gd->env_valid = ENV_INVALID; } else if (crc_ok[0] && !crc_ok[1]) { - gd->env_valid = 1; + gd->env_valid = ENV_VALID; } else if (!crc_ok[0] && crc_ok[1]) { - gd->env_valid = 2; + gd->env_valid = ENV_REDUND; } else { /* both ok - check serial */ - if (flags[0] == ACTIVE_FLAG && flags[1] == OBSOLETE_FLAG) - gd->env_valid = 1; - else if (flags[0] == OBSOLETE_FLAG && flags[1] == ACTIVE_FLAG) - gd->env_valid = 2; + if (flags[0] == ENV_REDUND_ACTIVE && + flags[1] == ENV_REDUND_OBSOLETE) + gd->env_valid = ENV_VALID; + else if (flags[0] == ENV_REDUND_OBSOLETE && + flags[1] == ENV_REDUND_ACTIVE) + gd->env_valid = ENV_REDUND; else if (flags[0] == 0xFF && flags[1] == 0) - gd->env_valid = 2; + gd->env_valid = ENV_REDUND; else if (flags[1] == 0xFF && flags[0] == 0) - gd->env_valid = 1; + gd->env_valid = ENV_VALID; else /* flags are equal - almost impossible */ - gd->env_valid = 1; + gd->env_valid = ENV_VALID; } #else /* CONFIG_ENV_OFFSET_REDUND */ @@ -170,47 +173,45 @@ void env_relocate_spec(void) } if (crc == new) { - gd->env_valid = 1; + gd->env_valid = ENV_VALID; } else { - gd->env_valid = 0; + gd->env_valid = ENV_INVALID; } #endif /* CONFIG_ENV_OFFSET_REDUND */ off = CONFIG_ENV_OFFSET; #ifdef CONFIG_ENV_OFFSET_REDUND - if (gd->env_valid == 2) + if (gd->env_valid == ENV_REDUND) off = CONFIG_ENV_OFFSET_REDUND; #endif eeprom_bus_read(CONFIG_SYS_DEF_EEPROM_ADDR, off, (uchar *)buf_env, CONFIG_ENV_SIZE); - env_import(buf_env, 1); + return env_import(buf_env, 1); } -int saveenv(void) +static int env_eeprom_save(void) { env_t env_new; int rc; unsigned int off = CONFIG_ENV_OFFSET; #ifdef CONFIG_ENV_OFFSET_REDUND unsigned int off_red = CONFIG_ENV_OFFSET_REDUND; - char flag_obsolete = OBSOLETE_FLAG; + char flag_obsolete = ENV_REDUND_OBSOLETE; #endif - BUG_ON(env_ptr != NULL); - rc = env_export(&env_new); if (rc) return rc; #ifdef CONFIG_ENV_OFFSET_REDUND - if (gd->env_valid == 1) { + if (gd->env_valid == ENV_VALID) { off = CONFIG_ENV_OFFSET_REDUND; off_red = CONFIG_ENV_OFFSET; } - env_new.flags = ACTIVE_FLAG; + env_new.flags = ENV_REDUND_ACTIVE; #endif rc = eeprom_bus_write(CONFIG_SYS_DEF_EEPROM_ADDR, @@ -222,24 +223,18 @@ int saveenv(void) off_red + offsetof(env_t, flags), (uchar *)&flag_obsolete, 1); - if (gd->env_valid == 1) - gd->env_valid = 2; + if (gd->env_valid == ENV_VALID) + gd->env_valid = ENV_REDUND; else - gd->env_valid = 1; + gd->env_valid = ENV_VALID; } #endif return rc; } -/* - * Initialize Environment use - * - * We are still running from ROM, so data use is limited. - * Use a (moderately small) buffer on the stack - */ -int env_init(void) -{ - gd->env_addr = (ulong)&default_environment[0]; - gd->env_valid = 1; - return 0; -} +U_BOOT_ENV_LOCATION(eeprom) = { + .location = ENVL_EEPROM, + ENV_NAME("EEPROM") + .load = env_eeprom_load, + .save = env_save_ptr(env_eeprom_save), +};