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文件系统