|
Message
From: cvs at opencores.org<cvs@o...>
Date: Thu Jun 7 16:37:31 CEST 2007
Subject: [cvs-checkins] MODIFIED: jop ...
Date: 00/07/06 07:16:37 Added: jop/java/target/src/common/yaffs2/port CFG_H.java Dtest_C.java ECC_C.java ECC_H.java Guts_H.java Template.java devextras.java devextrasEnumeration.java iattr.java list_head.java yaffs_BlockIndex.java yaffs_BlockInfo.java yaffs_CheckpointDevice.java yaffs_CheckpointObject.java yaffs_CheckpointValidity.java yaffs_ChunkCache.java yaffs_DIR.java yaffs_Device.java yaffs_DirectoryStructure.java yaffs_ECCOther.java yaffs_ExtendedTags.java yaffs_FileStructure.java yaffs_HardLinkStructure.java yaffs_NANDSpare.java yaffs_Object.java yaffs_ObjectBucket.java yaffs_ObjectHeader.java yaffs_ObjectList.java yaffs_ObjectVariant.java yaffs_PackedTags1.java yaffs_PackedTags2.java yaffs_PackedTags2TagsPart.java yaffs_Spare.java yaffs_SuperBlockHeader.java yaffs_SymLinkStructure.java yaffs_Tags.java yaffs_TempBuffer.java yaffs_Tnode.java yaffs_TnodeList.java yaffs_Tnode_internal.java yaffs_Tnode_level0.java yaffs_checkptrw_C.java yaffs_checkptrw_H.java yaffs_dirent.java yaffs_fileem2k_C.java yaffs_fileem2k_H.java yaffs_guts_C.java yaffs_nand_C.java yaffs_packedtags1_C.java yaffs_packedtags1_H.java yaffs_packedtags2_C.java yaffs_packedtags2_H.java yaffs_qsort_C.java yaffs_ramdisk_C.java yaffs_stat.java yaffs_tagscompat_C.java yaffs_tagscompat_H.java yaffs_tagsvalidity_C.java yaffs_tagsvalidity_H.java yaffscfg2k_C.java yaffscfg_C.java yaffsfs_C.java yaffsfs_DeviceConfiguration.java yaffsfs_DirectorySearchContext.java yaffsfs_H.java yaffsfs_Handle.java ydirectenv.java yflash_Block.java yflash_Device.java yflash_Page.java yportenv.java yramdisk_Block.java yramdisk_Device.java yramdisk_Page.java Log: Java port of YAFFS, a NAND flash file system. Under development. Revision Changes Path 1.1 jop/java/target/src/common/yaffs2/port/CFG_H.java http://www.opencores.org/cvsweb.shtml/jop/java/target/src/common/yaffs2/port/CFG_H.java?rev=1.1&content-type=text/x-cvsweb-markup Index: CFG_H.java =================================================================== package yaffs2.port; public abstract class CFG_H { /* * YAFFS: Yet another Flash File System . A NAND-flash specific file system. * * Copyright (C) 2002-2007 Aleph One Ltd. * for Toby Churchill Ltd and Brightstar Engineering * * Created by Charles Manning <charles@a...> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1 as * published by the Free Software Foundation. * * Note: Only YAFFS headers are LGPL, YAFFS C code is covered by GPL. */ /* * Header file for using yaffs in an application via * a direct interface. */ static final int YAFFSFS_N_HANDLES = 200; } 1.1 jop/java/target/src/common/yaffs2/port/Dtest_C.java http://www.opencores.org/cvsweb.shtml/jop/java/target/src/common/yaffs2/port/Dtest_C.java?rev=1.1&content-type=text/x-cvsweb-markup Index: Dtest_C.java =================================================================== package yaffs2.port; import java.io.RandomAccessFile; import static yaffs2.port.yaffsfs_C.*; import static yaffs2.port.yaffsfs_H.*; import static yaffs2.utils.Unix.*; import static yaffs2.utils.emulation.FileEmulationUnix.*; import static yaffs2.utils.emulation.Utils.*; import static yaffs2.utils.Constants.*; import static yaffs2.utils.Utils.*; public class Dtest_C { /* * YAFFS: Yet Another Flash File System. A NAND-flash specific file system.
*
* Copyright (C) 2002-2007 Aleph One Ltd.
* for Toby Churchill Ltd and Brightstar Engineering
*
* Created by Charles Manning <charles@a...>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*/
/*
* Test code for the "direct" interface.
*/
//void dumpDir(const char *dname);
static byte[] xx = new byte[600];//char xx[600];
static final int xxIndex = 0;
static void copy_in_a_file(String yaffsName, String inName)
{
RandomAccessFile inh;
int outh;
/*unsigned char buffer[100];*/
byte[] buffer = new byte[100]; final int bufferIndex = 0;
int ni,no;
inh = open(inName,O_RDONLY);
outh = yaffs_open(StringToByteArray(yaffsName), 0, O_CREAT | O_RDWR | O_TRUNC, S_IREAD | S_IWRITE);
while((ni = read(inh,buffer,bufferIndex,100)) > 0)
{
no = yaffs_write(outh,buffer,bufferIndex,ni);
if(ni != no)
{
printf("problem writing yaffs file\n");
}
}
yaffs_close(outh);
close(inh);
}
static void make_a_file(byte[] yaffsName,int yaffsNameIndex,byte bval,int sizeOfFile)
{
int outh;
int i;
//unsigned char buffer[100];
byte[] buffer = new byte[100]; final int bufferIndex = 0;
outh = yaffs_open(yaffsName, yaffsNameIndex, O_CREAT | O_RDWR | O_TRUNC, S_IREAD | S_IWRITE);
memset(buffer,bufferIndex,bval,100);
do{
i = sizeOfFile;
if(i > 100) i = 100;
sizeOfFile -= i;
yaffs_write(outh,buffer,bufferIndex,i);
} while (sizeOfFile > 0);
yaffs_close(outh);
}
static void make_pattern_file(byte[] fn,int fnIndex,int size)
{
int outh;
int marker;
int i;
outh = yaffs_open(fn, fnIndex, O_CREAT | O_RDWR | O_TRUNC, S_IREAD | S_IWRITE);
yaffs_lseek(outh,size-1,SEEK_SET);
yaffs_write(outh,new byte[] {'A'},0,1);
for(i = 0; i < size; i+=256)
{
marker = ~i;
yaffs_lseek(outh,i,SEEK_SET);
yaffs_write(outh,IntToByteArray(marker),0,SIZEOF_INT);
}
yaffs_close(outh);
}
static boolean check_pattern_file(byte[] fn, int fnIndex)
{
int h;
byte[] marker = new byte[SIZEOF_INT];
int i;
int size;
boolean ok = true;
h = yaffs_open(fn, fnIndex, O_RDWR,0);
size = yaffs_lseek(h,0,SEEK_END);
for(i = 0; i < size; i+=256)
{
yaffs_lseek(h,i,SEEK_SET);
yaffs_read(h,marker,0,SIZEOF_INT);
ok = (getIntFromByteArray(marker,0) == ~i);
if(!ok)
{
printf("pattern check failed on file %a, size %d at position %d. Got %x instead of %x\n",
fn,fnIndex,size,i,getIntFromByteArray(marker,0),~i);
}
}
yaffs_close(h);
return ok;
}
static boolean dump_file_data(byte[] fn, int fnIndex)
{
int h;
int marker;
int i = 0;
int size;
boolean ok = true;
/*unsigned*/ byte[] b = new byte[1];
h = yaffs_open(fn, fnIndex, O_RDWR,0);
printf("%a\n",fn,fnIndex);
while(yaffs_read(h,b,0,1)> 0)
{
printf("%02x",b);
i++;
if(i > 32)
{
printf("\n");
i = 0;;
}
}
printf("\n");
yaffs_close(h);
return ok;
}
static void dump_file(byte[] fn, int fnIndex)
{
int i;
int size;
int h;
h = yaffs_open(fn,fnIndex,O_RDONLY,0);
if(h < 0)
{
printf("*****\nDump file %a does not exist\n",fn,fnIndex);
}
else
{
size = yaffs_lseek(h,0,SEEK_SET);
printf("*****\nDump file %a size %d\n",fn,fnIndex,size);
for(i = 0; i < size; i++)
{
}
}
}
static void create_file_of_size(byte[] fn,int fnIndex,int syze)
{
int h;
int n;
//char xx[200];
byte[] xx = new byte[200]; final int xxIndex = 0;
int iterations = (syze + /*strlen*/(fn.length) -1)/ /*strlen*/(fn.length);
h = yaffs_open(fn, fnIndex, O_CREAT | O_RDWR | O_TRUNC, S_IREAD | S_IWRITE);
while (iterations > 0)
{
sprintf(xx,xxIndex,"%a %8d",fn,fnIndex,iterations);
yaffs_write(h,xx,xxIndex,strlen(xx, xxIndex));
iterations--;
}
yaffs_close (h);
}
static void verify_file_of_size(byte[] fn,int fnIndex,int syze)
{
int h;
int n;
byte[] xx = new byte[200]; final int xxIndex = 0;
byte[] yy = new byte[200]; final int yyIndex = 0;
int l;
int iterations = (syze + strlen(fn,fnIndex) -1)/ strlen(fn,fnIndex);
h = yaffs_open(fn, fnIndex, O_RDONLY, S_IREAD | S_IWRITE);
while (iterations > 0)
{
sprintf(xx,xxIndex,"%a %8d",fn,fnIndex,iterations);
l = strlen(xx,xxIndex);
yaffs_read(h,yy,xxIndex,l);
yy[l] = 0;
if(strcmp(xx,xxIndex,yy,yyIndex) != 0){
printf("=====>>>>> verification of file %a failed near position %d\n",fn,fnIndex,yaffs_lseek(h,0,SEEK_CUR));
}
iterations--;
}
yaffs_close (h);
}
static void create_resized_file_of_size(/*const char **/ byte[] fn,int fnIndex,
int syze1,int reSyze, int syze2)
{
int h;
int n;
int iterations;
h = yaffs_open(fn, fnIndex, O_CREAT | O_RDWR | O_TRUNC, S_IREAD | S_IWRITE);
iterations = (syze1 + strlen(fn,fnIndex) -1)/ strlen(fn,fnIndex);
while (iterations > 0)
{
yaffs_write(h,fn,fnIndex,strlen(fn,fnIndex));
iterations--;
}
yaffs_truncate(h,reSyze);
yaffs_lseek(h,0,SEEK_SET);
iterations = (syze2 + strlen(fn,fnIndex) -1)/ strlen(fn,fnIndex);
while (iterations > 0)
{
yaffs_write(h,fn,fnIndex,strlen(fn,fnIndex));
iterations--;
}
yaffs_close (h);
}
static void do_some_file_stuff(byte[] path, int pathIndex)
{
byte[] fn = new byte[100]; final int fnIndex = 0;
sprintf(fn,fnIndex,"%a/%s",path,pathIndex,"f1");
create_file_of_size(fn,fnIndex,10000);
sprintf(fn,fnIndex,"%a/%s",path,pathIndex,"fdel");
create_file_of_size(fn,fnIndex,10000);
yaffs_unlink(fn,fnIndex);
sprintf(fn,fnIndex,"%a/%s",path,pathIndex,"f2");
create_resized_file_of_size(fn,fnIndex,10000,3000,4000);
}
static void yaffs_backward_scan_test(byte[] path, int pathIndex)
{
byte[] fn = new byte[100]; final int fnIndex = 0;
yaffs2.utils.Globals.configuration.yaffs_StartUp();
yaffs_mount(path,pathIndex);
do_some_file_stuff(path,pathIndex);
sprintf(fn,fnIndex,"%a/ddd",path,pathIndex);
yaffs_mkdir(fn,fnIndex,0);
do_some_file_stuff(fn,fnIndex);
yaffs_unmount(path,pathIndex);
yaffs_mount(path,pathIndex);
}
static byte[] xxzz = new byte[2000]; static int xxzzIndex = 0;
static void yaffs_device_flush_test(byte[] path, int pathIndex)
{
byte[] fn = new byte[100]; int fnIndex = 0;
int h;
int i;
yaffs2.utils.Globals.configuration.yaffs_StartUp();
yaffs_mount(path, pathIndex);
do_some_file_stuff(path, pathIndex);
// Open and add some data to a few files
for(i = 0; i < 10; i++) {
sprintf(fn,fnIndex,"%a/ff%d",path,pathIndex,i);
h = yaffs_open(fn, fnIndex, O_CREAT | O_RDWR | O_TRUNC, S_IWRITE | S_IREAD);
yaffs_write(h,xxzz,xxzzIndex,2000);
yaffs_write(h,xxzz,xxzzIndex,2000);
}
yaffs_unmount(path,pathIndex);
yaffs_mount(path,pathIndex);
}
static void short_scan_test(byte[] path, int pathIndex, int fsize, int niterations)
{
int i;
byte[] fn = new byte[100]; final int fnIndex = 0;
sprintf(fn,fnIndex,"%a/%s",path,pathIndex,"f1");
yaffs2.utils.Globals.configuration.yaffs_StartUp();
for(i = 0; i < niterations; i++)
{
printf("\n*****************\nIteration %d\n",i);
yaffs_mount(path,pathIndex);
printf("\nmount: Directory look-up of %a\n",path,pathIndex);
dumpDir(path, pathIndex);
make_a_file(fn, fnIndex,(byte)1,fsize);
yaffs_unmount(path, pathIndex);
}
}
static void scan_pattern_test(byte[] path, int pathIndex, int fsize, int niterations)
{
int i;
int j;
byte[][] fn = new byte[3][100]; final int fnIndex = 0;
boolean result;
sprintf(fn[0],fnIndex,"%a/%s",path,pathIndex,"f0");
sprintf(fn[1],fnIndex,"%a/%s",path,pathIndex,"f1");
sprintf(fn[2],fnIndex,"%a/%s",path,pathIndex,"f2");
yaffs2.utils.Globals.configuration.yaffs_StartUp();
for(i = 0; i < niterations; i++)
{
printf("\n*****************\nIteration %d\n",i);
yaffs_mount(path, pathIndex);
printf("\nmount: Directory look-up of %a\n",path,pathIndex);
dumpDir(path, pathIndex);
for(j = 0; j < 3; j++)
{
result = dump_file_data(fn[j],fnIndex);
result = check_pattern_file(fn[j],fnIndex);
make_pattern_file(fn[j],fnIndex,fsize);
result = dump_file_data(fn[j],fnIndex);
result = check_pattern_file(fn[j],fnIndex);
}
yaffs_unmount(path, pathIndex);
}
}
static void fill_disk(byte[] path, int pathIndex, int nfiles)
{
int h;
int n;
int result;
int f;
byte[] str = new byte[50]; final int strIndex = 0;
for(n = 0; n < nfiles; n++)
{
sprintf(str,strIndex,"%a/%d",path,pathIndex,n);
h = yaffs_open(str, strIndex, O_CREAT | O_RDWR | O_TRUNC, S_IREAD | S_IWRITE);
printf("writing file %a handle %d ",str,strIndex,h);
while ((result = yaffs_write(h,xx,xxIndex,600)) == 600)
{
f = yaffs_freespace(path, pathIndex);
}
result = yaffs_close(h);
printf(" close %d\n",result);
}
}
static void fill_disk_and_delete(byte[] path, int pathIndex, int nfiles, int ncycles)
{
int i,j;
byte[] str = new byte[50]; final int strIndex = 0;
int result;
for(i = 0; i < ncycles; i++)
{
printf("@@@@@@@@@@@@@@ cycle %d\n",i);
fill_disk(path,pathIndex,nfiles);
for(j = 0; j < nfiles; j++)
{
sprintf(str,strIndex,"%a/%d",path,pathIndex,j);
result = yaffs_unlink(str,strIndex);
printf("unlinking file %a, result %d\n",str,strIndex,result);
}
}
}
static void fill_files(byte[] path, int pathIndex, int flags, int maxIterations, int siz)
{
int i;
int j;
byte[] str = new byte[50]; final int strIndex = 0;
int h;
i = 0;
do{
sprintf(str,strIndex,"%a/%d",path,pathIndex,i);
h = yaffs_open(str, strIndex, O_CREAT | O_TRUNC | O_RDWR,S_IREAD | S_IWRITE);
yaffs_close(h);
if(h >= 0)
{
for(j = 0; j < siz; j++)
{
yaffs_write(h,str,strIndex,1);
}
}
if((flags & 1) != 0)
{
yaffs_unlink(str, strIndex);
}
i++;
} while(h >= 0 && i < maxIterations);
if((flags & 2) != 0)
{
i = 0;
do{
sprintf(str, strIndex, "%a/%d", path, pathIndex, i);
printf("unlink %a\n",str,strIndex);
i++;
} while(yaffs_unlink(str,strIndex) >= 0);
}
}
static void leave_unlinked_file(byte[] path, int pathIndex,int maxIterations,int siz)
{
int i;
byte[] str = new byte[50]; final int strIndex = 0;
int h;
i = 0;
do{
sprintf(str, strIndex,"%a/%d",path, pathIndex,i);
printf("create %a\n",str, strIndex);
h = yaffs_open(str, strIndex, O_CREAT | O_TRUNC | O_RDWR,S_IREAD | S_IWRITE);
if(h >= 0)
{
yaffs_unlink(str, strIndex);
}
i++;
} while(h < 0 && i < maxIterations);
if(h >= 0)
{
for(i = 0; i < siz; i++)
{
yaffs_write(h,str, strIndex,1);
}
}
printf("Leaving file %a open\n",str, strIndex);
}
static void dumpDirFollow(byte[] dname, int dnameIndex)
{
yaffs_DIR d;
yaffs_dirent de;
yaffs_stat s = new yaffs_stat();
byte[] str = new byte[100]; final int strIndex = 0;
d = yaffs_opendir(dname, dnameIndex);
if(!(d != null))
{
printf("opendir failed\n");
}
else
{
while((de = yaffs_readdir(d)) != null)
{
sprintf(str, strIndex,"%a/%a",dname, dnameIndex,de.d_name,de.d_nameIndex);
yaffs_stat(str, strIndex, s);
printf("%a length %d mode %X ",de.d_name,de.d_nameIndex,(int)s.st_size,s.st_mode);
switch(s.st_mode & S_IFMT)
{
case S_IFREG: printf("data file"); break;
case S_IFDIR: printf("directory"); break;
case S_IFLNK: printf("symlink -->");
if(yaffs_readlink(str, strIndex,str, strIndex,100) < 0)
printf("no alias");
else
printf("\"%a\"",str, strIndex);
break;
default: printf("unknown"); break;
}
printf("\n");
}
yaffs_closedir(d);
}
printf("\n");
printf("Free space in %a is %d\n\n",dname,dnameIndex,(int)yaffs_freespace(dname, dnameIndex));
}
static void dump_directory_tree_worker(byte[] dname, int dnameIndex, int recursive)
{
yaffs_DIR d;
yaffs_dirent de;
yaffs_stat s = new yaffs_stat();
byte[] str = new byte[1000]; final int strIndex = 0;
d = yaffs_opendir(dname, dnameIndex);
if(!(d != null))
{
printf("opendir failed\n");
}
else
{
while((de = yaffs_readdir(d)) != null)
{
sprintf(str, strIndex,"%a/%a",dname,dnameIndex,de.d_name,de.d_nameIndex);
yaffs_lstat(str, strIndex,s);
printf("%a inode %d obj %x length %d mode %X ",str,strIndex,s.st_ino,
yaffs2.utils.Utils.hashCode(de.d_dont_use),(int)s.st_size,s.st_mode);
switch(s.st_mode & S_IFMT)
{
case S_IFREG: printf("data file"); break;
case S_IFDIR: printf("directory"); break;
case S_IFLNK: printf("symlink -->");
if(yaffs_readlink(str, strIndex,str, strIndex,100) < 0)
printf("no alias");
else
printf("\"%a\"",str, strIndex);
break;
default: printf("unknown"); break;
}
printf("\n");
if((s.st_mode & S_IFMT) == S_IFDIR && recursive != 0)
dump_directory_tree_worker(str, strIndex,1);
}
yaffs_closedir(d);
}
}
static void dump_directory_tree(byte[] dname, int dnameIndex)
{
dump_directory_tree_worker(dname, dnameIndex,1);
printf("\n");
printf("Free space in %a is %d\n\n",dname,dnameIndex,(int)yaffs_freespace(dname, dnameIndex));
}
static void dumpDir(byte[] dname, int dnameIndex)
{ dump_directory_tree_worker(dname, dnameIndex,0);
printf("\n");
printf("Free space in %a is %d\n\n",dname, dnameIndex,(int)yaffs_freespace(dname, dnameIndex));
}
static void PermissionsCheck(byte[] path, int pathIndex, /*mode_t*/ int tmode, int tflags,int expectedResult)
{
int fd;
if(yaffs_chmod(path, pathIndex,tmode)< 0) printf("chmod failed\n");
fd = yaffs_open(path, pathIndex,tflags,0);
if((fd >= 0) != (expectedResult > 0))
{
printf("Permissions check %x %x %d failed\n",tmode,tflags,expectedResult);
}
else
{
printf("Permissions check %x %x %d OK\n",tmode,tflags,expectedResult);
}
yaffs_close(fd);
}
// XXX translate
// static int long_test(int argc, char *argv[])
// {
//
// int f;
// int r;
// char buffer[20];
//
// char str[100];
//
// int h;
// mode_t temp_mode;
// struct yaffs_stat ystat;
//
// yaffs_StartUp();
//
// yaffs_mount("/boot");
// yaffs_mount("/data");
// yaffs_mount("/flash");
// yaffs_mount("/ram");
//
// printf("\nDirectory look-up of /boot\n");
// dumpDir("/boot");
// printf("\nDirectory look-up of /data\n");
// dumpDir("/data");
// printf("\nDirectory look-up of /flash\n");
// dumpDir("/flash");
//
// //leave_unlinked_file("/flash",20000,0);
// //leave_unlinked_file("/data",20000,0);
//
// leave_unlinked_file("/ram",20,0);
//
//
// f = yaffs_open("/boot/b1", O_RDONLY,0);
//
// printf("open /boot/b1 readonly, f=%d\n",f);
//
// f = yaffs_open("/boot/b1", O_CREAT,S_IREAD | S_IWRITE);
//
// printf("open /boot/b1 O_CREAT, f=%d\n",f);
//
//
// r = yaffs_write(f,"hello",1);
// printf("write %d attempted to write to a read-only file\n",r);
//
// r = yaffs_close(f);
//
// printf("close %d\n",r);
//
// f = yaffs_open("/boot/b1", O_RDWR,0);
//
// printf("open /boot/b1 O_RDWR,f=%d\n",f);
//
//
// r = yaffs_write(f,"hello",2);
// printf("write %d attempted to write to a writeable file\n",r);
// r = yaffs_write(f,"world",3);
// printf("write %d attempted to write to a writeable file\n",r);
//
// r= yaffs_lseek(f,0,SEEK_END);
// printf("seek end %d\n",r);
// memset(buffer,0,20);
// r = yaffs_read(f,buffer,10);
// printf("read %d \"%s\"\n",r,buffer);
// r= yaffs_lseek(f,0,SEEK_SET);
// printf("seek set %d\n",r);
// memset(buffer,0,20);
// r = yaffs_read(f,buffer,10);
// printf("read %d \"%s\"\n",r,buffer);
// memset(buffer,0,20);
// r = yaffs_read(f,buffer,10);
// printf("read %d \"%s\"\n",r,buffer);
//
// // Check values reading at end.
// // A read past end of file should return 0 for 0 bytes read.
//
// r= yaffs_lseek(f,0,SEEK_END);
// r = yaffs_read(f,buffer,10);
// printf("read at end returned %d\n",r);
// r= yaffs_lseek(f,500,SEEK_END);
// r = yaffs_read(f,buffer,10);
// printf("read past end returned %d\n",r);
//
// r = yaffs_close(f);
//
// printf("close %d\n",r);
//
// copy_in_a_file("/boot/yyfile","xxx");
//
// // Create a file with a long name
//
// copy_in_a_file("/boot/file with a long name","xxx");
//
//
// printf("\nDirectory look-up of /boot\n");
// dumpDir("/boot");
//
// // Check stat
// r = yaffs_stat("/boot/file with a long name",&ystat);
//
// // Check rename
//
// r = yaffs_rename("/boot/file with a long name","/boot/r1");
//
// printf("\nDirectory look-up of /boot\n");
// dumpDir("/boot");
//
// // Check unlink
// r = yaffs_unlink("/boot/r1");
//
// printf("\nDirectory look-up of /boot\n");
// dumpDir("/boot");
//
// // Check mkdir
//
// r = yaffs_mkdir("/boot/directory1",0);
//
// printf("\nDirectory look-up of /boot\n");
// dumpDir("/boot");
// printf("\nDirectory look-up of /boot/directory1\n");
// dumpDir("/boot/directory1");
//
// // add a file to the directory
// copy_in_a_file("/boot/directory1/file with a long name","xxx");
//
// printf("\nDirectory look-up of /boot\n");
// dumpDir("/boot");
// printf("\nDirectory look-up of /boot/directory1\n");
// dumpDir("/boot/directory1");
//
// // Attempt to delete directory (should fail)
//
// r = yaffs_rmdir("/boot/directory1");
//
// printf("\nDirectory look-up of /boot\n");
// dumpDir("/boot");
// printf("\nDirectory look-up of /boot/directory1\n");
// dumpDir("/boot/directory1");
//
// // Delete file first, then rmdir should work
// r = yaffs_unlink("/boot/directory1/file with a long name");
// r = yaffs_rmdir("/boot/directory1");
//
//
// printf("\nDirectory look-up of /boot\n");
// dumpDir("/boot");
// printf("\nDirectory look-up of /boot/directory1\n");
// dumpDir("/boot/directory1");
//
// #if 0
// fill_disk_and_delete("/boot",20,20);
//
// printf("\nDirectory look-up of /boot\n");
// dumpDir("/boot");
// #endif
//
// yaffs_symlink("yyfile","/boot/slink");
//
// yaffs_readlink("/boot/slink",str,100);
// printf("symlink alias is %s\n",str);
//
//
//
//
// printf("\nDirectory look-up of /boot\n");
// dumpDir("/boot");
// printf("\nDirectory look-up of /boot (using stat instead of lstat)\n");
// dumpDirFollow("/boot");
// printf("\nDirectory look-up of /boot/directory1\n");
// dumpDir("/boot/directory1");
//
// h = yaffs_open("/boot/slink",O_RDWR,0);
//
// printf("file length is %d\n",(int)yaffs_lseek(h,0,SEEK_END));
//
// yaffs_close(h);
//
// yaffs_unlink("/boot/slink");
//
//
// printf("\nDirectory look-up of /boot\n");
// dumpDir("/boot");
//
// // Check chmod
//
// yaffs_stat("/boot/yyfile",&ystat);
// temp_mode = ystat.st_mode;
//
// yaffs_chmod("/boot/yyfile",0x55555);
// printf("\nDirectory look-up of /boot\n");
// dumpDir("/boot");
//
// yaffs_chmod("/boot/yyfile",temp_mode);
// printf("\nDirectory look-up of /boot\n");
// dumpDir("/boot");
//
// // Permission checks...
// PermissionsCheck("/boot/yyfile",0, O_WRONLY,0);
// PermissionsCheck("/boot/yyfile",0, O_RDONLY,0);
// PermissionsCheck("/boot/yyfile",0, O_RDWR,0);
//
// PermissionsCheck("/boot/yyfile",S_IREAD, O_WRONLY,0);
// PermissionsCheck("/boot/yyfile",S_IREAD, O_RDONLY,1);
// PermissionsCheck("/boot/yyfile",S_IREAD, O_RDWR,0);
//
// PermissionsCheck("/boot/yyfile",S_IWRITE, O_WRONLY,1);
// PermissionsCheck("/boot/yyfile",S_IWRITE, O_RDONLY,0);
// PermissionsCheck("/boot/yyfile",S_IWRITE, O_RDWR,0);
//
// PermissionsCheck("/boot/yyfile",S_IREAD | S_IWRITE, O_WRONLY,1);
// PermissionsCheck("/boot/yyfile",S_IREAD | S_IWRITE, O_RDONLY,1);
// PermissionsCheck("/boot/yyfile",S_IREAD | S_IWRITE, O_RDWR,1);
//
// yaffs_chmod("/boot/yyfile",temp_mode);
//
// //create a zero-length file and unlink it (test for scan bug)
//
// h = yaffs_open("/boot/zlf",O_CREAT | O_TRUNC | O_RDWR,0);
// yaffs_close(h);
//
// yaffs_unlink("/boot/zlf");
//
//
// yaffs_DumpDevStruct("/boot");
//
// fill_disk_and_delete("/boot",20,20);
//
// yaffs_DumpDevStruct("/boot");
//
// fill_files("/boot",1,10000,0);
// fill_files("/boot",1,10000,5000);
// fill_files("/boot",2,10000,0);
// fill_files("/boot",2,10000,5000);
//
// leave_unlinked_file("/data",20000,0);
// leave_unlinked_file("/data",20000,5000);
// leave_unlinked_file("/data",20000,5000);
// leave_unlinked_file("/data",20000,5000);
// leave_unlinked_file("/data",20000,5000);
// leave_unlinked_file("/data",20000,5000);
//
// yaffs_DumpDevStruct("/boot");
// yaffs_DumpDevStruct("/data");
//
//
//
// return 0;
//
// }
//
// static int huge_directory_test_on_path(char *path)
// {
//
// yaffs_DIR *d;
// yaffs_dirent *de;
// struct yaffs_stat s;
//
// int f;
// int i;
// int r;
// int total = 0;
// int lastTotal = 0;
// char buffer[20];
//
// char str[100];
// char name[100];
// char name2[100];
//
// int h;
// mode_t temp_mode;
// struct yaffs_stat ystat;
//
// yaffs_StartUp();
//
// yaffs_mount(path);
//
// // Create a large number of files
//
// for(i = 0; i < 2000; i++)
// {
// sprintf(str,"%s/%d",path,i);
//
// f = yaffs_open(str,O_CREAT,S_IREAD | S_IWRITE);
// yaffs_close(f);
// }
//
//
//
// d = yaffs_opendir(path);
// i = 0;
// if (d) {
// while((de = yaffs_readdir(d)) != NULL) {
// if (total >lastTotal+100*9*1024||(i & 1023)==0){
// printf("files = %d, total = %d\n",i, total);
// lastTotal = total;
// }
// i++;
// sprintf(str,"%s/%s",path,de->d_name);
// yaffs_lstat(str,&s);
// switch(s.st_mode & S_IFMT){
// case S_IFREG:
// //printf("data file");
// total += s.st_size;
// break;
// }
// }
//
// yaffs_closedir(d);
// }
//
// return 0;
// }
//
// static int yaffs_scan_test(const char *path)
// {
// }
//
//
// static void rename_over_test(const char *mountpt)
// {
// int i;
// char a[100];
// char b[100];
//
// sprintf(a,"%s/a",mountpt);
// sprintf(b,"%s/b",mountpt);
//
// yaffs_StartUp();
//
// yaffs_mount(mountpt);
// i = yaffs_open(a,O_CREAT | O_TRUNC | O_RDWR, 0);
// yaffs_close(i);
// i = yaffs_open(b,O_CREAT | O_TRUNC | O_RDWR, 0);
// yaffs_close(i);
// yaffs_rename(a,b); // rename over
// yaffs_rename(b,a); // rename back again (not renaimng over)
// yaffs_rename(a,b); // rename back again (not renaimng over)
//
//
// yaffs_unmount(mountpt);
//
// }
//
// static int resize_stress_test(const char *path)
// {
// int a,b,i,j;
// int x;
// int r;
// char aname[100];
// char bname[100];
//
// char abuffer[1000];
// char bbuffer[1000];
//
// yaffs_StartUp();
//
// yaffs_mount(path);
//
// sprintf(aname,"%s%s",path,"/a");
// sprintf(bname,"%s%s",path,"/b");
//
// memset(abuffer,'a',1000);
// memset(bbuffer,'b',1000);
//
// a = yaffs_open(aname, O_CREAT | O_TRUNC | O_RDWR, S_IREAD | S_IWRITE);
// b = yaffs_open(bname, O_CREAT | O_TRUNC | O_RDWR, S_IREAD | S_IWRITE);
//
// printf(" %s %d %s %d\n",aname,a,bname,b);
//
// x = 0;
//
// for(j = 0; j < 100; j++)
// {
// yaffs_lseek(a,0,SEEK_END);
//
//
// for(i = 0; i <20000; i++)
// {
// //r = yaffs_lseek(b,i,SEEK_SET);
// //r = yaffs_write(b,bbuffer,1000);
//
// if(x & 0x16)
// {
// // shrink
// int syz = yaffs_lseek(a,0,SEEK_END);
//
// syz -= 500;
// if(syz < 0) syz = 0;
// yaffs_truncate(a,syz);
//
// }
// else
// {
// //expand
// r = yaffs_lseek(a,i * 500,SEEK_SET);
// r = yaffs_write(a,abuffer,1000);
// }
// x++;
//
// }
// }
//
// return 0;
//
// }
//
//
// static int resize_stress_test_no_grow_complex(const char *path,int iters)
// {
// int a,b,i,j;
// int x;
// int r;
// char aname[100];
// char bname[100];
//
// char abuffer[1000];
// char bbuffer[1000];
//
// yaffs_StartUp();
//
// yaffs_mount(path);
//
// sprintf(aname,"%s%s",path,"/a");
// sprintf(bname,"%s%s",path,"/b");
//
// memset(abuffer,'a',1000);
// memset(bbuffer,'b',1000);
//
// a = yaffs_open(aname, O_CREAT | O_TRUNC | O_RDWR, S_IREAD | S_IWRITE);
// b = yaffs_open(bname, O_CREAT | O_TRUNC | O_RDWR, S_IREAD | S_IWRITE);
//
// printf(" %s %d %s %d\n",aname,a,bname,b);
//
// x = 0;
//
// for(j = 0; j < iters; j++)
// {
// yaffs_lseek(a,0,SEEK_END);
//
//
// for(i = 0; i <20000; i++)
// {
// //r = yaffs_lseek(b,i,SEEK_SET);
// //r = yaffs_write(b,bbuffer,1000);
//
// if(!(x%20))
// {
// // shrink
// int syz = yaffs_lseek(a,0,SEEK_END);
//
// while(syz > 4000)
// {
//
// syz -= 2050;
// if(syz < 0) syz = 0;
// yaffs_truncate(a,syz);
// syz = yaffs_lseek(a,0,SEEK_END);
// printf("shrink to %d\n",syz);
// }
//
//
// }
// else
// {
// //expand
// r = yaffs_lseek(a,500,SEEK_END);
// r = yaffs_write(a,abuffer,1000);
// }
// x++;
//
//
// }
// printf("file size is %d\n",yaffs_lseek(a,0,SEEK_END));
//
// }
//
// return 0;
//
// }
//
// static int resize_stress_test_no_grow(const char *path,int iters)
// {
// int a,b,i,j;
// int x;
// int r;
// char aname[100];
// char bname[100];
//
// char abuffer[1000];
// char bbuffer[1000];
//
// yaffs_StartUp();
//
// yaffs_mount(path);
//
// sprintf(aname,"%s%s",path,"/a");
// sprintf(bname,"%s%s",path,"/b");
//
// memset(abuffer,'a',1000);
// memset(bbuffer,'b',1000);
//
// a = yaffs_open(aname, O_CREAT | O_TRUNC | O_RDWR, S_IREAD | S_IWRITE);
// b = yaffs_open(bname, O_CREAT | O_TRUNC | O_RDWR, S_IREAD | S_IWRITE);
//
// printf(" %s %d %s %d\n",aname,a,bname,b);
//
// x = 0;
//
// for(j = 0; j < iters; j++)
// {
// yaffs_lseek(a,0,SEEK_END);
//
//
// for(i = 0; i <20000; i++)
// {
// //r = yaffs_lseek(b,i,SEEK_SET);
// //r = yaffs_write(b,bbuffer,1000);
//
// if(!(x%20))
// {
// // shrink
// int syz = yaffs_lseek(a,0,SEEK_END);
//
// while(syz > 4000)
// {
//
// syz -= 2050;
// if(syz < 0) syz = 0;
// yaffs_truncate(a,syz);
// syz = yaffs_lseek(a,0,SEEK_END);
// printf("shrink to %d\n",syz);
// }
//
//
// }
// else
// {
// //expand
// r = yaffs_lseek(a,-500,SEEK_END);
// r = yaffs_write(a,abuffer,1000);
// }
// x++;
//
//
// }
// printf("file size is %d\n",yaffs_lseek(a,0,SEEK_END));
//
// }
//
// return 0;
//
// }
//
// static int directory_rename_test(void)
// {
// int r;
// yaffs_StartUp();
//
// yaffs_mount("/ram");
// yaffs_mkdir("/ram/a",0);
// yaffs_mkdir("/ram/a/b",0);
// yaffs_mkdir("/ram/c",0);
//
// printf("\nDirectory look-up of /ram\n");
// dumpDir("/ram");
// dumpDir("/ram/a");
// dumpDir("/ram/a/b");
//
// printf("Do rename (should fail)\n");
//
// r = yaffs_rename("/ram/a","/ram/a/b/d");
// printf("\nDirectory look-up of /ram\n");
// dumpDir("/ram");
// dumpDir("/ram/a");
// dumpDir("/ram/a/b");
//
// printf("Do rename (should not fail)\n");
//
// r = yaffs_rename("/ram/c","/ram/a/b/d");
// printf("\nDirectory look-up of /ram\n");
// dumpDir("/ram");
// dumpDir("/ram/a");
// dumpDir("/ram/a/b");
//
//
// return 1;
//
// }
//
// static int cache_read_test(void)
// {
// int a,b,c;
// int i;
// int sizeOfFiles = 500000;
// char buffer[100];
//
// yaffs_StartUp();
//
// yaffs_mount("/boot");
//
// make_a_file("/boot/a",'a',sizeOfFiles);
// make_a_file("/boot/b",'b',sizeOfFiles);
//
// a = yaffs_open("/boot/a",O_RDONLY,0);
// b = yaffs_open("/boot/b",O_RDONLY,0);
// c = yaffs_open("/boot/c", O_CREAT | O_RDWR | O_TRUNC, S_IREAD | S_IWRITE);
//
// do{
// i = sizeOfFiles;
// if (i > 100) i = 100;
// sizeOfFiles -= i;
// yaffs_read(a,buffer,i);
// yaffs_read(b,buffer,i);
// yaffs_write(c,buffer,i);
// } while(sizeOfFiles > 0);
//
//
//
// return 1;
//
// }
//
// static int cache_bypass_bug_test(void)
// {
// // This test reporoduces a bug whereby YAFFS caching *was* buypassed
// // resulting in erroneous reads after writes.
// // This bug has been fixed.
//
// int a;
// int i;
// char buffer1[1000];
// char buffer2[1000];
//
// memset(buffer1,0,sizeof(buffer1));
// memset(buffer2,0,sizeof(buffer2));
//
// yaffs_StartUp();
//
// yaffs_mount("/boot");
//
// // Create a file of 2000 bytes.
// make_a_file("/boot/a",'X',2000);
//
// a = yaffs_open("/boot/a",O_RDWR, S_IREAD | S_IWRITE);
//
// // Write a short sequence to the file.
// // This will go into the cache.
// yaffs_lseek(a,0,SEEK_SET);
// yaffs_write(a,"abcdefghijklmnopqrstuvwxyz",20);
//
// // Read a short sequence from the file.
// // This will come from the cache.
// yaffs_lseek(a,0,SEEK_SET);
// yaffs_read(a,buffer1,30);
//
// // Read a page size sequence from the file.
// yaffs_lseek(a,0,SEEK_SET);
// yaffs_read(a,buffer2,512);
//
// printf("buffer 1 %s\n",buffer1);
// printf("buffer 2 %s\n",buffer2);
//
// if(strncmp(buffer1,buffer2,20))
// {
// printf("Cache bypass bug detected!!!!!\n");
// }
//
//
// return 1;
// }
//
//
// static int free_space_check(void)
// {
// int f;
//
// yaffs_StartUp();
// yaffs_mount("/boot");
// fill_disk("/boot/",2);
// f = yaffs_freespace("/boot");
//
// printf("%d free when disk full\n",f);
// return 1;
// }
//
// static int truncate_test(void)
// {
// int a;
// int r;
// int i;
// int l;
//
// char y[10];
//
// yaffs_StartUp();
// yaffs_mount("/boot");
//
// yaffs_unlink("/boot/trunctest");
//
// a = yaffs_open("/boot/trunctest", O_CREAT | O_TRUNC | O_RDWR, S_IREAD | S_IWRITE);
//
// yaffs_write(a,"abcdefghijklmnopqrstuvwzyz",26);
//
// yaffs_truncate(a,3);
// l= yaffs_lseek(a,0,SEEK_END);
//
// printf("truncated length is %d\n",l);
//
// yaffs_lseek(a,5,SEEK_SET);
// yaffs_write(a,"1",1);
//
// yaffs_lseek(a,0,SEEK_SET);
//
// r = yaffs_read(a,y,10);
//
// printf("read %d bytes:",r);
//
// for(i = 0; i < r; i++) printf("[%02X]",y[i]);
//
// printf("\n");
//
// return 0;
//
// }
//
//
//
//
//
// static void fill_disk_test(const char *mountpt)
// {
// int i;
// yaffs_StartUp();
//
// for(i = 0; i < 5; i++)
// {
// yaffs_mount(mountpt);
// fill_disk_and_delete(mountpt,100,i+1);
// yaffs_unmount(mountpt);
// }
//
// }
//
//
//
// static void lookup_test(const char *mountpt)
// {
// int i;
// int h;
// char a[100];
// char b[100];
//
//
// yaffs_DIR *d;
// yaffs_dirent *de;
// struct yaffs_stat s;
// char str[100];
//
// yaffs_StartUp();
//
// yaffs_mount(mountpt);
//
// d = yaffs_opendir(mountpt);
//
// if(!d)
// {
// printf("opendir failed\n");
// }
// else
// {
//
// for(i = 0; (de = yaffs_readdir(d)) != NULL; i++)
// {
// printf("unlinking %s\n",de->d_name);
// yaffs_unlink(de->d_name);
// }
//
// printf("%d files deleted\n",i);
// }
//
//
// for(i = 0; i < 2000; i++){
// sprintf(a,"%s/%d",mountpt,i);
// h = yaffs_open(a,O_CREAT | O_TRUNC | O_RDWR, 0);
// yaffs_close(h);
// }
//
// yaffs_rewinddir(d);
// for(i = 0; (de = yaffs_readdir(d)) != NULL; i++)
// {
// printf("%d %s\n",i,de->d_name);
// }
//
// printf("%d files listed\n\n\n",i);
//
// yaffs_rewinddir(d);
// yaffs_readdir(d);
// yaffs_readdir(d);
// yaffs_readdir(d);
//
// for(i = 0; i < 2000; i++){
// sprintf(a,"%s/%d",mountpt,i);
// yaffs_unlink(a);
// }
//
//
// yaffs_unmount(mountpt);
//
// }
//
// static void link_test(const char *mountpt)
// {
// int i;
// int h;
// char a[100];
// char b[100];
// char c[100];
//
// int f0;
// int f1;
// int f2;
// int f3;
// sprintf(a,"%s/aaa",mountpt);
// sprintf(b,"%s/bbb",mountpt);
// sprintf(c,"%s/ccc",mountpt);
//
// yaffs_StartUp();
//
// yaffs_mount(mountpt);
//
//
// h = yaffs_open(a, O_CREAT | O_TRUNC | O_RDWR, S_IREAD | S_IWRITE);
// for(i = 0; i < 100; i++)
// yaffs_write(h,a,100);
//
// yaffs_close(h);
//
// yaffs_unlink(b);
// yaffs_unlink(c);
// yaffs_link(a,b);
// yaffs_link(a,c);
// yaffs_unlink(b);
// yaffs_unlink(c);
// yaffs_unlink(a);
//
//
// yaffs_unmount(mountpt);
// yaffs_mount(mountpt);
//
// printf("link test done\n");
//
// }
//
// static void freespace_test(const char *mountpt)
// {
// int i;
// int h;
// char a[100];
// char b[100];
//
// int f0;
// int f1;
// int f2;
// int f3;
// sprintf(a,"%s/aaa",mountpt);
//
// yaffs_StartUp();
//
// yaffs_mount(mountpt);
//
// f0 = yaffs_freespace(mountpt);
//
// h = yaffs_open(a, O_CREAT | O_TRUNC | O_RDWR, S_IREAD | S_IWRITE);
//
// for(i = 0; i < 100; i++)
// yaffs_write(h,a,100);
//
// yaffs_close(h);
//
// f1 = yaffs_freespace(mountpt);
//
// yaffs_unlink(a);
//
// f2 = yaffs_freespace(mountpt);
//
//
// yaffs_unmount(mountpt);
// yaffs_mount(mountpt);
//
// f3 = yaffs_freespace(mountpt);
//
// printf("%d\n%d\n%d\n%d\n",f0, f1,f2,f3);
//
//
// }
//
// static void simple_rw_test(const char *mountpt)
// {
// int i;
// int h;
// char a[100];
//
// int x;
// int result;
//
// sprintf(a,"%s/aaa",mountpt);
//
// yaffs_StartUp();
//
// yaffs_mount(mountpt);
//
// yaffs_unlink(a);
//
// h = yaffs_open(a,O_CREAT| O_TRUNC | O_RDWR, S_IREAD | S_IWRITE);
//
// for(i = 100000;i < 200000; i++){
// result = yaffs_write(h,&i,sizeof(i));
//
// if(result != 4)
// {
// printf("write error\n");
// exit(1);
// }
// }
//
// //yaffs_close(h);
//
// // h = yaffs_open(a,O_RDWR, S_IREAD | S_IWRITE);
//
//
// yaffs_lseek(h,0,SEEK_SET);
//
// for(i = 100000; i < 200000; i++){
// result = yaffs_read(h,&x,sizeof(x));
//
// if(result != 4 || x != i){
// printf("read error %d %x %x\n",i,result,x);
// }
// }
//
// printf("Simple rw test passed\n");
//
//
//
// }
//
//
// static void scan_deleted_files_test(const char *mountpt)
// {
// char fn[100];
// char sub[100];
//
// const char *p;
//
// int i;
// int j;
// int k;
// int h;
//
// sprintf(sub,"%s/sdir",mountpt);
// yaffs_StartUp();
//
// for(j = 0; j < 10; j++)
// {
// printf("\n\n>>>>>>> Run %d <<<<<<<<<<<<<\n\n",j);
// yaffs_mount(mountpt);
// yaffs_mkdir(sub,0);
//
//
// p = (j & 0) ? mountpt: sub;
//
// for(i = 0; i < 100; i++)
// {
// sprintf(fn,"%s/%d",p,i);
//
// if(i & 1)
// {
// h = yaffs_open(fn,O_CREAT | O_TRUNC | O_RDWR, S_IREAD | S_IWRITE);
// for(k = 0; k < 1000; k++)
// yaffs_write(h,fn,100);
// yaffs_close(h);
// }
// else
// yaffs_mkdir(fn,0);
// }
//
// for(i = 0; i < 10; i++)
// {
// sprintf(fn,"%s/%d",p,i);
// if(i & 1)
// yaffs_unlink(fn);
// else
// yaffs_rmdir(fn);
//
// }
//
// yaffs_unmount(mountpt);
// }
//
//
//
//
// }
//
//
// static void write_10k(int h)
// {
// int i;
// const char *s="0123456789";
// for(i = 0; i < 1000; i++)
// yaffs_write(h,s,10);
//
// }
// static void write_200k_file(const char *fn, const char *fdel, const char *fdel1)
// {
// int h1;
// int i;
// int offs;
//
// h1 = yaffs_open(fn, O_CREAT | O_TRUNC | O_RDWR, S_IREAD | S_IWRITE);
//
// for(i = 0; i < 100000; i+= 10000)
// {
// write_10k(h1);
// }
//
// offs = yaffs_lseek(h1,0,SEEK_CUR);
// if( offs != 100000)
// {
// printf("Could not write file\n");
// }
//
// yaffs_unlink(fdel);
// for(i = 0; i < 100000; i+= 10000)
// {
// write_10k(h1);
// }
//
// offs = yaffs_lseek(h1,0,SEEK_CUR);
// if( offs != 200000)
// {
// printf("Could not write file\n");
// }
//
// yaffs_close(h1);
// yaffs_unlink(fdel1);
//
// }
//
//
// static void verify_200k_file(const char *fn)
// {
// int h1;
// int i;
// char x[11];
// const char *s="0123456789";
// int errCount = 0;
//
// h1 = yaffs_open(fn, O_RDONLY, 0);
//
// for(i = 0; i < 200000 && errCount < 10; i+= 10)
// {
// yaffs_read(h1,x,10);
// if(strncmp(x,s,10) != 0)
// {
// printf("File %s verification failed at %d\n",fn,i);
// errCount++;
// }
// }
// if(errCount >= 10)
// printf("Too many errors... aborted\n");
//
// yaffs_close(h1);
//
// }
//
//
// static void check_resize_gc_bug(const char *mountpt)
// {
//
// char a[30];
// char b[30];
// char c[30];
//
// int i;
//
// sprintf(a,"%s/a",mountpt);
// sprintf(b,"%s/b",mountpt);
// sprintf(c,"%s/c",mountpt);
//
//
//
//
// yaffs_StartUp();
// yaffs_mount(mountpt);
// yaffs_unlink(a);
// yaffs_unlink(b);
//
// for(i = 0; i < 50; i++)
// {
// printf("A\n");write_200k_file(a,"",c);
// printf("B\n");verify_200k_file(a);
// printf("C\n");write_200k_file(b,a,c);
// printf("D\n");verify_200k_file(b);
// yaffs_unmount(mountpt);
// yaffs_mount(mountpt);
// printf("E\n");verify_200k_file(a);
// printf("F\n");verify_200k_file(b);
// }
//
// }
//
//
// static void multi_mount_test(const char *mountpt,int nmounts)
// {
//
// char a[30];
// char b[30];
// char c[30];
//
// int i;
// int j;
//
// sprintf(a,"%s/a",mountpt);
//
// yaffs_StartUp();
//
// for(i = 0; i < nmounts; i++){
// int h0;
// int h1;
// int len0;
// int len1;
//
// static char xx[1000];
//
// printf("############### Iteration %d Start\n",i);
// if(1 || i == 0 || i == 5)
// yaffs_mount(mountpt);
//
// dump_directory_tree(mountpt);
//
//
// yaffs_mkdir(a,0);
//
// sprintf(xx,"%s/0",a);
// h0 = yaffs_open(xx, O_RDWR | O_CREAT | O_TRUNC, S_IREAD | S_IWRITE);
//
// sprintf(xx,"%s/1",a);
// h1 = yaffs_open(xx, O_RDWR | O_CREAT | O_TRUNC, S_IREAD | S_IWRITE);
//
// for(j = 0; j < 200; j++){
// yaffs_write(h0,xx,1000);
// yaffs_write(h1,xx,1000);
// }
//
// len0 = yaffs_lseek(h0,0,SEEK_END);
// len1 = yaffs_lseek(h1,0,SEEK_END);
//
// yaffs_lseek(h0,0,SEEK_SET);
// yaffs_lseek(h1,0,SEEK_SET);
//
// for(j = 0; j < 200; j++){
// yaffs_read(h0,xx,1000);
// yaffs_read(h1,xx,1000);
// }
//
//
// yaffs_truncate(h0,0);
// yaffs_close(h0);
// yaffs_close(h1);
//
// printf("########### %d\n",i);
// dump_directory_tree(mountpt);
//
// if(1 || i == 4 || i == nmounts -1)
// yaffs_unmount(mountpt);
// }
// }
//
//
// static void small_mount_test(const char *mountpt,int nmounts)
// {
//
// char a[30];
// char b[30];
// char c[30];
//
// int i;
// int j;
//
// int h0;
// int h1;
// int len0;
// int len1;
// int nread;
//
// sprintf(a,"%s/a",mountpt);
//
// yaffs_StartUp();
//
//
//
// for(i = 0; i < nmounts; i++){
//
// static char xx[1000];
//
// printf("############### Iteration %d Start\n",i);
// if(1 || i == 0 || i == 5)
// yaffs_mount(mountpt);
//
// dump_directory_tree(mountpt);
//
// yaffs_mkdir(a,0);
//
// sprintf(xx,"%s/0",a);
// if(i ==0){
//
// h0 = yaffs_open(xx, O_RDWR | O_CREAT | O_TRUNC, S_IREAD | S_IWRITE);
// for(j = 0; j < 130; j++)
// yaffs_write(h0,xx,1000);
// yaffs_close(h0);
// }
//
// h0 = yaffs_open(xx,O_RDONLY,0);
//
// sprintf(xx,"%s/1",a);
// h1 = yaffs_open(xx, O_RDWR | O_CREAT | O_TRUNC, S_IREAD | S_IWRITE);
//
// while((nread = yaffs_read(h0,xx,1000)) > 0)
// yaffs_write(h1,xx,nread);
//
//
// len0 = yaffs_lseek(h0,0,SEEK_END);
// len1 = yaffs_lseek(h1,0,SEEK_END);
//
// yaffs_lseek(h0,0,SEEK_SET);
// yaffs_lseek(h1,0,SEEK_SET);
//
// for(j = 0; j < 200; j++){
// yaffs_read(h0,xx,1000);
// yaffs_read(h1,xx,1000);
// }
//
// yaffs_close(h0);
// yaffs_close(h1);
//
// printf("########### %d\n",i);
// dump_directory_tree(mountpt);
//
// if(1 || i == 4 || i == nmounts -1)
// yaffs_unmount(mountpt);
// }
// }
static boolean early_exit;
static byte[] _STATIC_LOCAL_small_overwrite_test_xx = new byte[8000];
static void small_overwrite_test(String mountpt,int nmounts)
{
byte[] a = new byte[30]; final int aIndex = 0;
byte[] b = new byte[30]; final int bIndex = 0;
byte[] c = new byte[30]; final int cIndex = 0;
int i;
int j;
int h0;
int h1;
int len0;
int len1;
int nread;
sprintf(a,aIndex,"%s/a",mountpt);
yaffs2.utils.Globals.configuration.yaffs_StartUp();
for(i = 0; i < nmounts; i++){
// static char xx[8000];
printf("############### Iteration %d Start\n",i);
if(true)
yaffs_mount(StringToByteArray(mountpt), 0);
dump_directory_tree(StringToByteArray(mountpt), 0);
yaffs_mkdir(a, aIndex,0);
sprintf(_STATIC_LOCAL_small_overwrite_test_xx,0,"%a/0",a,aIndex);
h0 = yaffs_open(_STATIC_LOCAL_small_overwrite_test_xx,0, O_RDWR | O_CREAT | O_TRUNC, S_IREAD | S_IWRITE);
sprintf(_STATIC_LOCAL_small_overwrite_test_xx,0,"%a/1",a,aIndex);
h1 = yaffs_open(_STATIC_LOCAL_small_overwrite_test_xx,0, O_RDWR | O_CREAT | O_TRUNC, S_IREAD | S_IWRITE);
for(j = 0; j < 1000000; j+=1000){
yaffs_truncate(h0,j);
yaffs_lseek(h0,j,SEEK_SET);
yaffs_write(h0,_STATIC_LOCAL_small_overwrite_test_xx,0,7000);
yaffs_write(h1,_STATIC_LOCAL_small_overwrite_test_xx,0,7000);
if(early_exit)
System.exit(0);
}
yaffs_close(h0);
printf("########### %d\n",i);
dump_directory_tree(StringToByteArray(mountpt), 0);
if(true)
yaffs_unmount(StringToByteArray(mountpt), 0);
}
}
// XXX translate
// static void yaffs_touch(const char *fn)
// {
// yaffs_chmod(fn, S_IREAD | S_IWRITE);
// }
//
// static void checkpoint_fill_test(const char *mountpt,int nmounts)
// {
//
// char a[50];
// char b[50];
// char c[50];
//
// int i;
// int j;
// int h;
//
// sprintf(a,"%s/a",mountpt);
//
//
//
//
// yaffs_StartUp();
//
// for(i = 0; i < nmounts; i++){
// printf("############### Iteration %d Start\n",i);
// yaffs_mount(mountpt);
// dump_directory_tree(mountpt);
// yaffs_mkdir(a,0);
//
// sprintf(b,"%s/zz",a);
//
// h = yaffs_open(b,O_CREAT | O_RDWR,S_IREAD |S_IWRITE);
//
//
// while(yaffs_write(h,c,50) == 50){}
//
// yaffs_close(h);
//
// for(j = 0; j < 2; j++){
// printf("touch %d\n",j);
// yaffs_touch(b);
// yaffs_unmount(mountpt);
// yaffs_mount(mountpt);
// }
//
// dump_directory_tree(mountpt);
// yaffs_unmount(mountpt);
// }
// }
//
//
// static int make_file2(const char *name1, const char *name2,int syz)
// {
//
// char xx[2500];
// int i;
// int h1=-1,h2=-1;
// int n = 1;
//
//
// if(name1)
// h1 = yaffs_open(name1,O_CREAT | O_TRUNC | O_RDWR, S_IREAD | S_IWRITE);
// if(name2)
// h2 = yaffs_open(name2,O_CREAT | O_TRUNC | O_RDWR, S_IREAD | S_IWRITE);
//
// while(syz > 0 && n > 0){
// i = (syz > 2500) ? 2500 : syz;
// n = yaffs_write(h1,xx,i);
// n = yaffs_write(h2,xx,i);
// syz -= 500;
// }
// yaffs_close(h1);
// yaffs_close(h2);
//
// }
//
//
// extern void SetCheckpointReservedBlocks(int n);
//
// static void checkpoint_upgrade_test(const char *mountpt,int nmounts)
// {
//
// char a[50];
// char b[50];
// char c[50];
// char d[50];
//
// int i;
// int j;
// int h;
//
// sprintf(a,"%s/a",mountpt);
//
//
//
//
// printf("Create start condition\n");
// yaffs_StartUp();
// SetCheckpointReservedBlocks(0);
// yaffs_mount(mountpt);
// yaffs_mkdir(a,0);
// sprintf(b,"%s/zz",a);
// sprintf(c,"%s/xx",a);
// make_file2(b,c,2000000);
// sprintf(d,"%s/aa",a);
// make_file2(d,NULL,500000000);
// dump_directory_tree(mountpt);
//
// printf("Umount/mount attempt full\n");
// yaffs_unmount(mountpt);
//
// SetCheckpointReservedBlocks(10);
// yaffs_mount(mountpt);
//
// printf("unlink small file\n");
// yaffs_unlink(c);
// dump_directory_tree(mountpt);
//
// printf("Umount/mount attempt\n");
// yaffs_unmount(mountpt);
// yaffs_mount(mountpt);
//
// for(j = 0; j < 500; j++){
// printf("***** touch %d\n",j);
// dump_directory_tree(mountpt);
// yaffs_touch(b);
// yaffs_unmount(mountpt);
// yaffs_mount(mountpt);
// }
//
// for(j = 0; j < 500; j++){
// printf("***** touch %d\n",j);
// dump_directory_tree(mountpt);
// yaffs_touch(b);
// yaffs_unmount(mountpt);
// yaffs_mount(mountpt);
// }
// }
//
// static void huge_array_test(const char *mountpt,int n)
// {
//
// char a[50];
//
//
// int i;
// int j;
// int h;
//
// int fnum;
//
// sprintf(a,"mount point %s",mountpt);
//
//
//
// yaffs_StartUp();
//
// yaffs_mount(mountpt);
//
// while(n>0){
// n--;
// fnum = 0;
// printf("\n\n START run\n\n");
// while(yaffs_freespace(mountpt) > 25000000){
// sprintf(a,"%s/file%d",mountpt,fnum);
// fnum++;
// printf("create file %s\n",a);
// create_file_of_size(a,10000000);
// printf("verifying file %s\n",a);
// verify_file_of_size(a,10000000);
// }
//
// printf("\n\n verification/deletion\n\n");
//
// for(i = 0; i < fnum; i++){
// sprintf(a,"%s/file%d",mountpt,i);
// printf("verifying file %s\n",a);
// verify_file_of_size(a,10000000);
// printf("deleting file %s\n",a);
// yaffs_unlink(a);
// }
// printf("\n\n done \n\n");
//
//
// }
// }
/**
* @param args
*/
public static void main(String[] args)
{
yaffs2.utils.Globals.startUp(
new yaffs2.platform.emulation.yaffscfg2k_C(),
new yaffs2.platform.emulation.PortConfiguration(),
new yaffs2.platform.emulation.DebugConfiguration());
small_overwrite_test("/flash/boot",1);
//return long_test(argc,argv);
//return cache_read_test();
//resize_stress_test_no_grow("/flash",20);
//huge_directory_test_on_path("/ram2k");
//yaffs_backward_scan_test("/flash/flash");
// yaffs_device_flush_test("/flash/flash");
//scan_pattern_test("/flash",10000,10);
//short_scan_test("/flash/flash",40000,200);
//small_mount_test("/flash/flash",1000);
// small_overwrite_test("/flash/flash",1000);
//checkpoint_fill_test("/flash/flash",20);
//checkpoint_upgrade_test("/flash/flash",20);
// huge_array_test("/flash/flash",10);
//long_test_on_path("/ram2k");
// long_test_on_path("/flash");
//simple_rw_test("/flash/flash");
//fill_disk_test("/flash/flash");
// rename_over_test("/flash");
//lookup_test("/flash");
//freespace_test("/flash/flash");
//link_test("/flash/flash");
// cache_bypass_bug_test();
//free_space_check();
//check_resize_gc_bug("/flash");
//return 0;
}
}
1.1 jop/java/target/src/common/yaffs2/port/ECC_C.java
http://www.opencores.org/cvsweb.shtml/jop/java/target/src/common/yaffs2/port/ECC_C.java?rev=1.1&content-type=text/x-cvsweb-markup
Index: ECC_C.java
===================================================================
package yaffs2.port;
import yaffs2.utils.*;
import static yaffs2.utils.Utils.*;
public class ECC_C
{
/*
* YAFFS: Yet Another Flash File System. A NAND-flash specific file system.
*
* Copyright (C) 2002-2007 Aleph One Ltd.
* for Toby Churchill Ltd and Brightstar Engineering
*
* Created by Charles Manning <charles@a...>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*/
/*
* This code implements the ECC algorithm used in SmartMedia.
*
* The ECC comprises 22 bits of parity information and is stuffed into 3 bytes.
* The two unused bit are set to 1.
* The ECC can correct single bit errors in a 256-byte page of data. Thus, two such ECC
* blocks are used on a 512-byte NAND page.
*
*/
/* Table generated by gen-ecc.c
* Using a table means we do not have to calculate p1..p4 and p1'..p4'
* for each byte of data. These are instead provided in a table in bits7..2.
* Bit 0 of each entry indicates whether the entry has an odd or even parity, and therefore
* this bytes influence on the line parity.
*/
static final String yaffs_ecc_c_version =
"$Id: ECC_C.java,v 1.1 2007/06/07 14:37:29 peter.hilber Exp $";
static final byte[] column_parity_table = { // XXX first it was mistakenly a short[]
(byte)0x00, (byte)0x55, (byte)0x59, (byte)0x0c, (byte)0x65, (byte)0x30, (byte)0x3c, (byte)0x69,
(byte)0x69, (byte)0x3c, (byte)0x30, (byte)0x65, (byte)0x0c, (byte)0x59, (byte)0x55, (byte)0x00,
(byte)0x95, (byte)0xc0, (byte)0xcc, (byte)0x99, (byte)0xf0, (byte)0xa5, (byte)0xa9, (byte)0xfc,
(byte)0xfc, (byte)0xa9, (byte)0xa5, (byte)0xf0, (byte)0x99, (byte)0xcc, (byte)0xc0, (byte)0x95,
(byte)0x99, (byte)0xcc, (byte)0xc0, (byte)0x95, (byte)0xfc, (byte)0xa9, (byte)0xa5, (byte)0xf0,
(byte)0xf0, (byte)0xa5, (byte)0xa9, (byte)0xfc, (byte)0x95, (byte)0xc0, (byte)0xcc, (byte)0x99,
(byte)0x0c, (byte)0x59, (byte)0x55, (byte)0x00, (byte)0x69, (byte)0x3c, (byte)0x30, (byte)0x65,
(byte)0x65, (byte)0x30, (byte)0x3c, (byte)0x69, (byte)0x00, (byte)0x55, (byte)0x59, (byte)0x0c,
(byte)0xa5, (byte)0xf0, (byte)0xfc, (byte)0xa9, (byte)0xc0, (byte)0x95, (byte)0x99, (byte)0xcc,
(byte)0xcc, (byte)0x99, (byte)0x95, (byte)0xc0, (byte)0xa9, (byte)0xfc, (byte)0xf0, (byte)0xa5,
(byte)0x30, (byte)0x65, (byte)0x69, (byte)0x3c, (byte)0x55, (byte)0x00, (byte)0x0c, (byte)0x59,
(byte)0x59, (byte)0x0c, (byte)0x00, (byte)0x55, (byte)0x3c, (byte)0x69, (byte)0x65, (byte)0x30,
(byte)0x3c, (byte)0x69, (byte)0x65, (byte)0x30, (byte)0x59, (byte)0x0c, (byte)0x00, (byte)0x55,
(byte)0x55, (byte)0x00, (byte)0x0c, (byte)0x59, (byte)0x30, (byte)0x65, (byte)0x69, (byte)0x3c,
(byte)0xa9, (byte)0xfc, (byte)0xf0, (byte)0xa5, (byte)0xcc, (byte)0x99, (byte)0x95, (byte)0xc0,
(byte)0xc0, (byte)0x95, (byte)0x99, (byte)0xcc, (byte)0xa5, (byte)0xf0, (byte)0xfc, (byte)0xa9,
(byte)0xa9, (byte)0xfc, (byte)0xf0, (byte)0xa5, (byte)0xcc, (byte)0x99, (byte)0x95, (byte)0xc0,
(byte)0xc0, (byte)0x95, (byte)0x99, (byte)0xcc, (byte)0xa5, (byte)0xf0, (byte)0xfc, (byte)0xa9,
(byte)0x3c, (byte)0x69, (byte)0x65, (byte)0x30, (byte)0x59, (byte)0x0c, (byte)0x00, (byte)0x55,
(byte)0x55, (byte)0x00, (byte)0x0c, (byte)0x59, (byte)0x30, (byte)0x65, (byte)0x69, (byte)0x3c,
(byte)0x30, (byte)0x65, (byte)0x69, (byte)0x3c, (byte)0x55, (byte)0x00, (byte)0x0c, (byte)0x59,
(byte)0x59, (byte)0x0c, (byte)0x00, (byte)0x55, (byte)0x3c, (byte)0x69, (byte)0x65, (byte)0x30,
(byte)0xa5, (byte)0xf0, (byte)0xfc, (byte)0xa9, (byte)0xc0, (byte)0x95, (byte)0x99, (byte)0xcc,
(byte)0xcc, (byte)0x99, (byte)0x95, (byte)0xc0, (byte)0xa9, (byte)0xfc, (byte)0xf0, (byte)0xa5,
(byte)0x0c, (byte)0x59, (byte)0x55, (byte)0x00, (byte)0x69, (byte)0x3c, (byte)0x30, (byte)0x65,
(byte)0x65, (byte)0x30, (byte)0x3c, (byte)0x69, (byte)0x00, (byte)0x55, (byte)0x59, (byte)0x0c,
(byte)0x99, (byte)0xcc, (byte)0xc0, (byte)0x95, (byte)0xfc, (byte)0xa9, (byte)0xa5, (byte)0xf0,
(byte)0xf0, (byte)0xa5, (byte)0xa9, (byte)0xfc, (byte)0x95, (byte)0xc0, (byte)0xcc, (byte)0x99,
(byte)0x95, (byte)0xc0, (byte)0xcc, (byte)0x99, (byte)0xf0, (byte)0xa5, (byte)0xa9, (byte)0xfc,
(byte)0xfc, (byte)0xa9, (byte)0xa5, (byte)0xf0, (byte)0x99, (byte)0xcc, (byte)0xc0, (byte)0x95,
(byte)0x00, (byte)0x55, (byte)0x59, (byte)0x0c, (byte)0x65, (byte)0x30, (byte)0x3c, (byte)0x69,
(byte)0x69, (byte)0x3c, (byte)0x30, (byte)0x65, (byte)0x0c, (byte)0x59, (byte)0x55, (byte)0x00
};
/* Count the bits in an unsigned char or a U32 */
static int yaffs_CountBits(byte x)
{
int r = 0;
while (x != 0) {
if ((x & 1) != 0)
r++;
x >>>= 1;
}
return r;
}
static int yaffs_CountBits32(int x)
{
int r = 0;
while (x != 0) {
if ((x & 1) != 0)
r++;
x >>>= 1;
}
return r;
}
// XXX make several versions? // ???
/* Calculate the ECC for a 256-byte block of data */
static void yaffs_ECCCalculate(byte[] data, int dataIndex,
byte[] ecc, int eccIndex)
{
int i;
int col_parity = 0;
int line_parity = 0;
int line_parity_prime = 0;
int t;
int b;
for (i = 0; i < 256; i++) {
b = column_parity_table[byteAsUnsignedByte(data[dataIndex+i])];
col_parity ^= b;
if ((b & 0x01) != 0) // odd number of bits in the byte
{
line_parity ^= i;
line_parity_prime ^= ~i;
}
}
ecc[eccIndex+2] = (byte)((~col_parity) | 0x03);
t = 0;
if ((line_parity & 0x80) != 0)
t |= 0x80;
if ((line_parity_prime & 0x80) != 0)
t |= 0x40;
if ((line_parity & 0x40) != 0)
t |= 0x20;
if ((line_parity_prime & 0x40) != 0)
t |= 0x10;
if ((line_parity & 0x20) != 0)
t |= 0x08;
if ((line_parity_prime & 0x20) != 0)
t |= 0x04;
if ((line_parity & 0x10) != 0)
t |= 0x02;
if ((line_parity_prime & 0x10) != 0)
t |= 0x01;
ecc[eccIndex+1] = (byte)~t;
t = 0;
if ((line_parity & 0x08) != 0)
t |= 0x80;
if ((line_parity_prime & 0x08) != 0)
t |= 0x40;
if ((line_parity & 0x04) != 0)
t |= 0x20;
if ((line_parity_prime & 0x04) != 0)
t |= 0x10;
if ((line_parity & 0x02) != 0)
t |= 0x08;
if ((line_parity_prime & 0x02) != 0)
t |= 0x04;
if ((line_parity & 0x01) != 0)
t |= 0x02;
if ((line_parity_prime & 0x01) != 0)
t |= 0x01;
ecc[eccIndex+0] = (byte)~t;
/*#ifdef CONFIG_YAFFS_ECC_WRONG_ORDER
// Swap the bytes into the wrong order
t = ecc[0];
ecc[0] = ecc[1];
ecc[1] = t;
#endif*/
}
/* Correct the ECC on a 256 byte block of data */
static int yaffs_ECCCorrect(byte[] data, int dataIndex,
byte[] read_ecc, int read_eccIndex,
byte[] test_ecc, int test_eccIndex)
{
int d0, d1, d2; /* deltas */
d0 = (read_ecc[read_eccIndex+0] ^ test_ecc[test_eccIndex+0]);
d1 = (read_ecc[read_eccIndex+1] ^ test_ecc[test_eccIndex+1]);
d2 = (read_ecc[read_eccIndex+2] ^ test_ecc[test_eccIndex+2]);
if ((d0 | d1 | d2) == 0)
return 0; /* no error */
if (((d0 ^ (d0 >>> 1)) & 0x55) == 0x55 &&
((d1 ^ (d1 >>> 1)) & 0x55) == 0x55 &&
((d2 ^ (d2 >>> 1)) & 0x54) == 0x54) {
/* Single bit (recoverable) error in data */
int _byte;
int bit;
/*#ifdef CONFIG_YAFFS_ECC_WRONG_ORDER
// swap the bytes to correct for the wrong order
unsigned char t;
t = d0;
d0 = d1;
d1 = t;
#endif*/
bit = _byte = 0;
if ((d1 & 0x80) != 0)
_byte |= 0x80;
if ((d1 & 0x20) != 0)
_byte |= 0x40;
if ((d1 & 0x08) != 0)
_byte |= 0x20;
if ((d1 & 0x02) != 0)
_byte |= 0x10;
if ((d0 & 0x80) != 0)
_byte |= 0x08;
if ((d0 & 0x20) != 0)
_byte |= 0x04;
if ((d0 & 0x08) != 0)
_byte |= 0x02;
if ((d0 & 0x02) != 0)
_byte |= 0x01;
if ((d2 & 0x80) != 0)
bit |= 0x04;
if ((d2 & 0x20) != 0)
bit |= 0x02;
if ((d2 & 0x08) != 0)
bit |= 0x01;
/*data[_byte] ^= (1 << bit);*/ data[dataIndex + _byte] ^= (1 << bit);
return 1; /* Corrected the error */
}
if ((yaffs_CountBits((byte)d0) +
yaffs_CountBits((byte)d1) +
yaffs_CountBits((byte)d2)) == 1) {
/* Reccoverable error in ecc */
read_ecc[read_eccIndex+0] = test_ecc[test_eccIndex+0];
read_ecc[read_eccIndex+1] = test_ecc[test_eccIndex+1];
read_ecc[read_eccIndex+2] = test_ecc[test_eccIndex+2];
return 1; /* Corrected the error */
}
/* Unrecoverable error */
return -1;
}
/*
* ECCxxxOther does ECC calcs on arbitrary n bytes of data
*/
static void yaffs_ECCCalculateOther(SerializableObject data/*, int nBytes*/ ,
yaffs_ECCOther eccOther)
{
int nBytes = data.getSerializedLength(); // PORT
int i;
int col_parity = 0;
int line_parity = 0;
int line_parity_prime = 0;
int b;
for (i = 0; i < nBytes; i++) {
b = column_parity_table[byteAsUnsignedByte(data.serialized[data.offset+i])];
col_parity ^= b;
if ((b & 0x01) != 0) {
/* odd number of bits in the byte */
line_parity ^= i;
line_parity_prime ^= ~i;
}
}
eccOther.setcolParity((byte)((col_parity >>> 2) & 0x3f));
eccOther.setlineParity(line_parity);
eccOther.setlineParityPrime(line_parity_prime);
}
static int yaffs_ECCCorrectOther(SerializableObject data/*, int nBytes*/ ,
yaffs_ECCOther read_ecc,
yaffs_ECCOther test_ecc)
{
int nBytes = data.getSerializedLength();
int cDelta; /* column parity delta */
int lDelta; /* line parity delta */
int lDeltaPrime; /* line parity delta */
int bit;
cDelta = read_ecc.colParity() ^ test_ecc.colParity();
lDelta = read_ecc.lineParity() ^ test_ecc.lineParity();
lDeltaPrime = read_ecc.lineParityPrime() ^ test_ecc.lineParityPrime();
if ((cDelta | lDelta | lDeltaPrime) == 0)
return 0; /* no error */
if (lDelta == ~lDeltaPrime &&
(((cDelta ^ (cDelta >>> 1)) & 0x15) == 0x15))
{
/* Single bit (recoverable) error in data */
bit = 0;
if ((cDelta & 0x20) != 0)
bit |= 0x04;
if ((cDelta & 0x08) != 0)
bit |= 0x02;
if ((cDelta & 0x02) != 0)
bit |= 0x01;
if(lDelta >= nBytes)
return -1;
data.serialized[data.offset+(int)lDelta] ^= (1 << bit);
return 1; /* corrected */
}
if ((yaffs_CountBits32(lDelta) + yaffs_CountBits32(lDeltaPrime) +
yaffs_CountBits((byte)cDelta)) == 1) {
/* Reccoverable error in ecc */
read_ecc = test_ecc;
return 1; /* corrected */
}
/* Unrecoverable error */
return -1;
}
}
1.1 jop/java/target/src/common/yaffs2/port/ECC_H.java
http://www.opencores.org/cvsweb.shtml/jop/java/target/src/common/yaffs2/port/ECC_H.java?rev=1.1&content-type=text/x-cvsweb-markup
Index: ECC_H.java
===================================================================
package yaffs2.port;
abstract public class ECC_H
{
/*
* YAFFS: Yet another Flash File System . A NAND-flash specific file system.
*
* Copyright (C) 2002-2007 Aleph One Ltd.
* for Toby Churchill Ltd and Brightstar Engineering
*
* Created by Charles Manning <charles@a...>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License version 2.1 as
* published by the Free Software Foundation.
*
* Note: Only YAFFS headers are LGPL, YAFFS C code is covered by GPL.
*/
/*
* This code implements the ECC algorithm used in SmartMedia.
*
* The ECC comprises 22 bits of parity information and is stuffed into 3 bytes.
* The two unused bit are set to 1.
* The ECC can correct single bit errors in a 256-byte page of data. Thus, two such ECC
* blocks are used on a 512-byte NAND page.
*
*/
/**
* @param data const unsigned char *
* @param ecc unsigned char *
*/
abstract void yaffs_ECCCalculate(byte[] data, byte[] ecc);
/**
* @param data unsigned char *
* @param read_ecc unsigned char *
* @param test_ecc const unsigned char *
* @return
*/
abstract int yaffs_ECCCorrect(byte[] data, byte[] read_ecc,
byte[] test_ecc);
/**
* @param data const unsigned char
* @param nBytes unsigned
* @param ecc yaffs_ECCOther *
*/
abstract void yaffs_ECCCalculateOther(byte[] data, long nBytes,
yaffs_ECCOther ecc);
/**
* @param data unsigned char *
* @param nBytes unsigned
* @param read_ecc yaffs_ECCOther *
* @param test_ecc const yaffs_ECCOther *
* @return
*/
abstract int yaffs_ECCCorrectOther(byte[] data, long nBytes,
yaffs_ECCOther read_ecc,
yaffs_ECCOther test_ecc);
}
1.1 jop/java/target/src/common/yaffs2/port/Guts_H.java
http://www.opencores.org/cvsweb.shtml/jop/java/target/src/common/yaffs2/port/Guts_H.java?rev=1.1&content-type=text/x-cvsweb-markup
Index: Guts_H.java
===================================================================
package yaffs2.port;
import static yaffs2.port.yportenv.*;
import static yaffs2.port.ydirectenv.*;
public abstract class Guts_H
{
/*
* YAFFS: Yet another Flash File System . A NAND-flash specific file system.
*
* Copyright (C) 2002-2007 Aleph One Ltd.
* for Toby Churchill Ltd and Brightstar Engineering
*
* Created by Charles Manning <charles@a...>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License version 2.1 as
* published by the Free Software Foundation.
*
* Note: Only YAFFS headers are LGPL, YAFFS C code is covered by GPL.
*/
static final boolean YAFFS_OK = /*1*/ true;
static final boolean YAFFS_FAIL = /*0*/ false;
/* Give us a Y=0x59,
* Give us an A=0x41,
* Give us an FF=0xFF
* Give us an S=0x53
* And what have we got...
*/
static final int YAFFS_MAGIC = 0x5941FF53;
static final int YAFFS_NTNODES_LEVEL0 = 16;
static final int YAFFS_TNODES_LEVEL0_BITS = 4;
static final int YAFFS_TNODES_LEVEL0_MASK = 0xf;
static final int YAFFS_NTNODES_INTERNAL = (YAFFS_NTNODES_LEVEL0 / 2);
static final int YAFFS_TNODES_INTERNAL_BITS = (YAFFS_TNODES_LEVEL0_BITS - 1);
static final int YAFFS_TNODES_INTERNAL_MASK = 0x7;
static final int YAFFS_TNODES_MAX_LEVEL = 6;
//#ifndef CONFIG_YAFFS_NO_YAFFS1
static final int YAFFS_BYTES_PER_SPARE = 16;
static final int YAFFS_BYTES_PER_CHUNK = 512;
static final int YAFFS_CHUNK_SIZE_SHIFT = 9;
static final int YAFFS_CHUNKS_PER_BLOCK = 32;
static final int YAFFS_BYTES_PER_BLOCK = (YAFFS_CHUNKS_PER_BLOCK*YAFFS_BYTES_PER_CHUNK);
//#endif
static final int YAFFS_MIN_YAFFS2_CHUNK_SIZE = 1024;
static final int YAFFS_MIN_YAFFS2_SPARE_SIZE = 32;
static final int YAFFS_MAX_CHUNK_ID = 0x000FFFFF;
static final int YAFFS_UNUSED_OBJECT_ID = 0x0003FFFF;
static final int YAFFS_ALLOCATION_NOBJECTS = 100;
static final int YAFFS_ALLOCATION_NTNODES = 100;
static final int YAFFS_ALLOCATION_NLINKS = 100;
static final int YAFFS_NOBJECT_BUCKETS = 256;
static final int YAFFS_OBJECT_SPACE = 0x40000;
static final int YAFFS_NCHECKPOINT_OBJECTS = 5000;
static final int YAFFS_CHECKPOINT_VERSION = 2;
/*#ifdef CONFIG_YAFFS_UNICODE
#define YAFFS_MAX_NAME_LENGTH 127
#define YAFFS_MAX_ALIAS_LENGTH 79
#else*/
static final int YAFFS_MAX_NAME_LENGTH = 255;
static final int YAFFS_MAX_ALIAS_LENGTH = 159;
/*#endif*/
static final int YAFFS_SHORT_NAME_LENGTH = 15;
/* Some special object ids for pseudo objects */
static final int YAFFS_OBJECTID_ROOT = 1;
static final int YAFFS_OBJECTID_LOSTNFOUND = 2;
static final int YAFFS_OBJECTID_UNLINKED = 3;
static final int YAFFS_OBJECTID_DELETED = 4;
/* Sseudo object ids for checkpointing */
static final int YAFFS_OBJECTID_SB_HEADER = 0x10;
static final int YAFFS_OBJECTID_CHECKPOINT_DATA = 0x20;
static final int YAFFS_SEQUENCE_CHECKPOINT_DATA = 0x21;
/* */
static final int YAFFS_MAX_SHORT_OP_CACHES = 20;
static final int YAFFS_N_TEMP_BUFFERS = 4;
/* Sequence numbers are used in YAFFS2 to determine block allocation order.
* The range is limited slightly to help distinguish bad numbers from good.
* This also allows us to perhaps in the future use special numbers for
* special purposes.
* EFFFFF00 allows the allocation of 8 blocks per second (~1Mbytes) for 15 years,
* and is a larger number than the lifetime of a 2GB device.
*/
static final long YAFFS_LOWEST_SEQUENCE_NUMBER = 0x00001000l;
static final long YAFFS_HIGHEST_SEQUENCE_NUMBER = 0xEFFFFF00l;
/* Stuff used for extended tags in YAFFS2 */
//typedef enum {
static final int YAFFS_ECC_RESULT_UNKNOWN = 0;
static final int YAFFS_ECC_RESULT_NO_ERROR = 1;
static final int YAFFS_ECC_RESULT_FIXED = 2;
static final int YAFFS_ECC_RESULT_UNFIXED = 3;
//} yaffs_ECCResult;
//typedef enum {
static final int YAFFS_OBJECT_TYPE_UNKNOWN = 0;
static final int YAFFS_OBJECT_TYPE_FILE = 1;
static final int YAFFS_OBJECT_TYPE_SYMLINK = 2;
static final int YAFFS_OBJECT_TYPE_DIRECTORY = 3;
static final int YAFFS_OBJECT_TYPE_HARDLINK = 4;
static final int YAFFS_OBJECT_TYPE_SPECIAL = 5;
//} yaffs_ObjectType;
/*Special structure for passing through to mtd */
/*struct yaffs_NANDSpare {
yaffs_Spare spare;
int eccres1;
int eccres2;
};*/
/* Block data in RAM */
//typedef enum {
static final int YAFFS_BLOCK_STATE_UNKNOWN = 0;
static final int YAFFS_BLOCK_STATE_SCANNING = 1;
static final int YAFFS_BLOCK_STATE_NEEDS_SCANNING = 2;
/* The block might have something on it (ie it is allocating or full, perhaps empty)
* but it needs to be scanned to determine its true state.
* This state is only valid during yaffs_Scan.
* NB We tolerate empty because the pre-scanner might be incapable of deciding
* However, if this state is returned on a YAFFS2 device, then we expect a sequence number
*/
static final int YAFFS_BLOCK_STATE_EMPTY = 3;
/* This block is empty */
static final int YAFFS_BLOCK_STATE_ALLOCATING = 4;
/* This block is partially allocated.
* At least one page holds valid data.
* This is the one currently being used for page
* allocation. Should never be more than one of these
*/
static final int YAFFS_BLOCK_STATE_FULL = 5;
/* All the pages in this block have been allocated.
*/
static final int YAFFS_BLOCK_STATE_DIRTY = 6;
/* All pages have been allocated and deleted.
* Erase me, reuse me.
*/
static final int YAFFS_BLOCK_STATE_CHECKPOINT = 7;
/* This block is assigned to holding checkpoint data.
*/
static final int YAFFS_BLOCK_STATE_COLLECTING = 8;
/* This block is being garbage collected */
static final int YAFFS_BLOCK_STATE_DEAD = 9;
/* This block has failed and is not in use */
//} yaffs_BlockState;
/*------------------------ Object -----------------------------*/
/* An object can be one of:
* - a directory (no data, has children links
* - a regular file (data.... not prunes :->).
* - a symlink [symbolic link] (the alias).
* - a hard link
*/
/* Function to manipulate block info */
static /*Y_INLINE*/ yaffs_BlockInfo yaffs_GetBlockInfo(yaffs_Device dev, int blk)
{
if (blk < dev.internalStartBlock || blk > dev.internalEndBlock) {
T(YAFFS_TRACE_ERROR,
TSTR
("**>> yaffs: getBlockInfo block %d is not valid" + TENDSTR),
blk);
yaffs2.utils.Globals.portConfiguration.YBUG();
}
return dev.blockInfo[blk - dev.internalStartBlock];
}
/*----------------------- YAFFS Functions -----------------------*/
// public static int yaffs_GutsInitialise(yaffs_Device dev);
// public static void yaffs_Deinitialise(yaffs_Device dev);
//
// public static int yaffs_GetNumberOfFreeChunks(yaffs_Device dev);
//
// public static int yaffs_RenameObject(yaffs_Object oldDir, byte[] oldName,
// yaffs_Object newDir, byte[] newName);
//
// public static int yaffs_Unlink(yaffs_Object dir, byte[] name);
// public static int yaffs_DeleteFile(yaffs_Object obj);
//
// int yaffs_GetObjectName(yaffs_Object * obj, YCHAR * name, int buffSize);
// int yaffs_GetObjectFileLength(yaffs_Object * obj);
// int yaffs_GetObjectInode(yaffs_Object * obj);
// unsigned yaffs_GetObjectType(yaffs_Object * obj);
// int yaffs_GetObjectLinkCount(yaffs_Object * obj);
//
// int yaffs_SetAttributes(yaffs_Object * obj, struct iattr *attr);
// int yaffs_GetAttributes(yaffs_Object * obj, struct iattr *attr);
//
// /* File operations */
// int yaffs_ReadDataFromFile(yaffs_Object * obj, __u8 * buffer, loff_t offset,
// int nBytes);
// int yaffs_WriteDataToFile(yaffs_Object * obj, const __u8 * buffer, loff_t offset,
// int nBytes, int writeThrough);
// int yaffs_ResizeFile(yaffs_Object * obj, loff_t newSize);
//
// yaffs_Object *yaffs_MknodFile(yaffs_Object * parent, const YCHAR * name,
// __u32 mode, __u32 uid, __u32 gid);
// int yaffs_FlushFile(yaffs_Object * obj, int updateTime);
//
// /* Flushing and checkpointing */
// void yaffs_FlushEntireDeviceCache(yaffs_Device *dev);
//
// int yaffs_CheckpointSave(yaffs_Device *dev);
// int yaffs_CheckpointRestore(yaffs_Device *dev);
//
// /* Directory operations */
// yaffs_Object *yaffs_MknodDirectory(yaffs_Object * parent, const YCHAR * name,
// __u32 mode, __u32 uid, __u32 gid);
// yaffs_Object *yaffs_FindObjectByName(yaffs_Object * theDir, const YCHAR * name);
// int yaffs_ApplyToDirectoryChildren(yaffs_Object * theDir,
// int (*fn) (yaffs_Object *));
//
// yaffs_Object *yaffs_FindObjectByNumber(yaffs_Device * dev, __u32 number);
//
// /* Link operations */
// yaffs_Object *yaffs_Link(yaffs_Object * parent, const YCHAR * name,
// yaffs_Object * equivalentObject);
//
// yaffs_Object *yaffs_GetEquivalentObject(yaffs_Object * obj);
//
// /* Symlink operations */
// yaffs_Object *yaffs_MknodSymLink(yaffs_Object * parent, const YCHAR * name,
// __u32 mode, __u32 uid, __u32 gid,
// const YCHAR * alias);
// YCHAR *yaffs_GetSymlinkAlias(yaffs_Object * obj);
//
// /* Special inodes (fifos, sockets and devices) */
// yaffs_Object *yaffs_MknodSpecial(yaffs_Object * parent, const YCHAR * name,
// __u32 mode, __u32 uid, __u32 gid, __u32 rdev);
//
// /* Special directories */
// yaffs_Object *yaffs_Root(yaffs_Device * dev);
// yaffs_Object *yaffs_LostNFound(yaffs_Device * dev);
//
// #ifdef CONFIG_YAFFS_WINCE
// /* CONFIG_YAFFS_WINCE special stuff */
// void yfsd_WinFileTimeNow(__u32 target[2]);
// #endif
//
// #ifdef __KERNEL__
//
// void yaffs_HandleDeferedFree(yaffs_Object * obj);
// #endif
//
// /* Debug dump */
// int yaffs_DumpObject(yaffs_Object * obj);
//
// void yaffs_GutsTest(yaffs_Device * dev);
//
// /* A few useful functions */
// void yaffs_InitialiseTags(yaffs_ExtendedTags * tags);
// void yaffs_DeleteChunk(yaffs_Device * dev, int chunkId, int markNAND, int lyn);
// int yaffs_CheckFF(__u8 * buffer, int nBytes);
// void yaffs_HandleChunkError(yaffs_Device *dev, yaffs_BlockInfo *bi);
}
1.1 jop/java/target/src/common/yaffs2/port/Template.java
http://www.opencores.org/cvsweb.shtml/jop/java/target/src/common/yaffs2/port/Template.java?rev=1.1&content-type=text/x-cvsweb-markup
Index: Template.java
===================================================================
package yaffs2.port;
import yaffs2.utils.*;
import yaffs2.assertions.*;
import yaffs2.port.*;
import static yaffs2.utils.Utils.*;
import static yaffs2.utils.Constants.*;
import static yaffs2.assertions.Assert.*;
import static yaffs2.utils.Unix.*;
import static yaffs2.port.yaffs_ObjectHeader.*;
import static yaffs2.port.Guts_H.*;
import static yaffs2.port.yaffs_BlockInfo.*;
import static yaffs2.port.yaffs_Spare.*;
import static yaffs2.port.yaffs_ExtendedTags.*;
import static yaffs2.port.yaffs_Tags.*;
import static yaffs2.port.yaffs_ChunkCache.*;
import static yaffs2.port.CFG_H.*;
import static yaffs2.port.yaffsfs_DeviceConfiguration.*;
import static yaffs2.port.ECC_C.*;
import static yaffs2.port.yaffs_ECCOther.*;
import static yaffs2.port.yportenv.*;
import static yaffs2.port.ydirectenv.*;
import static yaffs2.port.yaffs_tagsvalidity_C.*;
import static yaffs2.port.yaffs_tagscompat_C.*;
/**
* Copy the imports above to avoid a lot of typing.
* XXX Add new classes.
* @author Peter Hilber (peter.hilber@s...)
*
*/
public class Template
{
public static void main(String[] args)
{
}
}
1.1 jop/java/target/src/common/yaffs2/port/devextras.java
http://www.opencores.org/cvsweb.shtml/jop/java/target/src/common/yaffs2/port/devextras.java?rev=1.1&content-type=text/x-cvsweb-markup
Index: devextras.java
===================================================================
package yaffs2.port;
public class devextras
{
/*
* YAFFS: Yet another Flash File System . A NAND-flash specific file system.
*
* Copyright (C) 2002-2007 Aleph One Ltd.
* for Toby Churchill Ltd and Brightstar Engineering
*
* Created by Charles Manning <charles@a...>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License version 2.1 as
* published by the Free Software Foundation.
*
* Note: Only YAFFS headers are LGPL, YAFFS C code is covered by GPL.
*/
/*
* This file is just holds extra declarations used during development.
* Most of these are from kernel includes placed here so we can use them in
* applications.
*
*/
/*#if defined WIN32
#define __inline__ __inline
#define new newHack
#endif*/
//#if !(defined __KERNEL__) || (defined WIN32)
/* User space defines */
/*typedef unsigned char __u8;
typedef unsigned short __u16;
typedef unsigned __u32;*/
/*
* Simple doubly linked list implementation.
*
* Some of the internal functions ("__xxx") are useful when
* manipulating whole lists rather than single entries, as
* sometimes we already know the next/prev entries and we can
* generate better code by using them directly rather than
* using the generic single-entry routines.
*/
// #define prefetch(x) 1 // PORT Removed.
// #define LIST_HEAD_INIT(name) { &(name), &(name) }
static list_head LIST_HEAD_INIT(Object list_entry)
{
list_head result = new list_head(list_entry);
INIT_LIST_HEAD(result);
return result;
}
// #define LIST_HEAD(name) \
// struct list_head name = LIST_HEAD_INIT(name)
// PORT list_head example = LIST_HEAD_INIT();
static void INIT_LIST_HEAD(list_head ptr)
{
(ptr).next = (ptr); (ptr).prev = (ptr);
}
/*
* Insert a new entry between two known consecutive entries.
*
* This is only for internal list manipulation where we know
* the prev/next entries already!
*/
static /*__inline__*/ void __list_add(list_head _new,
list_head prev,
list_head next)
{
next.prev = _new;
_new.next = next;
_new.prev = prev;
prev.next = _new;
}
/**
* list_add - add a new entry
* @new: new entry to be added
* @head: list head to add it after
*
* Insert a new entry after the specified head.
* This is good for implementing stacks.
*/
static /*__inline__*/ void list_add(list_head _new, list_head head)
{
__list_add(_new, head, head.next());
}
/**
* list_add_tail - add a new entry
* @new: new entry to be added
* @head: list head to add it before
*
* Insert a new entry before the specified head.
* This is useful for implementing queues.
*/
static /*__inline__*/ void list_add_tail(list_head _new,
list_head head)
{
__list_add(_new, head.prev(), head);
}
/*
* Delete a list entry by making the prev/next entries
* point to each other.
*
* This is only for internal list manipulation where we know
* the prev/next entries already!
*/
static /*__inline__*/ void __list_del(list_head prev,
list_head next)
{
next.prev = prev;
prev.next = next;
}
/**
* list_del - deletes entry from list.
* @entry: the element to delete from the list.
* Note: list_empty on entry does not return true after this, the entry is
* in an undefined state.
*/
static /*__inline__*/ void list_del(list_head entry)
{
__list_del(entry.prev(), entry.next());
}
/**
* list_del_init - deletes entry from list and reinitialize it.
* @entry: the element to delete from the list.
*/
static /*__inline__*/ void list_del_init(list_head entry)
{
__list_del(entry.prev(), entry.next());
INIT_LIST_HEAD(entry);
}
/**
* list_empty - tests whether a list is empty
* @head: the list to test.
*/
static /*__inline__*/ boolean list_empty(list_head head)
{
return head.next == head;
}
/**
* list_splice - join two lists
* @list: the new list to add.
* @head: the place to add it in the first list.
*/
static /*__inline__*/ void list_splice(list_head list,
list_head head)
{
list_head first = list.next();
if (first != list) {
list_head last = list.prev();
list_head at = head.next();
first.prev = head;
head.next = first;
last.next = at;
at.prev = last;
}
}
/**
* list_entry - get the struct for this entry
* @ptr: the &struct list_head pointer.
* @type: the type of the struct this is embedded in.
* @member: the name of the list_struct within the struct.
*/
// #define list_entry(ptr, type, member) \
// ((type *)((char *)(ptr)-(unsigned long)(&((type *)0).member)))
// PORT Introduced list_entry field in list_head, which gives the same
// result as this macro.
/**
* list_for_each - iterate over a list
* @pos: the &struct list_head to use as a loop counter.
* @head: the head for your list.
*/
// #define list_for_each(pos, head) \
// for (pos = (head).next, prefetch(pos.next); pos != (head); \
// pos = pos.next, prefetch(pos.next))
// PORT The corresponding code was inserted where this macro has been used.
// PORT prefetch() doesnt do anything, so it was omitted.
/**
* list_for_each_safe - iterate over a list safe against removal
* of list entry
* @pos: the &struct list_head to use as a loop counter.
* @n: another &struct list_head to use as temporary storage
* @head: the head for your list.
*/
// #define list_for_each_safe(pos, n, head) \
// for (pos = (head).next, n = pos.next; pos != (head); \
// pos = n, n = pos.next)
// PORT The corresponding code was inserted where this macro has been used.
/*
* File types
*/
static final int DT_UNKNOWN = 0;
static final int DT_FIFO = 1;
static final int DT_CHR = 2;
static final int DT_DIR = 4;
static final int DT_BLK = 6;
static final int DT_REG = 8;
static final int DT_LNK = 10;
static final int DT_SOCK = 12;
static final int DT_WHT = 14;
/*#ifndef WIN32
#include <sys/stat.h>
#endif*/
/*
* Attribute flags. These should be or-ed together to figure out what
* has been changed!
*/
static final int ATTR_MODE = 1;
static final int ATTR_UID = 2;
static final int ATTR_GID = 4;
static final int ATTR_SIZE = 8;
static final int ATTR_ATIME = 16;
static final int ATTR_MTIME = 32;
static final int ATTR_CTIME = 64;
static final int ATTR_ATIME_SET = 128;
static final int ATTR_MTIME_SET = 256;
static final int ATTR_FORCE = 512; /* Not a change, but a change it */
static final int ATTR_ATTR_FLAG = 1024;
/*#define KERN_DEBUG
#else
#ifndef WIN32
#include <linux/types.h>
#include <linux/list.h>
#include <linux/fs.h>
#include <linux/stat.h>
#endif
#endif
#if defined WIN32
#undef new
#endif*/
}
1.1 jop/java/target/src/common/yaffs2/port/devextrasEnumeration.java
http://www.opencores.org/cvsweb.shtml/jop/java/target/src/common/yaffs2/port/devextrasEnumeration.java?rev=1.1&content-type=text/x-cvsweb-markup
Index: devextrasEnumeration.java
===================================================================
package yaffs2.port;
public class devextrasEnumeration
{
/**
* list_for_each - iterate over a list
* @pos: the &struct list_head to use as a loop counter.
* @head: the head for your list.
*/
// XXX #define list_for_each(pos, head) \
// for (pos = (head).next, prefetch(pos.next); pos != (head); \
// pos = pos.next, prefetch(pos.next))
public abstract class enumerate
{
public abstract void callback(list_head pos);
public void list_for_each(list_head head)
{
list_head pos;
for (pos = head.next/*, prefetch(pos.next)*/; pos != head;
pos = pos.next/*, prefetch(pos.next)*/)
{
callback(pos);
}
}
}
/**
* list_for_each_safe - iterate over a list safe against removal
* of list entry
* @pos: the &struct list_head to use as a loop counter.
* @n: another &struct list_head to use as temporary storage
* @head: the head for your list.
*/
// XXX #define list_for_each_safe(pos, n, head) \
// for (pos = (head).next, n = pos.next; pos != (head); \
// pos = n, n = pos.next)
}
1.1 jop/java/target/src/common/yaffs2/port/iattr.java
http://www.opencores.org/cvsweb.shtml/jop/java/target/src/common/yaffs2/port/iattr.java?rev=1.1&content-type=text/x-cvsweb-markup
Index: iattr.java
===================================================================
package yaffs2.port;
public class iattr
{
//struct iattr {
/*unsigned int*/ int ia_valid;
/*unsigned*/ int ia_mode;
/*unsigned*/ int ia_uid;
/*unsigned*/ int ia_gid;
/*unsigned*/ int ia_size;
/*unsigned*/ int ia_atime;
/*unsigned*/ int ia_mtime;
/*unsigned*/ int ia_ctime;
/*unsigned int*/ int ia_attr_flags;
//};
}
1.1 jop/java/target/src/common/yaffs2/port/list_head.java
http://www.opencores.org/cvsweb.shtml/jop/java/target/src/common/yaffs2/port/list_head.java?rev=1.1&content-type=text/x-cvsweb-markup
Index: list_head.java
===================================================================
package yaffs2.port;
import yaffs2.utils.*;
public class list_head implements list_head_or_yaffs_Object
{
/**
* PORT Since we can't do pointer arithmetic, we have to save the object the list_head belongs to.
* @param owner
*/
public list_head(Object owner) // XXX check later if it should be reset somewhere (not in memset()!)
{
this.list_entry = owner;
}
/**
* PORT Since we can't do pointer arithmetic, we have to save the object it belongs to.
*/
public Object list_entry;
//struct list_head {
public list_head_or_yaffs_Object next, prev;
public list_head next() // XXX see if these typecasts will always succeed
{
return (list_head)next;
}
public list_head prev() // XXX see if these typecasts will always succeed
{
return (list_head)prev;
}
//};
}
1.1 jop/java/target/src/common/yaffs2/port/yaffs_BlockIndex.java
http://www.opencores.org/cvsweb.shtml/jop/java/target/src/common/yaffs2/port/yaffs_BlockIndex.java?rev=1.1&content-type=text/x-cvsweb-markup
Index: yaffs_BlockIndex.java
===================================================================
package yaffs2.port;
public class yaffs_BlockIndex
{
// typedef struct {
/**int*/ int seq;
int block;
//} yaffs_BlockIndex;
}
1.1 jop/java/target/src/common/yaffs2/port/yaffs_BlockInfo.java
http://www.opencores.org/cvsweb.shtml/jop/java/target/src/common/yaffs2/port/yaffs_BlockInfo.java?rev=1.1&content-type=text/x-cvsweb-markup
Index: yaffs_BlockInfo.java
===================================================================
package yaffs2.port;
import yaffs2.utils.SerializableObject;
import static yaffs2.utils.Utils.*;
public class yaffs_BlockInfo extends yaffs2.utils.SerializableObject
{
// int softDeletions:10; /* number of soft deleted pages */
// int pagesInUse:10; /* number of pages in use */
// yaffs_BlockState blockState:4; /* One of the above block states */
// __u32 needsRetiring:1; /* Data has failed on this block, need to get valid data off */
// /* and retire the block. */
// __u32 skipErasedCheck: 1; /* If this is set we can skip the erased check on this block */
// __u32 gcPrioritise: 1; /* An ECC check or bank check has failed on this block.
// It should be prioritised for GC */
// __u32 chunkErrorStrikes:3; /* How many times we've had ecc etc failures on this block and tried to reuse it */
//
// #ifdef CONFIG_YAFFS_YAFFS2
// __u32 hasShrinkHeader:1; /* This block has at least one shrink object header */
// __u32 sequenceNumber; /* block sequence number for yaffs2 */
//#endif
public yaffs_BlockInfo(SerializableObject owner, int offset)
{
super(owner, offset);
}
public yaffs_BlockInfo(byte[] array, int offset)
{
super(array, offset);
}
public yaffs_BlockInfo()
{
super(SERIALIZED_LENGTH);
}
static final int SERIALIZED_LENGTH = 4+4;
int softDeletions()
{
return byteAsUnsignedByte(serialized[offset+0]) | ((serialized[offset+1] & 0x3) << 8);
}
void setSoftDeletions(int value)
{
serialized[offset+0] = (byte)value;
serialized[offset+1] = (byte)(serialized[offset+1] & ~0x3 | ((value & 0x3) >>> 8));
}
int pagesInUse()
{
return (byteAsUnsignedByte(serialized[offset+1]) >>> 2) | ((serialized[offset+2] & 0xf ) << 2);
}
void setPagesInUse(int value)
{
serialized[offset+1] = (byte)(serialized[offset+1] & 0x3 | (value << 2));
serialized[offset+2] = (byte)(serialized[offset+2] & ~0xf | ((value & 0xf00) >>> 8));
}
int blockState()
{
return (byteAsUnsignedByte(serialized[offset+2]) >>> 4);
}
void setBlockState(int value)
{
serialized[offset+2] = (byte)(serialized[offset+2] & ~0xF0 | (value << 4));
}
boolean needsRetiring()
{
return (serialized[offset+3] & 0x1) != 0;
}
void setNeedsRetiring(boolean value)
{
serialized[offset+3] = (byte)(serialized[offset+3] & ~0x1 | (value ? 0x1 : 0));
}
boolean skipErasedCheck()
{
return (serialized[offset+3] & 0x2) != 0;
}
void setSkipErasedCheck(boolean value)
{
serialized[offset+3] = (byte)(serialized[offset+3] & ~0x2 | (value ? 0x2 : 0));
}
boolean gcPrioritise()
{
return (serialized[offset+3] & 0x4) != 0;
}
void setGcPrioritise(boolean value)
{
serialized[offset+3] = (byte)(serialized[offset+3] & ~0x4 | (value ? 0x4 : 0));
}
int chunkErrorStrikes()
{
return (serialized[offset+3] >>> 3) & 0x7;
}
void setChunkErrorStrikes(int value)
{
serialized[offset+3] = (byte)(serialized[offset+3] & (~0x7 << 3) | ((value & 0x7) << 3));
}
//#ifdef CONFIG_YAFFS_YAFFS2
/*__u32*/ boolean hasShrinkHeader() /* This block has at least one shrink object header */
{
return ((serialized[offset+3] >>> 6) & 0x1) != 0;
}
void setHasShrinkHeader(boolean value)
{
serialized[offset+3] = (byte)(serialized[offset+3] & ~0x40 | (value ? 0x40 : 0));
}
// XXX PORT may be larger than Integer.MAX_VALUE, which causes sign extension for longs!
// XXX check every invocation
/*__u32*/ int sequenceNumber() /* block sequence number for yaffs2 */
{
return yaffs2.utils.Utils.getIntFromByteArray(serialized, offset+4);
}
void setSequenceNumber(/*__u32*/ int value)
{
yaffs2.utils.Utils.writeIntToByteArray(serialized, offset+4, value);
}
//#endif
@Override
public int getSerializedLength()
{
return SERIALIZED_LENGTH;
}
}
1.1 jop/java/target/src/common/yaffs2/port/yaffs_CheckpointDevice.java
http://www.opencores.org/cvsweb.shtml/jop/java/target/src/common/yaffs2/port/yaffs_CheckpointDevice.java?rev=1.1&content-type=text/x-cvsweb-markup
Index: yaffs_CheckpointDevice.java
===================================================================
package yaffs2.port;
import yaffs2.utils.*;
import static yaffs2.utils.Utils.*;
public class yaffs_CheckpointDevice extends SerializableObject
{
static final int SERIALIZED_LENGTH = 10*4;
public yaffs_CheckpointDevice()
{
super(SERIALIZED_LENGTH);
}
/* The CheckpointDevice structure holds the device information that changes at runtime and
* must be preserved over unmount/mount cycles.
*/
//typedef struct {
int structType()
{
return getIntFromByteArray(serialized, offset+0);
}
void setStructType(int value)
{
writeIntToByteArray(serialized, offset+0, value);
}
int nErasedBlocks()
{
return getIntFromByteArray(serialized, offset+4);
}
void setNErasedBlocks(int value)
{
writeIntToByteArray(serialized, offset+4, value);
}
int allocationBlock() /* Current block being allocated off */
{
return getIntFromByteArray(serialized, offset+8);
}
void setAllocationBlock(int value)
{
writeIntToByteArray(serialized, offset+8, value);
}
/**__u32*/ int allocationPage()
{
return getIntFromByteArray(serialized, offset+12);
}
void setAllocationPage(int value)
{
writeIntToByteArray(serialized, offset+12, value);
}
int nFreeChunks()
{
return getIntFromByteArray(serialized, offset+16);
}
void setNFreeChunks(int value)
{
writeIntToByteArray(serialized, offset+16, value);
}
int nDeletedFiles() /* Count of files awaiting deletion;*/
{
return getIntFromByteArray(serialized, offset+20);
}
void setNDeletedFiles(int value)
{
writeIntToByteArray(serialized, offset+20, value);
}
int nUnlinkedFiles() /* Count of unlinked files. */
{
return getIntFromByteArray(serialized, offset+24);
}
void setNUnlinkedFiles(int value)
{
writeIntToByteArray(serialized, offset+24, value);
}
int nBackgroundDeletions() /* Count of background deletions. */
{
return getIntFromByteArray(serialized, offset+28);
}
void setNBackgroundDeletions(int value)
{
writeIntToByteArray(serialized, offset+28, value);
}
/* yaffs2 runtime stuff */ // XXX check conversion
/**unsigned*/ int sequenceNumber() /* Sequence number of currently allocating block */
{
return getIntFromByteArray(serialized, offset+32);
}
/**@param value unsigned*/ void setSequenceNumber(int value)
{
writeIntToByteArray(serialized, offset+32, value);
}
/**unsigned*/ int oldestDirtySequence() // XXX check conversion
{
return getIntFromByteArray(serialized, offset+36);
}
/**@param value unsigned*/ void setOldestDirtySequence(int value)
{
writeIntToByteArray(serialized, offset+36, value);
}
@Override
public int getSerializedLength()
{
return SERIALIZED_LENGTH;
}
//} yaffs_CheckpointDevice;
}
1.1 jop/java/target/src/common/yaffs2/port/yaffs_CheckpointObject.java
|