nand write.e 和nand write.yaffs的区别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了nand write.e 和nand write.yaffs的区别相关的知识,希望对你有一定的参考价值。

nand write:向Nand Flash写入数据,如果NandFlash相应的区域有坏块,则直接报错。
nand write.e: 向Nand Flash写入数据减肥时会时行ECC校验,如果NandFlash相应的区域有坏块,可以跳过坏块。
nand write.jffs2:向Nand Flash写入jffs2镜像到相应的分区。
nand write.yaffs:同理,实现yaffs文件系统镜像的烧写,这个命令不一定所有版本的u-boot支持,有些版本可能需要自己手动添加
一般可能是这两种情况:
1.需要使用nand write.yaffs命令烧写
2.mkyaffs2image工具或者制作时的参数为问题
可以先增加u-boot对nand write.yaffs的支持,这个网上的资料很多,如果还有错误,再检查工具。
http://processors.wiki.ti.com/index.php/Put_YAFFS_Image_to_Flash
http://processors.wiki.ti.com/index.php/Create_a_YAFFS_Target_Image
参考技术A nand write:向Nand Flash写入数据,如果NandFlash相应的区域有坏块,则直接报错。

nand write.e: 向Nand Flash写入数据减肥时会时行ECC校验,如果NandFlash相应的区域有坏块,可以跳过坏块。

nand write.jffs2:向Nand Flash写入jffs2镜像到相应的分区。

nand
write.yaffs:同理,实现yaffs文件系统镜像的烧写,这个命令不一定所有版本的u-boot支持,有些版本可能需要自己手动添加

u-boot-2016.03 支持yaffs2文件系统烧写之添加nand write.yaffs2命令

  我们进入nand的命令文件cmd/nand.c,在do_nand函数里,有nand read或write的代码,而其中有对jffs2的支持,却并没有对yaffs2的支持。以前的老版本uboot是有对yaffs文件系统烧写的支持的,于是我们参考老版本的uboot代码,在do_nand函数里的nand write/read部分加上一段代码,如下:

 1 #ifdef CONFIG_CMD_NAND_TRIMFFS
 2         } else if (!strcmp(s, ".trimffs")) {
 3             if (read) {
 4                 printf("Unknown nand command suffix ‘%s‘\n", s);
 5                  return 1;
 6             }
 7             ret = nand_write_skip_bad(nand, off, &rwsize, NULL,
 8                         maxsize, (u_char *)addr,
 9                         WITH_DROP_FFS | WITH_WR_VERIFY);
10 #endif
11 #ifdef CONFIG_CMD_NAND_YAFFS
12         } else if (!strcmp(s, ".yaffs2")) {
13             if (read) {
14                 printf("Unknown nand command suffix ‘%s‘.\n", s);
15                 return 1;
16             }
17             ret = nand_write_skip_bad(nand, off, &rwsize,NULL,//这里参数和老版比要修改下
18                         maxsize,(u_char *)addr,
19                         WITH_YAFFS_OOB);
20 #endif

在nand_help_text[]里添加nand write.yaffs的帮助信息:

    "nand read.raw - addr off|partition [count]\n"
    "nand write.raw - addr off|partition [count]\n"
    "    Use read.raw/write.raw to avoid ECC and access the flash as-is.\n"
#ifdef CONFIG_CMD_NAND_YAFFS
    "nand write.yaffs2 - addr off|partition size\n"
    "    write ‘size‘ bytes starting at offset ‘off‘ with yaffs format\n"
    "    from memory address ‘addr‘, skipping bad blocks.\n"
#endif  

nand_write_skip_bad函数内部也要修改:

 1    if (actual)
 2         *actual = 0; 
 3 #ifdef CONFIG_CMD_NAND_YAFFS                                                       
 4      if (flags & WITH_YAFFS_OOB) {                                                  
 5         if (flags & ~WITH_YAFFS_OOB)                                               
 6             return -EINVAL;                                                        
 7                                                                                    
 8         int pages;                                                                 
 9         pages = nand->erasesize / nand->writesize;                                 
10         blocksize = (pages * nand->oobsize) + nand->erasesize;                     
11         if (*length % (nand->writesize + nand->oobsize)) {                         
12             printf ("Attempt to write incomplete page"                             
13                 " in yaffs mode\n");                                               
14             return -EINVAL;                                                        
15         }                                                                          
16     } else                                                                         
17 #endif                                                                             
18     {                                                                              
19         blocksize = nand->erasesize;                                               
20     }    
21 
22     ...
23 
24 if (left_to_write < (blocksize - block_offset))                            
25         write_size = left_to_write;                                            
26      else                                                                       
27         write_size = blocksize - block_offset;                                 
28 #ifdef CONFIG_CMD_NAND_YAFFS                                                       
29     if (flags & WITH_YAFFS_OOB) {                                              
30         int page, pages;                                                       
31         size_t pagesize = nand->writesize;                                     
32         size_t pagesize_oob = pagesize + nand->oobsize;                        
33         struct mtd_oob_ops ops;                                                
34                                                                                
35         ops.len = pagesize;                                                    
36         ops.ooblen = nand->oobsize;                                            
37         ops.mode = MTD_OPS_RAW;       //这里要改为RAW                                         
38         ops.ooboffs = 0;                                                       
39                                                                                
40         pages = write_size / pagesize_oob;                                     
41         for (page = 0; page < pages; page++) {                                 
42             WATCHDOG_RESET();                                                  
43                                                                                
44         ops.datbuf = p_buffer;                                             
45         ops.oobbuf = ops.datbuf + pagesize;                                
46                                                                            
47         rval = nand->_write_oob(nand, offset, &ops);                        
48         if (rval != 0) 
49              break;                                                         
50                                                                               
51              offset += pagesize;                                                
52              p_buffer += pagesize_oob;                                          
53             }                                                                      
54         }                                                                          
55         else                                                                       
56 #endif    
57      {          //这里要加个左大括号                                                                
58              truncated_write_size = write_size;                                     
59 #ifdef CONFIG_CMD_NAND_TRIMFFS                                                     
60          if (flags & WITH_DROP_FFS)                                                 
61              truncated_write_size = drop_ffs(nand, p_buffer,                        
62                      &write_size);                                                  
63 #endif                                                                             
64                                                                                     
65          rval = nand_write(nand, offset, &truncated_write_size,                     
66                  p_buffer);                                                         
67                                                                                     
68          if ((flags & WITH_WR_VERIFY) && !rval)                                     
69              rval = nand_verify(nand, offset,                                       
70                  truncated_write_size, p_buffer);                                   
71                                                                                     
72          offset += write_size;                                                      
73          p_buffer += write_size;                                                    
74          } //这里要加个右大括号                                                                         
75          if (rval != 0) {      

同时,在include/nand.h中添加WITH_YAFFS_OOB宏的定义,

#define WITH_YAFFS_OOB    (1 << 0)
#define WITH_DROP_FFS   (1 << 0)

 最后在配置文件里添加CONFIG_CMD_NAND_YAFFS宏定义,编译烧写,成功烧写yaffs2文件系统并挂载成功,此uboot已经支持yaffs2文件系统的烧写。

以上是关于nand write.e 和nand write.yaffs的区别的主要内容,如果未能解决你的问题,请参考以下文章

三星S4 I9500刷机老是出现 NAND Write Start!!

什么是NAND芯片?

怎么从spi刷入nand

nand flash nor flash mcp flash 的区别

Serial flash 和 nor flash nand flash 有啥区别

nand flash X16和X8在硬件和软件设计上都有哪些差异,请帮忙说明一些,越详细越好。