*** empty log message ***
[yaffs/.git] / utils / mkyaffs.c
index 7fd2b0b831805358270c2f528960b329dc4ff8ff..3a0ed6776be3dd0a0d11f8022bf4613bb81d77b2 100644 (file)
@@ -63,6 +63,7 @@ static const char countBits[256] =
  */
 
 unsigned char oobbuf[16];
+unsigned char imgpage[528];
 
 
 /*
@@ -71,20 +72,39 @@ unsigned char oobbuf[16];
 int main(int argc, char **argv)
 {
        unsigned long addr;
+       unsigned long offset;
        int bs, fd, i;
+       int img=-1;
+       int imglen = 0;
        struct mtd_oob_buf oob = {0, 16, (unsigned char *) &oobbuf};
        mtd_info_t meminfo;
        erase_info_t erase;
 
        /* Make sure a device was specified */
        if(argc < 2) {
-               printf("usage: %s <mtdname>\n", argv[0]);
+               printf("usage: %s <mtdname> [image name]\n", argv[0]);
                exit(1);
        }
+       
+       if(argc > 2 && 
+          (img = open(argv[2],O_RDONLY)) == -1)        {
+               perror("opening image file");
+               exit(1);
+       }
+       
+       if(img >= 0){
+          imglen = lseek(img,0,SEEK_END);
+          if(imglen %528){
+               printf("Image not a multiple of 528 bytes\n");
+               exit(1);
+          }
+       }
+       
+       lseek(img,0,SEEK_SET);
 
        /* Open the device */
        if((fd = open(argv[1], O_RDWR)) == -1) {
-               perror("open flash");
+               perror("opening flash");
                exit(1);
        }
 
@@ -103,7 +123,14 @@ int main(int argc, char **argv)
                exit(1);
        }
        
+       if(imglen >= 0 &&
+          (imglen/528 +32)*512 > meminfo.size){
+               printf("Image is too big for NAND\n");
+               exit(1);
+       }
+       
        
+       printf("Erasing and programming NAND\n");
        for(addr = 0; addr < meminfo.size; addr += meminfo.erasesize)
        {
                /* Read the OOB data to determine if the block is valid.
@@ -137,11 +164,28 @@ int main(int argc, char **argv)
                                exit(1);
                        }
                        
+                       /* Do some programming, but not in the first block */
+                       
+                       if(addr){
+                               for(offset = 0; offset <meminfo.erasesize; offset+=512)
+                               {
+                                       if(read(img,imgpage,528) == 528){
+                                               lseek(fd,addr+offset,SEEK_SET);
+                                               write(fd,imgpage,512);
+                                               oob.start = addr+offset;
+                                               oob.length=16;
+                                               oob.ptr=&imgpage[512];
+                                               ioctl(fd,MEMWRITEOOB,&oob);
+                                       }
+                               }
+                       }
+                       
                }
 
        }
 
 
+
        /* All the tests succeeded */
        printf("OK\n");
        close(fd);