Windows下u-boot-2011.03在Mini2440移植详解(5)

发布者:平和梦想最新更新时间:2022-05-23 来源: eefocus关键字:Windows  u-boot  Mini2440  移植 手机看文章 扫描二维码
随时随地手机看文章

增加Nand Flash ECC的支持


又参考了网址http://blog.csdn.net/fulinus/article/details/8737129


修改相关文件:


1.u-boot-2011.03driversmtdnands3c2440_nand.c


2.u-boot-2011.03includeconfigsmini2440.h


一开始一直不能确定的是:nand->ecc.size 和nand->ecc.bytes到底是多少?板子上带的Nand Flash是:K9F1208U0B:64MB,8位。每1页包含512字节的main数据区和16字节的spare数据区。main区用于存储数据,spare区用于存储其它附加信息。S3C2440一次可以产生4个字节的ECC,对于K9F1208U0B,页大小是512字节的nand flash,只要读取1页(512字节)就产生4个字节的main区ECC。对于页是2048字节的nand flash,同样也是读取1页(2048字节)就产生4字节的ECC。参考网址,将nand->ecc.size=512,nand->ecc.bytes=4。


@2014-04-26:关于产生ECC字节数之前的误解:


S3C2440到底读/写一页数据上产生多少个字节的main区ECC和多少个字节的spare区ECC,是和Nand Flash的位数关联的。如果Nand Flash是8位的,那么一页产生4字节的Main区ECC(在NFMECC0寄存器里)和2个字节的spare区ECC(在NFSECC寄存器的低16位),如果Nand Flash是16位的,那么一页产生8个字节的Main区ECC(在NFMECC0和NFMECC1寄存器里)和4个字节的spare区ECC(在NFSECC寄存器里)。但是目前我们并没有是spare区的ECC码。


如下图(摘自S3C2440A datasheet)


关于怎么产生ECC:


在S3C2440数据手册第6章有这么一段。

产生ECC校验码的过程为:在读取或写入哪个区的数据之前,先解锁该区的ECC,以便产生该区的ECC。在读取或写入完数据之后,再锁定该区的ECC,这样系统就会把产生的ECC码保存到相应的寄存器中。


以主数据区域为例:解锁ECC,将NFCONT中第5位MainECCLock置0。锁定ECC,将NFCONT中第5位MainECCLock置1。


当读或写数据时,自动产生的ECC校验在寄存器NFMECC0/1中。


ECC校验可以纠正1个比特的错误和检测2个比特的错误。


关于出现1位错误根据下图校正。

1.先计算哪个数据出错:(NFESTAT0>>7) & 0x7ff;


2.再计算哪个位出错:(NFESTAT0>>4) & 0x7;


3.校正:我们知道,1位出错,要么是0变1,要么是1变0。用1与这位异或即可。


Repaired = Data[(NFESTAT0>>7)& 0x7ff] ^ (1<<((NFESTAT0>>4) & 0x7));


测试:


调试运行后的串口输出如下图:

读参数时报了一个-74的错误,应该就是ECC校验不过的原因。具体还没有去查。下面还有一个warning。在串口中输入saveenv,然后再次调试运行,如下图。这时候没有报上图的错误了。

查看参数0x80000的nand flash值,发现oob的前4个字节已经与之前的不同了。其中0x80000是在mini2440.h文件内定义的nand flash 参数起始地址。nand dump命令并不会去进行数据的ECC校验检测,只是读取数据,这区别与下面的nand read命令

当执行:nand read 0x31100000 0x80000 0x200时,程序会调用到这里,在文件drivers/mtd/nand/nand_base.c,函数nand_read_page_hwecc。如下图:

根据上图可做函数简要说明:


staticint s3c2440_nand_calculate_ecc(structmtd_info *mtd, const u_char *dat,


                                  u_char *ecc_code)


当读或写完一页后,调用该函数,读取NFMECC0寄存器,就可以将该页main区的ECC校验码取出。参考源码


其中,u_char *ecc_code就是存取读取的ECC校验码


staticint s3c2440_nand_correct_data(structmtd_info *mtd, u_char *dat,


                                 u_char *read_ecc, u_char *calc_ecc)


该函数用来比较read_ecc和calc_ecc的校验是否相等的。


其中,read_ecc是在spare区读出来的ECC校验值。


      calc_ecc是读完1页后自动产生的ECC校验值。针对main区的ECC校验码,此值同样存在于NFMECC0寄存器内。


但是在该函数中并没有直接去比较read_ecc和calc_ecc,而是将read_ecc的值写入NFMECCD0和NFMECCD1,用硬件去比较,然后读取寄存器NFSTAT的值来判断。


其实直接比较read_ecc和calc_ecc,也是可以的,有的移植就是直接比较的。



本部分代码下载地址:360云盘http://yunpan.360.cn/,在《Uboot相关代码》文件夹里的《u-boot-2011.03_SRAM调试.zip》文件。

《u-boot-2011.03源码无修改.tar.bz2》是从官网下的无修改代码

关键字:Windows  u-boot  Mini2440  移植 引用地址:Windows下u-boot-2011.03在Mini2440移植详解(5)

上一篇:Windows下u-boot-2011.03在Mini2440移植详解(6)
下一篇:Windows下u-boot-2011.03在Mini2440移植详解(4)

推荐阅读最新更新时间:2024-11-20 08:25

