u-boot的nand flash驱动有两个版本,似乎是以u-boot1..5为分界点的,之前的版本使用的是自己写的nand flash驱动,而后面的版本使用的是linux内核中nand flash的驱动。这两个版本有可能在同一个u-boot中存在,都存放在
driver目录下面,一个为nand,一个为nand_legacy,意思为传统的nand flash驱动。两者使用一个宏开关
CFG_NAND_LEGACY来打开,如果定义这个宏的话,将使用传统的nand flash驱动,否则使用最新的flash驱动。
关于传统的flash驱动中的yaffs文件映像的下载问题,我已经解决,可以看我的另外的一篇文章,使用的内核版本是2..17的内核可能可以使用我说的方法,.618的内核可能就不能用我说的那个方法,.18以上的内核帮忙验证一下,然后在这里告诉一下在下。
最新的flash中的yaffs文件映像烧写的问题,我放出一个老外的驱动,我验证过映像下载是没有问题,但是产生了一些其他的问题,我一直没有解决,所以这篇文章也拖到现在。

                diff --git a/common/cmd_nand.c b/common/cmd_nand.c
index b011b5e..
--- a/common/cmd_nand.c
+++ b/common/cmd_nand.c
@@ -, +, @@ #endif
                 opts.quiet      = quiet;
                 ret = nand_write_opts(nand, &opts);
             }
