Sometimes data is on a block device and within a partition, but not in a particular filesystem. This commands permits reading raw data from a partition. Signed-off-by: Kenneth Waters <kwaters@chromium.org> Signed-off-by: Simon Glass <sjg@chromium.org>master
parent
53fdc7ef2e
commit
ff048ea916
@ -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" |
||||||
|
); |
Loading…
Reference in new issue