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>master
parent
9fe6d8716e
commit
09c3280754
@ -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; |
||||
} |
Loading…
Reference in new issue