#include <fat.h>
#include <fs.h>
+DECLARE_GLOBAL_DATA_PTR;
+
static block_dev_desc_t *fs_dev_desc;
static disk_partition_t fs_partition;
static int fs_type = FS_TYPE_ANY;
#define fs_read_ext fs_read_unsupported
#endif
-static const struct {
+static struct {
int fstype;
int (*probe)(void);
} fstypes[] = {
int fs_set_blk_dev(const char *ifname, const char *dev_part_str, int fstype)
{
int part, i;
+#ifdef CONFIG_NEEDS_MANUAL_RELOC
+ static int relocated;
+
+ if (!relocated) {
+ for (i = 0; i < ARRAY_SIZE(fstypes); i++)
+ fstypes[i].probe += gd->reloc_off;
+ relocated = 1;
+ }
+#endif
part = get_device_and_partition(ifname, dev_part_str, &fs_dev_desc,
&fs_partition, 1);
return ret;
}
-int do_fsload(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[],
- int fstype)
+int do_load(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[],
+ int fstype, int cmdline_base)
{
unsigned long addr;
const char *addr_str;
unsigned long pos;
int len_read;
char buf[12];
+ unsigned long time;
- if (argc < 5)
+ if (argc < 2)
+ return CMD_RET_USAGE;
+ if (argc > 7)
return CMD_RET_USAGE;
- if (fs_set_blk_dev(argv[1], argv[2], fstype))
+ if (fs_set_blk_dev(argv[1], (argc >= 3) ? argv[2] : NULL, fstype))
return 1;
if (argc >= 4) {
- addr = simple_strtoul(argv[3], NULL, 0);
+ addr = simple_strtoul(argv[3], NULL, cmdline_base);
} else {
addr_str = getenv("loadaddr");
if (addr_str != NULL)
}
}
if (argc >= 6)
- bytes = simple_strtoul(argv[5], NULL, 0);
+ bytes = simple_strtoul(argv[5], NULL, cmdline_base);
else
bytes = 0;
if (argc >= 7)
- pos = simple_strtoul(argv[6], NULL, 0);
+ pos = simple_strtoul(argv[6], NULL, cmdline_base);
else
pos = 0;
+ time = get_timer(0);
len_read = fs_read(filename, addr, pos, bytes);
+ time = get_timer(time);
if (len_read <= 0)
return 1;
- printf("%d bytes read\n", len_read);
+ printf("%d bytes read in %lu ms", len_read, time);
+ if (time > 0) {
+ puts(" (");
+ print_size(len_read / time * 1000, "/s");
+ puts(")");
+ }
+ puts("\n");
sprintf(buf, "0x%x", len_read);
setenv("filesize", buf);
{
if (argc < 2)
return CMD_RET_USAGE;
+ if (argc > 4)
+ return CMD_RET_USAGE;
if (fs_set_blk_dev(argv[1], (argc >= 3) ? argv[2] : NULL, fstype))
return 1;
- if (fs_ls(argc == 4 ? argv[3] : "/"))
+ if (fs_ls(argc >= 4 ? argv[3] : "/"))
return 1;
return 0;