Merge pull request #6866 from geky/fat-erase-disk

fatfs: Add erase disk to format
pull/6976/head
Cruz Monrreal 2018-05-21 17:14:14 -05:00 committed by GitHub
commit cd1ff94db2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 62 additions and 3 deletions

View File

@ -333,24 +333,83 @@ int FATFileSystem::unmount()
int FATFileSystem::format(BlockDevice *bd, bd_size_t cluster_size)
{
FATFileSystem fs;
int err = fs.mount(bd, false);
fs.lock();
int err = bd->init();
if (err) {
fs.unlock();
return err;
}
// erase first handful of blocks
bd_size_t header = 2*bd->get_erase_size();
err = bd->erase(0, header);
if (err) {
bd->deinit();
fs.unlock();
return err;
}
if (bd->get_erase_value() < 0) {
// erase is unknown, need to write 1s
bd_size_t program_size = bd->get_program_size();
void *buf = malloc(program_size);
if (!buf) {
bd->deinit();
fs.unlock();
return -ENOMEM;
}
memset(buf, 0xff, program_size);
for (bd_addr_t i = 0; i < header; i += program_size) {
err = bd->program(buf, i, program_size);
if (err) {
free(buf);
bd->deinit();
fs.unlock();
return err;
}
}
free(buf);
}
// trim entire device to indicate it is unneeded
err = bd->trim(0, bd->size());
if (err) {
bd->deinit();
fs.unlock();
return err;
}
err = bd->deinit();
if (err) {
fs.unlock();
return err;
}
err = fs.mount(bd, false);
if (err) {
fs.unlock();
return err;
}
// Logical drive number, Partitioning rule, Allocation unit size (bytes per cluster)
fs.lock();
FRESULT res = f_mkfs(fs._fsid, FM_ANY | FM_SFD, cluster_size, NULL, 0);
fs.unlock();
if (res != FR_OK) {
fs.unmount();
fs.unlock();
return fat_error_remap(res);
}
err = fs.unmount();
if (err) {
fs.unlock();
return err;
}
fs.unlock();
return 0;
}