1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3 * (C) Copyright 2008
4 * Stefan Roese, DENX Software Engineering, sr@denx.de.
5 */
6
7
8 /*
9 * UBIFS command support
10 */
11
12 #undef DEBUG
13
14 #include <common.h>
15 #include <config.h>
16 #include <command.h>
17 #include <ubifs_uboot.h>
18
19 static int ubifs_initialized;
20 static int ubifs_mounted;
21
do_ubifs_mount(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])22 static int do_ubifs_mount(cmd_tbl_t *cmdtp, int flag, int argc,
23 char * const argv[])
24 {
25 char *vol_name;
26 int ret;
27
28 if (argc != 2)
29 return CMD_RET_USAGE;
30
31 vol_name = argv[1];
32 debug("Using volume %s\n", vol_name);
33
34 if (ubifs_initialized == 0) {
35 ubifs_init();
36 ubifs_initialized = 1;
37 }
38
39 ret = uboot_ubifs_mount(vol_name);
40 if (ret)
41 return -1;
42
43 ubifs_mounted = 1;
44
45 return 0;
46 }
47
ubifs_is_mounted(void)48 int ubifs_is_mounted(void)
49 {
50 return ubifs_mounted;
51 }
52
cmd_ubifs_umount(void)53 void cmd_ubifs_umount(void)
54 {
55 uboot_ubifs_umount();
56 ubifs_mounted = 0;
57 ubifs_initialized = 0;
58 }
59
do_ubifs_umount(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])60 static int do_ubifs_umount(cmd_tbl_t *cmdtp, int flag, int argc,
61 char * const argv[])
62 {
63 if (argc != 1)
64 return CMD_RET_USAGE;
65
66 if (ubifs_initialized == 0) {
67 printf("No UBIFS volume mounted!\n");
68 return -1;
69 }
70
71 cmd_ubifs_umount();
72
73 return 0;
74 }
75
do_ubifs_ls(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])76 static int do_ubifs_ls(cmd_tbl_t *cmdtp, int flag, int argc,
77 char * const argv[])
78 {
79 char *filename = "/";
80 int ret;
81
82 if (!ubifs_mounted) {
83 printf("UBIFS not mounted, use ubifsmount to mount volume first!\n");
84 return -1;
85 }
86
87 if (argc == 2)
88 filename = argv[1];
89 debug("Using filename %s\n", filename);
90
91 ret = ubifs_ls(filename);
92 if (ret) {
93 printf("** File not found %s **\n", filename);
94 ret = CMD_RET_FAILURE;
95 }
96
97 return ret;
98 }
99
do_ubifs_load(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])100 static int do_ubifs_load(cmd_tbl_t *cmdtp, int flag, int argc,
101 char * const argv[])
102 {
103 char *filename;
104 char *endp;
105 int ret;
106 u32 addr;
107 u32 size = 0;
108
109 if (!ubifs_mounted) {
110 printf("UBIFS not mounted, use ubifs mount to mount volume first!\n");
111 return -1;
112 }
113
114 if (argc < 3)
115 return CMD_RET_USAGE;
116
117 addr = simple_strtoul(argv[1], &endp, 16);
118 if (endp == argv[1])
119 return CMD_RET_USAGE;
120
121 filename = argv[2];
122
123 if (argc == 4) {
124 size = simple_strtoul(argv[3], &endp, 16);
125 if (endp == argv[3])
126 return CMD_RET_USAGE;
127 }
128 debug("Loading file '%s' to address 0x%08x (size %d)\n", filename, addr, size);
129
130 ret = ubifs_load(filename, addr, size);
131 if (ret) {
132 printf("** File not found %s **\n", filename);
133 ret = CMD_RET_FAILURE;
134 }
135
136 return ret;
137 }
138
139 U_BOOT_CMD(
140 ubifsmount, 2, 0, do_ubifs_mount,
141 "mount UBIFS volume",
142 "<volume-name>\n"
143 " - mount 'volume-name' volume"
144 );
145
146 U_BOOT_CMD(
147 ubifsumount, 1, 0, do_ubifs_umount,
148 "unmount UBIFS volume",
149 " - unmount current volume"
150 );
151
152 U_BOOT_CMD(
153 ubifsls, 2, 0, do_ubifs_ls,
154 "list files in a directory",
155 "[directory]\n"
156 " - list files in a 'directory' (default '/')"
157 );
158
159 U_BOOT_CMD(
160 ubifsload, 4, 0, do_ubifs_load,
161 "load file from an UBIFS filesystem",
162 "<addr> <filename> [bytes]\n"
163 " - load file 'filename' to address 'addr'"
164 );
165