cmd_ubifs.c 2.98 KB
Newer Older
Stefan Roese's avatar
Stefan Roese committed
1 2 3 4
/*
 * (C) Copyright 2008
 * Stefan Roese, DENX Software Engineering, sr@denx.de.
 *
5
 * SPDX-License-Identifier:	GPL-2.0+
Stefan Roese's avatar
Stefan Roese committed
6 7 8 9 10 11 12 13 14 15 16 17 18
 */


/*
 * UBIFS command support
 */

#undef DEBUG

#include <common.h>
#include <config.h>
#include <command.h>

19 20
#include "../fs/ubifs/ubifs.h"

Stefan Roese's avatar
Stefan Roese committed
21 22 23
static int ubifs_initialized;
static int ubifs_mounted;

24 25
static int do_ubifs_mount(cmd_tbl_t *cmdtp, int flag, int argc,
				char * const argv[])
Stefan Roese's avatar
Stefan Roese committed
26 27 28 29
{
	char *vol_name;
	int ret;

30
	if (argc != 2)
31
		return CMD_RET_USAGE;
32

Stefan Roese's avatar
Stefan Roese committed
33 34 35 36 37 38 39 40
	vol_name = argv[1];
	debug("Using volume %s\n", vol_name);

	if (ubifs_initialized == 0) {
		ubifs_init();
		ubifs_initialized = 1;
	}

41
	ret = uboot_ubifs_mount(vol_name);
Stefan Roese's avatar
Stefan Roese committed
42 43 44 45 46 47 48 49
	if (ret)
		return -1;

	ubifs_mounted = 1;

	return 0;
}

50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
int ubifs_is_mounted(void)
{
	return ubifs_mounted;
}

void cmd_ubifs_umount(void)
{

	if (ubifs_sb) {
		printf("Unmounting UBIFS volume %s!\n",
		       ((struct ubifs_info *)(ubifs_sb->s_fs_info))->vi.name);
		ubifs_umount(ubifs_sb->s_fs_info);
	}

	ubifs_sb = NULL;
	ubifs_mounted = 0;
	ubifs_initialized = 0;
}

69 70
static int do_ubifs_umount(cmd_tbl_t *cmdtp, int flag, int argc,
				char * const argv[])
71 72
{
	if (argc != 1)
73
		return CMD_RET_USAGE;
74 75 76 77 78 79

	if (ubifs_initialized == 0) {
		printf("No UBIFS volume mounted!\n");
		return -1;
	}

80
	cmd_ubifs_umount();
81 82 83 84

	return 0;
}

85 86
static int do_ubifs_ls(cmd_tbl_t *cmdtp, int flag, int argc,
			char * const argv[])
Stefan Roese's avatar
Stefan Roese committed
87 88 89 90 91
{
	char *filename = "/";
	int ret;

	if (!ubifs_mounted) {
92
		printf("UBIFS not mounted, use ubifsmount to mount volume first!\n");
Stefan Roese's avatar
Stefan Roese committed
93 94 95 96 97 98 99 100
		return -1;
	}

	if (argc == 2)
		filename = argv[1];
	debug("Using filename %s\n", filename);

	ret = ubifs_ls(filename);
101 102 103 104
	if (ret) {
		printf("** File not found %s **\n", filename);
		ret = CMD_RET_FAILURE;
	}
Stefan Roese's avatar
Stefan Roese committed
105 106 107 108

	return ret;
}

109 110
static int do_ubifs_load(cmd_tbl_t *cmdtp, int flag, int argc,
				char * const argv[])
Stefan Roese's avatar
Stefan Roese committed
111 112
{
	char *filename;
113
	char *endp;
Stefan Roese's avatar
Stefan Roese committed
114 115 116 117 118 119 120 121 122
	int ret;
	u32 addr;
	u32 size = 0;

	if (!ubifs_mounted) {
		printf("UBIFS not mounted, use ubifs mount to mount volume first!\n");
		return -1;
	}

123
	if (argc < 3)
124
		return CMD_RET_USAGE;
Stefan Roese's avatar
Stefan Roese committed
125

126
	addr = simple_strtoul(argv[1], &endp, 16);
127
	if (endp == argv[1])
128
		return CMD_RET_USAGE;
129

Stefan Roese's avatar
Stefan Roese committed
130 131
	filename = argv[2];

132 133
	if (argc == 4) {
		size = simple_strtoul(argv[3], &endp, 16);
134
		if (endp == argv[3])
135
			return CMD_RET_USAGE;
136
	}
Stefan Roese's avatar
Stefan Roese committed
137 138 139
	debug("Loading file '%s' to address 0x%08x (size %d)\n", filename, addr, size);

	ret = ubifs_load(filename, addr, size);
140 141 142 143
	if (ret) {
		printf("** File not found %s **\n", filename);
		ret = CMD_RET_FAILURE;
	}
Stefan Roese's avatar
Stefan Roese committed
144 145 146 147 148 149

	return ret;
}

U_BOOT_CMD(
	ubifsmount, 2, 0, do_ubifs_mount,
Mike Frysinger's avatar
Mike Frysinger committed
150
	"mount UBIFS volume",
151 152
	"<volume-name>\n"
	"    - mount 'volume-name' volume"
Wolfgang Denk's avatar
Wolfgang Denk committed
153
);
Stefan Roese's avatar
Stefan Roese committed
154

155 156 157 158 159 160
U_BOOT_CMD(
	ubifsumount, 1, 0, do_ubifs_umount,
	"unmount UBIFS volume",
	"    - unmount current volume"
);

161 162
U_BOOT_CMD(
	ubifsls, 2, 0, do_ubifs_ls,
Wolfgang Denk's avatar
Wolfgang Denk committed
163 164 165 166
	"list files in a directory",
	"[directory]\n"
	"    - list files in a 'directory' (default '/')"
);
Stefan Roese's avatar
Stefan Roese committed
167

168 169
U_BOOT_CMD(
	ubifsload, 4, 0, do_ubifs_load,
Wolfgang Denk's avatar
Wolfgang Denk committed
170 171 172 173
	"load file from an UBIFS filesystem",
	"<addr> <filename> [bytes]\n"
	"    - load file 'filename' to address 'addr'"
);