xref: /rk3399_rockchip-uboot/fs/yaffs2/yaffs_uboot_glue.c (revision 90aa625c9a9e1fb7a2f001fd8e50099bacaf92b8)
1753ac610SCharles Manning /*
2753ac610SCharles Manning  * YAFFS: Yet Another Flash File System. A NAND-flash specific file system.
3753ac610SCharles Manning  *
4753ac610SCharles Manning  * Copyright (C) 2002-2007 Aleph One Ltd.
5753ac610SCharles Manning  *   for Toby Churchill Ltd and Brightstar Engineering
6753ac610SCharles Manning  *
7753ac610SCharles Manning  * Created by Charles Manning <charles@aleph1.co.uk>
8753ac610SCharles Manning  *
9753ac610SCharles Manning  * This program is free software; you can redistribute it and/or modify
10753ac610SCharles Manning  * it under the terms of the GNU General Public License version 2 as
11753ac610SCharles Manning  * published by the Free Software Foundation.
12753ac610SCharles Manning  */
13753ac610SCharles Manning 
14753ac610SCharles Manning /*
15753ac610SCharles Manning  * yaffscfg.c  The configuration for the "direct" use of yaffs.
16753ac610SCharles Manning  *
17753ac610SCharles Manning  * This is set up for u-boot.
18753ac610SCharles Manning  *
19753ac610SCharles Manning  * This version now uses the ydevconfig mechanism to set up partitions.
20753ac610SCharles Manning  */
21753ac610SCharles Manning 
22753ac610SCharles Manning #include <common.h>
236b44adc2STom Rini #include <div64.h>
24753ac610SCharles Manning 
25753ac610SCharles Manning #include <config.h>
26753ac610SCharles Manning #include "nand.h"
27753ac610SCharles Manning #include "yaffscfg.h"
28753ac610SCharles Manning #include "yaffsfs.h"
29753ac610SCharles Manning #include "yaffs_packedtags2.h"
30753ac610SCharles Manning #include "yaffs_mtdif.h"
31753ac610SCharles Manning #include "yaffs_mtdif2.h"
32753ac610SCharles Manning #if 0
33753ac610SCharles Manning #include <errno.h>
34753ac610SCharles Manning #else
35753ac610SCharles Manning #include "malloc.h"
36753ac610SCharles Manning #endif
37753ac610SCharles Manning 
38753ac610SCharles Manning unsigned yaffs_trace_mask = 0x0; /* Disable logging */
39753ac610SCharles Manning static int yaffs_errno;
40753ac610SCharles Manning 
41753ac610SCharles Manning 
yaffs_bug_fn(const char * fn,int n)42753ac610SCharles Manning void yaffs_bug_fn(const char *fn, int n)
43753ac610SCharles Manning {
44753ac610SCharles Manning 	printf("yaffs bug at %s:%d\n", fn, n);
45753ac610SCharles Manning }
46753ac610SCharles Manning 
yaffsfs_malloc(size_t x)47753ac610SCharles Manning void *yaffsfs_malloc(size_t x)
48753ac610SCharles Manning {
49753ac610SCharles Manning 	return malloc(x);
50753ac610SCharles Manning }
51753ac610SCharles Manning 
yaffsfs_free(void * x)52753ac610SCharles Manning void yaffsfs_free(void *x)
53753ac610SCharles Manning {
54753ac610SCharles Manning 	free(x);
55753ac610SCharles Manning }
56753ac610SCharles Manning 
yaffsfs_SetError(int err)57753ac610SCharles Manning void yaffsfs_SetError(int err)
58753ac610SCharles Manning {
59753ac610SCharles Manning 	yaffs_errno = err;
60753ac610SCharles Manning }
61753ac610SCharles Manning 
yaffsfs_GetLastError(void)62753ac610SCharles Manning int yaffsfs_GetLastError(void)
63753ac610SCharles Manning {
64753ac610SCharles Manning 	return yaffs_errno;
65753ac610SCharles Manning }
66753ac610SCharles Manning 
67753ac610SCharles Manning 
yaffsfs_GetError(void)68753ac610SCharles Manning int yaffsfs_GetError(void)
69753ac610SCharles Manning {
70753ac610SCharles Manning 	return yaffs_errno;
71753ac610SCharles Manning }
72753ac610SCharles Manning 
yaffsfs_Lock(void)73753ac610SCharles Manning void yaffsfs_Lock(void)
74753ac610SCharles Manning {
75753ac610SCharles Manning }
76753ac610SCharles Manning 
yaffsfs_Unlock(void)77753ac610SCharles Manning void yaffsfs_Unlock(void)
78753ac610SCharles Manning {
79753ac610SCharles Manning }
80753ac610SCharles Manning 
yaffsfs_CurrentTime(void)81753ac610SCharles Manning __u32 yaffsfs_CurrentTime(void)
82753ac610SCharles Manning {
83753ac610SCharles Manning 	return 0;
84753ac610SCharles Manning }
85753ac610SCharles Manning 
yaffs_malloc(size_t size)86753ac610SCharles Manning void *yaffs_malloc(size_t size)
87753ac610SCharles Manning {
88753ac610SCharles Manning 	return malloc(size);
89753ac610SCharles Manning }
90753ac610SCharles Manning 
yaffs_free(void * ptr)91753ac610SCharles Manning void yaffs_free(void *ptr)
92753ac610SCharles Manning {
93753ac610SCharles Manning 	free(ptr);
94753ac610SCharles Manning }
95753ac610SCharles Manning 
yaffsfs_LocalInitialisation(void)96753ac610SCharles Manning void yaffsfs_LocalInitialisation(void)
97753ac610SCharles Manning {
98753ac610SCharles Manning 	/* No locking used */
99753ac610SCharles Manning }
100753ac610SCharles Manning 
101753ac610SCharles Manning 
yaffs_file_type_str(struct yaffs_stat * stat)102753ac610SCharles Manning static const char *yaffs_file_type_str(struct yaffs_stat *stat)
103753ac610SCharles Manning {
104753ac610SCharles Manning 	switch (stat->st_mode & S_IFMT) {
105753ac610SCharles Manning 	case S_IFREG: return "regular file";
106753ac610SCharles Manning 	case S_IFDIR: return "directory";
107753ac610SCharles Manning 	case S_IFLNK: return "symlink";
108753ac610SCharles Manning 	default: return "unknown";
109753ac610SCharles Manning 	}
110753ac610SCharles Manning }
111753ac610SCharles Manning 
yaffs_error_str(void)112753ac610SCharles Manning static const char *yaffs_error_str(void)
113753ac610SCharles Manning {
114753ac610SCharles Manning 	int error = yaffsfs_GetLastError();
115753ac610SCharles Manning 
116753ac610SCharles Manning 	if (error < 0)
117753ac610SCharles Manning 		error = -error;
118753ac610SCharles Manning 
119753ac610SCharles Manning 	switch (error) {
120753ac610SCharles Manning 	case EBUSY: return "Busy";
121753ac610SCharles Manning 	case ENODEV: return "No such device";
122753ac610SCharles Manning 	case EINVAL: return "Invalid parameter";
123753ac610SCharles Manning 	case ENFILE: return "Too many open files";
124753ac610SCharles Manning 	case EBADF:  return "Bad handle";
125753ac610SCharles Manning 	case EACCES: return "Wrong permissions";
126753ac610SCharles Manning 	case EXDEV:  return "Not on same device";
127753ac610SCharles Manning 	case ENOENT: return "No such entry";
128753ac610SCharles Manning 	case ENOSPC: return "Device full";
129753ac610SCharles Manning 	case EROFS:  return "Read only file system";
130753ac610SCharles Manning 	case ERANGE: return "Range error";
131753ac610SCharles Manning 	case ENOTEMPTY: return "Not empty";
132753ac610SCharles Manning 	case ENAMETOOLONG: return "Name too long";
133753ac610SCharles Manning 	case ENOMEM: return "Out of memory";
134753ac610SCharles Manning 	case EFAULT: return "Fault";
135753ac610SCharles Manning 	case EEXIST: return "Name exists";
136753ac610SCharles Manning 	case ENOTDIR: return "Not a directory";
137753ac610SCharles Manning 	case EISDIR: return "Not permitted on a directory";
138753ac610SCharles Manning 	case ELOOP:  return "Symlink loop";
139753ac610SCharles Manning 	case 0: return "No error";
140753ac610SCharles Manning 	default: return "Unknown error";
141753ac610SCharles Manning 	}
142753ac610SCharles Manning }
143753ac610SCharles Manning 
cmd_yaffs_tracemask(unsigned set,unsigned mask)144753ac610SCharles Manning void cmd_yaffs_tracemask(unsigned set, unsigned mask)
145753ac610SCharles Manning {
146753ac610SCharles Manning 	if (set)
147753ac610SCharles Manning 		yaffs_trace_mask = mask;
148753ac610SCharles Manning 
149753ac610SCharles Manning 	printf("yaffs trace mask: %08x\n", yaffs_trace_mask);
150753ac610SCharles Manning }
151753ac610SCharles Manning 
yaffs_regions_overlap(int a,int b,int x,int y)152753ac610SCharles Manning static int yaffs_regions_overlap(int a, int b, int x, int y)
153753ac610SCharles Manning {
154753ac610SCharles Manning 	return	(a <= x && x <= b) ||
155753ac610SCharles Manning 		(a <= y && y <= b) ||
156753ac610SCharles Manning 		(x <= a && a <= y) ||
157753ac610SCharles Manning 		(x <= b && b <= y);
158753ac610SCharles Manning }
159753ac610SCharles Manning 
cmd_yaffs_devconfig(char * _mp,int flash_dev,int start_block,int end_block)160753ac610SCharles Manning void cmd_yaffs_devconfig(char *_mp, int flash_dev,
161753ac610SCharles Manning 			int start_block, int end_block)
162753ac610SCharles Manning {
163753ac610SCharles Manning 	struct mtd_info *mtd = NULL;
164753ac610SCharles Manning 	struct yaffs_dev *dev = NULL;
165753ac610SCharles Manning 	struct yaffs_dev *chk;
166753ac610SCharles Manning 	char *mp = NULL;
167753ac610SCharles Manning 	struct nand_chip *chip;
168753ac610SCharles Manning 
169eb6a5c3cSGrygorii Strashko 	mtd = get_nand_dev_by_index(flash_dev);
170eb6a5c3cSGrygorii Strashko 	if (!mtd) {
171*90aa625cSMasahiro Yamada 		pr_err("\nno NAND devices available\n");
172eb6a5c3cSGrygorii Strashko 		return;
173eb6a5c3cSGrygorii Strashko 	}
174eb6a5c3cSGrygorii Strashko 
175753ac610SCharles Manning 	dev = calloc(1, sizeof(*dev));
176753ac610SCharles Manning 	mp = strdup(_mp);
177753ac610SCharles Manning 
178753ac610SCharles Manning 	if (!dev || !mp) {
179753ac610SCharles Manning 		/* Alloc error */
180753ac610SCharles Manning 		printf("Failed to allocate memory\n");
181753ac610SCharles Manning 		goto err;
182753ac610SCharles Manning 	}
183753ac610SCharles Manning 
184753ac610SCharles Manning 	if (flash_dev >= CONFIG_SYS_MAX_NAND_DEVICE) {
185753ac610SCharles Manning 		printf("Flash device invalid\n");
186753ac610SCharles Manning 		goto err;
187753ac610SCharles Manning 	}
188753ac610SCharles Manning 
189753ac610SCharles Manning 	if (end_block == 0)
1906b44adc2STom Rini 		end_block = lldiv(mtd->size, mtd->erasesize - 1);
191753ac610SCharles Manning 
192753ac610SCharles Manning 	if (end_block < start_block) {
193753ac610SCharles Manning 		printf("Bad start/end\n");
194753ac610SCharles Manning 		goto err;
195753ac610SCharles Manning 	}
196753ac610SCharles Manning 
19717cb4b8fSScott Wood 	chip =  mtd_to_nand(mtd);
198753ac610SCharles Manning 
199753ac610SCharles Manning 	/* Check for any conflicts */
200753ac610SCharles Manning 	yaffs_dev_rewind();
201753ac610SCharles Manning 	while (1) {
202753ac610SCharles Manning 		chk = yaffs_next_dev();
203753ac610SCharles Manning 		if (!chk)
204753ac610SCharles Manning 			break;
205753ac610SCharles Manning 		if (strcmp(chk->param.name, mp) == 0) {
206753ac610SCharles Manning 			printf("Mount point name already used\n");
207753ac610SCharles Manning 			goto err;
208753ac610SCharles Manning 		}
209753ac610SCharles Manning 		if (chk->driver_context == mtd &&
210753ac610SCharles Manning 			yaffs_regions_overlap(
211753ac610SCharles Manning 				chk->param.start_block, chk->param.end_block,
212753ac610SCharles Manning 				start_block, end_block)) {
213753ac610SCharles Manning 			printf("Region overlaps with partition %s\n",
214753ac610SCharles Manning 				chk->param.name);
215753ac610SCharles Manning 			goto err;
216753ac610SCharles Manning 		}
217753ac610SCharles Manning 
218753ac610SCharles Manning 	}
219753ac610SCharles Manning 
220753ac610SCharles Manning 	/* Seems sane, so configure */
221753ac610SCharles Manning 	memset(dev, 0, sizeof(*dev));
222753ac610SCharles Manning 	dev->param.name = mp;
223753ac610SCharles Manning 	dev->driver_context = mtd;
224753ac610SCharles Manning 	dev->param.start_block = start_block;
225753ac610SCharles Manning 	dev->param.end_block = end_block;
226753ac610SCharles Manning 	dev->param.chunks_per_block = mtd->erasesize / mtd->writesize;
227753ac610SCharles Manning 	dev->param.total_bytes_per_chunk = mtd->writesize;
228753ac610SCharles Manning 	dev->param.is_yaffs2 = 1;
229753ac610SCharles Manning 	dev->param.use_nand_ecc = 1;
230753ac610SCharles Manning 	dev->param.n_reserved_blocks = 5;
231753ac610SCharles Manning 	if (chip->ecc.layout->oobavail < sizeof(struct yaffs_packed_tags2))
232753ac610SCharles Manning 		dev->param.inband_tags = 1;
233753ac610SCharles Manning 	dev->param.n_caches = 10;
234753ac610SCharles Manning 	dev->param.write_chunk_tags_fn = nandmtd2_write_chunk_tags;
235753ac610SCharles Manning 	dev->param.read_chunk_tags_fn = nandmtd2_read_chunk_tags;
236753ac610SCharles Manning 	dev->param.erase_fn = nandmtd_EraseBlockInNAND;
237753ac610SCharles Manning 	dev->param.initialise_flash_fn = nandmtd_InitialiseNAND;
238753ac610SCharles Manning 	dev->param.bad_block_fn = nandmtd2_MarkNANDBlockBad;
239753ac610SCharles Manning 	dev->param.query_block_fn = nandmtd2_QueryNANDBlock;
240753ac610SCharles Manning 
241753ac610SCharles Manning 	yaffs_add_device(dev);
242753ac610SCharles Manning 
243753ac610SCharles Manning 	printf("Configures yaffs mount %s: dev %d start block %d, end block %d %s\n",
244753ac610SCharles Manning 		mp, flash_dev, start_block, end_block,
245753ac610SCharles Manning 		dev->param.inband_tags ? "using inband tags" : "");
246753ac610SCharles Manning 	return;
247753ac610SCharles Manning 
248753ac610SCharles Manning err:
249753ac610SCharles Manning 	free(dev);
250753ac610SCharles Manning 	free(mp);
251753ac610SCharles Manning }
252753ac610SCharles Manning 
cmd_yaffs_dev_ls(void)253753ac610SCharles Manning void cmd_yaffs_dev_ls(void)
254753ac610SCharles Manning {
255753ac610SCharles Manning 	struct yaffs_dev *dev;
256753ac610SCharles Manning 	int flash_dev;
257753ac610SCharles Manning 	int free_space;
258753ac610SCharles Manning 
259753ac610SCharles Manning 	yaffs_dev_rewind();
260753ac610SCharles Manning 
261753ac610SCharles Manning 	while (1) {
262753ac610SCharles Manning 		dev = yaffs_next_dev();
263753ac610SCharles Manning 		if (!dev)
264753ac610SCharles Manning 			return;
265b616d9b0SScott Wood 		flash_dev = nand_mtd_to_devnum(dev->driver_context);
266753ac610SCharles Manning 		printf("%-10s %5d 0x%05x 0x%05x %s",
267753ac610SCharles Manning 			dev->param.name, flash_dev,
268753ac610SCharles Manning 			dev->param.start_block, dev->param.end_block,
269753ac610SCharles Manning 			dev->param.inband_tags ? "using inband tags, " : "");
270753ac610SCharles Manning 
271753ac610SCharles Manning 		free_space = yaffs_freespace(dev->param.name);
272753ac610SCharles Manning 		if (free_space < 0)
273753ac610SCharles Manning 			printf("not mounted\n");
274753ac610SCharles Manning 		else
275753ac610SCharles Manning 			printf("free 0x%x\n", free_space);
276753ac610SCharles Manning 
277753ac610SCharles Manning 	}
278753ac610SCharles Manning }
279753ac610SCharles Manning 
make_a_file(char * yaffsName,char bval,int sizeOfFile)280753ac610SCharles Manning void make_a_file(char *yaffsName, char bval, int sizeOfFile)
281753ac610SCharles Manning {
282753ac610SCharles Manning 	int outh;
283753ac610SCharles Manning 	int i;
284753ac610SCharles Manning 	unsigned char buffer[100];
285753ac610SCharles Manning 
286753ac610SCharles Manning 	outh = yaffs_open(yaffsName,
287753ac610SCharles Manning 				O_CREAT | O_RDWR | O_TRUNC,
288753ac610SCharles Manning 				S_IREAD | S_IWRITE);
289753ac610SCharles Manning 	if (outh < 0) {
290753ac610SCharles Manning 		printf("Error opening file: %d. %s\n", outh, yaffs_error_str());
291753ac610SCharles Manning 		return;
292753ac610SCharles Manning 	}
293753ac610SCharles Manning 
294753ac610SCharles Manning 	memset(buffer, bval, 100);
295753ac610SCharles Manning 
296753ac610SCharles Manning 	do {
297753ac610SCharles Manning 		i = sizeOfFile;
298753ac610SCharles Manning 		if (i > 100)
299753ac610SCharles Manning 			i = 100;
300753ac610SCharles Manning 		sizeOfFile -= i;
301753ac610SCharles Manning 
302753ac610SCharles Manning 		yaffs_write(outh, buffer, i);
303753ac610SCharles Manning 
304753ac610SCharles Manning 	} while (sizeOfFile > 0);
305753ac610SCharles Manning 
306753ac610SCharles Manning 
307753ac610SCharles Manning 	yaffs_close(outh);
308753ac610SCharles Manning }
309753ac610SCharles Manning 
read_a_file(char * fn)310753ac610SCharles Manning void read_a_file(char *fn)
311753ac610SCharles Manning {
312753ac610SCharles Manning 	int h;
313753ac610SCharles Manning 	int i = 0;
314753ac610SCharles Manning 	unsigned char b;
315753ac610SCharles Manning 
316753ac610SCharles Manning 	h = yaffs_open(fn, O_RDWR, 0);
317753ac610SCharles Manning 	if (h < 0) {
318753ac610SCharles Manning 		printf("File not found\n");
319753ac610SCharles Manning 		return;
320753ac610SCharles Manning 	}
321753ac610SCharles Manning 
322753ac610SCharles Manning 	while (yaffs_read(h, &b, 1) > 0) {
323753ac610SCharles Manning 		printf("%02x ", b);
324753ac610SCharles Manning 		i++;
325753ac610SCharles Manning 		if (i > 32) {
326753ac610SCharles Manning 			printf("\n");
32751855e89SMasahiro Yamada 			i = 0;
328753ac610SCharles Manning 		}
329753ac610SCharles Manning 	}
330753ac610SCharles Manning 	printf("\n");
331753ac610SCharles Manning 	yaffs_close(h);
332753ac610SCharles Manning }
333753ac610SCharles Manning 
cmd_yaffs_mount(char * mp)334753ac610SCharles Manning void cmd_yaffs_mount(char *mp)
335753ac610SCharles Manning {
336753ac610SCharles Manning 	int retval = yaffs_mount(mp);
337753ac610SCharles Manning 	if (retval < 0)
338753ac610SCharles Manning 		printf("Error mounting %s, return value: %d, %s\n", mp,
339753ac610SCharles Manning 			yaffsfs_GetError(), yaffs_error_str());
340753ac610SCharles Manning }
341753ac610SCharles Manning 
342753ac610SCharles Manning 
cmd_yaffs_umount(char * mp)343753ac610SCharles Manning void cmd_yaffs_umount(char *mp)
344753ac610SCharles Manning {
345753ac610SCharles Manning 	if (yaffs_unmount(mp) == -1)
346753ac610SCharles Manning 		printf("Error umounting %s, return value: %d, %s\n", mp,
347753ac610SCharles Manning 			yaffsfs_GetError(), yaffs_error_str());
348753ac610SCharles Manning }
349753ac610SCharles Manning 
cmd_yaffs_write_file(char * yaffsName,char bval,int sizeOfFile)350753ac610SCharles Manning void cmd_yaffs_write_file(char *yaffsName, char bval, int sizeOfFile)
351753ac610SCharles Manning {
352753ac610SCharles Manning 	make_a_file(yaffsName, bval, sizeOfFile);
353753ac610SCharles Manning }
354753ac610SCharles Manning 
355753ac610SCharles Manning 
cmd_yaffs_read_file(char * fn)356753ac610SCharles Manning void cmd_yaffs_read_file(char *fn)
357753ac610SCharles Manning {
358753ac610SCharles Manning 	read_a_file(fn);
359753ac610SCharles Manning }
360753ac610SCharles Manning 
361753ac610SCharles Manning 
cmd_yaffs_mread_file(char * fn,char * addr)362753ac610SCharles Manning void cmd_yaffs_mread_file(char *fn, char *addr)
363753ac610SCharles Manning {
364753ac610SCharles Manning 	int h;
365753ac610SCharles Manning 	struct yaffs_stat s;
366753ac610SCharles Manning 
367753ac610SCharles Manning 	yaffs_stat(fn, &s);
368753ac610SCharles Manning 
369753ac610SCharles Manning 	printf("Copy %s to 0x%p... ", fn, addr);
370753ac610SCharles Manning 	h = yaffs_open(fn, O_RDWR, 0);
371753ac610SCharles Manning 	if (h < 0) {
372753ac610SCharles Manning 		printf("File not found\n");
373753ac610SCharles Manning 		return;
374753ac610SCharles Manning 	}
375753ac610SCharles Manning 
376753ac610SCharles Manning 	yaffs_read(h, addr, (int)s.st_size);
377753ac610SCharles Manning 	printf("\t[DONE]\n");
378753ac610SCharles Manning 
379753ac610SCharles Manning 	yaffs_close(h);
380753ac610SCharles Manning }
381753ac610SCharles Manning 
382753ac610SCharles Manning 
cmd_yaffs_mwrite_file(char * fn,char * addr,int size)383753ac610SCharles Manning void cmd_yaffs_mwrite_file(char *fn, char *addr, int size)
384753ac610SCharles Manning {
385753ac610SCharles Manning 	int outh;
386753ac610SCharles Manning 
387753ac610SCharles Manning 	outh = yaffs_open(fn, O_CREAT | O_RDWR | O_TRUNC, S_IREAD | S_IWRITE);
388753ac610SCharles Manning 	if (outh < 0)
389753ac610SCharles Manning 		printf("Error opening file: %d, %s\n", outh, yaffs_error_str());
390753ac610SCharles Manning 
391753ac610SCharles Manning 	yaffs_write(outh, addr, size);
392753ac610SCharles Manning 
393753ac610SCharles Manning 	yaffs_close(outh);
394753ac610SCharles Manning }
395753ac610SCharles Manning 
396753ac610SCharles Manning 
cmd_yaffs_ls(const char * mountpt,int longlist)397753ac610SCharles Manning void cmd_yaffs_ls(const char *mountpt, int longlist)
398753ac610SCharles Manning {
399753ac610SCharles Manning 	int i;
400753ac610SCharles Manning 	yaffs_DIR *d;
401753ac610SCharles Manning 	struct yaffs_dirent *de;
402753ac610SCharles Manning 	struct yaffs_stat stat;
403753ac610SCharles Manning 	char tempstr[255];
404753ac610SCharles Manning 
405753ac610SCharles Manning 	d = yaffs_opendir(mountpt);
406753ac610SCharles Manning 
407753ac610SCharles Manning 	if (!d) {
408753ac610SCharles Manning 		printf("opendir failed, %s\n", yaffs_error_str());
409753ac610SCharles Manning 		return;
410753ac610SCharles Manning 	}
411753ac610SCharles Manning 
412753ac610SCharles Manning 	for (i = 0; (de = yaffs_readdir(d)) != NULL; i++) {
413753ac610SCharles Manning 		if (longlist) {
414753ac610SCharles Manning 			sprintf(tempstr, "%s/%s", mountpt, de->d_name);
415753ac610SCharles Manning 			yaffs_lstat(tempstr, &stat);
416753ac610SCharles Manning 			printf("%-25s\t%7ld",
417753ac610SCharles Manning 					de->d_name,
418753ac610SCharles Manning 					(long)stat.st_size);
419753ac610SCharles Manning 			printf(" %5d %s\n",
420753ac610SCharles Manning 					stat.st_ino,
421753ac610SCharles Manning 					yaffs_file_type_str(&stat));
422753ac610SCharles Manning 		} else {
423753ac610SCharles Manning 			printf("%s\n", de->d_name);
424753ac610SCharles Manning 		}
425753ac610SCharles Manning 	}
426753ac610SCharles Manning 
427753ac610SCharles Manning 	yaffs_closedir(d);
428753ac610SCharles Manning }
429753ac610SCharles Manning 
430753ac610SCharles Manning 
cmd_yaffs_mkdir(const char * dir)431753ac610SCharles Manning void cmd_yaffs_mkdir(const char *dir)
432753ac610SCharles Manning {
433753ac610SCharles Manning 	int retval = yaffs_mkdir(dir, 0);
434753ac610SCharles Manning 
435753ac610SCharles Manning 	if (retval < 0)
436753ac610SCharles Manning 		printf("yaffs_mkdir returning error: %d, %s\n",
437753ac610SCharles Manning 			retval, yaffs_error_str());
438753ac610SCharles Manning }
439753ac610SCharles Manning 
cmd_yaffs_rmdir(const char * dir)440753ac610SCharles Manning void cmd_yaffs_rmdir(const char *dir)
441753ac610SCharles Manning {
442753ac610SCharles Manning 	int retval = yaffs_rmdir(dir);
443753ac610SCharles Manning 
444753ac610SCharles Manning 	if (retval < 0)
445753ac610SCharles Manning 		printf("yaffs_rmdir returning error: %d, %s\n",
446753ac610SCharles Manning 			retval, yaffs_error_str());
447753ac610SCharles Manning }
448753ac610SCharles Manning 
cmd_yaffs_rm(const char * path)449753ac610SCharles Manning void cmd_yaffs_rm(const char *path)
450753ac610SCharles Manning {
451753ac610SCharles Manning 	int retval = yaffs_unlink(path);
452753ac610SCharles Manning 
453753ac610SCharles Manning 	if (retval < 0)
454753ac610SCharles Manning 		printf("yaffs_unlink returning error: %d, %s\n",
455753ac610SCharles Manning 			retval, yaffs_error_str());
456753ac610SCharles Manning }
457753ac610SCharles Manning 
cmd_yaffs_mv(const char * oldPath,const char * newPath)458753ac610SCharles Manning void cmd_yaffs_mv(const char *oldPath, const char *newPath)
459753ac610SCharles Manning {
460753ac610SCharles Manning 	int retval = yaffs_rename(newPath, oldPath);
461753ac610SCharles Manning 
462753ac610SCharles Manning 	if (retval < 0)
463753ac610SCharles Manning 		printf("yaffs_unlink returning error: %d, %s\n",
464753ac610SCharles Manning 			retval, yaffs_error_str());
465753ac610SCharles Manning }
466