Parameter reverse transition from LittleFS to block device

For the smooth backward transition from LittleFS to preserve parameters
This commit is contained in:
Igor Mišić
2022-10-21 13:04:49 +02:00
parent dc7f29e2ec
commit ae3d3689f2
5 changed files with 181 additions and 0 deletions
@@ -75,6 +75,25 @@ __EXPORT int px4_mtd_get_geometry(const mtd_instance_s *instance, unsigned long
*/
__EXPORT ssize_t px4_mtd_get_partition_size(const mtd_instance_s *instance, const char *partname);
/*
Helper function for back transition from LittleFS.
It will unmount MTD for parameters with LittleFS and mount Block Device
*/
__EXPORT int px4_mtd_unmount_littlefs_mount_block_device(void);
/*
Helper function for back transition from LittleFS.
It will unmount MTD for parameters with Block Device and mount LittleFS with auto formatting
*/
__EXPORT int px4_mtd_unmount_block_device_mount_littlefs(void);
/*
Helper function for back transition from LittleFS.
It will write 0xFF to all RAMTRON to remove LittleFS records
*/
__EXPORT int px4_mtd_erase_littlefs_records(void);
FAR struct mtd_dev_s *px4_at24c_initialize(FAR struct i2c_master_s *dev,
uint8_t address);
+103
View File
@@ -57,6 +57,7 @@
#include <nuttx/drivers/drivers.h>
#include <nuttx/spi/spi.h>
#include <nuttx/mtd/mtd.h>
#include <fcntl.h>
extern "C" {
struct mtd_dev_s *ramtron_initialize(FAR struct spi_dev_s *dev);
@@ -66,6 +67,9 @@ extern "C" {
static int num_instances = 0;
static mtd_instance_s *instances = nullptr;
static uint8_t param_instance = 0;
static uint8_t param_part = 0;
static uint8_t param_block = 0;
static int ramtron_attach(mtd_instance_s &instance)
{
@@ -399,6 +403,12 @@ memoryout:
goto errout;
}
if (instances[i].partition_types[part] == MTD_PARAMETERS) {
param_instance = i;
param_part = part;
param_block = total_blocks;
}
total_blocks++;
/* Now create a character device on the block device */
@@ -470,3 +480,96 @@ __EXPORT int px4_mtd_query(const char *sub, const char *val, const char **get)
return rv;
}
int px4_mtd_unmount_littlefs_mount_block_device(void)
{
char blockname[32];
snprintf(blockname, sizeof(blockname), "/dev/mtdblock%d", param_block);
nx_umount2(instances[param_instance].partition_names[param_part], 0);
int ret = unregister_mtddriver(blockname);
if (ret < 0) {
PX4_ERR("unregister_mtddriver fail: %d", ret);
} else {
ret = ftl_initialize(0, instances[0].part_dev[0]);
if (ret < 0) {
PX4_ERR("ftl_initialize failed: %d", ret);
} else {
ret = bchdev_register(blockname, instances[param_instance].partition_names[param_part], false);
if (ret < 0) {
PX4_ERR("bchdev_register failed: %d", ret);
}
}
}
return ret;
}
int px4_mtd_unmount_block_device_mount_littlefs(void)
{
char blockname[32];
snprintf(blockname, sizeof(blockname), "/dev/mtdblock%d", param_block);
int ret = bchdev_unregister(instances[param_instance].partition_names[param_part]);
if (ret < 0) {
PX4_ERR("bchdev_unregister %s failed: %d", instances[param_instance].partition_names[param_part], ret);
} else {
ret = unregister_blockdriver(blockname);
if (ret < 0) {
PX4_ERR("unregister_blockdriver %s failed: %d", blockname, ret);
} else {
ret = register_mtddriver(blockname, instances[param_instance].part_dev[param_part], 0755, nullptr);
if (ret < 0) {
PX4_ERR("register_mtddriver %s failed: %d", blockname, ret);
} else {
ret = nx_mount(blockname, instances[param_instance].partition_names[param_part], "littlefs", 0, "");
if (ret < 0) {
PX4_ERR("nx_mount %s failed: %d", instances[param_instance].partition_names[param_part], ret);
}
}
}
}
return ret;
}
int px4_mtd_erase_littlefs_records(void)
{
uint8_t v[64];
memset(v, 0xFF, sizeof(v));
for (uint8_t i = 0; i < instances[param_instance].n_partitions_current; i++) {
uint32_t count = 0;
printf("Erasing %s\n", instances[param_instance].partition_names[i]);
int fd = open(instances[param_instance].partition_names[i], O_WRONLY);
if (fd == -1) {
PX4_ERR("Failed to open partition");
return 1;
}
while (write(fd, v, sizeof(v)) == sizeof(v)) {
count += sizeof(v);
}
close(fd);
}
return 0;
}