]> git.sur5r.net Git - u-boot/commitdiff
mtd, nand: Move common functions from cmd_nand.c to common place
authorHeiko Schocher <hs@denx.de>
Mon, 27 Apr 2015 05:42:05 +0000 (07:42 +0200)
committerJagan Teki <jteki@openedev.com>
Mon, 29 Jun 2015 19:10:11 +0000 (00:40 +0530)
Move common functions from cmd_nand.c (for calculating offset
and size from cmdline paramter) to common place, so they could
used from other commands which use mtd partitions.

For onenand the arg_off_size() is left in common/cmd_onenand.c.
It should use now the common arg_off() function, but as I could
not test onenand I let it there ...

Signed-off-by: Heiko Schocher <hs@denx.de>
Acked-by: Scott Wood <scottwood@freescale.com>
Reviewed-by: Jagannadh Teki <jteki@openedev.com>
common/cmd_nand.c
common/cmd_onenand.c
common/cmd_test.c
drivers/mtd/Makefile
drivers/mtd/mtd_uboot.c [new file with mode: 0644]
include/linux/mtd/mtd.h
include/vsprintf.h
lib/vsprintf.c

index 9433c80a04a42f65491874b94c6b92edc6efe7d4..1482462a509b78f098dffbc05c7309857f858100 100644 (file)
@@ -133,115 +133,6 @@ static int set_dev(int dev)
        return 0;
 }
 
