diff options
Diffstat (limited to 'cmd/read.c')
-rw-r--r-- | cmd/read.c | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/cmd/read.c b/cmd/read.c new file mode 100644 index 00000000000..8e21f004423 --- /dev/null +++ b/cmd/read.c @@ -0,0 +1,83 @@ +/* + * Copyright (c) 2011 The Chromium OS Authors. All rights reserved. + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + * + * Alternatively, this software may be distributed under the terms of the + * GNU General Public License ("GPL") version 2 as published by the Free + * Software Foundation. + */ + +#include <command.h> +#include <mapmem.h> +#include <part.h> +#include <vsprintf.h> + +static int +do_rw(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) +{ + struct blk_desc *dev_desc = NULL; + struct disk_partition part_info; + ulong offset, limit; + uint blk, cnt, res; + void *ptr; + int part; + + if (argc != 6) { + cmd_usage(cmdtp); + return 1; + } + + part = part_get_info_by_dev_and_name_or_num(argv[1], argv[2], + &dev_desc, &part_info, 1); + if (part < 0) + return 1; + + ptr = map_sysmem(hextoul(argv[3], NULL), 0); + blk = hextoul(argv[4], NULL); + cnt = hextoul(argv[5], NULL); + + if (part > 0) { + offset = part_info.start; + limit = part_info.size; + } else { + /* Largest address not available in struct blk_desc. */ + offset = 0; + limit = ~0; + } + + if (cnt + blk > limit) { + printf("%s out of range\n", cmdtp->name); + unmap_sysmem(ptr); + return 1; + } + + if (IS_ENABLED(CONFIG_CMD_WRITE) && !strcmp(cmdtp->name, "write")) + res = blk_dwrite(dev_desc, offset + blk, cnt, ptr); + else + res = blk_dread(dev_desc, offset + blk, cnt, ptr); + unmap_sysmem(ptr); + + if (res != cnt) { + printf("%s error\n", cmdtp->name); + return 1; + } + + return 0; +} + +#ifdef CONFIG_CMD_READ +U_BOOT_CMD( + read, 6, 0, do_rw, + "Load binary data from a partition", + "<interface> <dev[:part|#partname]> addr blk# cnt" +); +#endif + +#ifdef CONFIG_CMD_WRITE +U_BOOT_CMD( + write, 6, 0, do_rw, + "Store binary data to a partition", + "<interface> <dev[:part|#partname]> addr blk# cnt" +); +#endif |