2012-12-05 14:46:30 +00:00
|
|
|
/*
|
|
|
|
* 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>
|
2022-07-30 21:52:15 +00:00
|
|
|
#include <mapmem.h>
|
2012-12-05 14:46:30 +00:00
|
|
|
#include <part.h>
|
|
|
|
|
2023-03-02 08:12:22 +00:00
|
|
|
static int
|
|
|
|
do_rw(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
|
2012-12-05 14:46:30 +00:00
|
|
|
{
|
2016-02-29 22:25:34 +00:00
|
|
|
struct blk_desc *dev_desc = NULL;
|
2020-05-10 17:39:57 +00:00
|
|
|
struct disk_partition part_info;
|
2023-03-02 08:12:21 +00:00
|
|
|
ulong offset, limit;
|
2023-03-02 08:12:22 +00:00
|
|
|
uint blk, cnt, res;
|
2012-12-05 14:46:30 +00:00
|
|
|
void *addr;
|
2023-03-02 08:12:21 +00:00
|
|
|
int part;
|
2012-12-05 14:46:30 +00:00
|
|
|
|
|
|
|
if (argc != 6) {
|
|
|
|
cmd_usage(cmdtp);
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2023-03-02 08:12:21 +00:00
|
|
|
part = part_get_info_by_dev_and_name_or_num(argv[1], argv[2],
|
|
|
|
&dev_desc, &part_info, 1);
|
|
|
|
if (part < 0)
|
2012-12-05 14:46:30 +00:00
|
|
|
return 1;
|
|
|
|
|
2022-07-30 21:52:15 +00:00
|
|
|
addr = map_sysmem(hextoul(argv[3], NULL), 0);
|
2021-07-24 15:03:29 +00:00
|
|
|
blk = hextoul(argv[4], NULL);
|
|
|
|
cnt = hextoul(argv[5], NULL);
|
2012-12-05 14:46:30 +00:00
|
|
|
|
2023-03-02 08:12:21 +00:00
|
|
|
if (part > 0) {
|
2012-12-05 14:46:30 +00:00
|
|
|
offset = part_info.start;
|
|
|
|
limit = part_info.size;
|
|
|
|
} else {
|
2016-02-29 22:25:34 +00:00
|
|
|
/* Largest address not available in struct blk_desc. */
|
2023-03-02 08:12:21 +00:00
|
|
|
offset = 0;
|
2012-12-05 14:46:30 +00:00
|
|
|
limit = ~0;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (cnt + blk > limit) {
|
2023-03-02 08:12:22 +00:00
|
|
|
printf("%s out of range\n", cmdtp->name);
|
2012-12-05 14:46:30 +00:00
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2023-03-02 08:12:22 +00:00
|
|
|
if (IS_ENABLED(CONFIG_CMD_WRITE) && !strcmp(cmdtp->name, "write"))
|
|
|
|
res = blk_dwrite(dev_desc, offset + blk, cnt, addr);
|
|
|
|
else
|
|
|
|
res = blk_dread(dev_desc, offset + blk, cnt, addr);
|
|
|
|
|
|
|
|
if (res != cnt) {
|
|
|
|
printf("%s error\n", cmdtp->name);
|
2012-12-05 14:46:30 +00:00
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2023-03-02 08:12:22 +00:00
|
|
|
#ifdef CONFIG_CMD_READ
|
2012-12-05 14:46:30 +00:00
|
|
|
U_BOOT_CMD(
|
2023-03-02 08:12:22 +00:00
|
|
|
read, 6, 0, do_rw,
|
2012-12-05 14:46:30 +00:00
|
|
|
"Load binary data from a partition",
|
2023-03-02 08:12:21 +00:00
|
|
|
"<interface> <dev[:part|#partname]> addr blk# cnt"
|
2012-12-05 14:46:30 +00:00
|
|
|
);
|
2023-03-02 08:12:22 +00:00
|
|
|
#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
|