1 /* Yaffs commands.
2  * Modified by Charles Manning by adding ydevconfig command.
3  *
4  * Use ydevconfig to configure a mountpoint before use.
5  * For example:
6  *  # Configure mountpt xxx using nand device 0 using blocks 100-500
7  *  ydevconfig xxx 0 100 500
8  *  # Mount it
9  *  ymount xxx
10  *  # yls, yrdm etc
11  *  yls -l xxx
12  *  yrdm xxx/boot-image 82000000
13  *  ...
14  */
15 
16 #include <common.h>
17 
18 #include <config.h>
19 #include <command.h>
20 
21 #ifdef YAFFS2_DEBUG
22 #define PRINTF(fmt, args...) printf(fmt, ##args)
23 #else
24 #define PRINTF(fmt, args...) do { } while (0)
25 #endif
26 
27 extern void cmd_yaffs_dev_ls(void);
28 extern void cmd_yaffs_tracemask(unsigned set, unsigned mask);
29 extern void cmd_yaffs_devconfig(char *mp, int flash_dev,
30 				int start_block, int end_block);
31 extern void cmd_yaffs_mount(char *mp);
32 extern void cmd_yaffs_umount(char *mp);
33 extern void cmd_yaffs_read_file(char *fn);
34 extern void cmd_yaffs_write_file(char *fn, char bval, int sizeOfFile);
35 extern void cmd_yaffs_ls(const char *mountpt, int longlist);
36 extern void cmd_yaffs_mwrite_file(char *fn, char *addr, int size);
37 extern void cmd_yaffs_mread_file(char *fn, char *addr);
38 extern void cmd_yaffs_mkdir(const char *dir);
39 extern void cmd_yaffs_rmdir(const char *dir);
40 extern void cmd_yaffs_rm(const char *path);
41 extern void cmd_yaffs_mv(const char *oldPath, const char *newPath);
42 
43 extern int yaffs_dump_dev(const char *path);
44 
45 /* ytrace - show/set yaffs trace mask */
do_ytrace(struct cmd_tbl * cmdtp,int flag,int argc,char * const argv[])46 int do_ytrace(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
47 {
48 	if (argc > 1)
49 		cmd_yaffs_tracemask(1, simple_strtol(argv[1], NULL, 16));
50 	else
51 		cmd_yaffs_tracemask(0, 0);
52 
53 	return 0;
54 }
55 
56 /* ydevls - lists yaffs mount points. */
do_ydevls(struct cmd_tbl * cmdtp,int flag,int argc,char * const argv[])57 int do_ydevls(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
58 {
59 	cmd_yaffs_dev_ls();
60 
61 	return 0;
62 }
63 
64 /* ydevconfig mount_pt mtd_dev_num start_block end_block */
do_ydevconfig(struct cmd_tbl * cmdtp,int flag,int argc,char * const argv[])65 int do_ydevconfig(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
66 {
67 	char *mtpoint;
68 	int mtd_dev;
69 	int start_block;
70 	int end_block;
71 
72 	if (argc != 5) {
73 		printf
74 		    ("Bad arguments: ydevconfig mount_pt mtd_dev start_block end_block\n");
75 		return -1;
76 	}
77 
78 	mtpoint = argv[1];
79 	mtd_dev = simple_strtol(argv[2], NULL, 16);
80 	start_block = simple_strtol(argv[3], NULL, 16);
81 	end_block = simple_strtol(argv[4], NULL, 16);
82 
83 	cmd_yaffs_devconfig(mtpoint, mtd_dev, start_block, end_block);
84 
85 	return 0;
86 }
87 
do_ymount(struct cmd_tbl * cmdtp,int flag,int argc,char * const argv[])88 int do_ymount(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
89 {
90 	char *mtpoint;
91 
92 	if (argc != 2) {
93 		printf("Bad arguments: ymount mount_pt\n");
94 		return -1;
95 	}
96 
97 	mtpoint = argv[1];
98 	printf("Mounting yaffs2 mount point %s\n", mtpoint);
99 
100 	cmd_yaffs_mount(mtpoint);
101 
102 	return 0;
103 }
104 
do_yumount(struct cmd_tbl * cmdtp,int flag,int argc,char * const argv[])105 int do_yumount(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
106 {
107 	char *mtpoint;
108 
109 	if (argc != 2) {
110 		printf("Bad arguments: yumount mount_pt\n");
111 		return -1;
112 	}
113 
114 	mtpoint = argv[1];
115 	printf("Unmounting yaffs2 mount point %s\n", mtpoint);
116 	cmd_yaffs_umount(mtpoint);
117 
118 	return 0;
119 }
120 
do_yls(struct cmd_tbl * cmdtp,int flag,int argc,char * const argv[])121 int do_yls(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
122 {
123 	char *dirname;
124 
125 	if (argc < 2 || argc > 3 || (argc == 3 && strcmp(argv[1], "-l"))) {
126 		printf("Bad arguments: yls [-l] dir\n");
127 		return -1;
128 	}
129 
130 	dirname = argv[argc - 1];
131 
132 	cmd_yaffs_ls(dirname, (argc > 2) ? 1 : 0);
133 
134 	return 0;
135 }
136 
do_yrd(struct cmd_tbl * cmdtp,int flag,int argc,char * const argv[])137 int do_yrd(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
138 {
139 	char *filename;
140 
141 	if (argc != 2) {
142 		printf("Bad arguments: yrd file_name\n");
143 		return -1;
144 	}
145 
146 	filename = argv[1];
147 
148 	printf("Reading file %s ", filename);
149 
150 	cmd_yaffs_read_file(filename);
151 
152 	printf("done\n");
153 	return 0;
154 }
155 
do_ywr(struct cmd_tbl * cmdtp,int flag,int argc,char * const argv[])156 int do_ywr(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
157 {
158 	char *filename;
159 	ulong value;
160 	ulong numValues;
161 
162 	if (argc != 4) {
163 		printf("Bad arguments: ywr file_name value n_values\n");
164 		return -1;
165 	}
166 
167 	filename = argv[1];
168 	value = simple_strtoul(argv[2], NULL, 16);
169 	numValues = simple_strtoul(argv[3], NULL, 16);
170 
171 	printf("Writing value (%lx) %lx times to %s... ", value, numValues,
172 	       filename);
173 
174 	cmd_yaffs_write_file(filename, value, numValues);
175 
176 	printf("done\n");
177 	return 0;
178 }
179 
do_yrdm(struct cmd_tbl * cmdtp,int flag,int argc,char * const argv[])180 int do_yrdm(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
181 {
182 	char *filename;
183 	ulong addr;
184 
185 	if (argc != 3) {
186 		printf("Bad arguments: yrdm file_name addr\n");
187 		return -1;
188 	}
189 
190 	filename = argv[1];
191 	addr = simple_strtoul(argv[2], NULL, 16);
192 
193 	cmd_yaffs_mread_file(filename, (char *)addr);
194 
195 	return 0;
196 }
197 
do_ywrm(struct cmd_tbl * cmdtp,int flag,int argc,char * const argv[])198 int do_ywrm(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
199 {
200 	char *filename;
201 	ulong addr;
202 	ulong size;
203 
204 	if (argc != 4) {
205 		printf("Bad arguments: ywrm file_name addr size\n");
206 		return -1;
207 	}
208 
209 	filename = argv[1];
210 	addr = simple_strtoul(argv[2], NULL, 16);
211 	size = simple_strtoul(argv[3], NULL, 16);
212 
213 	cmd_yaffs_mwrite_file(filename, (char *)addr, size);
214 
215 	return 0;
216 }
217 
do_ymkdir(struct cmd_tbl * cmdtp,int flag,int argc,char * const argv[])218 int do_ymkdir(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
219 {
220 	char *dirname;
221 
222 	if (argc != 2) {
223 		printf("Bad arguments: ymkdir dir_name\n");
224 		return -1;
225 	}
226 
227 	dirname = argv[1];
228 	cmd_yaffs_mkdir(dirname);
229 
230 	return 0;
231 }
232 
do_yrmdir(struct cmd_tbl * cmdtp,int flag,int argc,char * const argv[])233 int do_yrmdir(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
234 {
235 	char *dirname;
236 
237 	if (argc != 2) {
238 		printf("Bad arguments: yrmdir dir_name\n");
239 		return -1;
240 	}
241 
242 	dirname = argv[1];
243 	cmd_yaffs_rmdir(dirname);
244 
245 	return 0;
246 }
247 
do_yrm(struct cmd_tbl * cmdtp,int flag,int argc,char * const argv[])248 int do_yrm(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
249 {
250 	char *name;
251 
252 	if (argc != 2) {
253 		printf("Bad arguments: yrm name\n");
254 		return -1;
255 	}
256 
257 	name = argv[1];
258 
259 	cmd_yaffs_rm(name);
260 
261 	return 0;
262 }
263 
do_ymv(struct cmd_tbl * cmdtp,int flag,int argc,char * const argv[])264 int do_ymv(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
265 {
266 	char *oldPath;
267 	char *newPath;
268 
269 	if (argc != 3) {
270 		printf("Bad arguments: ymv old_path new_path\n");
271 		return -1;
272 	}
273 
274 	oldPath = argv[1];
275 	newPath = argv[2];
276 
277 	cmd_yaffs_mv(newPath, oldPath);
278 
279 	return 0;
280 }
281 
282 U_BOOT_CMD(ytrace, 2, 0, do_ytrace,
283 	   "show/set yaffs trace mask",
284 	   "[new_mask]  show/set yaffs trace mask");
285 
286 U_BOOT_CMD(ydevls, 1, 0, do_ydevls,
287 	   "list yaffs mount points", "list yaffs mount points");
288 
289 U_BOOT_CMD(ydevconfig, 5, 0, do_ydevconfig,
290 	   "configure yaffs mount point",
291 	   "mtpoint mtd_id start_block end_block   configures a yaffs2 mount point");
292 
293 U_BOOT_CMD(ymount, 2, 0, do_ymount,
294 	   "mount yaffs", "mtpoint  mounts a yaffs2 mount point");
295 
296 U_BOOT_CMD(yumount, 2, 0, do_yumount,
297 	   "unmount yaffs", "mtpoint  unmounts a yaffs2 mount point");
298 
299 U_BOOT_CMD(yls, 3, 0, do_yls, "yaffs ls", "[-l] dirname");
300 
301 U_BOOT_CMD(yrd, 2, 0, do_yrd,
302 	   "read file from yaffs", "path   read file from yaffs");
303 
304 U_BOOT_CMD(ywr, 4, 0, do_ywr,
305 	   "write file to yaffs",
306 	   "filename value num_vlues   write values to yaffs file");
307 
308 U_BOOT_CMD(yrdm, 3, 0, do_yrdm,
309 	   "read file to memory from yaffs",
310 	   "filename offset    reads yaffs file into memory");
311 
312 U_BOOT_CMD(ywrm, 4, 0, do_ywrm,
313 	   "write file from memory to yaffs",
314 	   "filename offset size  writes memory to yaffs file");
315 
316 U_BOOT_CMD(ymkdir, 2, 0, do_ymkdir,
317 	   "YAFFS mkdir", "dir    create a yaffs directory");
318 
319 U_BOOT_CMD(yrmdir, 2, 0, do_yrmdir,
320 	   "YAFFS rmdir", "dirname   removes a yaffs directory");
321 
322 U_BOOT_CMD(yrm, 2, 0, do_yrm, "YAFFS rm", "path   removes a yaffs file");
323 
324 U_BOOT_CMD(ymv, 4, 0, do_ymv,
325 	   "YAFFS mv",
326 	   "old_path new_path   moves/rename files within a yaffs mount point");
327