int main() { initialize_spifi(); // Make sure that cube_image is placed in SPIFI if (!IS_ADDR_IN_SPIFI(cube_image)) { notify_completion(false); } // Make sure that cube_image_ref is in IFLASH if (IS_ADDR_IN_SPIFI(cube_image_ref)) { notify_completion(false); } // Compare content if (cube_image_sz != cube_image_ref_sz) { notify_completion(false); } else { int i = 0; for (; i < cube_image_sz; i++) { if (cube_image[i] != cube_image_ref[i]) { notify_completion(false); } } } notify_completion(true); }
SPIFI::SpifiError SPIFI::program(uint32_t dest, unsigned len, char* src, Options options, bool verify, char* scratch) { unsigned written = 0; SPIFIopers opers; opers.dest = (char *)dest; opers.length = SPIFI_MIN(len, PROG_SIZE); opers.scratch = scratch; opers.protect = 0; opers.options = options; if (verify) { opers.options |= S_VERIFY_PROG; } if (IS_ADDR_IN_SPIFI(src)) { // The SPIFI ROM driver cannot write data from SPIFI into // SPIFI (i.e. cannot read and write at the same time). // The workaround is to copy the source data into a buffer // in local memory and use that as source for the write // instead. while (written < len) { memcpy(_addrConflictBuff, src + written, opers.length); int rc = _spifi->spifi_program(_romData, _addrConflictBuff, &opers); if (rc) { // got an error return translateError(rc, verify); } written += opers.length; opers.dest += opers.length; opers.length = SPIFI_MIN(len - written, PROG_SIZE); } } else { while (written < len) { int rc = _spifi->spifi_program(_romData, src + written, &opers); if (rc) { // got an error return translateError(rc, verify); } written += opers.length; opers.dest += opers.length; opers.length = SPIFI_MIN(len - written, PROG_SIZE); } } return Ok; }