@@ -333,24 +333,83 @@ int FATFileSystem::unmount()
333
333
int FATFileSystem::format (BlockDevice *bd, bd_size_t cluster_size)
334
334
{
335
335
FATFileSystem fs;
336
- int err = fs.mount (bd, false );
336
+ fs.lock ();
337
+
338
+ int err = bd->init ();
339
+ if (err) {
340
+ fs.unlock ();
341
+ return err;
342
+ }
343
+
344
+ // erase first handful of blocks
345
+ bd_size_t header = 2 *bd->get_erase_size ();
346
+ err = bd->erase (0 , header);
337
347
if (err) {
348
+ bd->deinit ();
349
+ fs.unlock ();
350
+ return err;
351
+ }
352
+
353
+ if (bd->get_erase_value () < 0 ) {
354
+ // erase is unknown, need to write 1s
355
+ bd_size_t program_size = bd->get_program_size ();
356
+ void *buf = malloc (program_size);
357
+ if (!buf) {
358
+ bd->deinit ();
359
+ fs.unlock ();
360
+ return -ENOMEM;
361
+ }
362
+
363
+ memset (buf, 0xff , program_size);
364
+
365
+ for (bd_addr_t i = 0 ; i < header; i += program_size) {
366
+ err = bd->program (buf, i, program_size);
367
+ if (err) {
368
+ free (buf);
369
+ bd->deinit ();
370
+ fs.unlock ();
371
+ return err;
372
+ }
373
+ }
374
+
375
+ free (buf);
376
+ }
377
+
378
+ // trim entire device to indicate it is unneeded
379
+ err = bd->trim (0 , bd->size ());
380
+ if (err) {
381
+ bd->deinit ();
382
+ fs.unlock ();
383
+ return err;
384
+ }
385
+
386
+ err = bd->deinit ();
387
+ if (err) {
388
+ fs.unlock ();
389
+ return err;
390
+ }
391
+
392
+ err = fs.mount (bd, false );
393
+ if (err) {
394
+ fs.unlock ();
338
395
return err;
339
396
}
340
397
341
398
// Logical drive number, Partitioning rule, Allocation unit size (bytes per cluster)
342
- fs.lock ();
343
399
FRESULT res = f_mkfs (fs._fsid , FM_ANY | FM_SFD, cluster_size, NULL , 0 );
344
- fs.unlock ();
345
400
if (res != FR_OK) {
401
+ fs.unmount ();
402
+ fs.unlock ();
346
403
return fat_error_remap (res);
347
404
}
348
405
349
406
err = fs.unmount ();
350
407
if (err) {
408
+ fs.unlock ();
351
409
return err;
352
410
}
353
411
412
+ fs.unlock ();
354
413
return 0 ;
355
414
}
356
415
0 commit comments