summaryrefslogtreecommitdiff
path: root/common/env_emmc.c
diff options
context:
space:
mode:
Diffstat (limited to 'common/env_emmc.c')
-rwxr-xr-xcommon/env_emmc.c107
1 files changed, 84 insertions, 23 deletions
diff --git a/common/env_emmc.c b/common/env_emmc.c
index c169aa209..221798e19 100755
--- a/common/env_emmc.c
+++ b/common/env_emmc.c
@@ -29,7 +29,7 @@
#include <environment.h>
#include <linux/stddef.h>
#include <malloc.h>
-#include <asm/arch/emmc.h>
+#include <mmc.h>
#if defined(CONFIG_CMD_ENV) && defined(CONFIG_CMD_EMMC)
#define CMD_SAVEENV
@@ -67,6 +67,62 @@ uchar env_get_char_spec (int index)
return ( *((uchar *)(gd->env_addr + index)) );
}
+static int emmc_init(void)
+{
+ int i;
+ struct mmc *boot_dev = NULL;
+
+ for (i = 0;; i++) {
+ boot_dev = find_mmc_device(i);
+ if (!boot_dev)
+ return -1;
+ if (!strcmp(boot_dev->name, env_name_spec))
+ break;
+ }
+
+ return mmc_init(boot_dev);
+}
+static int emmc_read_write(u32 byte_offset, void *read_buffer,
+ u32 size, u32 write)
+{
+ int i;
+ u32 xferred_bytes;
+ struct mmc *boot_dev = NULL;
+ u32 blkcnt;
+
+ for (i = 0;; i++) {
+ boot_dev = find_mmc_device(i);
+ if (!boot_dev)
+ return -1;
+ if (!strcmp(boot_dev->name, env_name_spec))
+ break;
+ }
+
+ if (write) {
+ blkcnt = size/boot_dev->write_bl_len;
+ if (size && !blkcnt)
+ blkcnt++;
+ xferred_bytes =
+ boot_dev->block_dev.block_write(i,
+ byte_offset/boot_dev->write_bl_len,
+ blkcnt,
+ (u_char *)read_buffer);
+ xferred_bytes *= boot_dev->write_bl_len;
+ } else {
+ blkcnt = size/boot_dev->read_bl_len;
+ if (size && !blkcnt)
+ blkcnt++;
+ xferred_bytes =
+ boot_dev->block_dev.block_read(i,
+ byte_offset/boot_dev->read_bl_len,
+ blkcnt,
+ (u_char *)read_buffer);
+ xferred_bytes *= boot_dev->read_bl_len;
+ }
+ debug("emmc read write:requested:0x%x,done:0x%x", size, xferred_bytes);
+ return xferred_bytes;
+}
+
/* this is called before nand_init()
* so we can't read Nand to validate env data.
@@ -131,21 +187,18 @@ int env_init(void)
#ifdef CMD_SAVEENV
int saveenv(void)
{
- ulong total;
int ret = 0;
- puts ("Erasing eMMC...");
- if (emmc_erase(CONFIG_ENV_OFFSET_START, CONFIG_ENV_OFFSET_END))
- return 1;
-
puts ("Writing to EMMC... ");
- total = CONFIG_ENV_SIZE;
- ret = emmc_write(CONFIG_ENV_OFFSET_START, (u32 *) env_ptr,
- CONFIG_ENV_SIZE);
- //if (ret || total != CONFIG_ENV_SIZE)
- //return 1;
+ env_crc_update();
+ ret = emmc_read_write(CONFIG_ENV_OFFSET_START, (void *) env_ptr,
+ CONFIG_ENV_SIZE, 1);
+
+ if (ret != CONFIG_ENV_SIZE)
+ puts("error in saving environment\n");
+ else
+ puts("done\n");
- puts ("done\n");
return ret;
}
#endif /* CMD_SAVEENV */
@@ -162,8 +215,8 @@ void env_relocate_spec (void)
tmp_env1 = (env_t *) malloc(CONFIG_ENV_SIZE);
tmp_env2 = (env_t *) malloc(CONFIG_ENV_SIZE);
- emmc_read(CONFIG_ENV_OFFSET_START,(u32 *) tmp_env1, total);
- emmc_read(CONFIG_ENV_OFFSET_START,(u32 *) tmp_env2, total);
+ emmc_read_write(CONFIG_ENV_OFFSET_START, (void *) tmp_env1, total, 0);
+ emmc_read_write(CONFIG_ENV_OFFSET_START, (void *) tmp_env2, total, 0);
crc1_ok = (crc32(0, tmp_env1->data, ENV_SIZE) == tmp_env1->crc);
crc2_ok = (crc32(0, tmp_env2->data, ENV_SIZE) == tmp_env2->crc);
@@ -204,18 +257,26 @@ void env_relocate_spec (void)
void env_relocate_spec (void)
{
#if !defined(ENV_IS_EMBEDDED)
- ulong total;
int ret;
- total = CONFIG_ENV_SIZE;
- printf("env_relocate_spec start\n");
- emmc_init(4);
- ret = emmc_read(CONFIG_ENV_OFFSET_START, (u_char*)env_ptr, total);
- if (ret || total != CONFIG_ENV_SIZE)
- return set_default_env();
+ ret = emmc_init();
- if (crc32(0, env_ptr->data, ENV_SIZE) != env_ptr->crc)
- return set_default_env();
+ ret = emmc_read_write(CONFIG_ENV_OFFSET_START,
+ (void *)env_ptr, CONFIG_ENV_SIZE, 0);
+
+ if (ret != CONFIG_ENV_SIZE) {
+ printf("env read failed so setting default env\n");
+ goto misc;
+ }
+
+ if (crc32(0, env_ptr->data, ENV_SIZE) != env_ptr->crc) {
+ printf("env crc failed so setting default env\n");
+ goto misc;
+ }
+ return;
+
+misc:
+ return set_default_env();
#endif /* ! ENV_IS_EMBEDDED */
}
#endif /* CONFIG_ENV_OFFSET_REDUND */