Skip to content

Commit 693f3b3

Browse files
committed
Add FatFS support to all bdev commands
1 parent 005a0c2 commit 693f3b3

File tree

1 file changed

+120
-41
lines changed

1 file changed

+120
-41
lines changed

main.cpp

Lines changed: 120 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -709,7 +709,8 @@ struct config_command : public cmd {
709709
auto bdev_options = (
710710
(option('p', "--partition") % "Partition to use as block device" &
711711
integer("partition").set(settings.bdev.partition) % "partition number").force_expand_help(true) +
712-
(option("--filesystem") & bdev_fs("fs").set(settings.bdev.fs) % "Filesystem (default: littlefs)").force_expand_help(true) +
712+
(option("--filesystem") % "Specify filesystem to use" &
713+
bdev_fs("fs").set(settings.bdev.fs) % "littlefs|fatfs").force_expand_help(true) +
713714
(option('f', "--format").set(settings.bdev.format) % "Format the drive if necessary (may result in data loss)")
714715
).min(0).doc_non_optional(true) % "Block device options";
715716

@@ -5432,7 +5433,7 @@ void setup_bdevfs(picoboot::connection con) {
54325433
}
54335434

54345435
// No FS Found
5435-
fail(ERROR_CONNECTION, "No file system detected - to format the drive use -f --filesystem <littlefs|fatfs>");
5436+
fail(ERROR_CONNECTION, "No file system detected - to format the drive use `-f --filesystem <littlefs|fatfs>`");
54365437
}
54375438
}
54385439

