Blame view
cmd/legacy-mtd-utils.c
1.9 KB
eb446ef62 cmd: nand/sf: iso... |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 |
// SPDX-License-Identifier: GPL-2.0+ #include <common.h> #include <jffs2/jffs2.h> #include <linux/mtd/mtd.h> #include <linux/mtd/partitions.h> #include <linux/string.h> #include <mtd.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 ", dev->id->type, devtype); return -1; } *off = part->offset; *size = part->size; *maxsize = part->size; *idx = dev->id->num; return 0; #else puts("mtdparts support missing. "); return -1; #endif } int mtd_arg_off(const char *arg, int *idx, loff_t *off, loff_t *size, loff_t *maxsize, int devtype, uint64_t chipsize) { if (!str2off(arg, off)) return get_part(arg, idx, off, size, maxsize, devtype); if (*off >= chipsize) { puts("Offset exceeds device limit "); 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, uint64_t 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 ", argv[1]); return -1; } if (*size > *maxsize) { puts("Size exceeds partition or device limit "); return -1; } print: printf("device %d ", *idx); if (*size == chipsize) puts("whole chip "); else printf("offset 0x%llx, size 0x%llx ", (unsigned long long)*off, (unsigned long long)*size); return 0; } |