void CMainDlg::OnBnClickedFlBcheck() { CBusy busy; if(!m_BootConnected) return; EnableControlBtn(false); blank_check(); // to do - what to do when erase operation halted ? ProgressChanged(100); LogResetReplaceLine(); EnableControlBtn(true); }
static flash_entry_header_t *find_free(data_size_t required) { for (int s = 0; sector_map[s].address; s++) { h_magic_t *pmagic = (h_magic_t *) sector_map[s].address; h_magic_t *pe = pmagic + (sector_map[s].size / sizeof(h_magic_t)) - 1; /* Hunt for Magic Signature */ do { if (valid_magic(pmagic)) { flash_entry_header_t *pf = (flash_entry_header_t *) pmagic; /* Test the CRC */ if (pf->crc == crc32(entry_crc_start(pf), entry_crc_length(pf))) { /* Valid Magic and CRC look for the next record*/ pmagic = ((uint32_t *) next_entry(pf)); } else { pmagic++; } } if (blank_magic(pmagic)) { flash_entry_header_t *pf = (flash_entry_header_t *) pmagic; if (blank_entry(pf) && blank_check(pf, required)) { return pf; } } } while (++pmagic != pe); } return NULL; }
int parameter_flashfs_write(flash_file_token_t token, uint8_t *buffer, size_t buf_size) { int rv = -ENXIO; if (sector_map) { rv = 0; /* Calculate the total space needed */ size_t total_size = buf_size + sizeof(flash_entry_header_t); size_t alignment = sizeof(h_magic_t) - 1; size_t size_adjust = ((total_size + alignment) & ~alignment) - total_size; total_size += size_adjust; /* Is this and existing entry */ flash_entry_header_t *pf = find_entry(token); if (!pf) { /* No Entry exists for this token so find a place for it */ pf = find_free(total_size); /* No Space */ if (pf == 0) { return -ENOSPC; } } else { /* Do we have space after the entry in the sector for the update */ sector_descriptor_t *current_sector = check_free_space_in_sector(pf, total_size); if (current_sector == 0) { /* Mark the last entry erased */ /* todo:consider a 2 stage erase or write before erase and do a fs check * at start up */ rv = erase_entry(pf); if (rv < 0) { return rv; } /* We had space and marked the last entry erased so use the Next Free */ pf = next_entry(pf); } else { /* * We did not have space in the current sector so select the next sector */ current_sector = get_next_sector_descriptor(current_sector); /* Will the data fit */ if (current_sector->size < total_size) { return -ENOSPC; } /* Mark the last entry erased */ /* todo:consider a 2 stage erase or write before erase and do a fs check * at start up */ rv = erase_entry(pf); if (rv < 0) { return rv; } pf = (flash_entry_header_t *) current_sector->address; } if (!blank_check(pf, total_size)) { rv = erase_sector(current_sector, pf); } } flash_entry_header_t *pn = (flash_entry_header_t *)(buffer - sizeof(flash_entry_header_t)); pn->magic = MagicSig; pn->file_token.t = token.t; pn->flag = ValidEntry + size_adjust; pn->size = total_size; for (size_t a = 0; a < size_adjust; a++) { buffer[buf_size + a] = (uint8_t)BlankSig; } pn->crc = crc32(entry_crc_start(pn), entry_crc_length(pn)); rv = up_progmem_write((size_t) pf, pn, pn->size); int system_bytes = (sizeof(flash_entry_header_t) + size_adjust); if (rv >= system_bytes) { rv -= system_bytes; } } return rv; }