mirror of https://github.com/ARMmbed/mbed-os.git
commit
cd1ff94db2
|
@ -333,24 +333,83 @@ int FATFileSystem::unmount()
|
||||||
int FATFileSystem::format(BlockDevice *bd, bd_size_t cluster_size)
|
int FATFileSystem::format(BlockDevice *bd, bd_size_t cluster_size)
|
||||||
{
|
{
|
||||||
FATFileSystem fs;
|
FATFileSystem fs;
|
||||||
int err = fs.mount(bd, false);
|
fs.lock();
|
||||||
|
|
||||||
|
int err = bd->init();
|
||||||
if (err) {
|
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;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Logical drive number, Partitioning rule, Allocation unit size (bytes per cluster)
|
// 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);
|
FRESULT res = f_mkfs(fs._fsid, FM_ANY | FM_SFD, cluster_size, NULL, 0);
|
||||||
fs.unlock();
|
|
||||||
if (res != FR_OK) {
|
if (res != FR_OK) {
|
||||||
|
fs.unmount();
|
||||||
|
fs.unlock();
|
||||||
return fat_error_remap(res);
|
return fat_error_remap(res);
|
||||||
}
|
}
|
||||||
|
|
||||||
err = fs.unmount();
|
err = fs.unmount();
|
||||||
if (err) {
|
if (err) {
|
||||||
|
fs.unlock();
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fs.unlock();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue