Implement "ls" and "fsload" commands that act like {fat,ext2}{ls,load}, and transparently handle either file-system. This scheme could easily be extended to other filesystem types; I only didn't do it for zfs because I don't have any filesystems of that type to test with. Replace the implementation of {fat,ext[24]}{ls,load} with this new code too. Signed-off-by: Stephen Warren <swarren@nvidia.com>master
parent
03e2ecf6b8
commit
045fa1e114
@ -1,197 +0,0 @@ |
|||||||
/*
|
|
||||||
* (C) Copyright 2011 - 2012 Samsung Electronics |
|
||||||
* EXT2/4 filesystem implementation in Uboot by |
|
||||||
* Uma Shankar <uma.shankar@samsung.com> |
|
||||||
* Manjunatha C Achar <a.manjunatha@samsung.com> |
|
||||||
* |
|
||||||
* Ext4fs support |
|
||||||
* made from existing cmd_ext2.c file of Uboot |
|
||||||
* |
|
||||||
* (C) Copyright 2004 |
|
||||||
* esd gmbh <www.esd-electronics.com> |
|
||||||
* Reinhard Arlt <reinhard.arlt@esd-electronics.com> |
|
||||||
* |
|
||||||
* made from cmd_reiserfs by |
|
||||||
* |
|
||||||
* (C) Copyright 2003 - 2004 |
|
||||||
* Sysgo Real-Time Solutions, AG <www.elinos.com> |
|
||||||
* Pavel Bartusek <pba@sysgo.com> |
|
||||||
* |
|
||||||
* This program is free software; you can redistribute it and/or |
|
||||||
* modify it under the terms of the GNU General Public License as |
|
||||||
* published by the Free Software Foundation; either version 2 of |
|
||||||
* the License, or (at your option) any later version. |
|
||||||
* |
|
||||||
* This program is distributed in the hope that it will be useful, |
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
||||||
* GNU General Public License for more details. |
|
||||||
* |
|
||||||
* You should have received a copy of the GNU General Public License |
|
||||||
* along with this program; if not, write to the Free Software |
|
||||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, |
|
||||||
* MA 02111-1307 USA |
|
||||||
* |
|
||||||
*/ |
|
||||||
|
|
||||||
/*
|
|
||||||
* Changelog: |
|
||||||
* 0.1 - Newly created file for ext4fs support. Taken from cmd_ext2.c |
|
||||||
* file in uboot. Added ext4fs ls load and write support. |
|
||||||
*/ |
|
||||||
|
|
||||||
#include <common.h> |
|
||||||
#include <part.h> |
|
||||||
#include <config.h> |
|
||||||
#include <command.h> |
|
||||||
#include <image.h> |
|
||||||
#include <linux/ctype.h> |
|
||||||
#include <asm/byteorder.h> |
|
||||||
#include <ext_common.h> |
|
||||||
#include <ext4fs.h> |
|
||||||
#include <linux/stat.h> |
|
||||||
#include <malloc.h> |
|
||||||
|
|
||||||
#if defined(CONFIG_CMD_USB) && defined(CONFIG_USB_STORAGE) |
|
||||||
#include <usb.h> |
|
||||||
#endif |
|
||||||
|
|
||||||
#if !defined(CONFIG_DOS_PARTITION) && !defined(CONFIG_EFI_PARTITION) |
|
||||||
#error DOS or EFI partition support must be selected |
|
||||||
#endif |
|
||||||
|
|
||||||
#define DOS_PART_MAGIC_OFFSET 0x1fe |
|
||||||
#define DOS_FS_TYPE_OFFSET 0x36 |
|
||||||
#define DOS_FS32_TYPE_OFFSET 0x52 |
|
||||||
|
|
||||||
int do_ext_load(cmd_tbl_t *cmdtp, int flag, int argc, |
|
||||||
char *const argv[]) |
|
||||||
{ |
|
||||||
char *filename = NULL; |
|
||||||
int dev, part; |
|
||||||
ulong addr = 0; |
|
||||||
int filelen; |
|
||||||
disk_partition_t info; |
|
||||||
block_dev_desc_t *dev_desc; |
|
||||||
char buf[12]; |
|
||||||
unsigned long count; |
|
||||||
const char *addr_str; |
|
||||||
|
|
||||||
count = 0; |
|
||||||
addr = simple_strtoul(argv[3], NULL, 16); |
|
||||||
filename = getenv("bootfile"); |
|
||||||
switch (argc) { |
|
||||||
case 3: |
|
||||||
addr_str = getenv("loadaddr"); |
|
||||||
if (addr_str != NULL) |
|
||||||
addr = simple_strtoul(addr_str, NULL, 16); |
|
||||||
else |
|
||||||
addr = CONFIG_SYS_LOAD_ADDR; |
|
||||||
|
|
||||||
break; |
|
||||||
case 4: |
|
||||||
break; |
|
||||||
case 5: |
|
||||||
filename = argv[4]; |
|
||||||
break; |
|
||||||
case 6: |
|
||||||
filename = argv[4]; |
|
||||||
count = simple_strtoul(argv[5], NULL, 16); |
|
||||||
break; |
|
||||||
|
|
||||||
default: |
|
||||||
return cmd_usage(cmdtp); |
|
||||||
} |
|
||||||
|
|
||||||
if (!filename) { |
|
||||||
puts("** No boot file defined **\n"); |
|
||||||
return 1; |
|
||||||
} |
|
||||||
|
|
||||||
part = get_device_and_partition(argv[1], argv[2], &dev_desc, &info, 1); |
|
||||||
if (part < 0) |
|
||||||
return 1; |
|
||||||
|
|
||||||
dev = dev_desc->dev; |
|
||||||
printf("Loading file \"%s\" from %s device %d%c%c\n", |
|
||||||
filename, argv[1], dev, |
|
||||||
part ? ':' : ' ', part ? part + '0' : ' '); |
|
||||||
|
|
||||||
ext4fs_set_blk_dev(dev_desc, &info); |
|
||||||
|
|
||||||
if (!ext4fs_mount(info.size)) { |
|
||||||
printf("** Bad ext2 partition or disk - %s %d:%d **\n", |
|
||||||
argv[1], dev, part); |
|
||||||
ext4fs_close(); |
|
||||||
goto fail; |
|
||||||
} |
|
||||||
|
|
||||||
filelen = ext4fs_open(filename); |
|
||||||
if (filelen < 0) { |
|
||||||
printf("** File not found %s\n", filename); |
|
||||||
ext4fs_close(); |
|
||||||
goto fail; |
|
||||||
} |
|
||||||
if ((count < filelen) && (count != 0)) |
|
||||||
filelen = count; |
|
||||||
|
|
||||||
if (ext4fs_read((char *)addr, filelen) != filelen) { |
|
||||||
printf("** Unable to read \"%s\" from %s %d:%d **\n", |
|
||||||
filename, argv[1], dev, part); |
|
||||||
ext4fs_close(); |
|
||||||
goto fail; |
|
||||||
} |
|
||||||
|
|
||||||
ext4fs_close(); |
|
||||||
/* Loading ok, update default load address */ |
|
||||||
load_addr = addr; |
|
||||||
|
|
||||||
printf("%d bytes read\n", filelen); |
|
||||||
sprintf(buf, "%X", filelen); |
|
||||||
setenv("filesize", buf); |
|
||||||
|
|
||||||
return 0; |
|
||||||
fail: |
|
||||||
return 1; |
|
||||||
} |
|
||||||
|
|
||||||
int do_ext_ls(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]) |
|
||||||
{ |
|
||||||
const char *filename = "/"; |
|
||||||
int dev; |
|
||||||
int part; |
|
||||||
block_dev_desc_t *dev_desc; |
|
||||||
disk_partition_t info; |
|
||||||
|
|
||||||
if (argc < 2) |
|
||||||
return cmd_usage(cmdtp); |
|
||||||
|
|
||||||
part = get_device_and_partition(argv[1], argv[2], &dev_desc, &info, 1); |
|
||||||
if (part < 0) |
|
||||||
return 1; |
|
||||||
|
|
||||||
if (argc == 4) |
|
||||||
filename = argv[3]; |
|
||||||
|
|
||||||
dev = dev_desc->dev; |
|
||||||
ext4fs_set_blk_dev(dev_desc, &info); |
|
||||||
|
|
||||||
if (!ext4fs_mount(info.size)) { |
|
||||||
printf("** Bad ext2 partition or disk - %s %d:%d **\n", |
|
||||||
argv[1], dev, part); |
|
||||||
ext4fs_close(); |
|
||||||
goto fail; |
|
||||||
} |
|
||||||
|
|
||||||
if (ext4fs_ls(filename)) { |
|
||||||
printf("** Error extfs_ls() **\n"); |
|
||||||
ext4fs_close(); |
|
||||||
goto fail; |
|
||||||
}; |
|
||||||
|
|
||||||
ext4fs_close(); |
|
||||||
return 0; |
|
||||||
|
|
||||||
fail: |
|
||||||
return 1; |
|
||||||
} |
|
@ -0,0 +1,51 @@ |
|||||||
|
/*
|
||||||
|
* Copyright (c) 2012, NVIDIA CORPORATION. All rights reserved. |
||||||
|
* |
||||||
|
* Inspired by cmd_ext_common.c, cmd_fat.c. |
||||||
|
* |
||||||
|
* This program is free software; you can redistribute it and/or modify it |
||||||
|
* under the terms and conditions of the GNU General Public License, |
||||||
|
* version 2, as published by the Free Software Foundation. |
||||||
|
* |
||||||
|
* This program is distributed in the hope it will be useful, but WITHOUT |
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for |
||||||
|
* more details. |
||||||
|
* |
||||||
|
* You should have received a copy of the GNU General Public License |
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/ |
||||||
|
|
||||||
|
#include <common.h> |
||||||
|
#include <command.h> |
||||||
|
#include <fs.h> |
||||||
|
|
||||||
|
int do_fsload_wrapper(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) |
||||||
|
{ |
||||||
|
return do_fsload(cmdtp, flag, argc, argv, FS_TYPE_ANY); |
||||||
|
} |
||||||
|
|
||||||
|
U_BOOT_CMD( |
||||||
|
fsload, 7, 0, do_fsload_wrapper, |
||||||
|
"load binary file from a filesystem", |
||||||
|
"<interface> [<dev[:part]> [<addr> [<filename> [bytes [pos]]]]]\n" |
||||||
|
" - Load binary file 'filename' from partition 'part' on device\n" |
||||||
|
" type 'interface' instance 'dev' to address 'addr' in memory.\n" |
||||||
|
" 'bytes' gives the size to load in bytes.\n" |
||||||
|
" If 'bytes' is 0 or omitted, the file is read until the end.\n" |
||||||
|
" 'pos' gives the file byte position to start reading from.\n" |
||||||
|
" If 'pos' is 0 or omitted, the file is read from the start." |
||||||
|
); |
||||||
|
|
||||||
|
int do_ls_wrapper(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) |
||||||
|
{ |
||||||
|
return do_ls(cmdtp, flag, argc, argv, FS_TYPE_ANY); |
||||||
|
} |
||||||
|
|
||||||
|
U_BOOT_CMD( |
||||||
|
ls, 4, 1, do_ls_wrapper, |
||||||
|
"list files in a directory (default /)", |
||||||
|
"<interface> [<dev[:part]> [directory]]\n" |
||||||
|
" - List files in directory 'directory' of partition 'part' on\n" |
||||||
|
" device type 'interface' instance 'dev'." |
||||||
|
); |
@ -0,0 +1,47 @@ |
|||||||
|
#
|
||||||
|
# (C) Copyright 2000-2006
|
||||||
|
# Wolfgang Denk, DENX Software Engineering, wd@denx.de.
|
||||||
|
# Copyright (c) 2012, NVIDIA CORPORATION. All rights reserved.
|
||||||
|
#
|
||||||
|
# See file CREDITS for list of people who contributed to this
|
||||||
|
# project.
|
||||||
|
#
|
||||||
|
# This program is free software; you can redistribute it and/or
|
||||||
|
# modify it under the terms of the GNU General Public License as
|
||||||
|
# published by the Free Software Foundation; either version 2 of
|
||||||
|
# the License, or (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program; if not, write to the Free Software
|
||||||
|
# Foundation, Inc., 59 Temple Place, Suite 330, Boston,
|
||||||
|
# MA 02111-1307 USA
|
||||||
|
#
|
||||||
|
|
||||||
|
include $(TOPDIR)/config.mk |
||||||
|
|
||||||
|
LIB = $(obj)libfs.o
|
||||||
|
|
||||||
|
COBJS-y += fs.o
|
||||||
|
|
||||||
|
COBJS := $(COBJS-y)
|
||||||
|
SRCS := $(COBJS:.o=.c)
|
||||||
|
OBJS := $(addprefix $(obj),$(COBJS))
|
||||||
|
|
||||||
|
all: $(LIB) |
||||||
|
|
||||||
|
$(LIB): $(obj).depend $(OBJS) |
||||||
|
$(call cmd_link_o_target, $(OBJS))
|
||||||
|
|
||||||
|
#########################################################################
|
||||||
|
|
||||||
|
# defines $(obj).depend target
|
||||||
|
include $(SRCTREE)/rules.mk |
||||||
|
|
||||||
|
sinclude $(obj).depend |
||||||
|
|
||||||
|
#########################################################################
|
@ -0,0 +1,308 @@ |
|||||||
|
/*
|
||||||
|
* Copyright (c) 2012, NVIDIA CORPORATION. All rights reserved. |
||||||
|
* |
||||||
|
* This program is free software; you can redistribute it and/or modify it |
||||||
|
* under the terms and conditions of the GNU General Public License, |
||||||
|
* version 2, as published by the Free Software Foundation. |
||||||
|
* |
||||||
|
* This program is distributed in the hope it will be useful, but WITHOUT |
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for |
||||||
|
* more details. |
||||||
|
* |
||||||
|
* You should have received a copy of the GNU General Public License |
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/ |
||||||
|
|
||||||
|
#include <config.h> |
||||||
|
#include <common.h> |
||||||
|
#include <part.h> |
||||||
|
#include <ext4fs.h> |
||||||
|
#include <fat.h> |
||||||
|
#include <fs.h> |
||||||
|
|
||||||
|
static block_dev_desc_t *fs_dev_desc; |
||||||
|
static disk_partition_t fs_partition; |
||||||
|
static int fs_type = FS_TYPE_ANY; |
||||||
|
|
||||||
|
static inline int fs_ls_unsupported(const char *dirname) |
||||||
|
{ |
||||||
|
printf("** Unrecognized filesystem type **\n"); |
||||||
|
return -1; |
||||||
|
} |
||||||
|
|
||||||
|
static inline int fs_read_unsupported(const char *filename, ulong addr, |
||||||
|
int offset, int len) |
||||||
|
{ |
||||||
|
printf("** Unrecognized filesystem type **\n"); |
||||||
|
return -1; |
||||||
|
} |
||||||
|
|
||||||
|
#ifdef CONFIG_FS_FAT |
||||||
|
static int fs_probe_fat(void) |
||||||
|
{ |
||||||
|
return fat_set_blk_dev(fs_dev_desc, &fs_partition); |
||||||
|
} |
||||||
|
|
||||||
|
static void fs_close_fat(void) |
||||||
|
{ |
||||||
|
} |
||||||
|
|
||||||
|
#define fs_ls_fat file_fat_ls |
||||||
|
|
||||||
|
static int fs_read_fat(const char *filename, ulong addr, int offset, int len) |
||||||
|
{ |
||||||
|
int len_read; |
||||||
|
|
||||||
|
len_read = file_fat_read_at(filename, offset, |
||||||
|
(unsigned char *)addr, len); |
||||||
|
if (len_read == -1) { |
||||||
|
printf("** Unable to read file %s **\n", filename); |
||||||
|
return -1; |
||||||
|
} |
||||||
|
|
||||||
|
return len_read; |
||||||
|
} |
||||||
|
#else |
||||||
|
static inline int fs_probe_fat(void) |
||||||
|
{ |
||||||
|
return -1; |
||||||
|
} |
||||||
|
|
||||||
|
static inline void fs_close_fat(void) |
||||||
|
{ |
||||||
|
} |
||||||
|
|
||||||
|
#define fs_ls_fat fs_ls_unsupported |
||||||
|
#define fs_read_fat fs_read_unsupported |
||||||
|
#endif |
||||||
|
|
||||||
|
#ifdef CONFIG_FS_EXT4 |
||||||
|
static int fs_probe_ext(void) |
||||||
|
{ |
||||||
|
ext4fs_set_blk_dev(fs_dev_desc, &fs_partition); |
||||||
|
|
||||||
|
if (!ext4fs_mount(fs_partition.size)) { |
||||||
|
ext4fs_close(); |
||||||
|
return -1; |
||||||
|
} |
||||||
|
|
||||||
|
return 0; |
||||||
|
} |
||||||
|
|
||||||
|
static void fs_close_ext(void) |
||||||
|
{ |
||||||
|
ext4fs_close(); |
||||||
|
} |
||||||
|
|
||||||
|
#define fs_ls_ext ext4fs_ls |
||||||
|
|
||||||
|
static int fs_read_ext(const char *filename, ulong addr, int offset, int len) |
||||||
|
{ |
||||||
|
int file_len; |
||||||
|
int len_read; |
||||||
|
|
||||||
|
if (offset != 0) { |
||||||
|
printf("** Cannot support non-zero offset **\n"); |
||||||
|
return -1; |
||||||
|
} |
||||||
|
|
||||||
|
file_len = ext4fs_open(filename); |
||||||
|
if (file_len < 0) { |
||||||
|
printf("** File not found %s **\n", filename); |
||||||
|
ext4fs_close(); |
||||||
|
return -1; |
||||||
|
} |
||||||
|
|
||||||
|
if (len == 0) |
||||||
|
len = file_len; |
||||||
|
|
||||||
|
len_read = ext4fs_read((char *)addr, len); |
||||||
|
ext4fs_close(); |
||||||
|
|
||||||
|
if (len_read != len) { |
||||||
|
printf("** Unable to read file %s **\n", filename); |
||||||
|
return -1; |
||||||
|
} |
||||||
|
|
||||||
|
return len_read; |
||||||
|
} |
||||||
|
#else |
||||||
|
static inline int fs_probe_ext(void) |
||||||
|
{ |
||||||
|
return -1; |
||||||
|
} |
||||||
|
|
||||||
|
static inline void fs_close_ext(void) |
||||||
|
{ |
||||||
|
} |
||||||
|
|
||||||
|
#define fs_ls_ext fs_ls_unsupported |
||||||
|
#define fs_read_ext fs_read_unsupported |
||||||
|
#endif |
||||||
|
|
||||||
|
static const struct { |
||||||
|
int fstype; |
||||||
|
int (*probe)(void); |
||||||
|
} fstypes[] = { |
||||||
|
{ |
||||||
|
.fstype = FS_TYPE_FAT, |
||||||
|
.probe = fs_probe_fat, |
||||||
|
}, |
||||||
|
{ |
||||||
|
.fstype = FS_TYPE_EXT, |
||||||
|
.probe = fs_probe_ext, |
||||||
|
}, |
||||||
|
}; |
||||||
|
|
||||||
|
int fs_set_blk_dev(const char *ifname, const char *dev_part_str, int fstype) |
||||||
|
{ |
||||||
|
int part, i; |
||||||
|
|
||||||
|
part = get_device_and_partition(ifname, dev_part_str, &fs_dev_desc, |
||||||
|
&fs_partition, 1); |
||||||
|
if (part < 0) |
||||||
|
return -1; |
||||||
|
|
||||||
|
for (i = 0; i < ARRAY_SIZE(fstypes); i++) { |
||||||
|
if ((fstype != FS_TYPE_ANY) && (fstype != fstypes[i].fstype)) |
||||||
|
continue; |
||||||
|
|
||||||
|
if (!fstypes[i].probe()) { |
||||||
|
fs_type = fstypes[i].fstype; |
||||||
|
return 0; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
printf("** Unrecognized filesystem type **\n"); |
||||||
|
return -1; |
||||||
|
} |
||||||
|
|
||||||
|
static void fs_close(void) |
||||||
|
{ |
||||||
|
switch (fs_type) { |
||||||
|
case FS_TYPE_FAT: |
||||||
|
fs_close_fat(); |
||||||
|
break; |
||||||
|
case FS_TYPE_EXT: |
||||||
|
fs_close_ext(); |
||||||
|
break; |
||||||
|
default: |
||||||
|
break; |
||||||
|
} |
||||||
|
|
||||||
|
fs_type = FS_TYPE_ANY; |
||||||
|
} |
||||||
|
|
||||||
|
int fs_ls(const char *dirname) |
||||||
|
{ |
||||||
|
int ret; |
||||||
|
|
||||||
|
switch (fs_type) { |
||||||
|
case FS_TYPE_FAT: |
||||||
|
ret = fs_ls_fat(dirname); |
||||||
|
break; |
||||||
|
case FS_TYPE_EXT: |
||||||
|
ret = fs_ls_ext(dirname); |
||||||
|
break; |
||||||
|
default: |
||||||
|
ret = fs_ls_unsupported(dirname); |
||||||
|
break; |
||||||
|
} |
||||||
|
|
||||||
|
fs_close(); |
||||||
|
|
||||||
|
return ret; |
||||||
|
} |
||||||
|
|
||||||
|
int fs_read(const char *filename, ulong addr, int offset, int len) |
||||||
|
{ |
||||||
|
int ret; |
||||||
|
|
||||||
|
switch (fs_type) { |
||||||
|
case FS_TYPE_FAT: |
||||||
|
ret = fs_read_fat(filename, addr, offset, len); |
||||||
|
break; |
||||||
|
case FS_TYPE_EXT: |
||||||
|
ret = fs_read_ext(filename, addr, offset, len); |
||||||
|
break; |
||||||
|
default: |
||||||
|
ret = fs_read_unsupported(filename, addr, offset, len); |
||||||
|
break; |
||||||
|
} |
||||||
|
|
||||||
|
fs_close(); |
||||||
|
|
||||||
|
return ret; |
||||||
|
} |
||||||
|
|
||||||
|
int do_fsload(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[], |
||||||
|
int fstype) |
||||||
|
{ |
||||||
|
unsigned long addr; |
||||||
|
const char *addr_str; |
||||||
|
const char *filename; |
||||||
|
unsigned long bytes; |
||||||
|
unsigned long pos; |
||||||
|
int len_read; |
||||||
|
char buf[12]; |
||||||
|
|
||||||
|
if (argc < 5) |
||||||
|
return CMD_RET_USAGE; |
||||||
|
|
||||||
|
if (fs_set_blk_dev(argv[1], argv[2], fstype)) |
||||||
|
return 1; |
||||||
|
|
||||||
|
if (argc >= 4) { |
||||||
|
addr = simple_strtoul(argv[3], NULL, 0); |
||||||
|
} else { |
||||||
|
addr_str = getenv("loadaddr"); |
||||||
|
if (addr_str != NULL) |
||||||
|
addr = simple_strtoul(addr_str, NULL, 16); |
||||||
|
else |
||||||
|
addr = CONFIG_SYS_LOAD_ADDR; |
||||||
|
} |
||||||
|
if (argc >= 5) { |
||||||
|
filename = argv[4]; |
||||||
|
} else { |
||||||
|
filename = getenv("bootfile"); |
||||||
|
if (!filename) { |
||||||
|
puts("** No boot file defined **\n"); |
||||||
|
return 1; |
||||||
|
} |
||||||
|
} |
||||||
|
if (argc >= 6) |
||||||
|
bytes = simple_strtoul(argv[5], NULL, 0); |
||||||
|
else |
||||||
|
bytes = 0; |
||||||
|
if (argc >= 7) |
||||||
|
pos = simple_strtoul(argv[6], NULL, 0); |
||||||
|
else |
||||||
|
pos = 0; |
||||||
|
|
||||||
|
len_read = fs_read(filename, addr, pos, bytes); |
||||||
|
if (len_read <= 0) |
||||||
|
return 1; |
||||||
|
|
||||||
|
printf("%d bytes read\n", len_read); |
||||||
|
|
||||||
|
sprintf(buf, "0x%x", len_read); |
||||||
|
setenv("filesize", buf); |
||||||
|
|
||||||
|
return 0; |
||||||
|
} |
||||||
|
|
||||||
|
int do_ls(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[], |
||||||
|
int fstype) |
||||||
|
{ |
||||||
|
if (argc < 2) |
||||||
|
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] : "/")) |
||||||
|
return 1; |
||||||
|
|
||||||
|
return 0; |
||||||
|
} |
@ -0,0 +1,65 @@ |
|||||||
|
/*
|
||||||
|
* Copyright (c) 2012, NVIDIA CORPORATION. All rights reserved. |
||||||
|
* |
||||||
|
* This program is free software; you can redistribute it and/or modify it |
||||||
|
* under the terms and conditions of the GNU General Public License, |
||||||
|
* version 2, as published by the Free Software Foundation. |
||||||
|
* |
||||||
|
* This program is distributed in the hope it will be useful, but WITHOUT |
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for |
||||||
|
* more details. |
||||||
|
* |
||||||
|
* You should have received a copy of the GNU General Public License |
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/ |
||||||
|
#ifndef _FS_H |
||||||
|
#define _FS_H |
||||||
|
|
||||||
|
#include <common.h> |
||||||
|
|
||||||
|
#define FS_TYPE_ANY 0 |
||||||
|
#define FS_TYPE_FAT 1 |
||||||
|
#define FS_TYPE_EXT 2 |
||||||
|
|
||||||
|
/*
|
||||||
|
* Tell the fs layer which block device an partition to use for future |
||||||
|
* commands. This also internally identifies the filesystem that is present |
||||||
|
* within the partition. The identification process may be limited to a |
||||||
|
* specific filesystem type by passing FS_* in the fstype parameter. |
||||||
|
* |
||||||
|
* Returns 0 on success. |
||||||
|
* Returns non-zero if there is an error accessing the disk or partition, or |
||||||
|
* no known filesystem type could be recognized on it. |
||||||
|
*/ |
||||||
|
int fs_set_blk_dev(const char *ifname, const char *dev_part_str, int fstype); |
||||||
|
|
||||||
|
/*
|
||||||
|
* Print the list of files on the partition previously set by fs_set_blk_dev(), |
||||||
|
* in directory "dirname". |
||||||
|
* |
||||||
|
* Returns 0 on success. Returns non-zero on error. |
||||||
|
*/ |
||||||
|
int fs_ls(const char *dirname); |
||||||
|
|
||||||
|
/*
|
||||||
|
* Read file "filename" from the partition previously set by fs_set_blk_dev(), |
||||||
|
* to address "addr", starting at byte offset "offset", and reading "len" |
||||||
|
* bytes. "offset" may be 0 to read from the start of the file. "len" may be |
||||||
|
* 0 to read the entire file. Note that not all filesystem types support |
||||||
|
* either/both offset!=0 or len!=0. |
||||||
|
* |
||||||
|
* Returns number of bytes read on success. Returns <= 0 on error. |
||||||
|
*/ |
||||||
|
int fs_read(const char *filename, ulong addr, int offset, int len); |
||||||
|
|
||||||
|
/*
|
||||||
|
* Common implementation for various filesystem commands, optionally limited |
||||||
|
* to a specific filesystem type via the fstype parameter. |
||||||
|
*/ |
||||||
|
int do_fsload(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[], |
||||||
|
int fstype); |
||||||
|
int do_ls(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[], |
||||||
|
int fstype); |
||||||
|
|
||||||
|
#endif /* _FS_H */ |
Loading…
Reference in new issue