以一下所提到的所有问题已经得到了彻底的解决,尤其让我们高兴的是早期对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的保护与否!!!