diff options
Diffstat (limited to 'package')
-rw-r--r-- | package/mtd/src/mtd.c | 33 | ||||
-rw-r--r-- | package/mtd/src/mtd.h | 1 |
2 files changed, 33 insertions, 1 deletions
diff --git a/package/mtd/src/mtd.c b/package/mtd/src/mtd.c index 9025240..85b069f 100644 --- a/package/mtd/src/mtd.c +++ b/package/mtd/src/mtd.c @@ -242,6 +242,25 @@ mtd_erase(const char *mtd) } int +mtd_refresh(const char *mtd) +{ + int fd; + + fd = mtd_open(mtd, O_RDWR | O_SYNC); + if(fd < 0) { + fprintf(stderr, "Could not open mtd device: %s\n", mtd); + exit(1); + } + if (ioctl(fd, MTDREFRESH, NULL)) { + fprintf(stderr, "Failed to refresh the MTD device\n"); + close(fd); + exit(1); + } + close(fd); + return 0; +} + +int mtd_write(int imagefd, const char *mtd) { int fd, i, result; @@ -318,6 +337,7 @@ void usage(void) "The device is in the format of mtdX (eg: mtd4) or its label.\n" "mtd recognizes these commands:\n" " unlock unlock the device\n" + " refresh refresh mtd partition\n" " erase erase all data on device\n" " write <imagefile>|- write <imagefile> (use - for stdin) to device\n" "Following options are available:\n" @@ -338,7 +358,8 @@ int main (int argc, char **argv) enum { CMD_ERASE, CMD_WRITE, - CMD_UNLOCK + CMD_UNLOCK, + CMD_REFRESH } cmd; erase[0] = NULL; @@ -380,6 +401,9 @@ int main (int argc, char **argv) if ((strcmp(argv[0], "unlock") == 0) && (argc == 2)) { cmd = CMD_UNLOCK; device = argv[1]; + } else if ((strcmp(argv[0], "refresh") == 0) && (argc == 2)) { + cmd = CMD_REFRESH; + device = argv[1]; } else if ((strcmp(argv[0], "erase") == 0) && (argc == 2)) { cmd = CMD_ERASE; device = argv[1]; @@ -451,6 +475,13 @@ int main (int argc, char **argv) if (quiet < 2) fprintf(stderr, "\n"); break; + case CMD_REFRESH: + if (quiet < 2) + fprintf(stderr, "Refreshing mtd partition %s ... "); + mtd_refresh(device); + if (quiet < 2) + fprintf(stderr, "\n"); + break; } sync(); diff --git a/package/mtd/src/mtd.h b/package/mtd/src/mtd.h index 8b83afd..6ce6261 100644 --- a/package/mtd/src/mtd.h +++ b/package/mtd/src/mtd.h @@ -96,6 +96,7 @@ struct region_info_user { #define MEMGETREGIONINFO _IOWR('M', 8, struct region_info_user) #define MEMREADDATA _IOWR('M', 9, struct mtd_oob_buf) #define MEMWRITEDATA _IOWR('M', 10, struct mtd_oob_buf) +#define MTDREFRESH _IO('M', 23) #ifndef __KERNEL__ |