以一下所提到的所有问题已经得到了彻底的解决,尤其让我们高兴的是早期对intel的这款e28f128 flash 始终支持的不是很好(这块flash往往擦写几十次可能就坏了,这实际上是这块flash的操作时序太简单所致,这也是采用这款flash的所有商家的共 同问题。),我们通过多方努力,今天终于做到了性能上的突破。

Protection for HHARM2410 ppcboot-2.0.0
一.问题提出
现 有的HHARM2410使用的是3 Volt Intel StrataFlash Memory device, 该Flash Memory提供安全模式(Security Mode),可以保护Flash中的数据防止被意外删除或重写。但是现在的 ppcboot for HHARM2410 版本并没有实现此保护功能,造成的后果是某些重要代码烧写到Flash中之后,如果后续程序跑飞,很可能会冲掉之前烧入的重要代码。这类错误很难发现而且 后果通常比较严重。
针对以上问题,对现有的ppcboot for HHARM2410代码进行改进,使之可以实现保护Flash中的数据防止被意外删除或重写的功能就显得十分必要。

当前
我们将flash初始化时做了很好保护,让我们的正常擦写失效。也就是说现在升级后ppcboot.bin连fl指令都不可直接执行,更不会因下载跑飞等现象导致引导丢失;再者,我们对这款的flash的时序做了更细化的处理,使得flash的使用寿命实现了质的飞跃。

要实现正常烧写,现在我们需要先执行protect 指令给与flash解保护。
具体步骤是这样的:
所有用到的指令我们都可以从help中得到。

启动时,如下
SMDK2410 # flinfo

Bank # 1: intel E28F128J3A150
   00000000 (RO)  00020000 (RO)  00040000 (RO)  00060000 (RO)  00080000 (RO)
   000A0000 (RO)  000C0000 (RO)  000E0000 (RO)  00100000 (RO)  00120000 (RO)
   00140000 (RO)  00160000 (RO)  00180000 (RO)  001A0000 (RO)  001C0000 (RO)
   001E0000 (RO)  00200000 (RO)  00220000 (RO)  00240000 (RO)  00260000 (RO)
   00280000 (RO)  002A0000 (RO)  002C0000 (RO)  002E0000 (RO)  00300000 (RO)
   00320000 (RO)  00340000 (RO)  00360000 (RO)  00380000 (RO)  003A0000 (RO)
   003C0000 (RO)  003E0000 (RO)  00400000 (RO)  00420000 (RO)  00440000 (RO)
   00460000 (RO)  00480000 (RO)  004A0000 (RO)  004C0000 (RO)  004E0000 (RO)
   00500000 (RO)  00520000 (RO)  00540000 (RO)  00560000 (RO)  00580000 (RO)
   005A0000 (RO)  005C0000 (RO)  005E0000 (RO)  00600000 (RO)  00620000 (RO)
   00640000 (RO)  00660000 (RO)  00680000 (RO)  006A0000 (RO)  006C0000 (RO)
   006E0000 (RO)  00700000 (RO)  00720000 (RO)  00740000 (RO)  00760000 (RO)
   00780000 (RO)  007A0000 (RO)  007C0000 (RO)  007E0000 (RO)  00800000 (RO)
   00820000 (RO)  00840000 (RO)  00860000 (RO)  00880000 (RO)  008A0000 (RO)
   008C0000 (RO)  008E0000 (RO)  00900000 (RO)  00920000 (RO)  00940000 (RO)
   00960000 (RO)  00980000 (RO)  009A0000 (RO)  009C0000 (RO)  009E0000 (RO)
   00A00000 (RO)  00A20000 (RO)  00A40000 (RO)  00A60000 (RO)  00A80000 (RO)
   00AA0000 (RO)  00AC0000 (RO)  00AE0000 (RO)  00B00000 (RO)  00B20000 (RO)
   00B40000 (RO)  00B60000 (RO)  00B80000 (RO)  00BA0000 (RO)  00BC0000 (RO)
   00BE0000 (RO)  00C00000 (RO)  00C20000 (RO)  00C40000 (RO)  00C60000 (RO)
   00C80000 (RO)  00CA0000 (RO)  00CC0000 (RO)  00CE0000 (RO)  00D00000 (RO)
   00D20000 (RO)  00D40000 (RO)  00D60000 (RO)  00D80000 (RO)  00DA0000 (RO)
   00DC0000 (RO)  00DE0000 (RO)  00E00000 (RO)  00E20000 (RO)  00E40000 (RO)
   00E60000 (RO)  00E80000 (RO)  00EA0000 (RO)  00EC0000 (RO)  00EE0000 (RO)
   00F00000 (RO)  00F20000 (RO)  00F40000 (RO)  00F60000 (RO)  00F80000 (RO)
