blob: fdc8bfe46a63ae7883cec2f85b291311501523d9 [file] [log] [blame]
Stefan Roesece6d0c82009-03-19 15:35:50 +01001/*
2 * (C) Copyright 2008
3 * Stefan Roese, DENX Software Engineering, sr@denx.de.
4 *
Wolfgang Denk1a459662013-07-08 09:37:19 +02005 * SPDX-License-Identifier: GPL-2.0+
Stefan Roesece6d0c82009-03-19 15:35:50 +01006 */
7
8
9/*
10 * UBIFS command support
11 */
12
13#undef DEBUG
14
15#include <common.h>
16#include <config.h>
17#include <command.h>
18
Stefan Roesecb9c09d2010-10-28 14:09:22 +020019#include "../fs/ubifs/ubifs.h"
20
Stefan Roesece6d0c82009-03-19 15:35:50 +010021static int ubifs_initialized;
22static int ubifs_mounted;
23
Wolfgang Denk54841ab2010-06-28 22:00:46 +020024int do_ubifs_mount(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
Stefan Roesece6d0c82009-03-19 15:35:50 +010025{
26 char *vol_name;
27 int ret;
28
Wolfgang Denk47e26b12010-07-17 01:06:04 +020029 if (argc != 2)
Simon Glass4c12eeb2011-12-10 08:44:01 +000030 return CMD_RET_USAGE;
Wolfgang Denk47e26b12010-07-17 01:06:04 +020031
Stefan Roesece6d0c82009-03-19 15:35:50 +010032 vol_name = argv[1];
33 debug("Using volume %s\n", vol_name);
34
35 if (ubifs_initialized == 0) {
36 ubifs_init();
37 ubifs_initialized = 1;
38 }
39
40 ret = ubifs_mount(vol_name);
41 if (ret)
42 return -1;
43
44 ubifs_mounted = 1;
45
46 return 0;
47}
48
Stefan Roese2f15cfd2010-11-01 17:28:22 +010049int ubifs_is_mounted(void)
50{
51 return ubifs_mounted;
52}
53
54void cmd_ubifs_umount(void)
55{
56
57 if (ubifs_sb) {
58 printf("Unmounting UBIFS volume %s!\n",
59 ((struct ubifs_info *)(ubifs_sb->s_fs_info))->vi.name);
60 ubifs_umount(ubifs_sb->s_fs_info);
61 }
62
63 ubifs_sb = NULL;
64 ubifs_mounted = 0;
65 ubifs_initialized = 0;
66}
67
Stefan Roesecb9c09d2010-10-28 14:09:22 +020068int do_ubifs_umount(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
69{
70 if (argc != 1)
Simon Glass4c12eeb2011-12-10 08:44:01 +000071 return CMD_RET_USAGE;
Stefan Roesecb9c09d2010-10-28 14:09:22 +020072
73 if (ubifs_initialized == 0) {
74 printf("No UBIFS volume mounted!\n");
75 return -1;
76 }
77
Stefan Roese2f15cfd2010-11-01 17:28:22 +010078 cmd_ubifs_umount();
Stefan Roesecb9c09d2010-10-28 14:09:22 +020079
80 return 0;
81}
82
Wolfgang Denk54841ab2010-06-28 22:00:46 +020083int do_ubifs_ls(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
Stefan Roesece6d0c82009-03-19 15:35:50 +010084{
85 char *filename = "/";
86 int ret;
87
88 if (!ubifs_mounted) {
Stefan Roese9a2ea572010-10-28 14:09:29 +020089 printf("UBIFS not mounted, use ubifsmount to mount volume first!\n");
Stefan Roesece6d0c82009-03-19 15:35:50 +010090 return -1;
91 }
92
93 if (argc == 2)
94 filename = argv[1];
95 debug("Using filename %s\n", filename);
96
97 ret = ubifs_ls(filename);
Tim Harvey7cdebc32013-10-10 01:32:26 +020098 if (ret) {
99 printf("** File not found %s **\n", filename);
100 ret = CMD_RET_FAILURE;
101 }
Stefan Roesece6d0c82009-03-19 15:35:50 +0100102
103 return ret;
104}
105
Wolfgang Denk54841ab2010-06-28 22:00:46 +0200106int do_ubifs_load(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
Stefan Roesece6d0c82009-03-19 15:35:50 +0100107{
108 char *filename;
Simon Kagstrom2896b582009-07-07 16:01:02 +0200109 char *endp;
Stefan Roesece6d0c82009-03-19 15:35:50 +0100110 int ret;
111 u32 addr;
112 u32 size = 0;
113
114 if (!ubifs_mounted) {
115 printf("UBIFS not mounted, use ubifs mount to mount volume first!\n");
116 return -1;
117 }
118
Wolfgang Denk47e26b12010-07-17 01:06:04 +0200119 if (argc < 3)
Simon Glass4c12eeb2011-12-10 08:44:01 +0000120 return CMD_RET_USAGE;
Stefan Roesece6d0c82009-03-19 15:35:50 +0100121
Simon Kagstrom2896b582009-07-07 16:01:02 +0200122 addr = simple_strtoul(argv[1], &endp, 16);
Wolfgang Denk47e26b12010-07-17 01:06:04 +0200123 if (endp == argv[1])
Simon Glass4c12eeb2011-12-10 08:44:01 +0000124 return CMD_RET_USAGE;
Simon Kagstrom2896b582009-07-07 16:01:02 +0200125
Stefan Roesece6d0c82009-03-19 15:35:50 +0100126 filename = argv[2];
127
Simon Kagstrom2896b582009-07-07 16:01:02 +0200128 if (argc == 4) {
129 size = simple_strtoul(argv[3], &endp, 16);
Wolfgang Denk47e26b12010-07-17 01:06:04 +0200130 if (endp == argv[3])
Simon Glass4c12eeb2011-12-10 08:44:01 +0000131 return CMD_RET_USAGE;
Simon Kagstrom2896b582009-07-07 16:01:02 +0200132 }
Stefan Roesece6d0c82009-03-19 15:35:50 +0100133 debug("Loading file '%s' to address 0x%08x (size %d)\n", filename, addr, size);
134
135 ret = ubifs_load(filename, addr, size);
Tim Harvey7cdebc32013-10-10 01:32:26 +0200136 if (ret) {
137 printf("** File not found %s **\n", filename);
138 ret = CMD_RET_FAILURE;
139 }
Stefan Roesece6d0c82009-03-19 15:35:50 +0100140
141 return ret;
142}
143
144U_BOOT_CMD(
145 ubifsmount, 2, 0, do_ubifs_mount,
Mike Frysinger852dbfd2009-03-23 22:27:34 -0400146 "mount UBIFS volume",
Simon Kagstrom2896b582009-07-07 16:01:02 +0200147 "<volume-name>\n"
148 " - mount 'volume-name' volume"
Wolfgang Denka89c33d2009-05-24 17:06:54 +0200149);
Stefan Roesece6d0c82009-03-19 15:35:50 +0100150
Frans Meulenbroeks388a29d2010-07-31 15:01:53 +0200151U_BOOT_CMD(
Stefan Roesecb9c09d2010-10-28 14:09:22 +0200152 ubifsumount, 1, 0, do_ubifs_umount,
153 "unmount UBIFS volume",
154 " - unmount current volume"
155);
156
157U_BOOT_CMD(
Frans Meulenbroeks388a29d2010-07-31 15:01:53 +0200158 ubifsls, 2, 0, do_ubifs_ls,
Wolfgang Denka89c33d2009-05-24 17:06:54 +0200159 "list files in a directory",
160 "[directory]\n"
161 " - list files in a 'directory' (default '/')"
162);
Stefan Roesece6d0c82009-03-19 15:35:50 +0100163
Frans Meulenbroeks388a29d2010-07-31 15:01:53 +0200164U_BOOT_CMD(
165 ubifsload, 4, 0, do_ubifs_load,
Wolfgang Denka89c33d2009-05-24 17:06:54 +0200166 "load file from an UBIFS filesystem",
167 "<addr> <filename> [bytes]\n"
168 " - load file 'filename' to address 'addr'"
169);