u-boot支持yaffs映像烧写的补丁
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映像烧写的补丁的更多相关文章
- 6.移植uboot-支持yaffs烧写,打补丁
在上一章,裁剪uboot以及分区后,本章主要使uboot支持yaffs以及制作补丁 1. 修改uboot支持yaffs 首先,每个命令都会对应一个文件,比如nand命令对应的common/cmd_na ...
- RK3399开发板Android镜像烧写之Windows系统映像烧写
4.1.1 l RKTool 驱动安装(基于迅为iTOP-3399开发板)DriverAssitant_v4.5.zip 文件,打开 驱动安装成功,如下图: 注意事项:1.目前支持的操作系统包括:X ...
- U-Boot在FL2440上移植(四)----支持网卡DM9000和烧写yaffs文件系统
<一>支持网卡芯片DM9000 在driver下,有网卡驱动DM9000x.c 和 DM9000x.h DM9000接在BANK4,位宽16 在include/configs/TX2440 ...
- s3c2440 移值u-boot-2016.03 第6篇 支持mtd yaffs 烧写
1, 解决启动时的错误 Warning - bad CRC, using default environment 搜索发现 在 /tools/env/fw_env.c 中 /* 放在NAND FLAS ...
- 【嵌入式开发】向开发板中烧写Linux系统-型号S3C6410
作者 : 万境绝尘 转载请著名出处 终于拿到板子了, 嵌入式开发正式开启. 板子型号 : 三星 S3C6410 基于ARM11, 指令集基于arm6指令集; 为毛不是 Cortext A9的板子; 烧 ...
- 树莓派开发系列教程2--树莓派3B介绍及系统烧写、基本配置
注意:树莓派系列的3篇文章里面的图片因为博客转移过程丢失了,非常抱歉 前言 树莓派系列里涉及到需要额外电脑来协助处理的部分(如烧写系统,远程访问等等),统一在运行着Ubuntu15系统的mac air ...
- Jlink烧写图文教程
,点击安装 , 插上jlink,安装驱动后,红灯一直亮 ...
- u-boot烧写Linux及系统整个启动过程
一.烧写文件 u-boot: u-boot.bin linux kernel: uImage Filesystem: root.bin(yaffs) 二.烧写步骤 1.烧写u-boot tftp 0 ...
- ESP8266乐鑫版本的(支持云端升级 (Boot 模式)烧写方法,(V1.5.4官方介绍如下)(BOOT模式)
硬件平台: nodeMCU devkit核心板,带ch340g,应该是仿造的,官方是cp2102驱动,安信可科技有连接https://wiki.ai-thinker.com/esp8266/board ...
随机推荐
- ab性能测试工具
Apache自带的压力测试工具——ab初体验 http://studiogang.blog.51cto.com/505887/386852 我们知道压力测试的软件确实很多,诸如微软的WAST,惠普的L ...
- Django实战(18):提交订单
前面的内容已经基本上涵盖了Django开发的主要方面,我们从需求和界面设计出发,创建模型和修改模型,并通过scaffold作为开发的起点:在scaffold的基础上重新定制模板,并且通过Model类和 ...
- 关于linux时间
时区确定cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 查看硬件时间hwclock --show 将系统时间写入硬件时间hwclock --sy ...
- 8-7 Unique Snowflakes UVA11572
输入一个长度为n n<=10 6 的序列A 找到一个尽量长的连续子序列 使得该序列中没有相同的元素 用滑动窗口法 时间复杂度n 好神奇 此题非常经典 map 410ms #inc ...
- 《Android源码设计模式》--享元模式
No1: 享元模式是对象池的一种实现.享元模式用来尽可能减少内存使用量,它适合用于可能存在大量重复对象的场景,来缓存可共享的对象,达到对象共享.避免创建过多对象的效果,这样一来就可以提升性能.避免内存 ...
- BoneBlack am335x can0 通讯配置与测试
准备工具: 1.内核3.14.65,u-boot.文件系统 2.boneblack开发板 3.串口线.电源线,测试线,测试夹 一.配置内核支持CAN通讯 [*] Networking support ...
- 使用 Python 读取火狐的 cookies
这事本来是有个 browsercookie 库可以做的,但是初看它就有不少问题: 不能指定要使用的火狐 profile(后来发现可以指定数据库文件). 找不到 sessionstore.js 文件时会 ...
- MySQL数据库sql语句
零.用户管理: 1.新建用户: >CREATE USER name IDENTIFIED BY 'ssapdrow'; 2.更改密码: >SET PASSWORD FOR name=PAS ...
- CVE-2014-4113本地提权测试
CVE-2014-4113本地提权漏洞分析 By Netfairy 前言 2014年10月14日, Crowdstrike和FireEye发表了一篇文章, 描述了一个新的针对Windows的提权漏洞. ...
- bzoj3173 Splay 维护前缀中的最大值
大致题意: 有一个空序列,依次插入1~N到该序列中,每次指定插入的位置,每次插入完成返回当前序列的LIS的长度. 题解: 设dp[i]表示 前缀1~i的最长上升子序列的长度. 因为是按照递增顺序插入的 ...