00FA0000 (RO)  00FC0000 (RO)  00FE0000 (RO)

我们看到我们的flash共有128个20000大小的sector,现在已经做了真正的保护,而不向先前打印都时虚的;这一点实际上是ppcboot发行方的bug,偷懒了!不过它的实现确实不容易,我们下了功夫的。

检验测试如下

按正常烧写,我们执行fl
SMDK2410 #fl 1000000 30008000 20000 这是早期的做法,我们这里的flash起始地址不是1000000 而是0 这更符合我们的编程习惯,也更好理解我们的flash接cs0的做法。

现在应该是
SMDK2410 #fl 0 300080000   20000 注意这里的30008000 不是固定的要求,只要是合理的sdram下载源码地址即可。

执行后我们会发现无法完成烧写,并提示 擦写、烧写失败!!!
SMDK2410 # fl 0 30008000 20000
Erasing Flash locations, Please Wait ...
       [XXXXX]
Error: Erase Failure!
Erased 1 sectors
Programming flash, Please Wait ...
       #
Error: Program Failure!

我们现在要实现成功烧写,必须先对flash解保护,也就是向下面这样实现,不过方法不是不唯一;
SMDK2410 #protect  off  all 可以实现flash的全部解保护

SMDK2410 # protect off all
Un-Protect Flash Bank # 1

                                                done
SMDK2410 # flinfo

Bank # 1: intel E28F128J3A150
   01000000      01020000      01040000      01060000      01080000
   010A0000      010C0000      010E0000      01100000      01120000
   01140000      01160000      01180000      011A0000      011C0000
   011E0000      01200000      01220000      01240000      01260000
   01280000      012A0000      012C0000      012E0000      01300000
   01320000      01340000      01360000      01380000      013A0000
   013C0000      013E0000      01400000      01420000      01440000
   01460000      01480000      014A0000      014C0000      014E0000
   01500000      01520000      01540000      01560000      01580000
   015A0000      015C0000      015E0000      01600000      01620000
   01640000      01660000      01680000      016A0000      016C0000
   016E0000      01700000      01720000      01740000      01760000
   01780000      017A0000      017C0000      017E0000      01800000
   01820000      01840000      01860000      01880000      018A0000
   018C0000      018E0000      01900000      01920000      01940000
   01960000      01980000      019A0000      019C0000      019E0000
   01A00000      01A20000      01A40000      01A60000      01A80000
   01AA0000      01AC0000      01AE0000      01B00000      01B20000
   01B40000      01B60000      01B80000      01BA0000      01BC0000
   01BE0000      01C00000      01C20000      01C40000      01C60000
   01C80000      01CA0000      01CC0000      01CE0000      01D00000
   01D20000      01D40000      01D60000      01D80000      01DA0000
   01DC0000      01DE0000      01E00000      01E20000      01E40000
   01E60000      01E80000      01EA0000      01EC0000      01EE0000
   01F00000      01F20000      01F40000      01F60000      01F80000
   01FA0000      01FC0000      01FE0000
init finished!!!
Flash: 16 MB
Write 18 to Watchdog and it is ff now
start linux now(y/n):
SMDK2410 #

SMDK2410 #protect  on  all可以实现flash的全部保护
SMDK2410 # protect on all
Protect Flash Bank # 1

                                                done
SMDK2410 # flinfo