-static inline int str2off(const char *p, loff_t *num)
-{
-       char *endptr;
-
-       *num = simple_strtoull(p, &endptr, 16);
-       return *p != '\0' && *endptr == '\0';
-}
-
-static inline int str2long(const char *p, ulong *num)
-{
-       char *endptr;
-
-       *num = simple_strtoul(p, &endptr, 16);
-       return *p != '\0' && *endptr == '\0';
-}
-
-static int get_part(const char *partname, int *idx, loff_t *off, loff_t *size,
-               loff_t *maxsize)
-{
-#ifdef CONFIG_CMD_MTDPARTS
-       struct mtd_device *dev;
-       struct part_info *part;
-       u8 pnum;
-       int ret;
-
-       ret = mtdparts_init();
-       if (ret)
-               return ret;
-
-       ret = find_dev_and_part(partname, &dev, &pnum, &part);
-       if (ret)
-               return ret;
-
-       if (dev->id->type != MTD_DEV_TYPE_NAND) {
-               puts("not a NAND device\n");
-               return -1;
-       }
-
-       *off = part->offset;
-       *size = part->size;
-       *maxsize = part->size;
-       *idx = dev->id->num;
-
-       ret = set_dev(*idx);
-       if (ret)
-               return ret;
-
-       return 0;
-#else
-       puts("offset is not a number\n");
-       return -1;
-#endif
-}
-
-static int arg_off(const char *arg, int *idx, loff_t *off, loff_t *size,
-               loff_t *maxsize)
-{
-       if (!str2off(arg, off))
-               return get_part(arg, idx, off, size, maxsize);
-
-       if (*off >= nand_info[*idx].size) {
-               puts("Offset exceeds device limit\n");
-               return -1;
-       }
-
-       *maxsize = nand_info[*idx].size - *off;
-       *size = *maxsize;
-       return 0;
-}
-
-static int arg_off_size(int argc, char *const argv[], int *idx,
-                       loff_t *off, loff_t *size, loff_t *maxsize)
-{
-       int ret;
-
-       if (argc == 0) {
-               *off = 0;
-               *size = nand_info[*idx].size;
-               *maxsize = *size;
-               goto print;
-       }
-
-       ret = arg_off(argv[0], idx, off, size, maxsize);
-       if (ret)
-               return ret;
-
-       if (argc == 1)
-               goto print;
-
-       if (!str2off(argv[1], size)) {
-               printf("'%s' is not a number\n", argv[1]);
-               return -1;
-       }
-
-       if (*size > *maxsize) {
-               puts("Size exceeds partition or device limit\n");
-               return -1;
-       }
-
-print:
-       printf("device %d ", *idx);
-       if (*size == nand_info[*idx].size)
-               puts("whole chip\n");
-       else
-               printf("offset 0x%llx, size 0x%llx\n",
-                      (unsigned long long)*off, (unsigned long long)*size);
-       return 0;
-}
-
 #ifdef CONFIG_CMD_NAND_LOCK_UNLOCK
 static void print_status(ulong start, ulong end, ulong erasesize, int status)
 {
@@ -322,7 +213,12 @@ int do_nand_env_oob(cmd_tbl_t *cmdtp, int argc, char *const argv[])
                        goto usage;
 
                /* We don't care about size, or maxsize. */
-               if (arg_off(argv[2], &idx, &addr, &maxsize, &maxsize)) {
+               if (mtd_arg_off(argv[2], &idx, &addr, &maxsize, &maxsize,
+                               MTD_DEV_TYPE_NAND, nand_info[idx].size)) {
+                       puts("Offset or partition name expected\n");
+                       return 1;
+               }
+               if (set_dev(idx)) {
                        puts("Offset or partition name expected\n");
                        return 1;
                }
@@ -597,8 +493,12 @@ static int do_nand(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 
                printf("\nNAND %s: ", cmd);
                /* skip first two or three arguments, look for offset and size */
-               if (arg_off_size(argc - o, argv + o, &dev, &off, &size,
-                                &maxsize) != 0)
+               if (mtd_arg_off_size(argc - o, argv + o, &dev, &off, &size,
+                                    &maxsize, MTD_DEV_TYPE_NAND,
+                                    nand_info[dev].size) != 0)
+                       return 1;
+
+               if (set_dev(dev))
                        return 1;
 
                nand = &nand_info[dev];
@@ -658,7 +558,12 @@ static int do_nand(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
                if (s && !strcmp(s, ".raw")) {
                        raw = 1;
 
-                       if (arg_off(argv[3], &dev, &off, &size, &maxsize))
+                       if (mtd_arg_off(argv[3], &dev, &off, &size, &maxsize,
+                                       MTD_DEV_TYPE_NAND,
+                                       nand_info[dev].size))
+                               return 1;
+
+                       if (set_dev(dev))
                                return 1;
 
                        nand = &nand_info[dev];
@@ -675,8 +580,13 @@ static int do_nand(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 
                        rwsize = pagecount * (nand->writesize + nand->oobsize);
                } else {
-                       if (arg_off_size(argc - 3, argv + 3, &dev,
-                                               &off, &size, &maxsize) != 0)
+                       if (mtd_arg_off_size(argc - 3, argv + 3, &dev, &off,
+                                            &size, &maxsize,
+                                            MTD_DEV_TYPE_NAND,
+                                            nand_info[dev].size) != 0)
+                               return 1;
+
+                       if (set_dev(dev))
                                return 1;
 
                        /* size is unspecified */
@@ -814,8 +724,12 @@ static int do_nand(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
                if (s && !strcmp(s, ".allexcept"))
                        allexcept = 1;
 
-               if (arg_off_size(argc - 2, argv + 2, &dev, &off, &size,
-                                &maxsize) < 0)
+               if (mtd_arg_off_size(argc - 2, argv + 2, &dev, &off, &size,
+                                    &maxsize, MTD_DEV_TYPE_NAND,
+                                    nand_info[dev].size) < 0)
+                       return 1;
+
+               if (set_dev(dev))
                        return 1;
 
                if (!nand_unlock(&nand_info[dev], off, size, allexcept)) {
index 06cc1405675a64f6d3c6dd637e9562817527e5ac..feab01a71e3d3f77b1e66dfa26a9faa660a50d63 100644 (file)
@@ -24,15 +24,8 @@ static struct mtd_info *mtd;
 static loff_t next_ofs;
 static loff_t skip_ofs;
 
-static inline int str2long(char *p, ulong *num)
-{
-       char *endptr;
-
-       *num = simple_strtoul(p, &endptr, 16);
-       return (*p != '\0' && *endptr == '\0') ? 1 : 0;
-}
-
-static int arg_off_size(int argc, char * const argv[], ulong *off, size_t *size)
+static int arg_off_size_onenand(int argc, char * const argv[], ulong *off,
+                               size_t *size)
 {
        if (argc >= 1) {
                if (!(str2long(argv[0], off))) {
@@ -399,7 +392,7 @@ static int do_onenand_read(cmd_tbl_t * cmdtp, int flag, int argc, char * const a
        addr = (ulong)simple_strtoul(argv[1], NULL, 16);
 
        printf("\nOneNAND read: ");
-       if (arg_off_size(argc - 2, argv + 2, &ofs, &len) != 0)
+       if (arg_off_size_onenand(argc - 2, argv + 2, &ofs, &len) != 0)
                return 1;
 
        ret = onenand_block_read(ofs, len, &retlen, (u8 *)addr, oob);
@@ -425,7 +418,7 @@ static int do_onenand_write(cmd_tbl_t * cmdtp, int flag, int argc, char * const
        addr = (ulong)simple_strtoul(argv[1], NULL, 16);
 
        printf("\nOneNAND write: ");
-       if (arg_off_size(argc - 2, argv + 2, &ofs, &len) != 0)
+       if (arg_off_size_onenand(argc - 2, argv + 2, &ofs, &len) != 0)
                return 1;
 
        ret = onenand_block_write(ofs, len, &retlen, (u8 *)addr, withoob);
@@ -461,7 +454,7 @@ static int do_onenand_erase(cmd_tbl_t * cmdtp, int flag, int argc, char * const
        printf("\nOneNAND erase: ");
 
        /* skip first two or three arguments, look for offset and size */
-       if (arg_off_size(argc, argv, &ofs, &len) != 0)
+       if (arg_off_size_onenand(argc, argv, &ofs, &len) != 0)
                return 1;
 
        ret = onenand_block_erase(ofs, len, force);
@@ -486,7 +479,7 @@ static int do_onenand_test(cmd_tbl_t * cmdtp, int flag, int argc, char * const a
        printf("\nOneNAND test: ");
 
        /* skip first two or three arguments, look for offset and size */
-       if (arg_off_size(argc - 1, argv + 1, &ofs, &len) != 0)
+       if (arg_off_size_onenand(argc - 1, argv + 1, &ofs, &len) != 0)
                return 1;
 
        ret = onenand_block_test(ofs, len);
index c93fe78231000e1ad1f28fa8dec560e35f8161ea..7285f75469fb15f7cf0daa1e9541ca6b3c887834 100644 (file)
@@ -5,15 +5,6 @@
  * SPDX-License-Identifier:    GPL-2.0+
  */
 
-/*
- * Define _STDBOOL_H here to avoid macro expansion of true and false.
- * If the future code requires macro true or false, remove this define
- * and undef true and false before U_BOOT_CMD. This define and comment
- * shall be removed if change to U_BOOT_CMD is made to take string
- * instead of stringifying it.
- */
-#define _STDBOOL_H
-
 #include <common.h>
 #include <command.h>
 #include <fs.h>
@@ -191,6 +182,9 @@ static int do_test(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
        return expr;
 }
 
+#undef true
+#undef false
+
 U_BOOT_CMD(
        test,   CONFIG_SYS_MAXARGS,     1,      do_test,
        "minimal test like /bin/sh",
index 5467a951bb4983235b44aea983ca16725cfadbf5..a623f4c9fa3fc904cd7a877877d9fb591e31ed23 100644 (file)
@@ -5,8 +5,8 @@
 # SPDX-License-Identifier:     GPL-2.0+
 #
 
-ifneq (,$(findstring y,$(CONFIG_MTD_DEVICE)$(CONFIG_CMD_NAND)$(CONFIG_CMD_ONENAND)))
-obj-y += mtdcore.o
+ifneq (,$(findstring y,$(CONFIG_MTD_DEVICE)$(CONFIG_CMD_NAND)$(CONFIG_CMD_ONENAND)$(CONFIG_CMD_SF)))
+obj-y += mtdcore.o mtd_uboot.o
 endif
 obj-$(CONFIG_MTD_PARTITIONS) += mtdpart.o
 obj-$(CONFIG_MTD_CONCAT) += mtdconcat.o
diff --git a/drivers/mtd/mtd_uboot.c b/drivers/mtd/mtd_uboot.c
new file mode 100644 (file)
index 0000000..7197007
--- /dev/null
@@ -0,0 +1,99 @@
+/*
+ * (C) Copyright 2014
+ * Heiko Schocher, DENX Software Engineering, hs@denx.de.
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+#include <common.h>
+#include <linux/mtd/mtd.h>
+#include <jffs2/jffs2.h>
+
+static int get_part(const char *partname, int *idx, loff_t *off, loff_t *size,
+               loff_t *maxsize, int devtype)
+{
+#ifdef CONFIG_CMD_MTDPARTS
+       struct mtd_device *dev;
+       struct part_info *part;
+       u8 pnum;
+       int ret;
+
+       ret = mtdparts_init();
+       if (ret)
+               return ret;
+
+       ret = find_dev_and_part(partname, &dev, &pnum, &part);
+       if (ret)
+               return ret;
+
+       if (dev->id->type != devtype) {
+               printf("not same typ %d != %d\n", dev->id->type, devtype);
+               return -1;
+       }
+
+       *off = part->offset;
+       *size = part->size;
+       *maxsize = part->size;
+       *idx = dev->id->num;
+
+       return 0;
+#else
+       puts("offset is not a number\n");
+       return -1;
+#endif
+}
+
+int mtd_arg_off(const char *arg, int *idx, loff_t *off, loff_t *size,
+               loff_t *maxsize, int devtype, int chipsize)
+{
+       if (!str2off(arg, off))
+               return get_part(arg, idx, off, size, maxsize, devtype);
+
+       if (*off >= chipsize) {
+               puts("Offset exceeds device limit\n");
+               return -1;
+       }
+
+       *maxsize = chipsize - *off;
+       *size = *maxsize;
+       return 0;
+}
+
+int mtd_arg_off_size(int argc, char *const argv[], int *idx, loff_t *off,
+                loff_t *size, loff_t *maxsize, int devtype, int chipsize)
+{
+       int ret;
+
+       if (argc == 0) {
+               *off = 0;
+               *size = chipsize;
+               *maxsize = *size;
+               goto print;
+       }
+
+       ret = mtd_arg_off(argv[0], idx, off, size, maxsize, devtype,
+                         chipsize);
+       if (ret)
+               return ret;
+
+       if (argc == 1)
+               goto print;
+
+       if (!str2off(argv[1], size)) {
+               printf("'%s' is not a number\n", argv[1]);
+               return -1;
+       }
+
+       if (*size > *maxsize) {
+               puts("Size exceeds partition or device limit\n");
+               return -1;
+       }
+
+print:
+       printf("device %d ", *idx);
+       if (*size == chipsize)
+               puts("whole chip\n");
+       else
+               printf("offset 0x%llx, size 0x%llx\n",
+                      (unsigned long long)*off, (unsigned long long)*size);
+       return 0;
+}
index 86664132759ec33aca7c0176c300ce6c819a3e28..33669da4ed8a9c2a8f29d389e8ac4bce142292c9 100644 (file)
@@ -482,5 +482,10 @@ int add_mtd_device(struct mtd_info *mtd);
 int del_mtd_device(struct mtd_info *mtd);
 int add_mtd_partitions(struct mtd_info *, const struct mtd_partition *, int);
 int del_mtd_partitions(struct mtd_info *);
+
+int mtd_arg_off(const char *arg, int *idx, loff_t *off, loff_t *size,
+               loff_t *maxsize, int devtype, int chipsize);
+int mtd_arg_off_size(int argc, char *const argv[], int *idx, loff_t *off,
+                loff_t *size, loff_t *maxsize, int devtype, int chipsize);
 #endif
 #endif /* __MTD_MTD_H__ */
index 09c8abd951d09c48ea8b937542549c25efb8ad79..d2fcca3f5a78e7f63ec4cfabaeb2c4cc3654092a 100644 (file)
@@ -196,4 +196,6 @@ int vscnprintf(char *buf, size_t size, const char *fmt, va_list args);
  */
 void print_grouped_ull(unsigned long long int_val, int digits);
 
+bool str2off(const char *p, loff_t *num);
+bool str2long(const char *p, ulong *num);
 #endif
index bedc865240de0dd7a2d50fa9be5a73dce5084b7b..a9b8a3ae67fa0817deefa3f1d5d559b97056eeb7 100644 (file)
@@ -909,3 +909,19 @@ void print_grouped_ull(unsigned long long int_val, int digits)
                grab = 3;
        }
 }
+
+bool str2off(const char *p, loff_t *num)
+{
+       char *endptr;
+
+       *num = simple_strtoull(p, &endptr, 16);
+       return *p != '\0' && *endptr == '\0';
+}
+
+bool str2long(const char *p, ulong *num)
+{
+       char *endptr;
+
+       *num = simple_strtoul(p, &endptr, 16);
+       return *p != '\0' && *endptr == '\0';
+}