aboutsummaryrefslogtreecommitdiff
path: root/apps/systemcmds/eeprom/eeprom.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/systemcmds/eeprom/eeprom.c')
-rw-r--r--apps/systemcmds/eeprom/eeprom.c84
1 files changed, 81 insertions, 3 deletions
diff --git a/apps/systemcmds/eeprom/eeprom.c b/apps/systemcmds/eeprom/eeprom.c
index fd99cc9a3..c4b7e5870 100644
--- a/apps/systemcmds/eeprom/eeprom.c
+++ b/apps/systemcmds/eeprom/eeprom.c
@@ -41,18 +41,23 @@
#include <nuttx/config.h>
#include <stdio.h>
+#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
-
+#include <unistd.h>
+#include <fcntl.h>
#include <sys/mount.h>
+#include <sys/ioctl.h>
#include <nuttx/i2c.h>
#include <nuttx/mtd.h>
#include <nuttx/fs/nxffs.h>
+#include <nuttx/fs/ioctl.h>
#include <arch/board/board.h>
#include "systemlib/systemlib.h"
+#include "systemlib/param/param.h"
#include "systemlib/err.h"
#ifndef PX4_I2C_BUS_ONBOARD
@@ -65,13 +70,30 @@
__EXPORT int eeprom_main(int argc, char *argv[]);
static void eeprom_start(void);
-
+static void eeprom_ioctl(unsigned operation);
+static void eeprom_save(const char *name);
+static void eeprom_load(const char *name);
int eeprom_main(int argc, char *argv[])
{
if (argc >= 2) {
if (!strcmp(argv[1], "start"))
eeprom_start();
+
+ if (!strcmp(argv[1], "save_param"))
+ eeprom_save(argv[2]);
+
+ if (!strcmp(argv[1], "load_param"))
+ eeprom_load(argv[2]);
+
+ if (0) { /* these actually require a file on the filesystem... */
+
+ if (!strcmp(argv[1], "reformat"))
+ eeprom_ioctl(FIOC_REFORMAT);
+
+ if (!strcmp(argv[1], "repack"))
+ eeprom_ioctl(FIOC_OPTIMIZE);
+ }
}
errx(1, "expected a command, try 'start'");
@@ -88,24 +110,80 @@ eeprom_start(void)
errx(1, "EEPROM service already started");
/* find the right I2C */
- struct i2c_s *i2c = up_i2cinitialize(PX4_I2C_BUS_ONBOARD);
+ struct i2c_dev_s *i2c = up_i2cinitialize(PX4_I2C_BUS_ONBOARD);
+
if (i2c == NULL)
errx(1, "failed to locate I2C bus");
/* start the MTD driver */
struct mtd_dev_s *mtd = at24c_initialize(i2c);
+
if (mtd == NULL)
errx(1, "failed to initialize EEPROM driver");
/* start NXFFS */
ret = nxffs_initialize(mtd);
+
if (ret < 0)
err(1, "failed to initialize NXFFS");
/* mount the EEPROM */
ret = mount(NULL, "/eeprom", "nxffs", 0, NULL);
+
if (ret < 0)
err(1, "failed to mount EEPROM");
errx(0, "mounted EEPROM at /eeprom");
}
+
+static void
+eeprom_ioctl(unsigned operation)
+{
+ int fd;
+
+ fd = open("/eeprom/.", 0);
+
+ if (fd < 0)
+ err(1, "open /eeprom");
+
+ if (ioctl(fd, operation, 0) < 0)
+ err(1, "ioctl");
+
+ exit(0);
+}
+
+static void
+eeprom_save(const char *name)
+{
+ int fd = open(name, O_WRONLY | O_CREAT | O_EXCL);
+
+ if (fd < 0)
+ err(1, "create '%s'", name);
+
+ int result = param_export(fd, false);
+ close(fd);
+
+ if (result < 0) {
+ unlink(name);
+ errx(1, "error exporting to '%s'", name);
+ }
+
+ exit(0);
+}
+
+static void
+eeprom_load(const char *name)
+{
+ int fd = open(name, O_RDONLY);
+
+ if (fd < 0)
+ err(1, "open '%s'", name);
+
+ int result = param_import(fd);
+ close(fd);
+
+ if (result < 0)
+ unlink(name);
+
+ exit(0);
+}