python移植到arm平台
1. 交叉编译Python   见 Cross Compiling Python for Embedded Linux CC=arm-linux-gcc CXX=arm-linux-g++ AR=arm-linux-ar RANLIB=arm-linux-ranlib ./configure --host=arm-linux --build=x86_64-linux-gnu --prefix=/root/tftpboot/Python-2.7.3 make HOSTPYTHON=./hostpython HOSTPGEN=./Parser/hostpgen BLDSHARED= arm-linux-gcc -shared CR
[单片机]
法国巴黎惊现10米高Windows Phone“手机”
          为了推销Lumia系列WP智能手机,诺基亚可真是费尽了心思,先是在英国伦敦高达400英尺的Millbank Tower上播放长达30分钟的视频,接着在香港旺角西洋菜南街展示由三种不同颜色的Lumia 800和白色 Lumia 710堆成的巨型Windows Phone手机,而现在,又有外国媒体报导称它在法国巴黎的香榭丽舍(Champs Elysées)展出了一个高10米的巨型Nokia Lumia 800。   据悉,这部“手机”拥有10天展出时间,并将于今晚(美国时间11月8日)揭幕。而诺基亚要在香榭丽舍举行展会,这次展会是交互性的,例如路人可以向圣诞老人发短信,而展会场地将提供Wind
[手机便携]
Windows Phone份额未来4年将持续下跌
    微软在2015年为Windows Phone设备带来Windows 10 Mobile更新,以提升该平台在接下来这段时间里的市场占有率。然而知名分析公司IDC却预测,其份额会在未来4年里持续下滑,从当前的1.6%、跌至2020年的0.9%。出货量方面,IDC表示微软今年可为市场带来23.8%的新设备,但这一数据将于2020年降至1780万。 Windows Phone份额未来4年将持续下跌     在IDC的预测中,Android会是来年唯一增长的平台,从2016的82.6%增量、到2020的84.6%增量。换言之,消费者将在未来四年购买16亿部Android设备。至于iOS,它会从15.2%小幅下滑至14%,但出货
[手机便携]
一起学mini2440裸机开发(十二)--mini2440的串口中断实验
本实验实现的功能是:利用串口中断功能,通过串口调试工具接收到字符后再显示。 下图为我的工程文档 main.c文件 #include isrservice.h #include uart.h #include led.h #include interrupt.h int main() { Uart0_Init(115200); //初始化并设置波特率为115 200 Uart0_Interrupt_Init(); //Uart0中断初始化 Led_Init(); //Led初始化 while(1) //循环,等到中断发生 { ; }
[单片机]
一起学<font color='red'>mini2440</font>裸机开发(十二)--<font color='red'>mini2440</font>的串口中断实验
linux2.6.32.2 mini2440平台移植--移植DM9000网卡驱动
1.1.1 设备资源初始化 Linux-2..6.32.2已经自带了完善的DM9000网卡驱动驱动(源代码位置:linux-2.6.32.2/ drivers/net/dm9000.c),它也是一个平台设备,因此在目标平台初始化代码中,只要填写好相应的结构表即可(在mach-mini2440.c里面),具体步骤如下: 首先添加驱动所需的头文件dm9000.h: #include linux/dm9000.h 再定义DM9000网卡设备的物理基地址,以便后面用到: /* DM9000AEP 10/100 ethernet controller */ #define MACH_MINI2440_DM9K_BAS
[单片机]
uCOS-Ⅱ C51移植笔记
(1)实时系统和前/后台系统; 前/后台系统:一个大循环,循环查询各种标志位。如果标志位置位,就执行相应的服务程序。标志位就是标志事件的发生,事件响应延时处于不可预测状态。最坏的情况是循环中所有其他的事件服务程序执行完,才响应当前事件。中断服务虽然能即时/优先响应,但是它们和主循环的通讯,也是通过置主循环中相应的标志位来完成的。 实时系统(uCOS):整个程序分成一个个看起来好象是并行的任务,每个任务都在等待事件的发生。除了最低优先级任务(在uCOS中是IDLE任务)是死循环以外,其他的任务都不能死循环,只能在驱动事件驱动下工作。任何驱动事件的产生,都使优先级最高的就绪任务运行。任务和任务/任务和中断的通讯,是通过相应事件驱动来完
[单片机]
AT91RM9200Linux移植笔记(二)-移植u-boot-1.1.6
u-boot的下载地址为http://sourceforge.net/project/showfiles.php?group_id=65938 ,最新的为u-boot-1.1.6,这个版本已经可以很好的支持AT91RM9200 添加PATH环境变量或者修改u-boot的Makefile将之前编译好的工具链路径添加进来 因为我们的开发板配置和at91rm9200dk很类似,因而可以直接使用at91rm9200dk_config的配置,如果相差比较大的话可以添加自己的开发板配置,还要修改诸如flash等的驱动,具体方法可参考u-boot的文档,一种简便的做法是在u-boot已经支持的开发板中参考选择一种较接近板的进行修改。 $ tar
[单片机]
高通与微软就下一代Windows操作系统展开合作
台北,2011年6月1日——美国高通公司今天宣布,公司倍受赞誉的Snapdragon™智能移动处理器系列即将推出的产品,包括集成3G/LTE调制解调器的MSM8960™,将支持运行下一代Windows操作系统的终端。双方的合作旨在继续应对日益融合且瞬息万变的移动计算市场,而高通公司的Snapdragon双核与四核处理器系列将使终端实现最佳的计算性能、更长的电池续航时间、增强的连接性以及一流的图形和多媒体功能。 高通公司计算和消费类产品管理高级副总裁路易斯•帕尼达表示:“在推动创新方面,高通公司和微软公司的合作历史悠久且卓有成效。我们很高兴能够成为移动计算领域下一步演进的领导者之一。我们即将发布的Snapdragon处理器
[嵌入式]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved