From 045fa1e1142552799ad3203e9e0bc22a11e866ea Mon Sep 17 00:00:00 2001 From: Stephen Warren Date: Mon, 22 Oct 2012 06:43:51 +0000 Subject: fs: add filesystem switch libary, implement ls and fsload commands 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 --- common/cmd_fs.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 common/cmd_fs.c (limited to 'common/cmd_fs.c') diff --git a/common/cmd_fs.c b/common/cmd_fs.c new file mode 100644 index 000000000..296124b99 --- /dev/null +++ b/common/cmd_fs.c @@ -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 . + */ + +#include +#include +#include + +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", + " [ [ [ [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 /)", + " [ [directory]]\n" + " - List files in directory 'directory' of partition 'part' on\n" + " device type 'interface' instance 'dev'." +); -- cgit v1.2.3-70-g09d2 From 3f83c87ee58d86e9a9d2e50b62f38c728bfb31f6 Mon Sep 17 00:00:00 2001 From: Stephen Warren Date: Tue, 30 Oct 2012 12:04:19 +0000 Subject: fs: fix number base behaviour change in fatload/ext*load MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Commit 045fa1e "fs: add filesystem switch libary, implement ls and fsload commands" unified the implementation of fatload and ext*load with the new command fsload. However, this altered the interpretation of command-line numbers from always being base-16, to requiring a "0x" prefix for base-16 numbers. Enhance do_fsload() to allow commands to specify which base to use. Use base 0, thus requiring a "0x" prefix for the new fsload command. This feels much cleaner than assuming base 16. Use base 16 for the pre-existing fatload and ext*load to prevent a change in behaviour. Use base 16 exclusively for the loadaddr environment variable, since that variable is interpreted in multiple places, so we don't want the behaviour to change. Update command help text to make it clear where numbers are assumed to be hex, and where an explicit "0x" prefix is required. Signed-off-by: Stephen Warren Reviewed-by: Benoît Thébaudeau --- common/cmd_ext2.c | 5 +++-- common/cmd_ext4.c | 5 +++-- common/cmd_fat.c | 5 +++-- common/cmd_fs.c | 6 ++++-- fs/fs.c | 8 ++++---- include/fs.h | 2 +- 6 files changed, 18 insertions(+), 13 deletions(-) (limited to 'common/cmd_fs.c') diff --git a/common/cmd_ext2.c b/common/cmd_ext2.c index 06d0234a4..7f225987a 100644 --- a/common/cmd_ext2.c +++ b/common/cmd_ext2.c @@ -49,7 +49,7 @@ int do_ext2ls (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) */ int do_ext2load (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { - return do_fsload(cmdtp, flag, argc, argv, FS_TYPE_EXT); + return do_fsload(cmdtp, flag, argc, argv, FS_TYPE_EXT, 16); } U_BOOT_CMD( @@ -64,5 +64,6 @@ U_BOOT_CMD( "load binary file from a Ext2 filesystem", " [addr] [filename] [bytes]\n" " - load binary file 'filename' from 'dev' on 'interface'\n" - " to address 'addr' from ext2 filesystem" + " to address 'addr' from ext2 filesystem.\n" + " All numeric parameters are assumed to be hex." ); diff --git a/common/cmd_ext4.c b/common/cmd_ext4.c index b4a154ffe..b50bd0ae9 100644 --- a/common/cmd_ext4.c +++ b/common/cmd_ext4.c @@ -59,7 +59,7 @@ int do_ext4_load(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]) { - return do_fsload(cmdtp, flag, argc, argv, FS_TYPE_EXT); + return do_fsload(cmdtp, flag, argc, argv, FS_TYPE_EXT, 16); } int do_ext4_ls(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]) @@ -136,4 +136,5 @@ U_BOOT_CMD(ext4load, 6, 0, do_ext4_load, "load binary file from a Ext4 filesystem", " [addr] [filename] [bytes]\n" " - load binary file 'filename' from 'dev' on 'interface'\n" - " to address 'addr' from ext4 filesystem"); + " to address 'addr' from ext4 filesystem.\n" + " All numeric parameters are assumed to be hex."); diff --git a/common/cmd_fat.c b/common/cmd_fat.c index c865d6d8a..82804838d 100644 --- a/common/cmd_fat.c +++ b/common/cmd_fat.c @@ -35,7 +35,7 @@ int do_fat_fsload (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { - return do_fsload(cmdtp, flag, argc, argv, FS_TYPE_FAT); + return do_fsload(cmdtp, flag, argc, argv, FS_TYPE_FAT, 16); } @@ -48,7 +48,8 @@ U_BOOT_CMD( " 'pos' gives the file position to start loading from.\n" " If 'pos' is omitted, 0 is used. 'pos' requires 'bytes'.\n" " 'bytes' gives the size to load. If 'bytes' is 0 or omitted,\n" - " the load stops on end of file." + " the load stops on end of file.\n" + " All numeric parameters are assumed to be hex." ); int do_fat_ls (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) diff --git a/common/cmd_fs.c b/common/cmd_fs.c index 296124b99..46fcef78e 100644 --- a/common/cmd_fs.c +++ b/common/cmd_fs.c @@ -22,7 +22,7 @@ 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); + return do_fsload(cmdtp, flag, argc, argv, FS_TYPE_ANY, 0); } U_BOOT_CMD( @@ -34,7 +34,9 @@ U_BOOT_CMD( " '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." + " If 'pos' is 0 or omitted, the file is read from the start.\n" + " All numeric parameters are assumed to be decimal,\n" + " unless specified otherwise using a leading \"0x\"." ); int do_ls_wrapper(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) diff --git a/fs/fs.c b/fs/fs.c index f57031261..1553af59d 100644 --- a/fs/fs.c +++ b/fs/fs.c @@ -248,7 +248,7 @@ int fs_read(const char *filename, ulong addr, int offset, int len) } int do_fsload(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[], - int fstype) + int fstype, int cmdline_base) { unsigned long addr; const char *addr_str; @@ -267,7 +267,7 @@ int do_fsload(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[], 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) @@ -285,11 +285,11 @@ int do_fsload(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[], } } 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; diff --git a/include/fs.h b/include/fs.h index f396d8492..c3ac7ccc0 100644 --- a/include/fs.h +++ b/include/fs.h @@ -58,7 +58,7 @@ int fs_read(const char *filename, ulong addr, int offset, int len); * 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 fstype, int cmdline_base); int do_ls(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[], int fstype); -- cgit v1.2.3-70-g09d2 From f9b55e22856a97523074f3dc40ea5d196298756a Mon Sep 17 00:00:00 2001 From: Stephen Warren Date: Wed, 31 Oct 2012 11:05:07 +0000 Subject: fs: rename fsload command to load When the generic filesystem load command "fsload" was written, I felt that "load" was too generic of a name for it, since many other similar commands already existed. However, it turns out that there is already an "fsload" command, so that name cannot be used. Rename the new "fsload" to plain "load" to avoid the conflict. At least anyone who's used a Basic interpreter should feel familiar with the name! Signed-off-by: Stephen Warren --- common/cmd_ext2.c | 2 +- common/cmd_ext4.c | 2 +- common/cmd_fat.c | 2 +- common/cmd_fs.c | 6 +++--- fs/fs.c | 2 +- include/fs.h | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) (limited to 'common/cmd_fs.c') diff --git a/common/cmd_ext2.c b/common/cmd_ext2.c index 7f225987a..f25e22b0a 100644 --- a/common/cmd_ext2.c +++ b/common/cmd_ext2.c @@ -49,7 +49,7 @@ int do_ext2ls (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) */ int do_ext2load (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { - return do_fsload(cmdtp, flag, argc, argv, FS_TYPE_EXT, 16); + return do_load(cmdtp, flag, argc, argv, FS_TYPE_EXT, 16); } U_BOOT_CMD( diff --git a/common/cmd_ext4.c b/common/cmd_ext4.c index b50bd0ae9..dcf76a50c 100644 --- a/common/cmd_ext4.c +++ b/common/cmd_ext4.c @@ -59,7 +59,7 @@ int do_ext4_load(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]) { - return do_fsload(cmdtp, flag, argc, argv, FS_TYPE_EXT, 16); + return do_load(cmdtp, flag, argc, argv, FS_TYPE_EXT, 16); } int do_ext4_ls(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]) diff --git a/common/cmd_fat.c b/common/cmd_fat.c index 82804838d..2e2301e58 100644 --- a/common/cmd_fat.c +++ b/common/cmd_fat.c @@ -35,7 +35,7 @@ int do_fat_fsload (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { - return do_fsload(cmdtp, flag, argc, argv, FS_TYPE_FAT, 16); + return do_load(cmdtp, flag, argc, argv, FS_TYPE_FAT, 16); } diff --git a/common/cmd_fs.c b/common/cmd_fs.c index 46fcef78e..a681d03d1 100644 --- a/common/cmd_fs.c +++ b/common/cmd_fs.c @@ -20,13 +20,13 @@ #include #include -int do_fsload_wrapper(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) +int do_load_wrapper(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { - return do_fsload(cmdtp, flag, argc, argv, FS_TYPE_ANY, 0); + return do_load(cmdtp, flag, argc, argv, FS_TYPE_ANY, 0); } U_BOOT_CMD( - fsload, 7, 0, do_fsload_wrapper, + load, 7, 0, do_load_wrapper, "load binary file from a filesystem", " [ [ [ [bytes [pos]]]]]\n" " - Load binary file 'filename' from partition 'part' on device\n" diff --git a/fs/fs.c b/fs/fs.c index 1553af59d..ff360afd4 100644 --- a/fs/fs.c +++ b/fs/fs.c @@ -247,7 +247,7 @@ int fs_read(const char *filename, ulong addr, int offset, int len) return ret; } -int do_fsload(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[], +int do_load(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[], int fstype, int cmdline_base) { unsigned long addr; diff --git a/include/fs.h b/include/fs.h index c3ac7ccc0..4f30a385a 100644 --- a/include/fs.h +++ b/include/fs.h @@ -57,7 +57,7 @@ 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 do_load(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[], int fstype, int cmdline_base); int do_ls(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[], int fstype); -- cgit v1.2.3-70-g09d2