Bank # 1: intel E28F128J3A150
   00000000 (RO)  00020000 (RO)  00040000 (RO)  00060000 (RO)  00080000 (RO)
   000A0000 (RO)  000C0000 (RO)  000E0000 (RO)  00100000 (RO)  00120000 (RO)
   00140000 (RO)  00160000 (RO)  00180000 (RO)  001A0000 (RO)  001C0000 (RO)
   001E0000 (RO)  00200000 (RO)  00220000 (RO)  00240000 (RO)  00260000 (RO)
   00280000 (RO)  002A0000 (RO)  002C0000 (RO)  002E0000 (RO)  00300000 (RO)
   00320000 (RO)  00340000 (RO)  00360000 (RO)  00380000 (RO)  003A0000 (RO)
   003C0000 (RO)  003E0000 (RO)  00400000 (RO)  00420000 (RO)  00440000 (RO)
   00460000 (RO)  00480000 (RO)  004A0000 (RO)  004C0000 (RO)  004E0000 (RO)
   00500000 (RO)  00520000 (RO)  00540000 (RO)  00560000 (RO)  00580000 (RO)
   005A0000 (RO)  005C0000 (RO)  005E0000 (RO)  00600000 (RO)  00620000 (RO)
   00640000 (RO)  00660000 (RO)  00680000 (RO)  006A0000 (RO)  006C0000 (RO)
   006E0000 (RO)  00700000 (RO)  00720000 (RO)  00740000 (RO)  00760000 (RO)
   00780000 (RO)  007A0000 (RO)  007C0000 (RO)  007E0000 (RO)  00800000 (RO)
   00820000 (RO)  00840000 (RO)  00860000 (RO)  00880000 (RO)  008A0000 (RO)
   008C0000 (RO)  008E0000 (RO)  00900000 (RO)  00920000 (RO)  00940000 (RO)
   00960000 (RO)  00980000 (RO)  009A0000 (RO)  009C0000 (RO)  009E0000 (RO)
   00A00000 (RO)  00A20000 (RO)  00A40000 (RO)  00A60000 (RO)  00A80000 (RO)
   00AA0000 (RO)  00AC0000 (RO)  00AE0000 (RO)  00B00000 (RO)  00B20000 (RO)
   00B40000 (RO)  00B60000 (RO)  00B80000 (RO)  00BA0000 (RO)  00BC0000 (RO)
   00BE0000 (RO)  00C00000 (RO)  00C20000 (RO)  00C40000 (RO)  00C60000 (RO)
   00C80000 (RO)  00CA0000 (RO)  00CC0000 (RO)  00CE0000 (RO)  00D00000 (RO)
   00D20000 (RO)  00D40000 (RO)  00D60000 (RO)  00D80000 (RO)  00DA0000 (RO)
   00DC0000 (RO)  00DE0000 (RO)  00E00000 (RO)  00E20000 (RO)  00E40000 (RO)
   00E60000 (RO)  00E80000 (RO)  00EA0000 (RO)  00EC0000 (RO)  00EE0000 (RO)
   00F00000 (RO)  00F20000 (RO)  00F40000 (RO)  00F60000 (RO)  00F80000 (RO)
00FA0000 (RO)  00FC0000 (RO)  00FE0000 (RO)

以上二种方法可以做到,但一般我们不建议这样做;我们希望,小范围操作应该这样:
SMDK2410 #protect  on  1:n--m
例如:
SMDK2410 # protect on 1:0-3
Protect Flash Sectors 0-3 in Bank # 1
.... done
SMDK2410 # flinfo
Bank # 1: intel E28F128J3A150
   01000000 (RO) 01020000 (RO) 01040000 (RO) 01060000 (RO) 01080000
   010A0000      010C0000      010E0000      01100000      01120000
   01140000      01160000      01180000      011A0000      011C0000
   011E0000      01200000      01220000      01240000      01260000
   01280000      012A0000      012C0000      012E0000      01300000
   01320000      01340000      01360000      01380000      013A0000
   013C0000      013E0000      01400000      01420000      01440000
   01460000      01480000      014A0000      014C0000      014E0000
   01500000      01520000      01540000      01560000      01580000
   015A0000      015C0000      015E0000      01600000      01620000
   01640000      01660000      01680000      016A0000      016C0000
   016E0000      01700000      01720000      01740000      01760000
   01780000      017A0000      017C0000      017E0000      01800000
   01820000      01840000      01860000      01880000      018A0000
   018C0000      018E0000      01900000      01920000      01940000
   01960000      01980000      019A0000      019C0000      019E0000
   01A00000      01A20000      01A40000      01A60000      01A80000
   01AA0000      01AC0000      01AE0000      01B00000      01B20000
   01B40000      01B60000      01B80000      01BA0000      01BC0000
   01BE0000      01C00000      01C20000      01C40000      01C60000
   01C80000      01CA0000      01CC0000      01CE0000      01D00000
   01D20000      01D40000      01D60000      01D80000      01DA0000
   01DC0000      01DE0000      01E00000      01E20000      01E40000
   01E60000      01E80000      01EA0000      01EC0000      01EE0000
   01F00000      01F20000      01F40000      01F60000      01F80000
   01FA0000      01FC0000      01FE0000

