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