+#ifdef CFG_NAND_YAFFS_WRITE
+        } else if (!read && s != NULL &&
+               (!strcmp(s, ".yaffs") || !strcmp(s, ".yaffs1"))) {
+            nand_write_options_t opts;
+            memset(&opts, , sizeof(opts));
+            opts.buffer    = (u_char*) addr;
+            opts.length    = size;
+            opts.offset    = off;
+            opts.pad    = ;
+            opts.blockalign = ;
+            opts.quiet      = quiet;
+            opts.writeoob    = ;
+            opts.autoplace    = ;
+            ] == ')
+                opts.forceyaffs = ;
+            ret = nand_write_opts(nand, &opts);
+#endif
         } else {
             if (read)
                 ret = nand_read(nand, off, &size, (u_char *)addr);
@@ -, +, @@ U_BOOT_CMD(nand, , , do_nand,
     "nand read[.jffs2]     - addr off|partition size\n"
     "nand write[.jffs2]    - addr off|partiton size - read/write `size' bytes starting\n"
     "    at offset `off' to/from memory address `addr'\n"
+#ifdef CFG_NAND_YAFFS_WRITE
+    "nand write[.yaffs[1]] - addr off|partition size - write `size' byte yaffs image\n"
+    "    starting at offset `off' from memory address `addr' (.yaffs1 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"
diff --git a/drivers/nand/nand_util.c b/drivers/nand/nand_util.c
index 10bf036..bea5c1e
--- a/drivers/nand/nand_util.c
+++ b/drivers/nand/nand_util.c
@@ -, +, @@ int nand_write_opts(nand_info_t *meminfo
         struct nand_oobinfo *oobsel =
             opts->forcejffs2 ? &jffs2_oobinfo : &yaffs_oobinfo;

+#ifdef CFG_NAND_YAFFS1_NEW_OOB_LAYOUT
+        /* jffs2_oobinfo matches 2.6.18+ MTD nand_oob_16 ecclayout */
+        oobsel = &jffs2_oobinfo;
+#endif
         ) {
             if (opts->forceyaffs) {
                 printf("YAFSS cannot operate on "
@@ -, +, @@ int nand_write_opts(nand_info_t *meminfo
             memcpy(oob_buf, buffer, meminfo->oobsize);
             buffer += meminfo->oobsize;

+            if (opts->forceyaffs) {
+#ifdef CFG_NAND_YAFFS1_NEW_OOB_LAYOUT
+                /* translate OOB for yaffs1 on Linux 2.6.18+ */
+                oob_buf[] = oob_buf[];
+                oob_buf[] = oob_buf[];
+                oob_buf[] = (oob_buf[] & 0x3f)
+                    | (oob_buf[] ==  : 0x80)
+                    | (oob_buf[] ==  ?  : 0x40);
+                oob_buf[] = oob_buf[];
+                oob_buf[] = oob_buf[];
+                oob_buf[] = oob_buf[];
+                oob_buf[]  = oob_buf[];
+                oob_buf[]  = oob_buf[];
+                memset(oob_buf, );
+#else
+                /* set the ECC bytes to 0xff so MTD will
+                   calculate it */
+                int i;
+                ; i  meminfo->oobinfo.eccbytes; i++)
+                    oob_buf[meminfo->oobinfo.eccpos[i]] = 0xff;
+#endif
+            }
             /* write OOB data first, as ecc will be placed
              * in there*/
             result = meminfo->write_oob(meminfo,

自己选择性的添加吧。

这个补丁主要完成了一个oob字节顺序的改变。

注意同时要查看一下你的mkyaffsimage命令的源文件里面的oob的字节的顺序!

这样制作的u-boot下载yaffs文件系统映像没有问题,但是垃圾回收(garbage collection)机制有问题,对该文件系统进行写入操作(mkdir、 touch)时,系统提示:

page
.
.
.
page    

具体原因待查!

内核的一个编译选项的意义:
Device Drivers->Memory Technolovy Devices->FTL(Flash Translation Layer) Support
这个选项的意义在于?
由于无法重复的在flash的同一块存储位置上做写入的操作(必须事先擦除该快之后才能写入),因此一般在硬盘上使用的文件系统,如:fat16,fat32,ntfs,ext2,ext3等将无法直接用到flash上,为了沿用这些文件系统,则必须透过一层转换层来将逻辑地址对应到flash的存储器的物理位置上,使系统能把flash当作普通的硬盘来使用,我们将这一层称之为ftl(flash translation layer),flash主要用于nor flash上,而nftl则应用于nand flash上。
最简单的ftl的实现方法就是一对一的映射,那么当上层的文件系统要写一个块设备的扇区的时候,闪存做下面的操作来完成这个请求。
、将这个扇区的所在的擦处块读到内存中,放入缓冲
、按照写要求更新该缓冲块
、对该快进行擦除
、回写
存在的问题:
、效率低,一个chunk更新要对整个block进行擦除
、没有磨损均衡策略
、非常不安全!容易引起数据的丢失,如果3步与第4步之间,数据将全部丢失

所以闪存转换层采用的算法比这个复杂一点

在flash上,尽量避免使用传统的依赖闪存转换层的文件系统,最好采用专门的针对flash的文件系统,如
jffs3和yaffs2

问题:加载cramfs文件系统分区(mount -t cramfs /dev/mtdblock1 /mnt/flash1)的时候,报出如下的错误:
end_request: I/O error, dev mtdblock2, sector
Buffer I/O error on device mtdblock2, logical block
end_request: I/O error, dev mtdblock2, sector
Buffer I/O error on device mtdblock2, logical block
end_request: I/O error, dev mtdblock2, sector
Buffer I/O error on device mtdblock2, logical block
end_request: I/O error, dev mtdblock2, sector
Buffer I/O error on device mtdblock2, logical block
end_request: I/O error, dev mtdblock2, sector
Buffer I/O error on device mtdblock2, logical block
end_request: I/O error, dev mtdblock2, sector
开始以为是硬件错误,后来仔细一检查发现:其实是uboot写入cramfs文件系统映像时使用的ecc校验算法和内核使用的校验算法不一致导致的,如果我们将内核中的mtd层ecc校验NAND_ECC_SOFT关掉,在/drivers/mtd/at91_nand.c文件中有定义。则系统在加载的时候将不再报错,验证了这是校验的问题,解觉的办法是什么?
首先在uboot中,使用nand erase 将cramfs分区擦除干净,以nfs的方式启动linux,然后使用
cp root_fs_cramfs.img /dev/mtd1
将cramfs映像文件拷贝到相应的字符设备中。
然后使用mount -t cramfs /dev/mtdblock1 /mnt/flash1。
则cramfs文件系统加载正常。

这样我们可以不使用ramdisk技术来加载根文件系统,可以省去读内存的时间,加快启动速度。
这时的内核启动参数为:
noinitrd init=/linuxrc root=/dev/mtdblock1 ro console=ttyS0, mem=64M ip=192.168.0.11 netmask=255.255.255.0
修改u-boot的bootcmd ,就可以加快启动速度,同时节省ram的空间!直接从cramfs的nandflash上启动

u-boot支持yaffs映像烧写的补丁的更多相关文章

  1. 6.移植uboot-支持yaffs烧写,打补丁

    在上一章,裁剪uboot以及分区后,本章主要使uboot支持yaffs以及制作补丁 1. 修改uboot支持yaffs 首先,每个命令都会对应一个文件,比如nand命令对应的common/cmd_na ...

  2. RK3399开发板Android镜像烧写之Windows系统映像烧写

    4.1.1 l RKTool  驱动安装(基于迅为iTOP-3399开发板)DriverAssitant_v4.5.zip 文件,打开 驱动安装成功,如下图: 注意事项:1.目前支持的操作系统包括:X ...

  3. U-Boot在FL2440上移植(四)----支持网卡DM9000和烧写yaffs文件系统

    <一>支持网卡芯片DM9000 在driver下,有网卡驱动DM9000x.c 和 DM9000x.h DM9000接在BANK4,位宽16 在include/configs/TX2440 ...

  4. s3c2440 移值u-boot-2016.03 第6篇 支持mtd yaffs 烧写

    1, 解决启动时的错误 Warning - bad CRC, using default environment 搜索发现 在 /tools/env/fw_env.c 中 /* 放在NAND FLAS ...

  5. 【嵌入式开发】向开发板中烧写Linux系统-型号S3C6410

    作者 : 万境绝尘 转载请著名出处 终于拿到板子了, 嵌入式开发正式开启. 板子型号 : 三星 S3C6410 基于ARM11, 指令集基于arm6指令集; 为毛不是 Cortext A9的板子; 烧 ...

  6. 树莓派开发系列教程2--树莓派3B介绍及系统烧写、基本配置

    注意:树莓派系列的3篇文章里面的图片因为博客转移过程丢失了,非常抱歉 前言 树莓派系列里涉及到需要额外电脑来协助处理的部分(如烧写系统,远程访问等等),统一在运行着Ubuntu15系统的mac air ...

  7. Jlink烧写图文教程

    ,点击安装          , 插上jlink,安装驱动后,红灯一直亮                                                                 ...

  8. u-boot烧写Linux及系统整个启动过程

    一.烧写文件 u-boot: u-boot.bin linux kernel: uImage Filesystem: root.bin(yaffs) 二.烧写步骤  1.烧写u-boot tftp 0 ...

  9. ESP8266乐鑫版本的(支持云端升级 (Boot 模式)烧写方法,(V1.5.4官方介绍如下)(BOOT模式)

    硬件平台: nodeMCU devkit核心板,带ch340g,应该是仿造的,官方是cp2102驱动,安信可科技有连接https://wiki.ai-thinker.com/esp8266/board ...

随机推荐

  1. linux 101 hacks 5PS1

    PS1——默认提示符 看完这一章,我心里若干个卧槽.. 如下所示, 可以通过修改 Linux 下的默认提示符,使其更加实用.在下面的例子中,默认的 PS1的值是“ \s-\v\$”,显示出了 shel ...

  2. ThinPHP3.2中 addAll()批量插入数据

    thinkphp中model类的addAll()方法可以将数据同时添加到数据库中. 1 2 3 4 5 6 // 批量添加数据 (only MySQL) $user = M('user'); //ar ...

  3. 配置k8s dns

    DNS (domain name system),提供域名解析服务,解决了难于记忆的IP地址问题,以更人性可读可记忆可标识的方式映射对应IP地址. Cluster DNS扩展插件用于支持k8s集群系统 ...

  4. Python 面向对象编程——访问限制

    <无访问限制的对象> 在Class内部,可以有属性和方法,而外部代码可以通过直接调用实例变量的方法来操作数据,这样,就隐藏了内部的复杂逻辑.但是,从前面Student类的定义来看(见:Py ...

  5. xml javascript

    1.XMLHttpRequest对象 创建XMLHttpRequest对象 xmlhttp=new XMLHttpRequest(); ##老版本的 Internet Explorer (IE5 和 ...

  6. CF912D Fishes 期望 + 贪心

    有趣的水题 由期望的线性性质,全局期望 = 每个格子的期望之和 由于权值一样,我们优先选概率大的点就好了 用一些数据结构来维护就好了 复杂度$O(k \log n)$ #include <set ...

  7. 鸟哥的私房菜:Linux磁盘与文件系统原理

    1 硬盘物理组成     //原理 磁头负责读写     磁道(硬盘同半径的一圈) 磁柱(所有盘磁道叠加起来的柱)     扇区(2条半径将磁道分开的一个扇形区域,是磁盘的最小存储单位) ------ ...

  8. dll文件反编译,c#、vb动态库反编译

    最近开发遇到一个项目,对方提供一个c#编写的动态库,图片处理需要调用该动态库方法,发现一张图片处理起来需要5s时间,对方无法提供有效解决手段,抱着试一试的想法反编译的对方的动态库,发现其中问题. 一下 ...

  9. bzoj 3668 数位DP

    收获: 1.如果有很多位操作,并且不包含+-×/等高级运算,那么可以一位一位考虑,如果求一个最优解,可以尝试逐位确定,这道题因为原始攻击值有范围,那么就需要数位DP. /*************** ...

  10. C#高级编程9-第3章 对象与类型

    类与结构 类和结构都是对象的模板 类定义了处理和访问数据的方法,通过类的实例化进行逻辑处理 类与结构的区别是类是引用类型,存储在托管堆上:结构是值类型,存储在栈上的: 类使用class进行修饰,结构使 ...