SMDK2410 #protect  off  1:n--m
例如:
SMDK2410 # protect off 1:3
Protect Flash Bank # 1

                                                done
SMDK2410 # flinfo

Bank # 1: intel E28F128J3A150
   00000000 (RO)  00020000 (RO)  00040000 (RO)  00060000       00080000 (RO)
   000A0000 (RO)  000C0000 (RO)  000E0000 (RO)  00100000 (RO)  00120000 (RO)
   00140000 (RO)  00160000 (RO)  00180000 (RO)  001A0000 (RO)  001C0000 (RO)
   001E0000 (RO)  00200000 (RO)  00220000 (RO)  00240000 (RO)  00260000 (RO)
   00280000 (RO)  002A0000 (RO)  002C0000 (RO)  002E0000 (RO)  00300000 (RO)
   00320000 (RO)  00340000 (RO)  00360000 (RO)  00380000 (RO)  003A0000 (RO)
   003C0000 (RO)  003E0000 (RO)  00400000 (RO)  00420000 (RO)  00440000 (RO)
   00460000 (RO)  00480000 (RO)  004A0000 (RO)  004C0000 (RO)  004E0000 (RO)
   00500000 (RO)  00520000 (RO)  00540000 (RO)  00560000 (RO)  00580000 (RO)
   005A0000 (RO)  005C0000 (RO)  005E0000 (RO)  00600000 (RO)  00620000 (RO)
   00640000 (RO)  00660000 (RO)  00680000 (RO)  006A0000 (RO)  006C0000 (RO)
   006E0000 (RO)  00700000 (RO)  00720000 (RO)  00740000 (RO)  00760000 (RO)
   00780000 (RO)  007A0000 (RO)  007C0000 (RO)  007E0000 (RO)  00800000 (RO)
   00820000 (RO)  00840000 (RO)  00860000 (RO)  00880000 (RO)  008A0000 (RO)
   008C0000 (RO)  008E0000 (RO)  00900000 (RO)  00920000 (RO)  00940000 (RO)
   00960000 (RO)  00980000 (RO)  009A0000 (RO)  009C0000 (RO)  009E0000 (RO)
   00A00000 (RO)  00A20000 (RO)  00A40000 (RO)  00A60000 (RO)  00A80000 (RO)
   00AA0000 (RO)  00AC0000 (RO)  00AE0000 (RO)  00B00000 (RO)  00B20000 (RO)
   00B40000 (RO)  00B60000 (RO)  00B80000 (RO)  00BA0000 (RO)  00BC0000 (RO)
   00BE0000 (RO)  00C00000 (RO)  00C20000 (RO)  00C40000 (RO)  00C60000 (RO)
   00C80000 (RO)  00CA0000 (RO)  00CC0000 (RO)  00CE0000 (RO)  00D00000 (RO)
   00D20000 (RO)  00D40000 (RO)  00D60000 (RO)  00D80000 (RO)  00DA0000 (RO)
   00DC0000 (RO)  00DE0000 (RO)  00E00000 (RO)  00E20000 (RO)  00E40000 (RO)
   00E60000 (RO)  00E80000 (RO)  00EA0000 (RO)  00EC0000 (RO)  00EE0000 (RO)
   00F00000 (RO)  00F20000 (RO)  00F40000 (RO)  00F60000 (RO)  00F80000 (RO)
00FA0000 (RO)  00FC0000 (RO)  00FE0000 (RO)

特别注意:这里的n和m是flash128个sector中自然数。要求:
n < m  并且都属于0——127这个范围,不可越界。甚至可以省去m这个参数,只用n这一个参数,这么做的意思就是对指定的某个sector执行操作。

上面的两步分别可以实现对这款flash的任意sector的保护和解保护。操作非常的简单、方便。

记住了哦,执行擦写前一定要,考虑到flash的保护与否!!!