u-boot-2011.03在TQ2440上的移植(8)--支持下载yaffs2文件系统
2011-03-21 15:11
561 查看
参考文章http://blog.chinaunix.net/u3/101649/showart.php?id=2134240,第2步修改分区大小后经过测试可以在TQ2440上使用,TQ2440分区如下:
0~0x40000 u-boot (256K)
0x200000~0x500000 kernel (3M)
0x500000~~ (剩余的)
1、通常一个Nnad Flash存储设备由若干块组成,1个块由若干页组成。一般128MB以下容量的Nand Flash芯片,一页大小为528B,被依次分为2个256B的主数据区和16B的额外空间。128MB以上容量的Nand Flash芯片,一页大小通常为2KB。由于Nand Flash出现位反转的概率较大,一般在读写时需要使用ECC进行错误检验和恢复。TQ2440上的Nandflash型号是K9F2G08,页面大小为page = 2K + 64Byte。
Yaffs/yaffs2文件系统的设计充分考虑到Nand Flash以页为存取单位等的特点,将文件组织成固定大小的段(Chunk)。以528B的页为例,Yaffs/yaffs2文件系统使用前512B存储数据和16B的额外空间存放数据的ECC和文件系统的组织信息等(称为OOB数据)。通过OOB数据,不但能实现错误检测和坏块处理,同时还可以避免加载时对整个存储介质的扫描,加快了文件系统的加载速度。以下是Yaffs/yaffs2文件系统页的结构说明
好了,在了解Nand Flash组成和Yaffs/yaffs2文件系统结构后,我们再回到u-boot中。目前,在u-boot中已经有对Cramfs、Jffs2等文件系统的读写支持,但与带有数据校验等功能的OOB区的Yaffs/Yaffs2文件系统相比,他们是将所有文件数据简单的以线性表形式组织的。所以,我们只要在此基础上通过修改u-boot的Nand Flash读写命令,增加处理00B区域数据的功能,即可以实现对Yaffs/Yaffs2文件系统的读写支持。
2、在include/configs/smdk2440.h头文件中定义一个管理对Yaffs2支持的宏和开启u-boot中对Nand Flash默认分区的宏,如下:
vi include/configs/smdk2440.h
//定义一个管理对Yaffs2支持的宏
#define CONFIG_MTD_NAND_YAFFS2 1
//开启Nand Flash默认分区,注意此处的分区要和你的内核中的分区保持一致
#define MTDIDS_DEFAULT "nand0=nandflash0"
#define MTDPARTS_DEFAULT "mtdparts=nandflash0:256k(bootloader)," /
"3m(kernel)," /
"-(root)"
3、在原来对Nand操作的命令集列表中添加Yaffs2对Nand的写命令,如下:
vi common/cmd_nand.c
在函数U_BOOT_CMD中添加如下:
//注意:这里只添加了yaffs2的写命令,因为我们只用u-boot下载(即写)功能,所以我们没有添加yaffs2读的命令
接着,在该文件中对nand操作的do_nand函数中添加yaffs2对nand的操作,如下:
0~0x40000 u-boot (256K)
0x200000~0x500000 kernel (3M)
0x500000~~ (剩余的)
1、通常一个Nnad Flash存储设备由若干块组成,1个块由若干页组成。一般128MB以下容量的Nand Flash芯片,一页大小为528B,被依次分为2个256B的主数据区和16B的额外空间。128MB以上容量的Nand Flash芯片,一页大小通常为2KB。由于Nand Flash出现位反转的概率较大,一般在读写时需要使用ECC进行错误检验和恢复。TQ2440上的Nandflash型号是K9F2G08,页面大小为page = 2K + 64Byte。
Yaffs/yaffs2文件系统的设计充分考虑到Nand Flash以页为存取单位等的特点,将文件组织成固定大小的段(Chunk)。以528B的页为例,Yaffs/yaffs2文件系统使用前512B存储数据和16B的额外空间存放数据的ECC和文件系统的组织信息等(称为OOB数据)。通过OOB数据,不但能实现错误检测和坏块处理,同时还可以避免加载时对整个存储介质的扫描,加快了文件系统的加载速度。以下是Yaffs/yaffs2文件系统页的结构说明
Yaffs页结构说明 ============================================== 字节 用途 ============================================== 0 - 511 存储数据(分为两个半部) 512 - 515 系统信息 516 数据状态字 517 块状态字 518 - 519 系统信息 520 - 522 后半部256字节的ECC 523 - 524 系统信息 525 - 527 前半部256字节的ECC ============================================== |
2、在include/configs/smdk2440.h头文件中定义一个管理对Yaffs2支持的宏和开启u-boot中对Nand Flash默认分区的宏,如下:
vi include/configs/smdk2440.h
//定义一个管理对Yaffs2支持的宏
#define CONFIG_MTD_NAND_YAFFS2 1
//开启Nand Flash默认分区,注意此处的分区要和你的内核中的分区保持一致
#define MTDIDS_DEFAULT "nand0=nandflash0"
#define MTDPARTS_DEFAULT "mtdparts=nandflash0:256k(bootloader)," /
"3m(kernel)," /
"-(root)"
3、在原来对Nand操作的命令集列表中添加Yaffs2对Nand的写命令,如下:
vi common/cmd_nand.c
在函数U_BOOT_CMD中添加如下:
//注意:这里只添加了yaffs2的写命令,因为我们只用u-boot下载(即写)功能,所以我们没有添加yaffs2读的命令
U_BOOT_CMD(nand, CONFIG_SYS_MAXARGS, 1, do_nand, "NAND sub-system", "info - show available NAND devices/n" "nand device [dev] - show or set current device/n" "nand read - addr off|partition size/n" "nand write - addr off|partition size/n" " read/write 'size' bytes starting at offset 'off'/n" " to/from memory address 'addr', skipping bad blocks./n" //注意:这里只添加了yaffs2的写命令,因为我们只用u-boot下载(即写)功能,所以我们没有添加yaffs2读的命令 #if defined(CONFIG_MTD_NAND_YAFFS2) "nand write[.yaffs2] - addr off|partition size - write `size' byte yaffs image/n" " starting at offset off' from memory address addr' (.yaffs2 for 512+16 NAND)/n" #endif "nand erase [clean] [off size] - erase 'size' bytes from/n" " offset 'off' (entire device if not specified)/n" "nand bad - show bad blocks/n" "nand dump[.oob] off - dump page/n" "nand scrub - really clean NAND erasing bad blocks (UNSAFE)/n" "nand markbad off [...] - mark bad block(s) at offset (UNSAFE)/n" "nand biterr off - make a bit error at offset (UNSAFE)" #ifdef CONFIG_CMD_NAND_LOCK_UNLOCK "/n" "nand lock [tight] [status]/n" " bring nand to lock state or display locked pages/n" "nand unlock [offset] [size] - unlock section" #endif ); |
if (strncmp(cmd, "read", 4) == 0 || strncmp(cmd, "write", 5) == 0) { int read; if (argc < 4) goto usage; addr = (ulong)simple_strtoul(argv[2], NULL, 16); read = strncmp(cmd, "read", 4) == 0; /* 1 = read, 0 = write */ printf("/nNAND %s: ", read ? "read" : "write"); if (arg_off_size(argc - 3, argv + 3, nand, &off, &size) != 0) return 1; s = strchr(cmd, '.'); if (!s || !strcmp(s, ".jffs2") || !strcmp(s, ".e") || !strcmp(s, ".i")) { if (read) ret = nand_read_skip_bad(nand, off, &size, (u_char *)addr); else ret = nand_write_skip_bad(nand, off, &size, (u_char *)addr); } //添加yaffs2相关操作,注意该处又关联到nand_write_skip_bad函数 #if defined(CONFIG_MTD_NAND_YAFFS2) else if (s != NULL && (!strcmp(s, ".yaffs2"))) { nand->rw_oob = 1; nand->skipfirstblk = 1; ret = nand_write_skip_bad(nand,off,&size,(u_char *)addr); nand->skipfirstblk = 0; nand->rw_oob = 0; } #endif else if (!strcmp(s, ".oob")) { /* out-of-band data */ mtd_oob_ops_t ops = { .oobbuf = (u8 *)addr, .ooblen = size, .mode = MTD_OOB_RAW }; if (read) ret = nand->read_oob(nand, off, &ops); else ret = nand->write_oob(nand, off, &ops); } else { printf("Unknown nand command suffix '%s'./n", s); return 1; } printf(" %zu bytes %s: %s/n", size, read ? "read" : "written", ret ? "ERROR" : "OK"); return ret == 0 ? 0 : 1; } 在include/linux/mtd/mtd.h头文件的mtd_info结构体中添加上面用到rw_oob和skipfirstblk数据成员,如下:
|
相关文章推荐
- 移植u-boot-2011.03到S3C2440(utu2440)的方法与步骤###8. u-boot引导启动nand flash中内核和根文件系统cramfs和用户文件系统yaffs2支持
- TX2440 ARM开发板Uboot移植(五、yaffs2文件系统的支持)
- UBOOT-2010.06 移植 支持 下载yaffs2文件系统 (九)
- u-boot-1.1.6下移植支持yaffs2文件系统的烧写
- 06-S3C2440学习之移植2012u-boot到S3C2440(移植过程五--最终)裁剪+修改默认参数+分区设置+支持文件系统下载
- <2012 12 06> FL2440开发板的U-boot-2010.09版本移植(十)支持烧写YAFFS2文件系统
- u-boot-2011.03在TQ2440上的移植(11)--支持USB下载
- 移植u-boot-2010.09到三星SC32442平台(三):yaffs2文件系统写入支持
- U-boot移植 (v2012.04.1 S3C2440平台) (五) DM9000驱动支持,yaffs文件系统下载支持
- 6410 UBOOT 支持SD/SDHC卡启动 FAT32文件系统 yaffs2烧录 图片显示烧录状态
- 移植U-BOOT之支持烧写YAFFS文件系统以及制作U-BOOT补丁
- 实现u-boot对yaffs/yaffs2文件系统下载的支持
- [转]u-boot-2010.12移植到2440(五,yaffs2文件系统移植
- u-boot-2016.03 支持yaffs2文件系统烧写之添加nand write.yaffs2命令
- ffs2官网-源码下载和向内核添加yaffs2文件系统支持
- u-boot-2011.03在TQ2440上的移植(3)--支持norflash启动 .
- 6410 UBOOT 支持SD/SDHC卡启动 FAT32文件系统 yaffs2烧录 图片显示烧录状态
- 天祥 TX2440 UBOOT移植(5. 支持文件操作系统yaffs2)
- u-boot-2009.08在mini2440上的移植(五)---增加yaffs2文件系统
- u-boot-2011.03在TQ2440上的移植(9)--TFTP下载菜单制作