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