diff options
author | px4dev <px4@purgatory.org> | 2012-08-19 22:15:51 -0700 |
---|---|---|
committer | px4dev <px4@purgatory.org> | 2012-08-19 22:15:51 -0700 |
commit | b0d13c9556d3dd059c30e14ff04fd437bc1b6ba8 (patch) | |
tree | d44769c4dd64087478fb1dba5f64b008321447d1 | |
parent | f8efb60b593be66534a4fdca554d03913a1b5651 (diff) | |
download | px4-firmware-b0d13c9556d3dd059c30e14ff04fd437bc1b6ba8.tar.gz px4-firmware-b0d13c9556d3dd059c30e14ff04fd437bc1b6ba8.tar.bz2 px4-firmware-b0d13c9556d3dd059c30e14ff04fd437bc1b6ba8.zip |
wrapper commands for saving and loading parameters
-rw-r--r-- | apps/systemcmds/eeprom/Makefile | 2 | ||||
-rw-r--r-- | apps/systemcmds/eeprom/eeprom.c | 84 |
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); +} |