mirror of
https://github.com/u-boot/u-boot.git
synced 2024-11-24 04:34:22 +08:00
mtd, nand: Move common functions from cmd_nand.c to common place
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>
This commit is contained in:
parent
9fe6d8716e
commit
09c3280754
@ -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)) {
|
||||
|
@ -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);
|
||||
|
@ -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",
|
||||
|
@ -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
|
||||
|
99
drivers/mtd/mtd_uboot.c
Normal file
99
drivers/mtd/mtd_uboot.c
Normal file
@ -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;
|
||||
}
|
@ -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__ */
|
||||
|
@ -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
|
||||
|
@ -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';
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user