@@ -5747,15 +5748,36 @@ bool bdev_mkdir_command::execute(device_map &devices) {
57475748
auto con = get_single_bootsel_device_connection(devices);
57485749
setup_bdevfs(con);
57495750

5750-
lfs_op_fn lfs_op = [&](lfs_t *lfs) {
5751-
int err = lfs_mkdir(lfs, settings.filenames[0].c_str());
5752-
if (err == LFS_ERR_EXIST) {
5753-
fos << "Directory already exists\n";
5754-
} else if (err) {
5755-
fos << "LittleFS Error " << err << "\n";
5751+
switch (settings.bdev.fs) {
5752+
case fs_littlefs: {
5753+
lfs_op_fn lfs_op = [&](lfs_t *lfs) {
5754+
int err = lfs_mkdir(lfs, settings.filenames[0].c_str());
5755+
if (err == LFS_ERR_EXIST) {
5756+
fos << "Directory already exists\n";
5757+
} else if (err) {
5758+
fos << "LittleFS Error " << err << "\n";
5759+
}
5760+
};
5761+
do_lfs_op(lfs_op);
5762+
break;
57565763
}
5757-
};
5758-
do_lfs_op(lfs_op);
5764+
5765+
case fs_fatfs: {
5766+
fatfs_op_fn fatfs_op = [&](FATFS *fatfs) {
5767+
int err = f_mkdir(fatfs, settings.filenames[0].c_str());
5768+
if (err == FR_EXIST) {
5769+
fos << "Directory already exists\n";
5770+
} else if (err) {
5771+
fos << "FatFS Error " << err << "\n";
5772+
}
5773+
};
5774+
do_fatfs_op(fatfs_op);
5775+
break;
5776+
}
5777+
5778+
default:
5779+
fail(ERROR_ARGS, "Unknown filesystem specified");
5780+
}
57595781
return false;
57605782
}
57615783

@@ -5892,17 +5914,40 @@ bool bdev_rm_command::execute(device_map &devices) {
58925914
auto con = get_single_bootsel_device_connection(devices);
58935915
setup_bdevfs(con);
58945916

5895-
lfs_op_fn lfs_op = [&](lfs_t *lfs) {
5896-
int err = lfs_remove(lfs, settings.filenames[0].c_str());
5897-
if (err == LFS_ERR_NOTEMPTY) {
5898-
fail(ERROR_NOT_POSSIBLE, "Directory to remove is not empty");
5899-
} else if (err == LFS_ERR_NOENT) {
5900-
fail(ERROR_NOT_POSSIBLE, "File to remove does not exist");
5901-
} else if (err) {
5902-
fail(ERROR_WRITE_FAILED, "LittleFS Error %d", err);
5917+
switch (settings.bdev.fs) {
5918+
case fs_littlefs: {
5919+
lfs_op_fn lfs_op = [&](lfs_t *lfs) {
5920+
int err = lfs_remove(lfs, settings.filenames[0].c_str());
5921+
if (err == LFS_ERR_NOTEMPTY) {
5922+
fail(ERROR_NOT_POSSIBLE, "Directory to remove is not empty");
5923+
} else if (err == LFS_ERR_NOENT) {
5924+
fail(ERROR_NOT_POSSIBLE, "File to remove does not exist");
5925+
} else if (err) {
5926+
fail(ERROR_WRITE_FAILED, "LittleFS Error %d", err);
5927+
}
5928+
};
5929+
do_lfs_op(lfs_op);
5930+
break;
59035931
}
5904-
};
5905-
do_lfs_op(lfs_op);
5932+
5933+
case fs_fatfs: {
5934+
fatfs_op_fn fatfs_op = [&](FATFS *fatfs) {
5935+
int err = f_unlink(fatfs, settings.filenames[0].c_str());
5936+
if (err == FR_DENIED) {
5937+
fail(ERROR_NOT_POSSIBLE, "Directory to remove is not empty");
5938+
} else if (err == FR_NO_FILE) {
5939+
fail(ERROR_NOT_POSSIBLE, "File to remove does not exist");
5940+
} else if (err) {
5941+
fail(ERROR_WRITE_FAILED, "FatFS Error %d", err);
5942+
}
5943+
};
5944+
do_fatfs_op(fatfs_op);
5945+
break;
5946+
}
5947+
5948+
default:
5949+
fail(ERROR_ARGS, "Unknown filesystem specified");
5950+
}
59065951
return false;
59075952
}
59085953

@@ -5913,27 +5958,61 @@ bool bdev_cat_command::execute(device_map &devices) {
59135958
auto con = get_single_bootsel_device_connection(devices);
59145959
setup_bdevfs(con);
59155960

5916-
lfs_op_fn lfs_op = [&](lfs_t *lfs) {
5917-
lfs_file_t file;
5918-
int err = lfs_file_open(lfs, &file, settings.filenames[0].c_str(), LFS_O_RDONLY);
5919-
if (err) {
5920-
fail(ERROR_READ_FAILED, "LittleFS Open Error %d", err);
5921-
}
5922-
auto size = lfs_file_size(lfs, &file);
5923-
err = lfs_file_rewind(lfs, &file);
5924-
std::vector<char> data_buf(size);
5925-
err = lfs_file_read(lfs, &file, data_buf.data(), data_buf.size());
5926-
if (err < 0) {
5927-
fail(ERROR_READ_FAILED, "LittleFS Read Error %d", err);
5928-
} else if (err != data_buf.size()) {
5929-
fail(ERROR_READ_FAILED, "LittleFS Read too short - got %d bytes expected %d bytes", err, data_buf.size());
5930-
}
5931-
err = lfs_file_close(lfs, &file);
5932-
5933-
string out(data_buf.begin(), data_buf.end());
5934-
printf("%s", out.c_str());
5935-
};
5936-
do_lfs_op(lfs_op);
5961+
switch (settings.bdev.fs) {
5962+
case fs_littlefs: {
5963+
lfs_op_fn lfs_op = [&](lfs_t *lfs) {
5964+
lfs_file_t file;
5965+
int err = lfs_file_open(lfs, &file, settings.filenames[0].c_str(), LFS_O_RDONLY);
5966+
if (err) {
5967+
fail(ERROR_READ_FAILED, "LittleFS Open Error %d", err);
5968+
}
5969+
auto size = lfs_file_size(lfs, &file);
5970+
err = lfs_file_rewind(lfs, &file);
5971+
std::vector<char> data_buf(size);
5972+
err = lfs_file_read(lfs, &file, data_buf.data(), data_buf.size());
5973+
if (err < 0) {
5974+
fail(ERROR_READ_FAILED, "LittleFS Read Error %d", err);
5975+
} else if (err != data_buf.size()) {
5976+
fail(ERROR_READ_FAILED, "LittleFS Read too short - got %d bytes expected %d bytes", err, data_buf.size());
5977+
}
5978+
err = lfs_file_close(lfs, &file);
5979+
5980+
string out(data_buf.begin(), data_buf.end());
5981+
printf("%s", out.c_str());
5982+
};
5983+
do_lfs_op(lfs_op);
5984+
break;
5985+
}
5986+
5987+
case fs_fatfs: {
5988+
fatfs_op_fn fatfs_op = [&](FATFS *fatfs) {
5989+
FIL file;
5990+
int err = f_open(fatfs, &file, settings.filenames[0].c_str(), FA_READ);
5991+
if (err) {
5992+
fail(ERROR_READ_FAILED, "FatFS Open Error %d", err);
5993+
}
5994+
auto size = f_size(&file);
5995+
err = f_rewind(&file);
5996+
std::vector<char> data_buf(size);
5997+
UINT bytes_read;
5998+
err = f_read(&file, data_buf.data(), data_buf.size(), &bytes_read);
5999+
if (err) {
6000+
fail(ERROR_READ_FAILED, "FatFS Read Error %d", err);
6001+
} else if (bytes_read != data_buf.size()) {
6002+
fail(ERROR_READ_FAILED, "FatFS Read too short - got %d bytes expected %d bytes", bytes_read, data_buf.size());
6003+
}
6004+
err = f_close(&file);
6005+
6006+
string out(data_buf.begin(), data_buf.end());
6007+
printf("%s", out.c_str());
6008+
};
6009+
do_fatfs_op(fatfs_op);
6010+
break;
6011+
}
6012+
6013+
default:
6014+
fail(ERROR_ARGS, "Unknown filesystem specified");
6015+
}
59376016
return false;
59386017
}
59396018

0 commit comments

Comments
 (0)