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
27extern void cmd_yaffs_dev_ls(void);
28extern void cmd_yaffs_tracemask(unsigned set, unsigned mask);
29extern void cmd_yaffs_devconfig(char *mp, int flash_dev,
30				int start_block, int end_block);
31extern void cmd_yaffs_mount(char *mp);
32extern void cmd_yaffs_umount(char *mp);
33extern void cmd_yaffs_read_file(char *fn);
34extern void cmd_yaffs_write_file(char *fn, char bval, int sizeOfFile);
35extern void cmd_yaffs_ls(const char *mountpt, int longlist);
36extern void cmd_yaffs_mwrite_file(char *fn, char *addr, int size);
37extern void cmd_yaffs_mread_file(char *fn, char *addr);
38extern void cmd_yaffs_mkdir(const char *dir);
39extern void cmd_yaffs_rmdir(const char *dir);
40extern void cmd_yaffs_rm(const char *path);
41extern void cmd_yaffs_mv(const char *oldPath, const char *newPath);
42
43extern int yaffs_dump_dev(const char *path);
44
45/* ytrace - show/set yaffs trace mask */
46int 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. */
57int 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 */
65int 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
88int 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
105int 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
121int 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
137int 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
156int 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 = hextoul(argv[2], NULL);
169	numValues = hextoul(argv[3], NULL);
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
180int 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 = hextoul(argv[2], NULL);
192
193	cmd_yaffs_mread_file(filename, (char *)addr);
194
195	return 0;
196}
197
198int 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 = hextoul(argv[2], NULL);
211	size = hextoul(argv[3], NULL);
212
213	cmd_yaffs_mwrite_file(filename, (char *)addr, size);
214
215	return 0;
216}
217
218int 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
233int 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
248int 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
264int 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
282U_BOOT_CMD(ytrace, 2, 0, do_ytrace,
283	   "show/set yaffs trace mask",
284	   "[new_mask]  show/set yaffs trace mask");
285
286U_BOOT_CMD(ydevls, 1, 0, do_ydevls,
287	   "list yaffs mount points", "list yaffs mount points");
288
289U_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
293U_BOOT_CMD(ymount, 2, 0, do_ymount,
294	   "mount yaffs", "mtpoint  mounts a yaffs2 mount point");
295
296U_BOOT_CMD(yumount, 2, 0, do_yumount,
297	   "unmount yaffs", "mtpoint  unmounts a yaffs2 mount point");
298
299U_BOOT_CMD(yls, 3, 0, do_yls, "yaffs ls", "[-l] dirname");
300
301U_BOOT_CMD(yrd, 2, 0, do_yrd,
302	   "read file from yaffs", "path   read file from yaffs");
303
304U_BOOT_CMD(ywr, 4, 0, do_ywr,
305	   "write file to yaffs",
306	   "filename value num_vlues   write values to yaffs file");
307
308U_BOOT_CMD(yrdm, 3, 0, do_yrdm,
309	   "read file to memory from yaffs",
310	   "filename offset    reads yaffs file into memory");
311
312U_BOOT_CMD(ywrm, 4, 0, do_ywrm,
313	   "write file from memory to yaffs",
314	   "filename offset size  writes memory to yaffs file");
315
316U_BOOT_CMD(ymkdir, 2, 0, do_ymkdir,
317	   "YAFFS mkdir", "dir    create a yaffs directory");
318
319U_BOOT_CMD(yrmdir, 2, 0, do_yrmdir,
320	   "YAFFS rmdir", "dirname   removes a yaffs directory");
321
322U_BOOT_CMD(yrm, 2, 0, do_yrm, "YAFFS rm", "path   removes a yaffs file");
323
324U_BOOT_CMD(ymv, 4, 0, do_ymv,
325	   "YAFFS mv",
326	   "old_path new_path   moves/rename files within a yaffs mount point");
327