windows操作系统如何支持yaffs文件系统

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了windows操作系统如何支持yaffs文件系统相关的知识,希望对你有一定的参考价值。

1、修改内核源码根目录下的Makefile文件
#ARCH ?= arm
#CROSS_COMPILE ?=arm-linux-

2、修改arch/arm/plat-s3c24xx/common-smdk.c文件,修改Nand Flash的分区信息和Nand Flash的硬件信息。这里的分区一定要和你的bootloader的一致,你可以参考smdk_default_nand_part[]这个数据结构的做法。

3、还是2中用到的文件,修改static struct s3c2410_platform_nand smdk_nand_info =
.tacls = 0,
.twrph0 = 30, //这 三个数字要改的 以前是20 60 20
.twrph1 = 0,
.nr_sets = ARRAY_SIZE(smdk_nand_sets),
.sets = smdk_nand_sets,
;

4、修改drivers/mtd/nand/s3c2410.c中s3c2410_nand_init_chip函数的NAND_ECC_SOFT为NAND_ECC_NONE。

5、晶振频率:修改arch/arm/mach-s3c2440/mach-smdk2440.c
static void __init smdk2440_map_io(void)

s3c24xx_init_io(smdk2440_iodesc, ARRAY_SIZE(smdk2440_iodesc));
s3c24xx_init_clocks(12000000);//改成和你的一样
s3c24xx_init_uarts(smdk2440_uartcfgs, ARRAY_SIZE(smdk2440_uartcfgs));


6、添加对yaffs2文件系统的支持:
下载yaffs2的源码包,解压后进入其中,其加入Linux内核(打补丁的方式)
#cd yaffs2
#./patch-ker.sh c $you_kernel_path(你的内核代码的目录)

7、配置内核
先拷贝s3c2410开发板的默认配置到内核根目录下,以简化配置过程
# cp arch/arm/configs/s3c2410_defconfig .config
# make menuconfig

1.General setup --->
[*] Configure standard kernel features (for small systems) --->

2. System Type ---->
[*] S3C2410 DMA support [*] Support ARM920T processor
S3C2410 Machines --->
[*] SMDK2410/A9M2410
S3C2440 Machines --->
[*] SMDK2440
[*] SMDK2440 with S3C2440 CPU module

3.Boot options --->
将 (root=/dev/hda1 ro init=/bin/bash console=ttySAC0) Default kernel command string
改成 (noinitrd root=/dev/mtdblock2 console=ttySAC0,115200 init=/linuxrc )
这里要特别注意root=/dev/mtdblock2 这个参数,mtdblock2是你的根文件系统所在的位置,和你在bootloader的分配有关,当然也和上述2。步骤的密切相关。不行的话多试几次。

4.[*] Enable loadable module support --->
[*] Module unloading
[*] Automatic kernel module loading
选择这两个,剩下的可以去掉
5.Device Drivers --->
<*> Memory Technology Device (MTD) support --->
[*] MTD partitioning support
<*> NAND Device Support --->
<*> NAND Flash support for S3C2410/S3C2440 SoC
[ ] S3C2410 NAND Hardware ECC //这个要去掉

6.File systems----->
Miscellaneous filesystems --->
<*>YAFFS2 file system support
7.make zImage
参考技术A 建立引导装载程序BOOTLOADER,从网络上下载一些公开源代码的BOOTLOADER,如U.BOOT、BLOB、VIVI、LILO、ARM-BOOT、RED-BOOT等,根据具体芯片进行移植修改。有些芯片没有内置引导装载程序,比如,三星的ARV17、ARM9系列芯片,这样就需要编写开发板上FLASH的烧写程序,可以在网上下载相应的烧写程序,也有Linux下的公开源代码的J-FLASH程序。

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文件系统的烧写。

以上是关于windows操作系统如何支持yaffs文件系统的主要内容,如果未能解决你的问题,请参考以下文章

s3c2440 移植linux内核 添加网卡支持 yaffs2文件系统支持

[讨论]关于使用EXT2,EXT4文件系统,为啥没有用yaffs2

Linux 4.10.8 根文件系统制作---制作yaffs文件系统

关于Linux2.6.30.4移植YAFFS2文件系统中出现的问题:

SylixOS下YAFFS挂载参数说明

jffs2和yaffs2文件系统