xref: /openbmc/u-boot/cmd/ubifs.c (revision 592cd5de)
183d290c5STom Rini // SPDX-License-Identifier: GPL-2.0+
22e192b24SSimon Glass /*
32e192b24SSimon Glass  * (C) Copyright 2008
42e192b24SSimon Glass  * Stefan Roese, DENX Software Engineering, sr@denx.de.
52e192b24SSimon Glass  */
62e192b24SSimon Glass 
72e192b24SSimon Glass 
82e192b24SSimon Glass /*
92e192b24SSimon Glass  * UBIFS command support
102e192b24SSimon Glass  */
112e192b24SSimon Glass 
122e192b24SSimon Glass #undef DEBUG
132e192b24SSimon Glass 
142e192b24SSimon Glass #include <common.h>
152e192b24SSimon Glass #include <config.h>
162e192b24SSimon Glass #include <command.h>
172e192b24SSimon Glass #include <ubifs_uboot.h>
182e192b24SSimon Glass 
192e192b24SSimon Glass static int ubifs_initialized;
202e192b24SSimon Glass static int ubifs_mounted;
212e192b24SSimon Glass 
cmd_ubifs_mount(char * vol_name)22*14dfc648STien Fong Chee int cmd_ubifs_mount(char *vol_name)
232e192b24SSimon Glass {
242e192b24SSimon Glass 	int ret;
252e192b24SSimon Glass 
262e192b24SSimon Glass 	debug("Using volume %s\n", vol_name);
272e192b24SSimon Glass 
282e192b24SSimon Glass 	if (ubifs_initialized == 0) {
292e192b24SSimon Glass 		ubifs_init();
302e192b24SSimon Glass 		ubifs_initialized = 1;
312e192b24SSimon Glass 	}
322e192b24SSimon Glass 
332e192b24SSimon Glass 	ret = uboot_ubifs_mount(vol_name);
342e192b24SSimon Glass 	if (ret)
352e192b24SSimon Glass 		return -1;
362e192b24SSimon Glass 
372e192b24SSimon Glass 	ubifs_mounted = 1;
382e192b24SSimon Glass 
39*14dfc648STien Fong Chee 	return ret;
40*14dfc648STien Fong Chee }
do_ubifs_mount(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])41*14dfc648STien Fong Chee static int do_ubifs_mount(cmd_tbl_t *cmdtp, int flag, int argc,
42*14dfc648STien Fong Chee 				char * const argv[])
43*14dfc648STien Fong Chee {
44*14dfc648STien Fong Chee 	char *vol_name;
45*14dfc648STien Fong Chee 
46*14dfc648STien Fong Chee 	if (argc != 2)
47*14dfc648STien Fong Chee 		return CMD_RET_USAGE;
48*14dfc648STien Fong Chee 
49*14dfc648STien Fong Chee 	vol_name = argv[1];
50*14dfc648STien Fong Chee 
51*14dfc648STien Fong Chee 	return cmd_ubifs_mount(vol_name);
522e192b24SSimon Glass }
532e192b24SSimon Glass 
ubifs_is_mounted(void)542e192b24SSimon Glass int ubifs_is_mounted(void)
552e192b24SSimon Glass {
562e192b24SSimon Glass 	return ubifs_mounted;
572e192b24SSimon Glass }
582e192b24SSimon Glass 
cmd_ubifs_umount(void)5910c20440STien Fong Chee int cmd_ubifs_umount(void)
602e192b24SSimon Glass {
6110c20440STien Fong Chee 	if (ubifs_initialized == 0) {
6210c20440STien Fong Chee 		printf("No UBIFS volume mounted!\n");
6310c20440STien Fong Chee 		return -1;
6410c20440STien Fong Chee 	}
6510c20440STien Fong Chee 
662e192b24SSimon Glass 	uboot_ubifs_umount();
672e192b24SSimon Glass 	ubifs_mounted = 0;
682e192b24SSimon Glass 	ubifs_initialized = 0;
6910c20440STien Fong Chee 
7010c20440STien Fong Chee 	return 0;
712e192b24SSimon Glass }
722e192b24SSimon Glass 
do_ubifs_umount(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])732e192b24SSimon Glass static int do_ubifs_umount(cmd_tbl_t *cmdtp, int flag, int argc,
742e192b24SSimon Glass 				char * const argv[])
752e192b24SSimon Glass {
762e192b24SSimon Glass 	if (argc != 1)
772e192b24SSimon Glass 		return CMD_RET_USAGE;
782e192b24SSimon Glass 
7910c20440STien Fong Chee 	return cmd_ubifs_umount();
802e192b24SSimon Glass }
812e192b24SSimon Glass 
do_ubifs_ls(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])822e192b24SSimon Glass static int do_ubifs_ls(cmd_tbl_t *cmdtp, int flag, int argc,
832e192b24SSimon Glass 			char * const argv[])
842e192b24SSimon Glass {
852e192b24SSimon Glass 	char *filename = "/";
862e192b24SSimon Glass 	int ret;
872e192b24SSimon Glass 
882e192b24SSimon Glass 	if (!ubifs_mounted) {
892e192b24SSimon Glass 		printf("UBIFS not mounted, use ubifsmount to mount volume first!\n");
902e192b24SSimon Glass 		return -1;
912e192b24SSimon Glass 	}
922e192b24SSimon Glass 
932e192b24SSimon Glass 	if (argc == 2)
942e192b24SSimon Glass 		filename = argv[1];
952e192b24SSimon Glass 	debug("Using filename %s\n", filename);
962e192b24SSimon Glass 
972e192b24SSimon Glass 	ret = ubifs_ls(filename);
982e192b24SSimon Glass 	if (ret) {
992e192b24SSimon Glass 		printf("** File not found %s **\n", filename);
1002e192b24SSimon Glass 		ret = CMD_RET_FAILURE;
1012e192b24SSimon Glass 	}
1022e192b24SSimon Glass 
1032e192b24SSimon Glass 	return ret;
1042e192b24SSimon Glass }
1052e192b24SSimon Glass 
do_ubifs_load(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])1062e192b24SSimon Glass static int do_ubifs_load(cmd_tbl_t *cmdtp, int flag, int argc,
1072e192b24SSimon Glass 				char * const argv[])
1082e192b24SSimon Glass {
1092e192b24SSimon Glass 	char *filename;
1102e192b24SSimon Glass 	char *endp;
1112e192b24SSimon Glass 	int ret;
1122e192b24SSimon Glass 	u32 addr;
1132e192b24SSimon Glass 	u32 size = 0;
1142e192b24SSimon Glass 
1152e192b24SSimon Glass 	if (!ubifs_mounted) {
1162e192b24SSimon Glass 		printf("UBIFS not mounted, use ubifs mount to mount volume first!\n");
1172e192b24SSimon Glass 		return -1;
1182e192b24SSimon Glass 	}
1192e192b24SSimon Glass 
1202e192b24SSimon Glass 	if (argc < 3)
1212e192b24SSimon Glass 		return CMD_RET_USAGE;
1222e192b24SSimon Glass 
1232e192b24SSimon Glass 	addr = simple_strtoul(argv[1], &endp, 16);
1242e192b24SSimon Glass 	if (endp == argv[1])
1252e192b24SSimon Glass 		return CMD_RET_USAGE;
1262e192b24SSimon Glass 
1272e192b24SSimon Glass 	filename = argv[2];
1282e192b24SSimon Glass 
1292e192b24SSimon Glass 	if (argc == 4) {
1302e192b24SSimon Glass 		size = simple_strtoul(argv[3], &endp, 16);
1312e192b24SSimon Glass 		if (endp == argv[3])
1322e192b24SSimon Glass 			return CMD_RET_USAGE;
1332e192b24SSimon Glass 	}
1342e192b24SSimon Glass 	debug("Loading file '%s' to address 0x%08x (size %d)\n", filename, addr, size);
1352e192b24SSimon Glass 
1362e192b24SSimon Glass 	ret = ubifs_load(filename, addr, size);
1372e192b24SSimon Glass 	if (ret) {
1382e192b24SSimon Glass 		printf("** File not found %s **\n", filename);
1392e192b24SSimon Glass 		ret = CMD_RET_FAILURE;
1402e192b24SSimon Glass 	}
1412e192b24SSimon Glass 
1422e192b24SSimon Glass 	return ret;
1432e192b24SSimon Glass }
1442e192b24SSimon Glass 
1452e192b24SSimon Glass U_BOOT_CMD(
1462e192b24SSimon Glass 	ubifsmount, 2, 0, do_ubifs_mount,
1472e192b24SSimon Glass 	"mount UBIFS volume",
1482e192b24SSimon Glass 	"<volume-name>\n"
1492e192b24SSimon Glass 	"    - mount 'volume-name' volume"
1502e192b24SSimon Glass );
1512e192b24SSimon Glass 
1522e192b24SSimon Glass U_BOOT_CMD(
1532e192b24SSimon Glass 	ubifsumount, 1, 0, do_ubifs_umount,
1542e192b24SSimon Glass 	"unmount UBIFS volume",
1552e192b24SSimon Glass 	"    - unmount current volume"
1562e192b24SSimon Glass );
1572e192b24SSimon Glass 
1582e192b24SSimon Glass U_BOOT_CMD(
1592e192b24SSimon Glass 	ubifsls, 2, 0, do_ubifs_ls,
1602e192b24SSimon Glass 	"list files in a directory",
1612e192b24SSimon Glass 	"[directory]\n"
1622e192b24SSimon Glass 	"    - list files in a 'directory' (default '/')"
1632e192b24SSimon Glass );
1642e192b24SSimon Glass 
1652e192b24SSimon Glass U_BOOT_CMD(
1662e192b24SSimon Glass 	ubifsload, 4, 0, do_ubifs_load,
1672e192b24SSimon Glass 	"load file from an UBIFS filesystem",
1682e192b24SSimon Glass 	"<addr> <filename> [bytes]\n"
1692e192b24SSimon Glass 	"    - load file 'filename' to address 'addr'"
1702e192b24SSimon Glass );
171