mirror of
https://github.com/PX4/PX4-Autopilot.git
synced 2026-05-28 02:36:37 +08:00
Introducing mtd status command, fixing compile errors for I2C setup
This commit is contained in:
+88
-29
@@ -62,6 +62,8 @@
|
|||||||
#include "systemlib/param/param.h"
|
#include "systemlib/param/param.h"
|
||||||
#include "systemlib/err.h"
|
#include "systemlib/err.h"
|
||||||
|
|
||||||
|
#include <board_config.h>
|
||||||
|
|
||||||
__EXPORT int mtd_main(int argc, char *argv[]);
|
__EXPORT int mtd_main(int argc, char *argv[]);
|
||||||
|
|
||||||
#ifndef CONFIG_MTD
|
#ifndef CONFIG_MTD
|
||||||
@@ -76,15 +78,25 @@ int mtd_main(int argc, char *argv[])
|
|||||||
|
|
||||||
#ifdef CONFIG_MTD_RAMTRON
|
#ifdef CONFIG_MTD_RAMTRON
|
||||||
static void ramtron_attach(void);
|
static void ramtron_attach(void);
|
||||||
|
#else
|
||||||
|
|
||||||
|
#ifndef PX4_I2C_BUS_ONBOARD
|
||||||
|
# error PX4_I2C_BUS_ONBOARD not defined, cannot locate onboard EEPROM
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static void at24xxx_attach(void);
|
static void at24xxx_attach(void);
|
||||||
|
#endif
|
||||||
static void mtd_start(char *partition_names[], unsigned n_partitions);
|
static void mtd_start(char *partition_names[], unsigned n_partitions);
|
||||||
static void mtd_test(void);
|
static void mtd_test(void);
|
||||||
static void mtd_erase(char *partition_names[], unsigned n_partitions);
|
static void mtd_erase(char *partition_names[], unsigned n_partitions);
|
||||||
|
static void mtd_print_info();
|
||||||
|
static int mtd_get_geometry(unsigned long *blocksize, unsigned long *erasesize, unsigned long *neraseblocks,
|
||||||
|
unsigned *blkpererase, unsigned *nblocks, unsigned *partsize, unsigned n_partitions);
|
||||||
|
|
||||||
static bool attached = false;
|
static bool attached = false;
|
||||||
static bool started = false;
|
static bool started = false;
|
||||||
static struct mtd_dev_s *mtd_dev;
|
static struct mtd_dev_s *mtd_dev;
|
||||||
|
static unsigned n_partitions_current = 0;
|
||||||
|
|
||||||
/* note, these will be equally sized */
|
/* note, these will be equally sized */
|
||||||
static char *partition_names_default[] = {"/fs/mtd_params", "/fs/mtd_waypoints"};
|
static char *partition_names_default[] = {"/fs/mtd_params", "/fs/mtd_waypoints"};
|
||||||
@@ -107,6 +119,9 @@ int mtd_main(int argc, char *argv[])
|
|||||||
if (!strcmp(argv[1], "test"))
|
if (!strcmp(argv[1], "test"))
|
||||||
mtd_test();
|
mtd_test();
|
||||||
|
|
||||||
|
if (!strcmp(argv[1], "status"))
|
||||||
|
mtd_status();
|
||||||
|
|
||||||
if (!strcmp(argv[1], "erase")) {
|
if (!strcmp(argv[1], "erase")) {
|
||||||
if (argc < 3) {
|
if (argc < 3) {
|
||||||
errx(1, "usage: mtd erase <PARTITION_PATH..>");
|
errx(1, "usage: mtd erase <PARTITION_PATH..>");
|
||||||
@@ -157,7 +172,7 @@ ramtron_attach(void)
|
|||||||
|
|
||||||
attached = true;
|
attached = true;
|
||||||
}
|
}
|
||||||
#endif
|
#else
|
||||||
|
|
||||||
static void
|
static void
|
||||||
at24xxx_attach(void)
|
at24xxx_attach(void)
|
||||||
@@ -188,6 +203,7 @@ at24xxx_attach(void)
|
|||||||
|
|
||||||
attached = true;
|
attached = true;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static void
|
static void
|
||||||
mtd_start(char *partition_names[], unsigned n_partitions)
|
mtd_start(char *partition_names[], unsigned n_partitions)
|
||||||
@@ -210,34 +226,12 @@ mtd_start(char *partition_names[], unsigned n_partitions)
|
|||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unsigned long blocksize, erasesize, neraseblocks;
|
||||||
|
unsigned blkpererase, nblocks, partsize;
|
||||||
|
|
||||||
/* Get the geometry of the FLASH device */
|
ret = mtd_get_geometry(&blocksize, &erasesize, &neraseblocks, &blkpererase, &nblocks, &partsize, n_partitions);
|
||||||
|
if (ret)
|
||||||
FAR struct mtd_geometry_s geo;
|
|
||||||
|
|
||||||
ret = mtd_dev->ioctl(mtd_dev, MTDIOC_GEOMETRY, (unsigned long)((uintptr_t)&geo));
|
|
||||||
|
|
||||||
if (ret < 0) {
|
|
||||||
warnx("ERROR: mtd->ioctl failed: %d", ret);
|
|
||||||
exit(3);
|
exit(3);
|
||||||
}
|
|
||||||
|
|
||||||
warnx("Flash Geometry:");
|
|
||||||
warnx(" blocksize: %lu", (unsigned long)geo.blocksize);
|
|
||||||
warnx(" erasesize: %lu", (unsigned long)geo.erasesize);
|
|
||||||
warnx(" neraseblocks: %lu", (unsigned long)geo.neraseblocks);
|
|
||||||
|
|
||||||
/* Determine the size of each partition. Make each partition an even
|
|
||||||
* multiple of the erase block size (perhaps not using some space at the
|
|
||||||
* end of the FLASH).
|
|
||||||
*/
|
|
||||||
|
|
||||||
unsigned blkpererase = geo.erasesize / geo.blocksize;
|
|
||||||
unsigned nblocks = (geo.neraseblocks / n_partitions) * blkpererase;
|
|
||||||
unsigned partsize = nblocks * geo.blocksize;
|
|
||||||
|
|
||||||
warnx(" No. partitions: %u", n_partitions);
|
|
||||||
warnx(" Partition size: %lu Blocks (%lu bytes)", (unsigned long)nblocks, (unsigned long)partsize);
|
|
||||||
|
|
||||||
/* Now create MTD FLASH partitions */
|
/* Now create MTD FLASH partitions */
|
||||||
|
|
||||||
@@ -284,18 +278,83 @@ mtd_start(char *partition_names[], unsigned n_partitions)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
n_partitions_current = n_partitions;
|
||||||
|
|
||||||
started = true;
|
started = true;
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
int mtd_get_geometry(unsigned long *blocksize, unsigned long *erasesize, unsigned long *neraseblocks,
|
||||||
|
unsigned *blkpererase, unsigned *nblocks, unsigned *partsize, unsigned n_partitions)
|
||||||
|
{
|
||||||
|
/* Get the geometry of the FLASH device */
|
||||||
|
|
||||||
|
FAR struct mtd_geometry_s geo;
|
||||||
|
|
||||||
|
int ret = mtd_dev->ioctl(mtd_dev, MTDIOC_GEOMETRY, (unsigned long)((uintptr_t)&geo));
|
||||||
|
|
||||||
|
if (ret < 0) {
|
||||||
|
warnx("ERROR: mtd->ioctl failed: %d", ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
*blocksize = geo.blocksize;
|
||||||
|
*erasesize = geo.blocksize;
|
||||||
|
*neraseblocks = geo.neraseblocks;
|
||||||
|
|
||||||
|
/* Determine the size of each partition. Make each partition an even
|
||||||
|
* multiple of the erase block size (perhaps not using some space at the
|
||||||
|
* end of the FLASH).
|
||||||
|
*/
|
||||||
|
|
||||||
|
*blkpererase = geo.erasesize / geo.blocksize;
|
||||||
|
*nblocks = (geo.neraseblocks / n_partitions) * *blkpererase;
|
||||||
|
*partsize = *nblocks * geo.blocksize;
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
void mtd_print_info()
|
||||||
|
{
|
||||||
|
if (!attached)
|
||||||
|
exit(1);
|
||||||
|
|
||||||
|
unsigned long blocksize, erasesize, neraseblocks;
|
||||||
|
unsigned blkpererase, nblocks, partsize;
|
||||||
|
|
||||||
|
int ret = mtd_get_geometry(&blocksize, &erasesize, &neraseblocks, &blkpererase, &nblocks, &partsize, n_partitions_current);
|
||||||
|
if (ret)
|
||||||
|
exit(3);
|
||||||
|
|
||||||
|
warnx("Flash Geometry:");
|
||||||
|
|
||||||
|
printf(" blocksize: %lu\n", blocksize);
|
||||||
|
printf(" erasesize: %lu\n", erasesize);
|
||||||
|
printf(" neraseblocks: %lu\n", neraseblocks);
|
||||||
|
printf(" No. partitions: %u\n", n_partitions_current);
|
||||||
|
printf(" Partition size: %u Blocks (%u bytes)\n", nblocks, partsize);
|
||||||
|
printf(" TOTAL SIZE: %u KiB\n", neraseblocks * erasesize / 1024);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
mtd_test(void)
|
mtd_test(void)
|
||||||
{
|
{
|
||||||
warnx("This test routine does not test anything yet!");
|
warnx("This test routine does not test anything yet!");
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
void
|
||||||
|
mtd_status(void)
|
||||||
|
{
|
||||||
|
if (!attached)
|
||||||
|
errx(1, "MTD driver not started");
|
||||||
|
|
||||||
|
mtd_print_info();
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
mtd_erase(char *partition_names[], unsigned n_partitions)
|
mtd_erase(char *partition_names[], unsigned n_partitions)
|
||||||
{
|
{
|
||||||
uint8_t v[64];
|
uint8_t v[64];
|
||||||
|
|||||||
Reference in New Issue
Block a user