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