diff options
Diffstat (limited to 'apps/systemcmds/eeprom/eeprom.c')
-rw-r--r-- | apps/systemcmds/eeprom/eeprom.c | 84 |
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); +} |