On Saturday, July 17, 2010 15:45:48 Wolfgang Denk wrote: > --- a/common/env_flash.c > +++ b/common/env_flash.c > #ifdef CMD_SAVEENV > int saveenv(void) > { > - char *saved_data = NULL; > - int rc = 1; > - char flag = OBSOLETE_FLAG, new_flag = ACTIVE_FLAG; > + env_t env_new; > + ssize_t len; > + char *saved_data = NULL; > + char *res; > + int rc = 1; > + char flag = OBSOLETE_FLAG, new_flag = ACTIVE_FLAG; > #if CONFIG_ENV_SECT_SIZE > CONFIG_ENV_SIZE > - ulong up_data = 0; > + ulong up_data = 0; > #endif > > - debug ("Protect off %08lX ... %08lX\n", > + debug("Protect off %08lX ... %08lX\n", > (ulong)flash_addr, end_addr); > > - if (flash_sect_protect (0, (ulong)flash_addr, end_addr)) { > - goto Done; > + if (flash_sect_protect(0, (ulong)flash_addr, end_addr)) { > + goto done; > } > > - debug ("Protect off %08lX ... %08lX\n", > + debug("Protect off %08lX ... %08lX\n", > (ulong)flash_addr_new, end_addr_new); > > - if (flash_sect_protect (0, (ulong)flash_addr_new, end_addr_new)) { > - goto Done; > + if (flash_sect_protect(0, (ulong)flash_addr_new, end_addr_new)) { > + goto done; > + } > + > + res = (char *)&env_new.data; > + len = hexport('\0', &res, ENV_SIZE); > + if (len < 0) { > + error("Cannot export environment: errno = %d\n", errno); > + goto done; > } > + env_new.crc = crc32(0, env_new.data, ENV_SIZE); > + env_new.flags = new_flag; > > #if CONFIG_ENV_SECT_SIZE > CONFIG_ENV_SIZE > up_data = (end_addr_new + 1 - ((long)flash_addr_new + CONFIG_ENV_SIZE)); > - debug ("Data to save 0x%x\n", up_data); > + debug("Data to save 0x%lX\n", up_data); > if (up_data) { > if ((saved_data = malloc(up_data)) == NULL) { > printf("Unable to save the rest of sector (%ld)\n", > up_data); > - goto Done; > + goto done; > } > memcpy(saved_data, > (void *)((long)flash_addr_new + CONFIG_ENV_SIZE), > up_data); > - debug ("Data (start 0x%x, len 0x%x) saved at 0x%x\n", > - (long)flash_addr_new + CONFIG_ENV_SIZE, > - up_data, saved_data); > + debug("Data (start 0x%lX, len 0x%lX) saved at 0x%p\n", > + (long)flash_addr_new + CONFIG_ENV_SIZE, > + up_data, saved_data); > } > #endif > - puts ("Erasing Flash..."); > - debug (" %08lX ... %08lX ...", > + puts("Erasing Flash..."); > + debug(" %08lX ... %08lX ...", > (ulong)flash_addr_new, end_addr_new); > > - if (flash_sect_erase ((ulong)flash_addr_new, end_addr_new)) { > - goto Done; > + if (flash_sect_erase((ulong)flash_addr_new, end_addr_new)) { > + goto done; > } > > - puts ("Writing to Flash... "); > - debug (" %08lX ... %08lX ...", > + puts("Writing to Flash... "); > + debug(" %08lX ... %08lX ...", > (ulong)&(flash_addr_new->data), > sizeof(env_ptr->data)+(ulong)&(flash_addr_new->data)); > - if ((rc = flash_write((char *)env_ptr->data, > - (ulong)&(flash_addr_new->data), > - sizeof(env_ptr->data))) || > - (rc = flash_write((char *)&(env_ptr->crc), > - (ulong)&(flash_addr_new->crc), > - sizeof(env_ptr->crc))) || > + if ((rc = flash_write((char *)&env_new, > + (ulong)flash_addr_new, > + sizeof(env_new))) || > (rc = flash_write(&flag, > (ulong)&(flash_addr->flags), > - sizeof(flash_addr->flags))) || > - (rc = flash_write(&new_flag, > - (ulong)&(flash_addr_new->flags), > - sizeof(flash_addr_new->flags)))) > - { > - flash_perror (rc); > - goto Done; > + sizeof(flash_addr->flags))) ) { > + flash_perror(rc); > + goto done; > } > - puts ("done\n"); > > #if CONFIG_ENV_SECT_SIZE > CONFIG_ENV_SIZE > if (up_data) { /* restore the rest of sector */ > - debug ("Restoring the rest of data to 0x%x len 0x%x\n", > - (long)flash_addr_new + CONFIG_ENV_SIZE, up_data); > + debug("Restoring the rest of data to 0x%lX len 0x%lX\n", > + (long)flash_addr_new + CONFIG_ENV_SIZE, up_data); > if (flash_write(saved_data, > (long)flash_addr_new + CONFIG_ENV_SIZE, > up_data)) { > flash_perror(rc); > - goto Done; > + goto done; > } > } > #endif > + puts("done\n"); > + > { > env_t * etmp = flash_addr; > ulong ltmp = end_addr; > @@ -220,13 +230,12 @@ int saveenv(void) > } > > rc = 0; > -Done: > - > +done: > if (saved_data) > - free (saved_data); > + free(saved_data); > /* try to re-protect */ > - (void) flash_sect_protect (1, (ulong)flash_addr, end_addr); > - (void) flash_sect_protect (1, (ulong)flash_addr_new, end_addr_new); > + (void) flash_sect_protect(1, (ulong)flash_addr, end_addr); > + (void) flash_sect_protect(1, (ulong)flash_addr_new, end_addr_new); > > return rc; > } > @@ -244,83 +253,93 @@ int env_init(void) > > gd->env_addr = (ulong)&default_environment[0]; > gd->env_valid = 0; > - return (0); > + return 0; > } > > #ifdef CMD_SAVEENV > > int saveenv(void) > { > - int len, rc; > - ulong end_addr; > - ulong flash_sect_addr; > -#if defined(CONFIG_ENV_SECT_SIZE) && (CONFIG_ENV_SECT_SIZE > > CONFIG_ENV_SIZE) - ulong flash_offset; > - uchar env_buffer[CONFIG_ENV_SECT_SIZE]; > -#else > - uchar *env_buffer = (uchar *)env_ptr; > -#endif /* CONFIG_ENV_SECT_SIZE */ > - int rcode = 0; > - > -#if defined(CONFIG_ENV_SECT_SIZE) && (CONFIG_ENV_SECT_SIZE > > CONFIG_ENV_SIZE) - > - flash_offset = ((ulong)flash_addr) & (CONFIG_ENV_SECT_SIZE-1); > - flash_sect_addr = ((ulong)flash_addr) & ~(CONFIG_ENV_SECT_SIZE-1); > - > - debug ( "copy old content: " > - "sect_addr: %08lX env_addr: %08lX offset: %08lX\n", > - flash_sect_addr, (ulong)flash_addr, flash_offset); > - > - /* copy old contents to temporary buffer */ > - memcpy (env_buffer, (void *)flash_sect_addr, CONFIG_ENV_SECT_SIZE); > - > - /* copy current environment to temporary buffer */ > - memcpy ((uchar *)((unsigned long)env_buffer + flash_offset), > - env_ptr, > - CONFIG_ENV_SIZE); > + env_t env_new; > + ssize_t len; > + int rc = 1; > + char *res; > + char *saved_data = NULL; > +#if CONFIG_ENV_SECT_SIZE > CONFIG_ENV_SIZE > + ulong up_data = 0; > > - len = CONFIG_ENV_SECT_SIZE; > -#else > - flash_sect_addr = (ulong)flash_addr; > - len = CONFIG_ENV_SIZE; > + up_data = (end_addr + 1 - ((long)flash_addr + CONFIG_ENV_SIZE)); > + debug("Data to save 0x%lx\n", up_data); > + if (up_data) { > + if ((saved_data = malloc(up_data)) == NULL) { > + printf("Unable to save the rest of sector (%ld)\n", > + up_data); > + goto done; > + } > + memcpy(saved_data, > + (void *)((long)flash_addr + CONFIG_ENV_SIZE), up_data); > + debug("Data (start 0x%lx, len 0x%lx) saved at 0x%lx\n", > + (ulong)flash_addr + CONFIG_ENV_SIZE, > + up_data, > + (ulong)saved_data); > + } > #endif /* CONFIG_ENV_SECT_SIZE */ > > - end_addr = flash_sect_addr + len - 1; > + debug("Protect off %08lX ... %08lX\n", > + (ulong)flash_addr, end_addr); > > - debug ("Protect off %08lX ... %08lX\n", > - (ulong)flash_sect_addr, end_addr); > + if (flash_sect_protect(0, (long)flash_addr, end_addr)) > + goto done; > > - if (flash_sect_protect (0, flash_sect_addr, end_addr)) > - return 1; > + res = (char *)&env_new.data; > + len = hexport('\0', &res, ENV_SIZE); > + if (len < 0) { > + error("Cannot export environment: errno = %d\n", errno); > + goto done; > + } > + env_new.crc = crc32(0, env_new.data, ENV_SIZE); > > - puts ("Erasing Flash..."); > - if (flash_sect_erase (flash_sect_addr, end_addr)) > - return 1; > + puts("Erasing Flash..."); > + if (flash_sect_erase((long)flash_addr, end_addr)) > + goto done; > > - puts ("Writing to Flash... "); > - rc = flash_write((char *)env_buffer, flash_sect_addr, len); > + puts("Writing to Flash... "); > + rc = flash_write((char *)&env_new, (long)flash_addr, CONFIG_ENV_SIZE); > if (rc != 0) { > - flash_perror (rc); > - rcode = 1; > - } else { > - puts ("done\n"); > + flash_perror(rc); > + goto done; > } > - > +#if CONFIG_ENV_SECT_SIZE > CONFIG_ENV_SIZE > + if (up_data) { /* restore the rest of sector */ > + debug("Restoring the rest of data to 0x%lx len 0x%lx\n", > + (ulong)flash_addr + CONFIG_ENV_SIZE, up_data); > + if (flash_write(saved_data, > + (long)flash_addr + CONFIG_ENV_SIZE, > + up_data)) { > + flash_perror(rc); > + goto done; > + } > + } > +#endif > + puts("done\n"); > + rc = 0; > +done: > + if (saved_data) > + free(saved_data); > /* try to re-protect */ > - (void) flash_sect_protect (1, flash_sect_addr, end_addr); > - return rcode; > + (void) flash_sect_protect(1, (long)flash_addr, end_addr); > + return rc; > }
it would seem that somewhere nestled in this rewrite, support for embedded env was broken (CONFIG_ENV_SIZE < CONFIG_ENV_SECT_SIZE). on a bf548-ezkit for example, i see this behavior: (v2010.09 / before this commit): bfin> save Saving Environment to Flash... . done Un-Protected 1 sectors Erasing Flash... . done Erased 1 sectors Writing to Flash... done . done Protected 1 sectors (after this commit / v2010.12): bfin> save Saving Environment to Flash... Error: start address not on sector boundary Error: start address not on sector boundary not sure if anyone has noticed/fixed this yet and would save me from the trouble of finding/fixing the problem ... -mike
signature.asc
Description: This is a digitally signed message part.
_______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot