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
do_ubifs_mount(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])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
ubifs_is_mounted(void)49*2e192b24SSimon Glass int ubifs_is_mounted(void)
50*2e192b24SSimon Glass {
51*2e192b24SSimon Glass return ubifs_mounted;
52*2e192b24SSimon Glass }
53*2e192b24SSimon Glass
cmd_ubifs_umount(void)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
do_ubifs_umount(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])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
do_ubifs_ls(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])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
do_ubifs_load(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])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