Browse Source

mtd:Allow a Board to set the partition sizes.

To define an N way split this define the following:

        #define BOARD_HAS_MTD_PARTITION_OVERRIDE {"/fs/mtd_params", "/fs/mtd_waypoints","/fs/equal_part" }

	OR
        To define a percentage split this define the following:
        #define BOARD_HAS_MTD_PARTITION_OVERRIDE {"/fs/mtd_params", "/fs/mtd_waypoints","/fs/tiny" }
        #define BOARD_MTD_PARTITION_TABLE_SIZES {50.0f, 49.0f, 1.0f}
sbg
David Sidrane 4 years ago committed by Daniel Agar
parent
commit
7d6f8dc882
  1. 89
      src/systemcmds/mtd/mtd.cpp

89
src/systemcmds/mtd/mtd.cpp

@ -49,6 +49,7 @@
#include <string.h> #include <string.h>
#include <stdbool.h> #include <stdbool.h>
#include <unistd.h> #include <unistd.h>
#include <math.h>
#include <fcntl.h> #include <fcntl.h>
#include <sys/mount.h> #include <sys/mount.h>
#include <sys/ioctl.h> #include <sys/ioctl.h>
@ -88,6 +89,14 @@ struct mtd_instance_s;
# define MTD_PARTITION_TABLE {"/fs/mtd_params", "/fs/mtd_waypoints"} # define MTD_PARTITION_TABLE {"/fs/mtd_params", "/fs/mtd_waypoints"}
# endif # endif
/* note, these will be equally sized */
static const char *partition_names_default[] = MTD_PARTITION_TABLE;
#if defined(BOARD_MTD_PARTITION_TABLE_SIZES)
static const float partition_sizes_default[] = BOARD_MTD_PARTITION_TABLE_SIZES;
#else
# define partition_sizes_default nullptr
#endif
#ifdef CONFIG_MTD_RAMTRON #ifdef CONFIG_MTD_RAMTRON
static int ramtron_attach(mtd_instance_s &instance); static int ramtron_attach(mtd_instance_s &instance);
@ -118,20 +127,20 @@ struct mtd_instance_s {
bool started; bool started;
struct mtd_dev_s *mtd_dev; struct mtd_dev_s *mtd_dev;
unsigned n_partitions_current; unsigned n_partitions_current;
int *partition_block_counts;
const float *partition_percentages;
const char **partition_names;
}; };
static mtd_instance_s instances[] = { static mtd_instance_s instances[] = {
#ifdef CONFIG_MTD_RAMTRON #ifdef CONFIG_MTD_RAMTRON
{&ramtron_attach, false, false, nullptr, 0}, {&ramtron_attach, false, false, nullptr, 0, nullptr, partition_sizes_default, partition_names_default},
#endif #endif
#ifdef PX4_I2C_BUS_MTD #ifdef PX4_I2C_BUS_MTD
{&at24xxx_attach, false, false, nullptr, 0}, {&at24xxx_attach, false, false, nullptr, 0, nullptr, nullptr, nullptr},
#endif #endif
}; };
static constexpr int num_instances = arraySize(instances); static constexpr int num_instances = arraySize(instances);
/* note, these will be equally sized */
static const char *partition_names_default[] = MTD_PARTITION_TABLE;
static const int n_partitions_default = arraySize(partition_names_default); static const int n_partitions_default = arraySize(partition_names_default);
static int static int
@ -380,11 +389,34 @@ mtd_start(mtd_instance_s &instance, const char *partition_names[], unsigned n_pa
unsigned offset; unsigned offset;
unsigned i; unsigned i;
for (offset = 0, i = 0; i < n_partitions; offset += nblocks, i++) {
instance.partition_block_counts = new int[n_partitions];
if (instance.partition_block_counts == nullptr) {
PX4_ERR("mtd_partition failed allocation counts");
return 1;
}
instance.partition_names = new const char *[n_partitions];
if (instance.partition_names == nullptr) {
PX4_ERR("mtd_partition failed allocation for names");
return 1;
}
for (unsigned int n = 0; n < n_partitions; n++) {
float percentage = instance.partition_percentages == nullptr ?
100.0f / n_partitions : instance.partition_percentages[n];
volatile int nb = neraseblocks * (percentage / 100.0f);
instance.partition_block_counts[n] = (nb == 0 ? 1 : nb);
instance.partition_names[n] = nullptr;
}
for (offset = 0, i = 0; i < n_partitions; offset += instance.partition_block_counts[i], i++) {
/* Create the partition */ /* Create the partition */
part[i] = mtd_partition(instance.mtd_dev, offset, nblocks); part[i] = mtd_partition(instance.mtd_dev, offset, instance.partition_block_counts[i]);
if (!part[i]) { if (!part[i]) {
PX4_ERR("mtd_partition failed. offset=%lu nblocks=%lu", PX4_ERR("mtd_partition failed. offset=%lu nblocks=%lu",
@ -392,6 +424,8 @@ mtd_start(mtd_instance_s &instance, const char *partition_names[], unsigned n_pa
return 1; return 1;
} }
instance.partition_names[i] = strdup(partition_names[i]);
/* Initialize to provide an FTL block driver on the MTD FLASH interface */ /* Initialize to provide an FTL block driver on the MTD FLASH interface */
ret = -1; ret = -1;
@ -459,7 +493,7 @@ int mtd_get_geometry(const mtd_instance_s &instance, unsigned long *blocksize, u
/* /*
get partition size in bytes get partition size in bytes
*/ */
static ssize_t mtd_get_partition_size(const mtd_instance_s &instance) static ssize_t mtd_get_partition_size(const mtd_instance_s &instance, const char *partname)
{ {
unsigned long blocksize, erasesize, neraseblocks; unsigned long blocksize, erasesize, neraseblocks;
unsigned blkpererase, nblocks, partsize = 0; unsigned blkpererase, nblocks, partsize = 0;
@ -471,7 +505,18 @@ static ssize_t mtd_get_partition_size(const mtd_instance_s &instance)
return 0; return 0;
} }
return partsize; unsigned partn = 0;
for (unsigned n = 0; n < instance.n_partitions_current; n++) {
if (instance.partition_names[n] != nullptr &&
partname != nullptr &&
strcmp(instance.partition_names[n], partname) == 0) {
partn = n;
break;
}
}
return instance.partition_block_counts[partn] * erasesize;
} }
int mtd_print_info(int instance) int mtd_print_info(int instance)
@ -533,16 +578,20 @@ mtd_erase(const char *partition_names[], unsigned n_partitions)
int int
mtd_readtest(const mtd_instance_s &instance, const char *partition_names[], unsigned n_partitions) mtd_readtest(const mtd_instance_s &instance, const char *partition_names[], unsigned n_partitions)
{ {
ssize_t expected_size = mtd_get_partition_size(instance);
if (expected_size == 0) {
return 1;
}
uint8_t v[128]; uint8_t v[128];
for (uint8_t i = 0; i < n_partitions; i++) { for (uint8_t i = 0; i < n_partitions; i++) {
ssize_t count = 0; ssize_t count = 0;
ssize_t expected_size = mtd_get_partition_size(instance, partition_names[i]);
if (expected_size == 0) {
PX4_ERR("Failed partition size is 0");
return 1;
}
printf("reading %s expecting %u bytes\n", partition_names[i], expected_size); printf("reading %s expecting %u bytes\n", partition_names[i], expected_size);
int fd = open(partition_names[i], O_RDONLY); int fd = open(partition_names[i], O_RDONLY);
@ -576,17 +625,19 @@ mtd_readtest(const mtd_instance_s &instance, const char *partition_names[], unsi
int int
mtd_rwtest(const mtd_instance_s &instance, const char *partition_names[], unsigned n_partitions) mtd_rwtest(const mtd_instance_s &instance, const char *partition_names[], unsigned n_partitions)
{ {
ssize_t expected_size = mtd_get_partition_size(instance);
if (expected_size == 0) {
return 1;
}
uint8_t v[128], v2[128]; uint8_t v[128], v2[128];
for (uint8_t i = 0; i < n_partitions; i++) { for (uint8_t i = 0; i < n_partitions; i++) {
ssize_t count = 0; ssize_t count = 0;
off_t offset = 0; off_t offset = 0;
ssize_t expected_size = mtd_get_partition_size(instance, partition_names[i]);
if (expected_size == 0) {
PX4_ERR("Failed partition size is 0");
return 1;
}
printf("rwtest %s testing %u bytes\n", partition_names[i], expected_size); printf("rwtest %s testing %u bytes\n", partition_names[i], expected_size);
int fd = open(partition_names[i], O_RDWR); int fd = open(partition_names[i], O_RDWR);

Loading…
Cancel
Save