- int total, ret = 0;
- puts ("Erasing Nand...");
- if (nand_erase(nand_dev_desc + 0, CFG_ENV_OFFSET, CFG_ENV_SIZE, 0))
- return 1;
-
- puts ("Writing to Nand... ");
- ret = nand_rw(nand_dev_desc + 0,
- NANDRW_WRITE | NANDRW_JFFS2, CFG_ENV_OFFSET, CFG_ENV_SIZE,
- &total, (u_char*)env_ptr);
- if (ret || total != CFG_ENV_SIZE)
+ env_t env_new;
+ ssize_t len;
+ char *res;
+ int ret = 0;
+ nand_erase_options_t nand_erase_options;
+
+ nand_erase_options.length = CONFIG_ENV_RANGE;
+ nand_erase_options.quiet = 0;
+ nand_erase_options.jffs2 = 0;
+ nand_erase_options.scrub = 0;
+
+ if (CONFIG_ENV_RANGE < CONFIG_ENV_SIZE)
+ return 1;
+
+ res = (char *)&env_new.data;
+ len = hexport('\0', &res, ENV_SIZE);
+ if (len < 0) {
+ error("Cannot export environment: errno = %d\n", errno);
+ return 1;
+ }
+ env_new.crc = crc32(0, env_new.data, ENV_SIZE);
+ env_new.flags = ACTIVE_FLAG;
+
+ if(gd->env_valid == 1) {
+ puts("Erasing redundant NAND...\n");
+ nand_erase_options.offset = CONFIG_ENV_OFFSET_REDUND;
+ if (nand_erase_opts(&nand_info[0], &nand_erase_options))
+ return 1;
+
+ puts("Writing to redundant NAND... ");
+ ret = writeenv(CONFIG_ENV_OFFSET_REDUND,
+ (u_char *)&env_new);
+ } else {
+ puts("Erasing NAND...\n");
+ nand_erase_options.offset = CONFIG_ENV_OFFSET;
+ if (nand_erase_opts(&nand_info[0], &nand_erase_options))
+ return 1;
+
+ puts("Writing to NAND... ");
+ ret = writeenv(CONFIG_ENV_OFFSET,
+ (u_char *)&env_new);
+ }
+ if (ret) {
+ puts("FAILED!\n");