|
@@ -0,0 +1,81 @@
|
|
|
+/*
|
|
|
+ * 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 <common.h>
|
|
|
+#include <command.h>
|
|
|
+#include <part.h>
|
|
|
+
|
|
|
+int do_read(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
|
|
+{
|
|
|
+ char *ep;
|
|
|
+ block_dev_desc_t *dev_desc = NULL;
|
|
|
+ int dev;
|
|
|
+ int part = 0;
|
|
|
+ disk_partition_t part_info;
|
|
|
+ ulong offset = 0u;
|
|
|
+ ulong limit = 0u;
|
|
|
+ void *addr;
|
|
|
+ uint blk;
|
|
|
+ uint cnt;
|
|
|
+
|
|
|
+ if (argc != 6) {
|
|
|
+ cmd_usage(cmdtp);
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+
|
|
|
+ dev = (int)simple_strtoul(argv[2], &ep, 16);
|
|
|
+ if (*ep) {
|
|
|
+ if (*ep != ':') {
|
|
|
+ printf("Invalid block device %s\n", argv[2]);
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+ part = (int)simple_strtoul(++ep, NULL, 16);
|
|
|
+ }
|
|
|
+
|
|
|
+ dev_desc = get_dev(argv[1], dev);
|
|
|
+ if (dev_desc == NULL) {
|
|
|
+ printf("Block device %s %d not supported\n", argv[1], dev);
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+
|
|
|
+ addr = (void *)simple_strtoul(argv[3], NULL, 16);
|
|
|
+ blk = simple_strtoul(argv[4], NULL, 16);
|
|
|
+ cnt = simple_strtoul(argv[5], NULL, 16);
|
|
|
+
|
|
|
+ if (part != 0) {
|
|
|
+ if (get_partition_info(dev_desc, part, &part_info)) {
|
|
|
+ printf("Cannot find partition %d\n", part);
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+ offset = part_info.start;
|
|
|
+ limit = part_info.size;
|
|
|
+ } else {
|
|
|
+ /* Largest address not available in block_dev_desc_t. */
|
|
|
+ limit = ~0;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (cnt + blk > limit) {
|
|
|
+ printf("Read out of range\n");
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (dev_desc->block_read(dev, offset + blk, cnt, addr) < 0) {
|
|
|
+ printf("Error reading blocks\n");
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+U_BOOT_CMD(
|
|
|
+ read, 6, 0, do_read,
|
|
|
+ "Load binary data from a partition",
|
|
|
+ "<interface> <dev[:part]> addr blk# cnt"
|
|
|
+);
|