X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2Fflash%2Fnor%2Fcore.c;h=b8dda96b0f6ea3d50417351efd1c378aba927044;hb=49b7905cae66ee9e011c71aff758fafba823f87f;hp=767006d27e10003190b7cf4b1a4df20661c76126;hpb=5e78ddcea0d8303c316f687c05dfa78af27109d8;p=fw%2Fopenocd diff --git a/src/flash/nor/core.c b/src/flash/nor/core.c index 767006d27..b8dda96b0 100644 --- a/src/flash/nor/core.c +++ b/src/flash/nor/core.c @@ -36,7 +36,7 @@ * primarily support access from Tcl scripts or from GDB. */ -struct flash_bank *flash_banks; +static struct flash_bank *flash_banks; int flash_driver_erase(struct flash_bank *bank, int first, int last) { @@ -56,7 +56,10 @@ int flash_driver_protect(struct flash_bank *bank, int set, int first, int last) int retval; bool updated = false; - /* NOTE: "first == last" means protect just that sector */ + /* NOTE: "first == last" means (un?)protect just that sector. + code including Lower level ddrivers may rely on this "first <= last" + * invariant. + */ /* callers may not supply illegal parameters ... */ if (first < 0 || first > last || last >= bank->num_sectors) @@ -73,7 +76,7 @@ int flash_driver_protect(struct flash_bank *bank, int set, int first, int last) * speeds at least some things up. */ scan: - for (int i = first; i < last; i++) { + for (int i = first; i <= last; i++) { struct flash_sector *sector = bank->sectors + i; /* Only filter requests to protect the already-protected, or @@ -90,10 +93,10 @@ scan: * REVISIT we could handle discontiguous regions by issuing * more than one driver request. How much would that matter? */ - if (i == first) { + if (i == first && i != last) { updated = true; first++; - } else if (i == last) { + } else if (i == last && i != first) { updated = true; last--; } @@ -107,11 +110,19 @@ scan: goto scan; } - /* Single sector, already protected? Nothing to do! */ - if (first == last) + /* Single sector, already protected? Nothing to do! + * We may have trimmed our parameters into this degenerate case. + * + * FIXME repeating the "is_protected==set" test is a giveaway that + * this fast-exit belongs earlier, in the trim-it-down loop; mve. + * */ + if (first == last && bank->sectors[first].is_protected == set) return ERROR_OK; + /* Note that we don't pass illegal parameters to drivers; any + * trimming just turns one valid range into another one. + */ retval = bank->driver->protect(bank, set, first, last); if (retval != ERROR_OK) { @@ -600,7 +611,8 @@ int flash_write_unlock(struct target *target, struct image *image, run_size += image->sections[++section_last].size; run_size += pad_bytes; - LOG_INFO("Padding image section %d with %d bytes", section_last-1, pad_bytes); + if (pad_bytes > 0) + LOG_INFO("Padding image section %d with %d bytes", section_last-1, pad_bytes); } /* fit the run into bank constraints */