ubi: Expose a few simple functions from the cmd_ubi
authorJoe Hershberger <joe.hershberger@ni.com>
Mon, 8 Apr 2013 10:32:47 +0000 (10:32 +0000)
committerTom Rini <trini@ti.com>
Thu, 11 Apr 2013 19:52:54 +0000 (15:52 -0400)
Part, Read, and Write functionality that will be used by env_ubi.

Signed-off-by: Joe Hershberger <joe.hershberger@ni.com>
common/cmd_ubi.c
include/ubi_uboot.h

index 35b1d31..41fbae7 100644 (file)
@@ -263,7 +263,7 @@ out_err:
        return err;
 }
 
-static int ubi_volume_write(char *volume, void *buf, size_t size)
+int ubi_volume_write(char *volume, void *buf, size_t size)
 {
        int err = 1;
        int rsvd_bytes = 0;
@@ -308,12 +308,10 @@ static int ubi_volume_write(char *volume, void *buf, size_t size)
                ubi_gluebi_updated(vol);
        }
 
-       printf("%d bytes written to volume %s\n", size, volume);
-
        return 0;
 }
 
-static int ubi_volume_read(char *volume, char *buf, size_t size)
+int ubi_volume_read(char *volume, char *buf, size_t size)
 {
        int err, lnum, off, len, tbuf_size;
        void *tbuf;
@@ -325,8 +323,6 @@ static int ubi_volume_read(char *volume, char *buf, size_t size)
        if (vol == NULL)
                return ENODEV;
 
-       printf("Read %d bytes from volume %s to %p\n", size, volume, buf);
-
        if (vol->updating) {
                printf("updating");
                return EBUSY;
@@ -431,26 +427,82 @@ static int ubi_dev_scan(struct mtd_info *info, char *ubidev,
        return 0;
 }
 
-static int do_ubi(cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])
+int ubi_part(char *part_name, const char *vid_header_offset)
 {
-       size_t size = 0;
-       ulong addr = 0;
        int err = 0;
-
-       if (argc < 2)
-               return CMD_RET_USAGE;
+       char mtd_dev[16];
+       struct mtd_device *dev;
+       struct part_info *part;
+       u8 pnum;
 
        if (mtdparts_init() != 0) {
                printf("Error initializing mtdparts!\n");
                return 1;
        }
 
+#ifdef CONFIG_CMD_UBIFS
+       /*
+        * Automatically unmount UBIFS partition when user
+        * changes the UBI device. Otherwise the following
+        * UBIFS commands will crash.
+        */
+       if (ubifs_is_mounted())
+               cmd_ubifs_umount();
+#endif
+
+       /* todo: get dev number for NAND... */
+       ubi_dev.nr = 0;
+
+       /*
+        * Call ubi_exit() before re-initializing the UBI subsystem
+        */
+       if (ubi_initialized) {
+               ubi_exit();
+               del_mtd_partitions(ubi_dev.mtd_info);
+       }
+
+       /*
+        * Search the mtd device number where this partition
+        * is located
+        */
+       if (find_dev_and_part(part_name, &dev, &pnum, &part)) {
+               printf("Partition %s not found!\n", part_name);
+               return 1;
+       }
+       sprintf(mtd_dev, "%s%d", MTD_DEV_TYPE(dev->id->type), dev->id->num);
+       ubi_dev.mtd_info = get_mtd_device_nm(mtd_dev);
+       if (IS_ERR(ubi_dev.mtd_info)) {
+               printf("Partition %s not found on device %s!\n", part_name,
+                      mtd_dev);
+               return 1;
+       }
+
+       ubi_dev.selected = 1;
+
+       strcpy(ubi_dev.part_name, part_name);
+       err = ubi_dev_scan(ubi_dev.mtd_info, ubi_dev.part_name,
+                       vid_header_offset);
+       if (err) {
+               printf("UBI init error %d\n", err);
+               ubi_dev.selected = 0;
+               return err;
+       }
+
+       ubi = ubi_devices[0];
+
+       return 0;
+}
+
+static int do_ubi(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
+{
+       size_t size = 0;
+       ulong addr = 0;
+
+       if (argc < 2)
+               return CMD_RET_USAGE;
+
        if (strcmp(argv[1], "part") == 0) {
-               char mtd_dev[16];
-               struct mtd_device *dev;
-               struct part_info *part;
                const char *vid_header_offset = NULL;
-               u8 pnum;
 
                /* Print current partition */
                if (argc == 2) {
@@ -467,58 +519,10 @@ static int do_ubi(cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])
                if (argc < 3)
                        return CMD_RET_USAGE;
 
-#ifdef CONFIG_CMD_UBIFS
-               /*
-                * Automatically unmount UBIFS partition when user
-                * changes the UBI device. Otherwise the following
-                * UBIFS commands will crash.
-                */
-               if (ubifs_is_mounted())
-                       cmd_ubifs_umount();
-#endif
-
-               /* todo: get dev number for NAND... */
-               ubi_dev.nr = 0;
-
-               /*
-                * Call ubi_exit() before re-initializing the UBI subsystem
-                */
-               if (ubi_initialized) {
-                       ubi_exit();
-                       del_mtd_partitions(ubi_dev.mtd_info);
-               }
-
-               /*
-                * Search the mtd device number where this partition
-                * is located
-                */
-               if (find_dev_and_part(argv[2], &dev, &pnum, &part)) {
-                       printf("Partition %s not found!\n", argv[2]);
-                       return 1;
-               }
-               sprintf(mtd_dev, "%s%d", MTD_DEV_TYPE(dev->id->type), dev->id->num);
-               ubi_dev.mtd_info = get_mtd_device_nm(mtd_dev);
-               if (IS_ERR(ubi_dev.mtd_info)) {
-                       printf("Partition %s not found on device %s!\n", argv[2], mtd_dev);
-                       return 1;
-               }
-
-               ubi_dev.selected = 1;
-
                if (argc > 3)
                        vid_header_offset = argv[3];
-               strcpy(ubi_dev.part_name, argv[2]);
-               err = ubi_dev_scan(ubi_dev.mtd_info, ubi_dev.part_name,
-                               vid_header_offset);
-               if (err) {
-                       printf("UBI init error %d\n", err);
-                       ubi_dev.selected = 0;
-                       return err;
-               }
-
-               ubi = ubi_devices[0];
 
-               return 0;
+               return ubi_part(argv[2], vid_header_offset);
        }
 
        if ((strcmp(argv[1], "part") != 0) && (!ubi_dev.selected)) {
@@ -571,6 +575,8 @@ static int do_ubi(cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])
        }
 
        if (strncmp(argv[1], "write", 5) == 0) {
+               int ret;
+
                if (argc < 5) {
                        printf("Please see usage\n");
                        return 1;
@@ -579,7 +585,13 @@ static int do_ubi(cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])
                addr = simple_strtoul(argv[2], NULL, 16);
                size = simple_strtoul(argv[4], NULL, 16);
 
-               return ubi_volume_write(argv[3], (void *)addr, size);
+               ret = ubi_volume_write(argv[3], (void *)addr, size);
+               if (!ret) {
+                       printf("%d bytes written to volume %s\n", size,
+                              argv[3]);
+               }
+
+               return ret;
        }
 
        if (strncmp(argv[1], "read", 4) == 0) {
@@ -597,8 +609,12 @@ static int do_ubi(cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])
                        argc--;
                }
 
-               if (argc == 3)
+               if (argc == 3) {
+                       printf("Read %d bytes from volume %s to %lx\n", size,
+                              argv[3], addr);
+
                        return ubi_volume_read(argv[3], (char *)addr, size);
+               }
        }
 
        printf("Please see usage\n");
index 69006e2..7f72022 100644 (file)
@@ -214,6 +214,9 @@ static inline long IS_ERR(const void *ptr)
 extern int ubi_mtd_param_parse(const char *val, struct kernel_param *kp);
 extern int ubi_init(void);
 extern void ubi_exit(void);
+extern int ubi_part(char *part_name, const char *vid_header_offset);
+extern int ubi_volume_write(char *volume, void *buf, size_t size);
+extern int ubi_volume_read(char *volume, char *buf, size_t size);
 
 extern struct ubi_device *ubi_devices[];