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