aboutsummaryrefslogtreecommitdiff
path: root/apps/systemcmds
diff options
context:
space:
mode:
authorpx4dev <px4@purgatory.org>2012-08-19 22:15:51 -0700
committerpx4dev <px4@purgatory.org>2012-08-19 22:15:51 -0700
commitb0d13c9556d3dd059c30e14ff04fd437bc1b6ba8 (patch)
treed44769c4dd64087478fb1dba5f64b008321447d1 /apps/systemcmds
parentf8efb60b593be66534a4fdca554d03913a1b5651 (diff)
downloadpx4-firmware-b0d13c9556d3dd059c30e14ff04fd437bc1b6ba8.tar.gz
px4-firmware-b0d13c9556d3dd059c30e14ff04fd437bc1b6ba8.tar.bz2
px4-firmware-b0d13c9556d3dd059c30e14ff04fd437bc1b6ba8.zip
wrapper commands for saving and loading parameters
Diffstat (limited to 'apps/systemcmds')
-rw-r--r--apps/systemcmds/eeprom/Makefile2
-rw-r--r--apps/systemcmds/eeprom/eeprom.c84
2 files changed, 82 insertions, 4 deletions
diff --git a/apps/systemcmds/eeprom/Makefile b/apps/systemcmds/eeprom/Makefile
index 63f28c349..2f3db0fdc 100644
--- a/apps/systemcmds/eeprom/Makefile
+++ b/apps/systemcmds/eeprom/Makefile
@@ -37,6 +37,6 @@
APPNAME = eeprom
PRIORITY = SCHED_PRIORITY_DEFAULT
-STACKSIZE = 2048
+STACKSIZE = 4096
include $(APPDIR)/mk/app.mk
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);
+}