mirror of https://github.com/rusefi/openblt.git
Refs #311. Reworked compiler specific parts in the LPC2000 port.
git-svn-id: https://svn.code.sf.net/p/openblt/code/trunk@340 5dc33758-31d5-4daf-9ae8-b24bf3d40d73
This commit is contained in:
parent
dd8874cfde
commit
511b2eb4de
Binary file not shown.
|
@ -1,7 +1,7 @@
|
|||
:1000000018F09FE518F09FE514F09FE514F09FE5C8
|
||||
:1000100014F09FE50000A0E114F09FE50CF09FE5CF
|
||||
:100020003C000000CC150000CC150000CC150000F1
|
||||
:1000300094150000B01500000000000080009FE54E
|
||||
:100020003C000000B8010000B8010000B801000069
|
||||
:10003000800100009C0100000000000080009FE59E
|
||||
:10004000DBF021E300D0A0E1040040E2D7F021E39F
|
||||
:1000500000D0A0E1040040E2D1F021E300D0A0E113
|
||||
:10006000040040E2D2F021E300D0A0E1040040E22D
|
||||
|
@ -10,7 +10,7 @@
|
|||
:1000900034209FE534309FE5030052E104009134A1
|
||||
:1000A00004008234FBFFFF3A0000A0E320109FE52C
|
||||
:1000B00020209FE5020051E104008134FCFFFF3A5B
|
||||
:1000C0001EFF2FE1DC1E0040B018000000020040BF
|
||||
:1000C0001EFF2FE1DC1E00409018000000020040DF
|
||||
:1000D0000102004004020040F806004008402DE9FB
|
||||
:1000E00094309FE52220A0E38420C3E55510E0E38F
|
||||
:1000F0008C10C3E55520A0E38C20C3E50100A0E3EC
|
||||
|
@ -21,334 +21,334 @@
|
|||
:100140000420C3E50220A0E30020C3E50120A0E3D2
|
||||
:100150000021C3E51D3843E2002093E5052082E33A
|
||||
:10016000002083E5042093E5012782E3042083E552
|
||||
:10017000020000EB0A0000EBFDFFFFEA00C01FE0F9
|
||||
:1001800008402DE9F50100EBEF0100EB5F0300EB08
|
||||
:100190003D0300EB090000EBE10100EB0840BDE886
|
||||
:1001A0001EFF2FE108402DE9E80100EB6F0300EB93
|
||||
:1001B0000E0000EBC60100EB0840BDE81EFF2FE17A
|
||||
:1001C00010402DE95D0000EB0C0200EB18409FE5AC
|
||||
:1001D0000130A0E30030C4E5B80200EB0030A0E33A
|
||||
:1001E0000030C4E51040BDE81EFF2FE100020040D2
|
||||
:1001F00008402DE948009FE56F0200EB010050E345
|
||||
:100200000400001A0120A0E338309FE50020C3E578
|
||||
:100210002C009FE55E0000EB24009FE5D80200EB78
|
||||
:10022000010050E30400001A0020A0E314309FE511
|
||||
:100230000020C3E508009FE5550000EB0840BDE83D
|
||||
:100240001EFF2FE104020040000200401EFF2FE1CC
|
||||
:1002500038402DE90040A0E10150A0E130309FE599
|
||||
:100260000030D3E5010053E3FF1001022302000B2D
|
||||
:100270001C309FE50030D3E5000053E3FF1005027A
|
||||
:100280000400A0019D02000B3C0000EB3840BDE8DB
|
||||
:100290001EFF2FE10002004030309FE50000D3E553
|
||||
:1002A000020050E30500000A030050E30500000AC5
|
||||
:1002B000010050E30800A0034000A0131EFF2FE13F
|
||||
:1002C0000000A0E31EFF2FE10000A0E31EFF2FE1CE
|
||||
:1002D0000002004030309FE50000D3E5020050E30B
|
||||
:1002E0000500000A030050E30500000A010050E386
|
||||
:1002F0000800A0034000A0131EFF2FE10000A0E3B0
|
||||
:100300001EFF2FE10000A0E31EFF2FE100020040CE
|
||||
:1003100008402DE9130000EB0840BDE81EFF2FE167
|
||||
:1003200014309FE50120E0E30320C3E50400C3E5AA
|
||||
:100330000220A0E3B424C3E11EFF2FE144020040E9
|
||||
:100340001C309FE50020A0E30020C3E5482083E5A2
|
||||
:100350004320C3E5B424C3E10220C3E50120C3E583
|
||||
:100360001EFF2FE1440200400C309FE50000D3E562
|
||||
:10037000000090E20100A0131EFF2FE144020040A4
|
||||
:100380000020A0E304309FE54320C3E51EFF2FE1DA
|
||||
:100390004402004038402DE90040A0E10030D0E5A3
|
||||
:1003A000FF0053E31600001A1C459FE50030A0E350
|
||||
:1003B0000130C4E50150A0E30050C4E50020E0E3B3
|
||||
:1003C0000320C4E51020A0E30420C4E50530C4E503
|
||||
:1003D000B0FFFFEB0600C4E5BDFFFFEB0700C4E57F
|
||||
:1003E000BBFFFFEB2004A0E10800C4E50950C4E511
|
||||
:1003F0000A50C4E50830A0E3B434C4E1A20200EB23
|
||||
:10040000200100EAC0249FE50020D2E5010052E36C
|
||||
:100410002B01001AC93043E2350053E303F19F97E3
|
||||
:10042000160100EAF40600008008000080080000C1
|
||||
:1004300074080000800800008008000058080000D0
|
||||
:10044000500700001C080000E407000080080000BE
|
||||
:10045000800800008008000080080000800800007C
|
||||
:10046000800800008008000080080000800800006C
|
||||
:10047000800800008008000080080000800800005C
|
||||
:10048000800800008008000080080000800800004C
|
||||
:10049000800800008008000080080000800800003C
|
||||
:1004A000800800008008000080080000800800002C
|
||||
:1004B000800800008008000080080000800800001C
|
||||
:1004C000800800008008000080080000D8050000B7
|
||||
:1004D00058050000FC040000B8050000800800007A
|
||||
:1004E00080080000800800004C0600008008000022
|
||||
:1004F000900600009C060000D00600000150D0E5E8
|
||||
:1005000064FFFFEB010040E2000055E1020000DA69
|
||||
:100510002200A0E381FFFFEBDA0000EAA8539FE589
|
||||
:10052000040085E2481095E50120D4E50F0100EBB9
|
||||
:100530000030E0E30330C5E50120D4E5483095E51F
|
||||
:10054000033082E0483085E50130D4E5013083E2B4
|
||||
:10055000B434C5E1CB0000EA0150D0E54DFFFFEB1C
|
||||
:10056000010040E2000055E1020000DA2200A0E3B1
|
||||
:100570006AFFFFEBC30000EA041094E548539FE5CF
|
||||
:10058000481085E5040085E20120D4E5F70000EB82
|
||||
:100590000030E0E30330C5E50120D4E5483095E5BF
|
||||
:1005A000033082E0483085E50130D4E5013083E254
|
||||
:1005B000B434C5E1B30000EA0C339FE50020E0E36A
|
||||
:1005C0000320C3E5042090E5482083E50120A0E353
|
||||
:1005D000B424C3E1AB0000EAEC329FE50020E0E385
|
||||
:1005E0000320C3E5483093E5040090E5000050E3A4
|
||||
:1005F0000700000A030080E00020A0E30110D3E41C
|
||||
:10060000012082E0FF2002E2000053E1FAFFFF1A1E
|
||||
:10061000000000EA0020A0E3AC329FE50010A0E358
|
||||
:100620000720C3E50810C3E50910C3E50A10C3E5B8
|
||||
:100630000120A0E30420C3E50510C3E50610C3E5CF
|
||||
:100640000820A0E3B424C3E18E0000EA78329FE5DD
|
||||
:100650000020E0E30320C3E570229FE5482083E506
|
||||
:100660000020A0E30420C3E50520C3E50620C3E580
|
||||
:100670000710A0E30710C3E50820C3E50920C3E580
|
||||
:100680000A20C3E50820A0E3B424C3E17D0000EA0A
|
||||
:100690000000A0E321FFFFEB7A0000EA28329FE58B
|
||||
:1006A0000020E0E30320C3E50020A0E30420C3E52D
|
||||
:1006B0000110D3E50510C3E50620C3E50720C3E517
|
||||
:1006C0000820C3E50620A0E3B424C3E16D0000EADE
|
||||
:1006D000F4319FE50020A0E30020C3E50120C3E53D
|
||||
:1006E0000020E0E30320C3E50120A0E3B424C3E13C
|
||||
:1006F000640000EAD0319FE5485093E5E5FEFFEB4A
|
||||
:10070000011040E20500A0E1012084E2E60100EBD7
|
||||
:10071000000050E30200001A3100A0E3FFFEFFEBEF
|
||||
:10072000580000EAA0419FE50030E0E30330C4E553
|
||||
:10073000485094E5D7FEFFEB015045E2000085E00C
|
||||
:10074000480084E50130A0E3B434C4E14D0000EA80
|
||||
:100750000150D0E5CFFEFFEB020040E2000055E182
|
||||
:10076000020000DA2200A0E3ECFEFFEB450000EA05
|
||||
:1007700054319FE50020E0E30320C3E50120A0E31E
|
||||
:10078000B424C3E10110D4E5000051E30500001AD0
|
||||
:10079000D50100EB000050E33A00001A3100A0E35D
|
||||
:1007A000DEFEFFEB370000EA1C319FE5480093E5D1
|
||||
:1007B000022084E2BC0100EB000050E30200001ABA
|
||||
:1007C0003100A0E3D5FEFFEB2E0000EAF8309FE5F4
|
||||
:1007D0000110D4E5482093E5022081E0482083E51C
|
||||
:1007E000280000EAE0409FE50030E0E30330C4E584
|
||||
:1007F0000050A0E30450C4E50550C4E5A5FEFFEB9E
|
||||
:100800000600C4E50750C4E50850C4E50950C4E536
|
||||
:100810000730A0E3B434C4E11A0000EAA8309FE531
|
||||
:10082000480093E5041094E5A30100EB000050E3B9
|
||||
:100830000200001A3100A0E3B8FEFFEB110000EA4D
|
||||
:1008400084309FE50020E0E30320C3E50120A0E31E
|
||||
:10085000B424C3E10B0000EA540000EB68309FE5CC
|
||||
:100860000020E0E30320C3E50120A0E3B424C3E1BA
|
||||
:10087000040000EA3100A0E3A8FEFFEB010000EA5B
|
||||
:100880002000A0E3A5FEFFEB3C309FE54330D3E51D
|
||||
:10089000010053E31000A003A0FEFF0B28309FE5EA
|
||||
:1008A000B414D3E10138A0E1000053E3040000DAFE
|
||||
:1008B00014009FE50130A0E34330C0E5030080E26F
|
||||
:1008C00062FEFFEB3840BDE81EFF2FE1440200400E
|
||||
:1008D0005017000008402DE98CFEFFEB010050E3AB
|
||||
:1008E0000C00000A34309FE50030D3E5010053E3EB
|
||||
:1008F0000800001AA90100EB20309FE5043093E5C1
|
||||
:100900007D3F83E2030050E10020A0230C309F25AF
|
||||
:100910000020C3252500002B0840BDE81EFF2FE165
|
||||
:100920009002004010402DE918409FE50130A0E3FF
|
||||
:100930000030C4E5990100EB040084E5E4FFFFEB1F
|
||||
:100940001040BDE81EFF2FE1900200401EFF2FE186
|
||||
:100950001EFF2FE108402DE9FCFFFFEBFDFFFFEA42
|
||||
:1009600008402DE91E0300EB0840BDE81EFF2FE103
|
||||
:1009700070402DE9016042E20668A0E12668A0E12E
|
||||
:10098000000052E30700000A014041E2016086E0F6
|
||||
:10099000005061E00130F4E50430C5E7EBFFFFEB08
|
||||
:1009A000060054E1FAFFFF1A7040BDE81EFF2FE178
|
||||
:1009B00008402DE9440100EB000050E30C00000A60
|
||||
:1009C00021FEFFEB610100EB430100EB0010A0E111
|
||||
:1009D0000101A0E34020A0E3E4FFFFEB0220A0E33D
|
||||
:1009E00014309FE5402083E50131A0E30FE0A0E152
|
||||
:1009F00013FF2FE10840BDE81EFF2FE100C01FE0FC
|
||||
:100A0000F0472DE90220A0E3D8309FE50020C3E5A0
|
||||
:100A1000023983E20120A0E3002083E50040A0E347
|
||||
:100A2000104083E5084083E5BC809FE5BC709FE5EE
|
||||
:100A3000BC909FE50830A0E10460F3E701A0D3E596
|
||||
:100A40000A3086E0013083E2835263E0053183E0BF
|
||||
:100A50000351A0E10700A0E10510A0E1320300EB83
|
||||
:100A6000000051E30F00001A0700A0E10510A0E10B
|
||||
:100A7000E30200EB013040E20338A0E1230859E132
|
||||
:100A80000800003A0038A0E12338A0E1013043E239
|
||||
:100A9000012046E201A04AE20AAAA0E102288AE176
|
||||
:100AA000032082E1030000EA024084E2240054E3D0
|
||||
:100AB000DFFFFF1A040000EA38309FE5142083E5C9
|
||||
:100AC0000020A0E3002083E5040000EA28009FE561
|
||||
:100AD000C410A0E39EFFFFEB0020A0E3F5FFFFEAB8
|
||||
:100AE000F047BDE81EFF2FE100C003E058170000EB
|
||||
:100AF00060EA0000FF030000004004E03C18000032
|
||||
:100B000038402DE90040A0E10150A0E19C309FE574
|
||||
:100B10001C3093E5040013E394009F05D610A00356
|
||||
:100B20008BFFFF0B0558A0E180309FE5305083E537
|
||||
:100B300080209FE5342083E50310D4E50220D4E52E
|
||||
:100B40000228A0E1012C82E00110D4E5012482E01A
|
||||
:100B50000010D4E5012082E0382083E50710D4E5B9
|
||||
:100B60000620D4E50228A0E1012C82E00510D4E59E
|
||||
:100B7000012482E00410D4E5012082E03C2083E5DA
|
||||
:100B80002120A0E3042083E51C3093E5080013E353
|
||||
:100B90000400001A14409FE56CFFFFEB1C3094E545
|
||||
:100BA000080013E3FBFFFF0A3840BDE81EFF2FE1FA
|
||||
:100BB000004004E03C180000E107000098309FE589
|
||||
:100BC0001C3093E5010013E31F00000A88309FE505
|
||||
:100BD000242093E584309FE5030052E11C00001AB5
|
||||
:100BE00074309FE5282093E50020C0E5282093E598
|
||||
:100BF0002224A0E10120C0E5282093E52228A0E1DD
|
||||
:100C00000220C0E5282093E5222CA0E10320C0E5C6
|
||||
:100C10002C2093E50420C0E52C2093E52224A0E1BC
|
||||
:100C20000520C0E52C2093E52228A0E10620C0E5A0
|
||||
:100C30002C2093E5222CA0E10720C0E50420A0E3AE
|
||||
:100C4000042083E50100A0E31EFF2FE10000A0E3E4
|
||||
:100C50001EFF2FE10000A0E31EFF2FE1004004E093
|
||||
:100C60006706000010402DE94C309FE51430D3E5B5
|
||||
:100C7000200013E30000A0030D00000A38309FE5B8
|
||||
:100C80000000C3E51430D3E5200013E30500001A8B
|
||||
:100C900024409FE52DFFFFEB1430D4E5200013E343
|
||||
:100CA000FBFFFF0A010000EA0100A0E3000000EAE8
|
||||
:100CB0000100A0E31040BDE81EFF2FE100C000E0EE
|
||||
:100CC00034309FE50020A0E30420C3E50820C3E5FD
|
||||
:100CD0001420C3E57F10E0E30C10C3E54110A0E34E
|
||||
:100CE0000010C3E50420C3E50320A0E30C20C3E506
|
||||
:100CF0000720A0E30820C3E51EFF2FE100C000E0AD
|
||||
:100D0000F0412DE90060A0E10140A0E1400051E385
|
||||
:100D100068009F859310A0830DFFFF8B0400A0E166
|
||||
:100D2000CFFFFFEB010050E350009F159710A01379
|
||||
:100D300007FFFF1B0450A0E1000054E30D00000A70
|
||||
:100D40000040A0E334809FE5A070A0E3FFFEFFEB2E
|
||||
:100D50000400D6E7C2FFFFEB010050E30800A0113A
|
||||
:100D60000710A011FAFEFF1B014084E20438A0E145
|
||||
:100D7000230855E1F4FFFF8AF041BDE81EFF2FE193
|
||||
:100D80006018000010402DE9F4309FE50030D3E5F5
|
||||
:100D9000000053E31400001AE8309FE51430D3E557
|
||||
:100DA000010013E30000A0033300000AD4309FE5E4
|
||||
:100DB0000030D3E5FF3003E2C4209FE50430C2E5F4
|
||||
:100DC000000053E30000A0032B00000A730000EBB7
|
||||
:100DD000AC309FE5480083E50000A0E34C00C3E58C
|
||||
:100DE0000120A0E30020C3E5230000EA90309FE546
|
||||
:100DF0004C20D3E58C309FE51430D3E5010013E39C
|
||||
:100E00001600000A7C309FE500C0D3E570309FE5F6
|
||||
:100E1000021083E005C0C1E5012082E2FF2002E26A
|
||||
:100E20004C20C3E50430D3E5020053E10000A013D9
|
||||
:100E30001100001A48409FE5051084E2CBFEFFEB4D
|
||||
:100E40000030A0E30030C4E50100A0E30A0000EA9E
|
||||
:100E50000000A0E328309FE50000C3E5060000EA9B
|
||||
:100E60004E0000EB18309FE5483093E5643083E294
|
||||
:100E7000030050E1F5FFFF8A0000A0E31040BDE849
|
||||
:100E80001EFF2FE19802004000C000E008402DE95D
|
||||
:100E9000FE0000EB0840BDE81EFF2FE108402DE9F1
|
||||
:100EA000000100EB0840BDE81EFF2FE108402DE9DE
|
||||
:100EB000020100EB0840BDE81EFF2FE108402DE9CC
|
||||
:100EC000190100EB0840BDE81EFF2FE108402DE9A5
|
||||
:100ED000830100EB0840BDE81EFF2FE108402DE92B
|
||||
:100EE000A90100EB0840BDE81EFF2FE108402DE9F5
|
||||
:100EF0005A0100EB000050E30000A0030100000ACB
|
||||
:100F0000890100EBFFFFFFEA0840BDE81EFF2FE16B
|
||||
:100F10002C309FE50020A0E3142083E5282083E502
|
||||
:100F200020109FE50C1083E50110A0E3041083E579
|
||||
:100F3000081093E510309FE5001083E5042083E559
|
||||
:100F40001EFF2FE1004000E05FEA0000E8020040E1
|
||||
:100F500014309FE50020A0E3042083E50C2083E506
|
||||
:100F6000082083E5102083E51EFF2FE1004000E00C
|
||||
:100F700020309FE5082093E51C309FE5041093E5A1
|
||||
:100F8000011082E0000093E5011060E0041083E5A9
|
||||
:100F9000002083E51EFF2FE1004000E0E802004052
|
||||
:100FA00008402DE9F1FFFFEB08309FE5040093E5D1
|
||||
:100FB0000840BDE81EFF2FE1E8020040F8402DE99F
|
||||
:100FC0000070A0E10040A0E30450A0E150609FE564
|
||||
:100FD0005EFEFFEB063094E7070053E10900008A4C
|
||||
:100FE000041086E0041091E5013083E0030057E12E
|
||||
:100FF0000400002A852085E024309FE5022183E05B
|
||||
:101000000800D2E5040000EA015085E20C4084E2C9
|
||||
:10101000C00054E3EDFFFF1AFF00A0E3F840BDE875
|
||||
:101020001EFF2FE17C17000030402DE924D04DE257
|
||||
:101030000040A0E1000090E5DFFFFFEBFF0050E380
|
||||
:101040000000A0033800000A3220A0E30C208DE548
|
||||
:1010500010008DE514008DE50130A0E300308DE532
|
||||
:101060003AFEFFEB0C008DE20D10A0E13A31E0E317
|
||||
:101070000FE0A0E113FF2FE100309DE5000053E3F6
|
||||
:101080000000A0132800001A3330A0E30C308DE5D7
|
||||
:101090000450A0E1043095E410308DE514508DE546
|
||||
:1010A000023CA0E318308DE588309FE51C308DE5CB
|
||||
:1010B0000130A0E300308DE524FEFFEB0C008DE253
|
||||
:1010C0000D10A0E13A31E0E30FE0A0E113FF2FE1C2
|
||||
:1010D00000309DE5000053E30000A0131200001A49
|
||||
:1010E0003830A0E30C308DE5003094E510308DE50C
|
||||
:1010F00014508DE5023CA0E318308DE50130A0E3EB
|
||||
:1011000000308DE511FEFFEB0C008DE20D10A0E12B
|
||||
:101110003A31E0E30FE0A0E113FF2FE100009DE58D
|
||||
:10112000010070E20000A033FFFFFFEA24D08DE24F
|
||||
:101130003040BDE81EFF2FE160EA000038402DE995
|
||||
:101140000040A0E10150A0E16C309FE5030050E1B8
|
||||
:101150000500000A020A51E30800000AB1FFFFEB94
|
||||
:10116000000050E30100001A0E0000EA4C409FE529
|
||||
:10117000853BB0E10000A0130D00001A000000EA5A
|
||||
:1011800034409FE5003094E5030055E10700000A74
|
||||
:101190000400A0E1045080E40510A0E1022CA0E3CB
|
||||
:1011A000F2FDFFEB010000EA0000A0E3000000EA0E
|
||||
:1011B0000400A0E13840BDE81EFF2FE1F404004028
|
||||
:1011C000F0020040F8432DE90060A0E10140A0E1F9
|
||||
:1011D0000270A0E10350A0E1A194A0E18994A0E1F4
|
||||
:1011E000003090E5010073E3049080040910A00131
|
||||
:1011F000022CA003DDFDFF0B003096E5090053E152
|
||||
:101200000400000A0600A0E10910A0E1CAFFFFEBFC
|
||||
:10121000006050E21500000A003096E5044063E0EB
|
||||
:10122000044086E0044084E25C809FE5029C89E201
|
||||
:10123000C6FDFFEB043086E2043063E0080053E1B2
|
||||
:101240000500009A0600A0E10910A0E1BAFFFFEB3B
|
||||
:10125000006050E20700000A044086E20130D7E453
|
||||
:101260000130C4E4015055E2F0FFFF1A030000EA28
|
||||
:101270000000A0E3020000EA0000A0E3000000EA92
|
||||
:101280000100A0E3F843BDE81EFF2FE1FF010000CD
|
||||
:101290000C309FE50020E0E3002083E5042283E595
|
||||
:1012A0001EFF2FE1F00200400C309FE50020E0E33C
|
||||
:1012B000002083E5042283E51EFF2FE1F0020040B9
|
||||
:1012C00070402DE90040A0E10150A0E10260A0E1E2
|
||||
:1012D00039FFFFEBFF0050E30000A0030E00000AFF
|
||||
:1012E000010045E2040080E033FFFFEBFF0050E324
|
||||
:1012F0000000A0030800000AA434A0E1100053E39A
|
||||
:101300001C009F051C009F150410A0E10620A0E111
|
||||
:101310000530A0E1AAFFFFEBFFFFFFEA7040BDE848
|
||||
:101320001EFF2FE1F4040040F002004070402DE960
|
||||
:1013300020D04DE20050A0E10160A0E11EFFFFEBD4
|
||||
:101340000040A0E1010046E2050080E01AFFFFEB4B
|
||||
:101350000050A0E1FF0054E3FF0050130000A00381
|
||||
:101360003A00000A050054E10000A0833700008A1B
|
||||
:10137000000054E30000A0033400000A100055E30D
|
||||
:101380000000A0833100008A3230A0E30C308DE5EC
|
||||
:1013900010408DE514508DE50130A0E300308DE55F
|
||||
:1013A0006AFDFFEB0C008DE20D10A0E13A31E0E3A5
|
||||
:1013B0000FE0A0E113FF2FE100309DE5000053E3B3
|
||||
:1013C0000000A0132100001A3430A0E30C308DE59A
|
||||
:1013D00010408DE514508DE57C309FE518308DE58B
|
||||
:1013E0000130A0E300308DE558FDFFEB0C008DE2ED
|
||||
:1013F0000D10A0E13A31E0E30FE0A0E113FF2FE18F
|
||||
:1014000000309DE5000053E30000A0130F00001A18
|
||||
:101410003530A0E30C308DE510408DE514508DE59E
|
||||
:101420000130A0E300308DE548FDFFEB0C008DE2BC
|
||||
:101430000D10A0E13A31E0E30FE0A0E113FF2FE14E
|
||||
:1014400000009DE5010070E20000A033FFFFFFEA0D
|
||||
:1014500020D08DE27040BDE81EFF2FE160EA000061
|
||||
:1014600004E02DE50CD04DE26C309FE5043293E5AD
|
||||
:10147000010073E30100A0031400000A58309FE547
|
||||
:10148000832F83E2060012E8011082E0102293E528
|
||||
:10149000021081E0142293E5021081E0182293E506
|
||||
:1014A000021081E0202293E5021081E0242293E5DE
|
||||
:1014B000023081E0003063E208208DE2043022E552
|
||||
:1014C00018009FE50410A0E37CFFFFEBFFFFFFEA9D
|
||||
:1014D0000CD08DE204E09DE41EFF2FE1F0020040FD
|
||||
:1014E00014200000023AA0E3050093E8000082E027
|
||||
:1014F000082093E5020080E00C2093E5020080E0E4
|
||||
:10150000102093E5020080E0142093E5020080E0C3
|
||||
:10151000182093E5020080E01C3093E5030080E092
|
||||
:10152000010070E20000A0331EFF2FE108402DE90A
|
||||
:101530004C309FE5043293E5010073E30400000A98
|
||||
:1015400040009FE5B7FEFFEB000050E30000A00362
|
||||
:101550000900000A28309FE5003093E5010073E39D
|
||||
:101560000100A0030400000A14009FE5ADFEFFEB9C
|
||||
:10157000000090E20100A013FFFFFFEA0840BDE871
|
||||
:101580001EFF2FE1F0020040F4040040020AA0E335
|
||||
:101590001EFF2FE104E04EE21F402DE908009FE509
|
||||
:1015A0003410A0E3EAFCFFEB1F80FDE88418000084
|
||||
:1015B00004E04EE20F502DE908009FE54010A0E343
|
||||
:1015C000E3FCFFEB0F90FDE8841800000F502DE9BD
|
||||
:1015D00008009FE54C10A0E3DDFCFFEB0F90FDE859
|
||||
:1015E0008418000000300FE1803083E303F029E12C
|
||||
:10017000160000EB1E0000EBFDFFFFEA00C01FE0D1
|
||||
:1001800004E04EE21F402DE908009FE53410A0E393
|
||||
:10019000030200EB1F80FDE83C18000004E04EE283
|
||||
:1001A0000F502DE908009FE54010A0E3FC0100EB93
|
||||
:1001B0000F90FDE83C1800000F502DE908009FE566
|
||||
:1001C0004C10A0E3F60100EB0F90FDE83C18000096
|
||||
:1001D00008402DE9F50100EBEF0100EB5F0300EBB8
|
||||
:1001E0003D0300EB090000EBE10100EB0840BDE836
|
||||
:1001F0001EFF2FE108402DE9E80100EB6F0300EB43
|
||||
:100200000E0000EBC60100EB0840BDE81EFF2FE129
|
||||
:1002100010402DE95D0000EB0C0200EB18409FE55B
|
||||
:100220000130A0E30030C4E5B80200EB0030A0E3E9
|
||||
:100230000030C4E51040BDE81EFF2FE10002004081
|
||||
:1002400008402DE948009FE56F0200EB010050E3F4
|
||||
:100250000400001A0120A0E338309FE50020C3E528
|
||||
:100260002C009FE55E0000EB24009FE5D80200EB28
|
||||
:10027000010050E30400001A0020A0E314309FE5C1
|
||||
:100280000020C3E508009FE5550000EB0840BDE8ED
|
||||
:100290001EFF2FE104020040000200401EFF2FE17C
|
||||
:1002A00038402DE90040A0E10150A0E130309FE549
|
||||
:1002B0000030D3E5010053E3FF1001022302000BDD
|
||||
:1002C0001C309FE50030D3E5000053E3FF1005022A
|
||||
:1002D0000400A0019D02000B3C0000EB3840BDE88B
|
||||
:1002E0001EFF2FE10002004030309FE50000D3E503
|
||||
:1002F000020050E30500000A030050E30500000A75
|
||||
:10030000010050E30800A0034000A0131EFF2FE1EE
|
||||
:100310000000A0E31EFF2FE10000A0E31EFF2FE17D
|
||||
:100320000002004030309FE50000D3E5020050E3BA
|
||||
:100330000500000A030050E30500000A010050E335
|
||||
:100340000800A0034000A0131EFF2FE10000A0E35F
|
||||
:100350001EFF2FE10000A0E31EFF2FE1000200407E
|
||||
:1003600008402DE9130000EB0840BDE81EFF2FE117
|
||||
:1003700014309FE50120E0E30320C3E50400C3E55A
|
||||
:100380000220A0E3B424C3E11EFF2FE14402004099
|
||||
:100390001C309FE50020A0E30020C3E5482083E552
|
||||
:1003A0004320C3E5B424C3E10220C3E50120C3E533
|
||||
:1003B0001EFF2FE1440200400C309FE50000D3E512
|
||||
:1003C000000090E20100A0131EFF2FE14402004054
|
||||
:1003D0000020A0E304309FE54320C3E51EFF2FE18A
|
||||
:1003E0004402004038402DE90040A0E10030D0E553
|
||||
:1003F000FF0053E31600001A1C459FE50030A0E300
|
||||
:100400000130C4E50150A0E30050C4E50020E0E362
|
||||
:100410000320C4E51020A0E30420C4E50530C4E5B2
|
||||
:10042000B0FFFFEB0600C4E5BDFFFFEB0700C4E52E
|
||||
:10043000BBFFFFEB2004A0E10800C4E50950C4E5C0
|
||||
:100440000A50C4E50830A0E3B434C4E1A20200EBD2
|
||||
:10045000200100EAC0249FE50020D2E5010052E31C
|
||||
:100460002B01001AC93043E2350053E303F19F9793
|
||||
:10047000160100EA44070000D0080000D008000080
|
||||
:10048000C4080000D0080000D0080000A808000040
|
||||
:10049000A00700006C08000034080000D00800002D
|
||||
:1004A000D0080000D0080000D0080000D0080000EC
|
||||
:1004B000D0080000D0080000D0080000D0080000DC
|
||||
:1004C000D0080000D0080000D0080000D0080000CC
|
||||
:1004D000D0080000D0080000D0080000D0080000BC
|
||||
:1004E000D0080000D0080000D0080000D0080000AC
|
||||
:1004F000D0080000D0080000D0080000D00800009C
|
||||
:10050000D0080000D0080000D0080000D00800008B
|
||||
:10051000D0080000D0080000D00800002806000025
|
||||
:10052000A80500004C05000008060000D0080000E7
|
||||
:10053000D0080000D00800009C060000D008000091
|
||||
:10054000E0060000EC060000200700000150D0E5A6
|
||||
:1005500064FFFFEB010040E2000055E1020000DA19
|
||||
:100560002200A0E381FFFFEBDA0000EAA8539FE539
|
||||
:10057000040085E2481095E50120D4E50F0100EB69
|
||||
:100580000030E0E30330C5E50120D4E5483095E5CF
|
||||
:10059000033082E0483085E50130D4E5013083E264
|
||||
:1005A000B434C5E1CB0000EA0150D0E54DFFFFEBCC
|
||||
:1005B000010040E2000055E1020000DA2200A0E361
|
||||
:1005C0006AFFFFEBC30000EA041094E548539FE57F
|
||||
:1005D000481085E5040085E20120D4E5F70000EB32
|
||||
:1005E0000030E0E30330C5E50120D4E5483095E56F
|
||||
:1005F000033082E0483085E50130D4E5013083E204
|
||||
:10060000B434C5E1B30000EA0C339FE50020E0E319
|
||||
:100610000320C3E5042090E5482083E50120A0E302
|
||||
:10062000B424C3E1AB0000EAEC329FE50020E0E334
|
||||
:100630000320C3E5483093E5040090E5000050E353
|
||||
:100640000700000A030080E00020A0E30110D3E4CB
|
||||
:10065000012082E0FF2002E2000053E1FAFFFF1ACE
|
||||
:10066000000000EA0020A0E3AC329FE50010A0E308
|
||||
:100670000720C3E50810C3E50910C3E50A10C3E568
|
||||
:100680000120A0E30420C3E50510C3E50610C3E57F
|
||||
:100690000820A0E3B424C3E18E0000EA78329FE58D
|
||||
:1006A0000020E0E30320C3E570229FE5482083E5B6
|
||||
:1006B0000020A0E30420C3E50520C3E50620C3E530
|
||||
:1006C0000710A0E30710C3E50820C3E50920C3E530
|
||||
:1006D0000A20C3E50820A0E3B424C3E17D0000EABA
|
||||
:1006E0000000A0E321FFFFEB7A0000EA28329FE53B
|
||||
:1006F0000020E0E30320C3E50020A0E30420C3E5DD
|
||||
:100700000110D3E50510C3E50620C3E50720C3E5C6
|
||||
:100710000820C3E50620A0E3B424C3E16D0000EA8D
|
||||
:10072000F4319FE50020A0E30020C3E50120C3E5EC
|
||||
:100730000020E0E30320C3E50120A0E3B424C3E1EB
|
||||
:10074000640000EAD0319FE5485093E5E5FEFFEBF9
|
||||
:10075000011040E20500A0E1012084E2E60100EB87
|
||||
:10076000000050E30200001A3100A0E3FFFEFFEB9F
|
||||
:10077000580000EAA0419FE50030E0E30330C4E503
|
||||
:10078000485094E5D7FEFFEB015045E2000085E0BC
|
||||
:10079000480084E50130A0E3B434C4E14D0000EA30
|
||||
:1007A0000150D0E5CFFEFFEB020040E2000055E132
|
||||
:1007B000020000DA2200A0E3ECFEFFEB450000EAB5
|
||||
:1007C00054319FE50020E0E30320C3E50120A0E3CE
|
||||
:1007D000B424C3E10110D4E5000051E30500001A80
|
||||
:1007E000D50100EB000050E33A00001A3100A0E30D
|
||||
:1007F000DEFEFFEB370000EA1C319FE5480093E581
|
||||
:10080000022084E2BC0100EB000050E30200001A69
|
||||
:100810003100A0E3D5FEFFEB2E0000EAF8309FE5A3
|
||||
:100820000110D4E5482093E5022081E0482083E5CB
|
||||
:10083000280000EAE0409FE50030E0E30330C4E533
|
||||
:100840000050A0E30450C4E50550C4E5A5FEFFEB4D
|
||||
:100850000600C4E50750C4E50850C4E50950C4E5E6
|
||||
:100860000730A0E3B434C4E11A0000EAA8309FE5E1
|
||||
:10087000480093E5041094E5A30100EB000050E369
|
||||
:100880000200001A3100A0E3B8FEFFEB110000EAFD
|
||||
:1008900084309FE50020E0E30320C3E50120A0E3CE
|
||||
:1008A000B424C3E10B0000EA540000EB68309FE57C
|
||||
:1008B0000020E0E30320C3E50120A0E3B424C3E16A
|
||||
:1008C000040000EA3100A0E3A8FEFFEB010000EA0B
|
||||
:1008D0002000A0E3A5FEFFEB3C309FE54330D3E5CD
|
||||
:1008E000010053E31000A003A0FEFF0B28309FE59A
|
||||
:1008F000B414D3E10138A0E1000053E3040000DAAE
|
||||
:1009000014009FE50130A0E34330C0E5030080E21E
|
||||
:1009100062FEFFEB3840BDE81EFF2FE144020040BD
|
||||
:100920005017000008402DE98CFEFFEB010050E35A
|
||||
:100930000C00000A34309FE50030D3E5010053E39A
|
||||
:100940000800001AA90100EB20309FE5043093E570
|
||||
:100950007D3F83E2030050E10020A0230C309F255F
|
||||
:100960000020C3252500002B0840BDE81EFF2FE115
|
||||
:100970009002004010402DE918409FE50130A0E3AF
|
||||
:100980000030C4E5990100EB040084E5E4FFFFEBCF
|
||||
:100990001040BDE81EFF2FE1900200401EFF2FE136
|
||||
:1009A0001EFF2FE108402DE9FCFFFFEBFDFFFFEAF2
|
||||
:1009B00008402DE90A0300EB0840BDE81EFF2FE1C7
|
||||
:1009C00070402DE9016042E20668A0E12668A0E1DE
|
||||
:1009D000000052E30700000A014041E2016086E0A6
|
||||
:1009E000005061E00130F4E50430C5E7EBFFFFEBB8
|
||||
:1009F000060054E1FAFFFF1A7040BDE81EFF2FE128
|
||||
:100A000008402DE9440100EB000050E30C00000A0F
|
||||
:100A100021FEFFEB610100EB430100EB0010A0E1C0
|
||||
:100A20000101A0E34020A0E3E4FFFFEB0220A0E3EC
|
||||
:100A300014309FE5402083E50131A0E30FE0A0E101
|
||||
:100A400013FF2FE10840BDE81EFF2FE100C01FE0AB
|
||||
:100A5000F0472DE90220A0E3D8309FE50020C3E550
|
||||
:100A6000023983E20120A0E3002083E50040A0E3F7
|
||||
:100A7000104083E5084083E5BC809FE5BC709FE59E
|
||||
:100A8000BC909FE50830A0E10460F3E701A0D3E546
|
||||
:100A90000A3086E0013083E2835263E0053183E06F
|
||||
:100AA0000351A0E10700A0E10510A0E11E0300EB47
|
||||
:100AB000000051E30F00001A0700A0E10510A0E1BB
|
||||
:100AC000CF0200EB013040E20338A0E1230859E1F6
|
||||
:100AD0000800003A0038A0E12338A0E1013043E2E9
|
||||
:100AE000012046E201A04AE20AAAA0E102288AE126
|
||||
:100AF000032082E1030000EA024084E2240054E380
|
||||
:100B0000DFFFFF1A040000EA38309FE5142083E578
|
||||
:100B10000020A0E3002083E5040000EA28009FE510
|
||||
:100B2000C410A0E39EFFFFEB0020A0E3F5FFFFEA67
|
||||
:100B3000F047BDE81EFF2FE100C003E0581700009A
|
||||
:100B400060EA0000FF030000004004E048180000D5
|
||||
:100B500038402DE90040A0E10150A0E19C309FE524
|
||||
:100B60001C3093E5040013E394009F05D610A00306
|
||||
:100B70008BFFFF0B0558A0E180309FE5305083E5E7
|
||||
:100B800080209FE5342083E50310D4E50220D4E5DE
|
||||
:100B90000228A0E1012C82E00110D4E5012482E0CA
|
||||
:100BA0000010D4E5012082E0382083E50710D4E569
|
||||
:100BB0000620D4E50228A0E1012C82E00510D4E54E
|
||||
:100BC000012482E00410D4E5012082E03C2083E58A
|
||||
:100BD0002120A0E3042083E51C3093E5080013E303
|
||||
:100BE0000400001A14409FE56CFFFFEB1C3094E5F5
|
||||
:100BF000080013E3FBFFFF0A3840BDE81EFF2FE1AA
|
||||
:100C0000004004E048180000E107000098309FE52C
|
||||
:100C10001C3093E5010013E31F00000A88309FE5B4
|
||||
:100C2000242093E584309FE5030052E11C00001A64
|
||||
:100C300074309FE5282093E50020C0E5282093E547
|
||||
:100C40002224A0E10120C0E5282093E52228A0E18C
|
||||
:100C50000220C0E5282093E5222CA0E10320C0E576
|
||||
:100C60002C2093E50420C0E52C2093E52224A0E16C
|
||||
:100C70000520C0E52C2093E52228A0E10620C0E550
|
||||
:100C80002C2093E5222CA0E10720C0E50420A0E35E
|
||||
:100C9000042083E50100A0E31EFF2FE10000A0E394
|
||||
:100CA0001EFF2FE10000A0E31EFF2FE1004004E043
|
||||
:100CB0006706000010402DE94C309FE51430D3E565
|
||||
:100CC000200013E30000A0030D00000A38309FE568
|
||||
:100CD0000000C3E51430D3E5200013E30500001A3B
|
||||
:100CE00024409FE52DFFFFEB1430D4E5200013E3F3
|
||||
:100CF000FBFFFF0A010000EA0100A0E3000000EA98
|
||||
:100D00000100A0E31040BDE81EFF2FE100C000E09D
|
||||
:100D100034309FE50020A0E30420C3E50820C3E5AC
|
||||
:100D20001420C3E57F10E0E30C10C3E54110A0E3FD
|
||||
:100D30000010C3E50420C3E50320A0E30C20C3E5B5
|
||||
:100D40000720A0E30820C3E51EFF2FE100C000E05C
|
||||
:100D5000F0412DE90060A0E10140A0E1400051E335
|
||||
:100D600068009F859310A0830DFFFF8B0400A0E116
|
||||
:100D7000CFFFFFEB010050E350009F159710A01329
|
||||
:100D800007FFFF1B0450A0E1000054E30D00000A20
|
||||
:100D90000040A0E334809FE5A070A0E3FFFEFFEBDE
|
||||
:100DA0000400D6E7C2FFFFEB010050E30800A011EA
|
||||
:100DB0000710A011FAFEFF1B014084E20438A0E1F5
|
||||
:100DC000230855E1F4FFFF8AF041BDE81EFF2FE143
|
||||
:100DD0006C18000010402DE9F4309FE50030D3E599
|
||||
:100DE000000053E31400001AE8309FE51430D3E507
|
||||
:100DF000010013E30000A0033300000AD4309FE594
|
||||
:100E00000030D3E5FF3003E2C4209FE50430C2E5A3
|
||||
:100E1000000053E30000A0032B00000A730000EB66
|
||||
:100E2000AC309FE5480083E50000A0E34C00C3E53B
|
||||
:100E30000120A0E30020C3E5230000EA90309FE5F5
|
||||
:100E40004C20D3E58C309FE51430D3E5010013E34B
|
||||
:100E50001600000A7C309FE500C0D3E570309FE5A6
|
||||
:100E6000021083E005C0C1E5012082E2FF2002E21A
|
||||
:100E70004C20C3E50430D3E5020053E10000A01389
|
||||
:100E80001100001A48409FE5051084E2CBFEFFEBFD
|
||||
:100E90000030A0E30030C4E50100A0E30A0000EA4E
|
||||
:100EA0000000A0E328309FE50000C3E5060000EA4B
|
||||
:100EB0004E0000EB18309FE5483093E5643083E244
|
||||
:100EC000030050E1F5FFFF8A0000A0E31040BDE8F9
|
||||
:100ED0001EFF2FE19802004000C000E008402DE90D
|
||||
:100EE000FE0000EB0840BDE81EFF2FE108402DE9A1
|
||||
:100EF000000100EB0840BDE81EFF2FE108402DE98E
|
||||
:100F0000020100EB0840BDE81EFF2FE108402DE97B
|
||||
:100F1000190100EB0840BDE81EFF2FE108402DE954
|
||||
:100F2000830100EB0840BDE81EFF2FE108402DE9DA
|
||||
:100F3000A90100EB0840BDE81EFF2FE108402DE9A4
|
||||
:100F40005A0100EB000050E30000A0030100000A7A
|
||||
:100F5000890100EBFFFFFFEA0840BDE81EFF2FE11B
|
||||
:100F60002C309FE50020A0E3142083E5282083E5B2
|
||||
:100F700020109FE50C1083E50110A0E3041083E529
|
||||
:100F8000081093E510309FE5001083E5042083E509
|
||||
:100F90001EFF2FE1004000E05FEA0000E802004091
|
||||
:100FA00014309FE50020A0E3042083E50C2083E5B6
|
||||
:100FB000082083E5102083E51EFF2FE1004000E0BC
|
||||
:100FC00020309FE5082093E51C309FE5041093E551
|
||||
:100FD000011082E0000093E5011060E0041083E559
|
||||
:100FE000002083E51EFF2FE1004000E0E802004002
|
||||
:100FF00008402DE9F1FFFFEB08309FE5040093E581
|
||||
:101000000840BDE81EFF2FE1E8020040F8402DE94E
|
||||
:101010000070A0E10040A0E30450A0E150609FE513
|
||||
:101020005EFEFFEB063094E7070053E10900008AFB
|
||||
:10103000041086E0041091E5013083E0030057E1DD
|
||||
:101040000400002A852085E024309FE5022183E00A
|
||||
:101050000800D2E5040000EA015085E20C4084E279
|
||||
:10106000C00054E3EDFFFF1AFF00A0E3F840BDE825
|
||||
:101070001EFF2FE17C17000030402DE924D04DE207
|
||||
:101080000040A0E1000090E5DFFFFFEBFF0050E330
|
||||
:101090000000A0033800000A3220A0E30C208DE5F8
|
||||
:1010A00010008DE514008DE50130A0E300308DE5E2
|
||||
:1010B0003AFEFFEB0C008DE20D10A0E13A31E0E3C7
|
||||
:1010C0000FE0A0E113FF2FE100309DE5000053E3A6
|
||||
:1010D0000000A0132800001A3330A0E30C308DE587
|
||||
:1010E0000450A0E1043095E410308DE514508DE5F6
|
||||
:1010F000023CA0E318308DE588309FE51C308DE57B
|
||||
:101100000130A0E300308DE524FEFFEB0C008DE202
|
||||
:101110000D10A0E13A31E0E30FE0A0E113FF2FE171
|
||||
:1011200000309DE5000053E30000A0131200001AF8
|
||||
:101130003830A0E30C308DE5003094E510308DE5BB
|
||||
:1011400014508DE5023CA0E318308DE50130A0E39A
|
||||
:1011500000308DE511FEFFEB0C008DE20D10A0E1DB
|
||||
:101160003A31E0E30FE0A0E113FF2FE100009DE53D
|
||||
:10117000010070E20000A033FFFFFFEA24D08DE2FF
|
||||
:101180003040BDE81EFF2FE160EA000038402DE945
|
||||
:101190000040A0E10150A0E16C309FE5030050E168
|
||||
:1011A0000500000A020A51E30800000AB1FFFFEB44
|
||||
:1011B000000050E30100001A0E0000EA4C409FE5D9
|
||||
:1011C000853BB0E10000A0130D00001A000000EA0A
|
||||
:1011D00034409FE5003094E5030055E10700000A24
|
||||
:1011E0000400A0E1045080E40510A0E1022CA0E37B
|
||||
:1011F000F2FDFFEB010000EA0000A0E3000000EABE
|
||||
:101200000400A0E13840BDE81EFF2FE1F4040040D7
|
||||
:10121000F0020040F8432DE90060A0E10140A0E1A8
|
||||
:101220000270A0E10350A0E1A194A0E18994A0E1A3
|
||||
:10123000003090E5010073E3049080040910A001E0
|
||||
:10124000022CA003DDFDFF0B003096E5090053E101
|
||||
:101250000400000A0600A0E10910A0E1CAFFFFEBAC
|
||||
:10126000006050E21500000A003096E5044063E09B
|
||||
:10127000044086E0044084E25C809FE5029C89E2B1
|
||||
:10128000C6FDFFEB043086E2043063E0080053E162
|
||||
:101290000500009A0600A0E10910A0E1BAFFFFEBEB
|
||||
:1012A000006050E20700000A044086E20130D7E403
|
||||
:1012B0000130C4E4015055E2F0FFFF1A030000EAD8
|
||||
:1012C0000000A0E3020000EA0000A0E3000000EA42
|
||||
:1012D0000100A0E3F843BDE81EFF2FE1FF0100007D
|
||||
:1012E0000C309FE50020E0E3002083E5042283E545
|
||||
:1012F0001EFF2FE1F00200400C309FE50020E0E3EC
|
||||
:10130000002083E5042283E51EFF2FE1F002004068
|
||||
:1013100070402DE90040A0E10150A0E10260A0E191
|
||||
:1013200039FFFFEBFF0050E30000A0030E00000AAE
|
||||
:10133000010045E2040080E033FFFFEBFF0050E3D3
|
||||
:101340000000A0030800000AA434A0E1100053E349
|
||||
:101350001C009F051C009F150410A0E10620A0E1C1
|
||||
:101360000530A0E1AAFFFFEBFFFFFFEA7040BDE8F8
|
||||
:101370001EFF2FE1F4040040F002004070402DE910
|
||||
:1013800020D04DE20050A0E10160A0E11EFFFFEB84
|
||||
:101390000040A0E1010046E2050080E01AFFFFEBFB
|
||||
:1013A0000050A0E1FF0054E3FF0050130000A00331
|
||||
:1013B0003A00000A050054E10000A0833700008ACB
|
||||
:1013C000000054E30000A0033400000A100055E3BD
|
||||
:1013D0000000A0833100008A3230A0E30C308DE59C
|
||||
:1013E00010408DE514508DE50130A0E300308DE50F
|
||||
:1013F0006AFDFFEB0C008DE20D10A0E13A31E0E355
|
||||
:101400000FE0A0E113FF2FE100309DE5000053E362
|
||||
:101410000000A0132100001A3430A0E30C308DE549
|
||||
:1014200010408DE514508DE57C309FE518308DE53A
|
||||
:101430000130A0E300308DE558FDFFEB0C008DE29C
|
||||
:101440000D10A0E13A31E0E30FE0A0E113FF2FE13E
|
||||
:1014500000309DE5000053E30000A0130F00001AC8
|
||||
:101460003530A0E30C308DE510408DE514508DE54E
|
||||
:101470000130A0E300308DE548FDFFEB0C008DE26C
|
||||
:101480000D10A0E13A31E0E30FE0A0E113FF2FE1FE
|
||||
:1014900000009DE5010070E20000A033FFFFFFEABD
|
||||
:1014A00020D08DE27040BDE81EFF2FE160EA000011
|
||||
:1014B00004E02DE50CD04DE26C309FE5043293E55D
|
||||
:1014C000010073E30100A0031400000A58309FE5F7
|
||||
:1014D000832F83E2060012E8011082E0102293E5D8
|
||||
:1014E000021081E0142293E5021081E0182293E5B6
|
||||
:1014F000021081E0202293E5021081E0242293E58E
|
||||
:10150000023081E0003063E208208DE2043022E501
|
||||
:1015100018009FE50410A0E37CFFFFEBFFFFFFEA4C
|
||||
:101520000CD08DE204E09DE41EFF2FE1F0020040AC
|
||||
:1015300014200000023AA0E3050093E8000082E0D6
|
||||
:10154000082093E5020080E00C2093E5020080E093
|
||||
:10155000102093E5020080E0142093E5020080E073
|
||||
:10156000182093E5020080E01C3093E5030080E042
|
||||
:10157000010070E20000A0331EFF2FE108402DE9BA
|
||||
:101580004C309FE5043293E5010073E30400000A48
|
||||
:1015900040009FE5B7FEFFEB000050E30000A00312
|
||||
:1015A0000900000A28309FE5003093E5010073E34D
|
||||
:1015B0000100A0030400000A14009FE5ADFEFFEB4C
|
||||
:1015C000000090E20100A013FFFFFFEA0840BDE821
|
||||
:1015D0001EFF2FE1F0020040F4040040020AA0E3E5
|
||||
:1015E0001EFF2FE100300FE1803083E303F029E19B
|
||||
:1015F0001EFF2FE100300FE18030C3E303F029E14B
|
||||
:101600001EFF2FE1000051E34300000A01C020E06B
|
||||
:1016100000106142012051E22700000A0030B0E1D1
|
||||
|
@ -385,13 +385,11 @@
|
|||
:1018000000400300002000000C0000000060030006
|
||||
:10181000002000000D0000000080030000200000F8
|
||||
:101820000E00000000A00300002000000F000000D8
|
||||
:1018300000C0030000200000100000002E2E2F2EFC
|
||||
:101840002E2F2E2E2F536F757263652F41524D37F9
|
||||
:101850005F4C5043323030302F63616E2E63000096
|
||||
:101860002E2E2F2E2E2F2E2E2F536F757263652F37
|
||||
:1018700041524D375F4C5043323030302F756172DA
|
||||
:10188000742E63002E2E2F2E2E2F2E2E2F536F757B
|
||||
:101890007263652F41524D375F4C504332303030C8
|
||||
:1018A0002F4743432F766563746F72732E63000076
|
||||
:0118B0000433
|
||||
:1018300000C0030000200000100000007665637403
|
||||
:101840006F72732E630000002E2E2F2E2E2F2E2E41
|
||||
:101850002F536F757263652F41524D375F4C504364
|
||||
:10186000323030302F63616E2E6300002E2E2F2E0B
|
||||
:101870002E2F2E2E2F536F757263652F41524D37C9
|
||||
:101880005F4C5043323030302F756172742E6300DC
|
||||
:011890000453
|
||||
:00000001FF
|
||||
|
|
|
@ -7,20 +7,20 @@ start address 0x00000000
|
|||
|
||||
Program Header:
|
||||
LOAD off 0x00008000 vaddr 0x00000000 paddr 0x00000000 align 2**15
|
||||
filesz 0x000018b0 memsz 0x000018b0 flags r-x
|
||||
LOAD off 0x00010200 vaddr 0x40000200 paddr 0x000018b0 align 2**15
|
||||
filesz 0x00001890 memsz 0x00001890 flags r-x
|
||||
LOAD off 0x00010200 vaddr 0x40000200 paddr 0x00001890 align 2**15
|
||||
filesz 0x00000001 memsz 0x00000001 flags rw-
|
||||
LOAD off 0x00010204 vaddr 0x40000204 paddr 0x000018b1 align 2**15
|
||||
LOAD off 0x00010204 vaddr 0x40000204 paddr 0x00001891 align 2**15
|
||||
filesz 0x00000000 memsz 0x000004f4 flags rw-
|
||||
private flags = 5000200: [Version5 EABI] [soft-float ABI]
|
||||
|
||||
Sections:
|
||||
Idx Name Size VMA LMA File off Algn
|
||||
0 .text 000018b0 00000000 00000000 00008000 2**2
|
||||
0 .text 00001890 00000000 00000000 00008000 2**2
|
||||
CONTENTS, ALLOC, LOAD, READONLY, CODE
|
||||
1 .data 00000001 40000200 000018b0 00010200 2**0
|
||||
1 .data 00000001 40000200 00001890 00010200 2**0
|
||||
CONTENTS, ALLOC, LOAD, DATA
|
||||
2 .bss 000004f4 40000204 000018b1 00010204 2**2
|
||||
2 .bss 000004f4 40000204 00001891 00010204 2**2
|
||||
ALLOC
|
||||
3 .ARM.attributes 0000002e 00000000 00000000 00010201 2**0
|
||||
CONTENTS, READONLY
|
||||
|
@ -32,15 +32,15 @@ Idx Name Size VMA LMA File off Algn
|
|||
CONTENTS, READONLY, DEBUGGING
|
||||
7 .debug_aranges 00000210 00000000 00000000 000138cc 2**0
|
||||
CONTENTS, READONLY, DEBUGGING
|
||||
8 .debug_line 00000ba7 00000000 00000000 00013adc 2**0
|
||||
8 .debug_line 00000b44 00000000 00000000 00013adc 2**0
|
||||
CONTENTS, READONLY, DEBUGGING
|
||||
9 .debug_str 00000aad 00000000 00000000 00014683 2**0
|
||||
9 .debug_str 00000a88 00000000 00000000 00014620 2**0
|
||||
CONTENTS, READONLY, DEBUGGING
|
||||
10 .debug_frame 000006f8 00000000 00000000 00015130 2**2
|
||||
10 .debug_frame 000006f8 00000000 00000000 000150a8 2**2
|
||||
CONTENTS, READONLY, DEBUGGING
|
||||
11 .debug_loc 00000e69 00000000 00000000 00015828 2**0
|
||||
11 .debug_loc 00000e69 00000000 00000000 000157a0 2**0
|
||||
CONTENTS, READONLY, DEBUGGING
|
||||
12 .debug_ranges 00000038 00000000 00000000 00016691 2**0
|
||||
12 .debug_ranges 00000038 00000000 00000000 00016609 2**0
|
||||
CONTENTS, READONLY, DEBUGGING
|
||||
SYMBOL TABLE:
|
||||
00000000 l d .text 00000000 .text
|
||||
|
@ -82,12 +82,13 @@ e01fc040 l *ABS* 00000000 MEMMAP
|
|||
00000000 l df *ABS* 00000000 hooks.c
|
||||
00000000 l df *ABS* 00000000 main.c
|
||||
00000000 l df *ABS* 00000000 extflash.c
|
||||
00000000 l df *ABS* 00000000 vectors.c
|
||||
00000000 l df *ABS* 00000000 boot.c
|
||||
00000000 l df *ABS* 00000000 com.c
|
||||
40000200 l O .data 00000001 comActiveInterface
|
||||
40000204 l O .bss 00000040 xcpCtoReqPacket.4167
|
||||
00000000 l df *ABS* 00000000 xcp.c
|
||||
00000320 l F .text 00000020 XcpSetCtoError
|
||||
00000370 l F .text 00000020 XcpSetCtoError
|
||||
00001750 l O .text 00000008 xcpStationId
|
||||
40000244 l O .bss 0000004c xcpInfo
|
||||
00000000 l df *ABS* 00000000 backdoor.c
|
||||
|
@ -99,7 +100,7 @@ e01fc040 l *ABS* 00000000 MEMMAP
|
|||
00000000 l df *ABS* 00000000 can.c
|
||||
00001758 l O .text 00000024 canTiming
|
||||
00000000 l df *ABS* 00000000 uart.c
|
||||
00000c64 l F .text 0000005c UartTransmitByte
|
||||
00000cb4 l F .text 0000005c UartTransmitByte
|
||||
40000298 l O .bss 00000001 xcpCtoRxInProgress.4174
|
||||
4000029c l O .bss 00000041 xcpCtoReqPacket.4172
|
||||
400002e0 l O .bss 00000004 xcpCtoRxStartTime.4175
|
||||
|
@ -109,85 +110,84 @@ e01fc040 l *ABS* 00000000 MEMMAP
|
|||
400002e8 l O .bss 00000004 free_running_counter_last
|
||||
400002ec l O .bss 00000004 millisecond_counter
|
||||
00000000 l df *ABS* 00000000 flash.c
|
||||
00000fbc l F .text 0000006c FlashGetSector
|
||||
00001028 l F .text 00000114 FlashWriteBlock
|
||||
0000113c l F .text 00000088 FlashSwitchBlock
|
||||
000011c4 l F .text 000000cc FlashAddToBlock
|
||||
0000100c l F .text 0000006c FlashGetSector
|
||||
00001078 l F .text 00000114 FlashWriteBlock
|
||||
0000118c l F .text 00000088 FlashSwitchBlock
|
||||
00001214 l F .text 000000cc FlashAddToBlock
|
||||
0000177c l O .text 000000c0 flashLayout
|
||||
400002f0 l O .bss 00000204 blockInfo
|
||||
400004f4 l O .bss 00000204 bootBlockInfo
|
||||
00000000 l df *ABS* 00000000 vectors.c
|
||||
00000000 l df *ABS* 00000000 cpu_comp.c
|
||||
00000000 l df *ABS* 00000000 _divsi3.o
|
||||
0000160c l .text 00000000 .divsi3_skip_div0_test
|
||||
00000000 l df *ABS* 00000000 _dvmd_tls.o
|
||||
00000000 l df *ABS* 00000000
|
||||
000001c0 g F .text 00000030 ComInit
|
||||
000012c0 g F .text 0000006c FlashWrite
|
||||
00000954 g F .text 0000000c AssertFailure
|
||||
00000bbc g F .text 000000a8 CanReceivePacket
|
||||
000015b0 g F .text 0000001c IRQ_ISR
|
||||
00000f70 g F .text 00000030 TimerUpdate
|
||||
00000380 g F .text 00000014 XcpPacketTransmitted
|
||||
000001f0 g F .text 0000005c ComTask
|
||||
00000180 g F .text 00000024 BootInit
|
||||
00000924 g F .text 00000028 BackDoorInit
|
||||
00000950 g F .text 00000004 CopService
|
||||
000018b0 g .text 00000000 _etext
|
||||
00000210 g F .text 00000030 ComInit
|
||||
00001310 g F .text 0000006c FlashWrite
|
||||
000009a4 g F .text 0000000c AssertFailure
|
||||
00000c0c g F .text 000000a8 CanReceivePacket
|
||||
0000019c g F .text 0000001c IRQ_ISR
|
||||
00000fc0 g F .text 00000030 TimerUpdate
|
||||
000003d0 g F .text 00000014 XcpPacketTransmitted
|
||||
00000240 g F .text 0000005c ComTask
|
||||
000001d0 g F .text 00000024 BootInit
|
||||
00000974 g F .text 00000028 BackDoorInit
|
||||
000009a0 g F .text 00000004 CopService
|
||||
00001890 g .text 00000000 _etext
|
||||
000015e4 g F .text 00000010 CpuIrqDisable
|
||||
0000158c g F .text 00000008 FlashGetUserProgBaseAddress
|
||||
000012a8 g F .text 00000018 FlashReinit
|
||||
00000f50 g F .text 00000020 TimerReset
|
||||
000001a4 g F .text 0000001c BootTask
|
||||
00001460 g F .text 00000084 FlashWriteChecksum
|
||||
000015dc g F .text 00000008 FlashGetUserProgBaseAddress
|
||||
000012f8 g F .text 00000018 FlashReinit
|
||||
00000fa0 g F .text 00000020 TimerReset
|
||||
000001f4 g F .text 0000001c BootTask
|
||||
000014b0 g F .text 00000084 FlashWriteChecksum
|
||||
40000204 g .bss 00000000 _bss_start
|
||||
00000250 g F .text 00000048 ComTransmitPacket
|
||||
000002a0 g F .text 00000048 ComTransmitPacket
|
||||
00000000 g .text 00000000 _startup
|
||||
00000368 g F .text 00000018 XcpIsConnected
|
||||
00000e8c g F .text 00000010 NvmInit
|
||||
00001290 g F .text 00000018 FlashInit
|
||||
00000edc g F .text 00000010 NvmGetUserProgBaseAddress
|
||||
000003b8 g F .text 00000018 XcpIsConnected
|
||||
00000edc g F .text 00000010 NvmInit
|
||||
000012e0 g F .text 00000018 FlashInit
|
||||
00000f2c g F .text 00000010 NvmGetUserProgBaseAddress
|
||||
400006f8 g .bss 00000000 _bss_end
|
||||
0000003c g .text 00000000 Reset_Handler
|
||||
00000e9c g F .text 00000010 NvmReinit
|
||||
0000024c g F .text 00000004 ComFree
|
||||
00000eec g F .text 00000010 NvmReinit
|
||||
0000029c g F .text 00000004 ComFree
|
||||
00001604 g F .text 00000000 .hidden __aeabi_idiv
|
||||
00000cc0 g F .text 00000040 UartInit
|
||||
00000ebc g F .text 00000010 NvmErase
|
||||
00000394 g F .text 00000540 XcpPacketReceived
|
||||
00000960 g F .text 00000010 CpuInit
|
||||
0000152c g F .text 00000060 FlashDone
|
||||
00000b00 g F .text 000000bc CanTransmitPacket
|
||||
00000d10 g F .text 00000040 UartInit
|
||||
00000f0c g F .text 00000010 NvmErase
|
||||
000003e4 g F .text 00000540 XcpPacketReceived
|
||||
000009b0 g F .text 00000010 CpuInit
|
||||
0000157c g F .text 00000060 FlashDone
|
||||
00000b50 g F .text 000000bc CanTransmitPacket
|
||||
0000174c w F .text 00000004 .hidden __aeabi_ldiv0
|
||||
00000340 g F .text 00000028 XcpInit
|
||||
0000132c g F .text 00000134 FlashErase
|
||||
00000390 g F .text 00000028 XcpInit
|
||||
0000137c g F .text 00000134 FlashErase
|
||||
000000dc g F .text 000000a4 main
|
||||
00000eec g F .text 00000024 NvmDone
|
||||
00000d00 g F .text 00000084 UartTransmitPacket
|
||||
00000ecc g F .text 00000010 NvmVerifyChecksum
|
||||
00000970 g F .text 00000040 CpuMemCopy
|
||||
00000f3c g F .text 00000024 NvmDone
|
||||
00000d50 g F .text 00000084 UartTransmitPacket
|
||||
00000f1c g F .text 00000010 NvmVerifyChecksum
|
||||
000009c0 g F .text 00000040 CpuMemCopy
|
||||
40001edc g *ABS* 00000000 _stack_end
|
||||
00001604 g F .text 00000128 .hidden __divsi3
|
||||
00001594 g F .text 0000001c FIQ_ISR
|
||||
000002d4 g F .text 0000003c ComGetActiveInterfaceMaxTxLen
|
||||
00000d84 g F .text 00000108 UartReceivePacket
|
||||
00000180 g F .text 0000001c FIQ_ISR
|
||||
00000324 g F .text 0000003c ComGetActiveInterfaceMaxTxLen
|
||||
00000dd4 g F .text 00000108 UartReceivePacket
|
||||
000015f4 g F .text 00000010 CpuIrqEnable
|
||||
40000200 g .data 00000000 _data
|
||||
0000094c g F .text 00000004 CopInit
|
||||
0000099c g F .text 00000004 CopInit
|
||||
0000008c g .text 00000000 SetupRAM
|
||||
00000a00 g F .text 00000100 CanInit
|
||||
00000eac g F .text 00000010 NvmWrite
|
||||
000009b0 g F .text 00000050 CpuStartUserProgram
|
||||
000014e4 g F .text 00000048 FlashVerifyChecksum
|
||||
00000a50 g F .text 00000100 CanInit
|
||||
00000efc g F .text 00000010 NvmWrite
|
||||
00000a00 g F .text 00000050 CpuStartUserProgram
|
||||
00001534 g F .text 00000048 FlashVerifyChecksum
|
||||
40000201 g .data 00000000 _edata
|
||||
400006f8 g .bss 00000000 _end
|
||||
000015cc g F .text 00000018 UNDEF_ISR
|
||||
00000310 g F .text 00000010 ComIsConnected
|
||||
000001b8 g F .text 00000018 UNDEF_ISR
|
||||
00000360 g F .text 00000010 ComIsConnected
|
||||
0000174c w F .text 00000004 .hidden __aeabi_idiv0
|
||||
00000298 g F .text 0000003c ComGetActiveInterfaceMaxRxLen
|
||||
000008d4 g F .text 00000050 BackDoorCheck
|
||||
00000fa0 g F .text 0000001c TimerGet
|
||||
000002e8 g F .text 0000003c ComGetActiveInterfaceMaxRxLen
|
||||
00000924 g F .text 00000050 BackDoorCheck
|
||||
00000ff0 g F .text 0000001c TimerGet
|
||||
0000172c g F .text 00000020 .hidden __aeabi_idivmod
|
||||
00000f10 g F .text 00000040 TimerInit
|
||||
00000f60 g F .text 00000040 TimerInit
|
||||
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/************************************************************************************//**
|
||||
* \file ARM7_LPC2000\GCC\cstart.s
|
||||
* \file Demo\ARM7_LPC2000_Olimex_LPC_L2294_GCC\Boot\cstart.s
|
||||
* \brief Bootloader C-startup assembly file.
|
||||
* \ingroup Target_ARM7_LPC2000
|
||||
* \ingroup Boot_ARM7_LPC2000_Olimex_LPC_L2294_GCC
|
||||
* \internal
|
||||
*----------------------------------------------------------------------------------------
|
||||
* C O P Y R I G H T
|
|
@ -41,6 +41,8 @@ main.c \
|
|||
extflash.c \
|
||||
extflash.h \
|
||||
lpc2294.h \
|
||||
vectors.c \
|
||||
cstart.s \
|
||||
../../../Source/boot.c \
|
||||
../../../Source/boot.h \
|
||||
../../../Source/com.c \
|
||||
|
@ -65,11 +67,9 @@ lpc2294.h \
|
|||
../../../Source/ARM7_LPC2000/uart.c \
|
||||
../../../Source/ARM7_LPC2000/nvm.c \
|
||||
../../../Source/ARM7_LPC2000/timer.c \
|
||||
../../../Source/ARM7_LPC2000/GCC/flash.c \
|
||||
../../../Source/ARM7_LPC2000/GCC/flash.h \
|
||||
../../../Source/ARM7_LPC2000/GCC/vectors.c \
|
||||
../../../Source/ARM7_LPC2000/GCC/cpu_comp.c \
|
||||
../../../Source/ARM7_LPC2000/GCC/cstart.s
|
||||
../../../Source/ARM7_LPC2000/flash.c \
|
||||
../../../Source/ARM7_LPC2000/flash.h \
|
||||
../../../Source/ARM7_LPC2000/GCC/cpu_comp.c
|
||||
|
||||
|
||||
#|---------------------------------------------------------------------------------------|
|
||||
|
@ -101,7 +101,7 @@ OBJ_PATH = ./obj
|
|||
BIN_PATH = ./bin
|
||||
INC_PATH = $(patsubst %,-I%,$(sort $(foreach file,$(filter %.h,$(PROJ_FILES)),$(dir $(file)))))
|
||||
INC_PATH += -I.
|
||||
LIB_PATH = -L../../../Source/ARM7_LPC2000/GCC/
|
||||
LIB_PATH = -L./
|
||||
|
||||
|
||||
#|---------------------------------------------------------------------------------------|
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/************************************************************************************//**
|
||||
* \file Source\ARM7_LPC2000\GCC\vectors.c
|
||||
* \file Demo\ARM7_LPC2000_Olimex_LPC_L2294_GCC\Boot\vectors.c
|
||||
* \brief Bootloader interrupt vectors source file.
|
||||
* \ingroup Target_ARM7_LPC2000
|
||||
* \ingroup Boot_ARM7_LPC2000_Olimex_LPC_L2294_GCC
|
||||
* \internal
|
||||
*----------------------------------------------------------------------------------------
|
||||
* C O P Y R I G H T
|
|
@ -1,91 +0,0 @@
|
|||
/************************************************************************************//**
|
||||
* \file Source\ARM7_LPC2000\Crossworks\cpu_comp.c
|
||||
* \brief Bootloader cpu module source file.
|
||||
* \ingroup Target_ARM7_LPC2000
|
||||
* \internal
|
||||
*----------------------------------------------------------------------------------------
|
||||
* C O P Y R I G H T
|
||||
*----------------------------------------------------------------------------------------
|
||||
* Copyright (c) 2016 by Feaser http://www.feaser.com All rights reserved
|
||||
*
|
||||
*----------------------------------------------------------------------------------------
|
||||
* L I C E N S E
|
||||
*----------------------------------------------------------------------------------------
|
||||
* This file is part of OpenBLT. OpenBLT is free software: you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as published by the Free
|
||||
* Software Foundation, either version 3 of the License, or (at your option) any later
|
||||
* version.
|
||||
*
|
||||
* OpenBLT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
|
||||
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
||||
* PURPOSE. See the GNU General Public License for more details.
|
||||
*
|
||||
* You have received a copy of the GNU General Public License along with OpenBLT. It
|
||||
* should be located in ".\Doc\license.html". If not, contact Feaser to obtain a copy.
|
||||
*
|
||||
* \endinternal
|
||||
****************************************************************************************/
|
||||
|
||||
/****************************************************************************************
|
||||
* Include files
|
||||
****************************************************************************************/
|
||||
#include "boot.h" /* bootloader generic header */
|
||||
|
||||
|
||||
/************************************************************************************//**
|
||||
** \brief Obtains current value of CPSR CPU register. Derived from a sample by R O
|
||||
** Software that is Copyright 2004, R O SoftWare, and can be used for hobby
|
||||
** or commercial purposes.
|
||||
** \return CPSR value.
|
||||
**
|
||||
****************************************************************************************/
|
||||
static blt_int32u IrqGetCPSR(void)
|
||||
{
|
||||
blt_int32u retval;
|
||||
__asm__ volatile (" mrs %0, cpsr" : "=r" (retval) : /* no inputs */ );
|
||||
return retval;
|
||||
} /*** end of IrqGetCPSR ***/
|
||||
|
||||
|
||||
/************************************************************************************//**
|
||||
** \brief Update value of CPSR CPU register. Derived from a sample by R O
|
||||
** Software that is Copyright 2004, R O SoftWare, and can be used for hobby
|
||||
** or commercial purposes.
|
||||
** \param val CPSR value.
|
||||
** \return none.
|
||||
**
|
||||
****************************************************************************************/
|
||||
static void IrqSetCPSR(blt_int32u val)
|
||||
{
|
||||
__asm__ volatile (" msr cpsr, %0" : /* no outputs */ : "r" (val) );
|
||||
} /*** end of IrqSetCPSR ***/
|
||||
|
||||
|
||||
/************************************************************************************//**
|
||||
** \brief Disable global interrupts.
|
||||
** \return none.
|
||||
**
|
||||
****************************************************************************************/
|
||||
void CpuIrqDisable(void)
|
||||
{
|
||||
blt_int32u _cpsr;
|
||||
|
||||
_cpsr = IrqGetCPSR();
|
||||
IrqSetCPSR(_cpsr | 0x00000080);
|
||||
} /*** end of CpuIrqDisable ***/
|
||||
|
||||
|
||||
/************************************************************************************//**
|
||||
** \brief Enable global interrupts.
|
||||
** \return none.
|
||||
**
|
||||
****************************************************************************************/
|
||||
void CpuIrqEnable(void)
|
||||
{
|
||||
blt_int32u _cpsr;
|
||||
|
||||
_cpsr = IrqGetCPSR();
|
||||
IrqSetCPSR(_cpsr & ~0x00000080);
|
||||
} /*** end of CpuIrqEnable ***/
|
||||
|
||||
/*********************************** end of cpu_comp.c *********************************/
|
|
@ -1,419 +0,0 @@
|
|||
/*****************************************************************************
|
||||
* Copyright (c) 2001, 2002 Rowley Associates Limited. *
|
||||
* *
|
||||
* This file may be distributed under the terms of the License Agreement *
|
||||
* provided with this software. *
|
||||
* *
|
||||
* THIS FILE IS PROVIDED AS IS WITH NO WARRANTY OF ANY KIND, INCLUDING THE *
|
||||
* WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. *
|
||||
*****************************************************************************/
|
||||
|
||||
/*****************************************************************************
|
||||
* Preprocessor Definitions
|
||||
* ------------------------
|
||||
* APP_ENTRY_POINT
|
||||
*
|
||||
* Defines the application entry point function, if undefined this setting
|
||||
* defaults to "main".
|
||||
*
|
||||
* INITIALIZE_STACKS
|
||||
*
|
||||
* If defined, the contents of the stacks will be initialized to a the
|
||||
* value 0xCC.
|
||||
*
|
||||
* INITIALIZE_SECONDARY_SECTIONS
|
||||
*
|
||||
* If defined, the .text2, .data2 and .bss2 sections will be initialized.
|
||||
*
|
||||
* SUPERVISOR_START
|
||||
*
|
||||
* If defined, the application will start up in supervisor mode. If
|
||||
* undefined the application will start up in system mode.
|
||||
*
|
||||
* FULL_LIBRARY
|
||||
*
|
||||
* If defined then
|
||||
* - argc, argv are setup by the debug_getargs.
|
||||
* - the exit symbol is defined and executes on return from main.
|
||||
* - the exit symbol calls destructors, atexit functions and then debug_exit.
|
||||
*
|
||||
* If not defined then
|
||||
* - argc and argv are zero.
|
||||
* - the exit symbol is defined, executes on return from main and loops
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
.section .vectors, "ax"
|
||||
.code 32
|
||||
.align 0
|
||||
.global _vectors
|
||||
.global reset_handler
|
||||
|
||||
/*****************************************************************************
|
||||
* Exception Vectors *
|
||||
*****************************************************************************/
|
||||
_vectors:
|
||||
ldr pc, [pc, #reset_handler_address - . - 8] /* reset */
|
||||
ldr pc, [pc, #undef_handler_address - . - 8] /* undefined instruction */
|
||||
ldr pc, [pc, #undef_handler_address - . - 8] /* swi handler */
|
||||
ldr pc, [pc, #pabort_handler_address - . - 8] /* abort prefetch */
|
||||
ldr pc, [pc, #dabort_handler_address - . - 8] /* abort data */
|
||||
.word 0xB9205F88 /* boot loader checksum */
|
||||
ldr pc, [pc, #-0xFF0] /* irq handler */
|
||||
ldr pc, [pc, #fiq_handler_address - . - 8] /* fiq handler */
|
||||
|
||||
reset_handler_address:
|
||||
.word Reset_Handler
|
||||
undef_handler_address:
|
||||
.word undef_handler
|
||||
pabort_handler_address:
|
||||
.word pabort_handler
|
||||
dabort_handler_address:
|
||||
.word dabort_handler
|
||||
fiq_handler_address:
|
||||
.word fiq_handler
|
||||
|
||||
|
||||
.section .init, "ax"
|
||||
.code 32
|
||||
.align 4
|
||||
|
||||
#ifndef APP_ENTRY_POINT
|
||||
#define APP_ENTRY_POINT main
|
||||
#endif
|
||||
|
||||
#ifndef ARGSSPACE
|
||||
#define ARGSSPACE 128
|
||||
#endif
|
||||
|
||||
.weak Reset_Handler
|
||||
.global __start
|
||||
.global __gccmain
|
||||
.extern APP_ENTRY_POINT
|
||||
.global exit
|
||||
|
||||
/************************************************************************************//**
|
||||
** \brief Reset interrupt service routine. Configures the stack for each mode,
|
||||
** disables the IRQ and FIQ interrupts, initializes RAM and jumps to
|
||||
** function main.
|
||||
** \return none.
|
||||
**
|
||||
****************************************************************************************/
|
||||
Reset_Handler:
|
||||
__start:
|
||||
mrs r0, cpsr
|
||||
bic r0, r0, #0x1F
|
||||
|
||||
/* Setup stacks */
|
||||
orr r1, r0, #0x1B /* Undefined mode */
|
||||
msr cpsr_cxsf, r1
|
||||
ldr sp, =__stack_und_end__
|
||||
#ifdef __ARM_EABI__
|
||||
bic sp, sp, #0x7
|
||||
#endif
|
||||
|
||||
orr r1, r0, #0x17 /* Abort mode */
|
||||
msr cpsr_cxsf, r1
|
||||
ldr sp, =__stack_abt_end__
|
||||
#ifdef __ARM_EABI__
|
||||
bic sp, sp, #0x7
|
||||
#endif
|
||||
|
||||
orr r1, r0, #0x12 /* IRQ mode */
|
||||
msr cpsr_cxsf, r1
|
||||
ldr sp, =__stack_irq_end__
|
||||
#ifdef __ARM_EABI__
|
||||
bic sp, sp, #0x7
|
||||
#endif
|
||||
|
||||
orr r1, r0, #0x11 /* FIQ mode */
|
||||
msr cpsr_cxsf, r1
|
||||
ldr sp, =__stack_fiq_end__
|
||||
#ifdef __ARM_EABI__
|
||||
bic sp, sp, #0x7
|
||||
#endif
|
||||
|
||||
orr r1, r0, #0x13 /* Supervisor mode */
|
||||
msr cpsr_cxsf, r1
|
||||
ldr sp, =__stack_svc_end__
|
||||
#ifdef __ARM_EABI__
|
||||
bic sp, sp, #0x7
|
||||
#endif
|
||||
|
||||
#ifdef SUPERVISOR_START
|
||||
/* Start application in supervisor mode */
|
||||
ldr r1, =__stack_end__ /* Setup user/system mode stack */
|
||||
#ifdef __ARM_EABI__
|
||||
bic r1, r1, #0x7
|
||||
#endif
|
||||
mov r2, sp
|
||||
stmfd r2!, {r1}
|
||||
ldmfd r2, {sp}^
|
||||
#else
|
||||
/* Start application in system mode */
|
||||
orr r1, r0, #0x1F /* System mode */
|
||||
msr cpsr_cxsf, r1
|
||||
ldr sp, =__stack_end__
|
||||
#ifdef __ARM_EABI__
|
||||
bic sp, sp, #0x7
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef INITIALIZE_STACKS
|
||||
mov r2, #0xCC
|
||||
ldr r0, =__stack_und_start__
|
||||
ldr r1, =__stack_und_end__
|
||||
bl memory_set
|
||||
ldr r0, =__stack_abt_start__
|
||||
ldr r1, =__stack_abt_end__
|
||||
bl memory_set
|
||||
ldr r0, =__stack_irq_start__
|
||||
ldr r1, =__stack_irq_end__
|
||||
bl memory_set
|
||||
ldr r0, =__stack_fiq_start__
|
||||
ldr r1, =__stack_fiq_end__
|
||||
bl memory_set
|
||||
ldr r0, =__stack_svc_start__
|
||||
ldr r1, =__stack_svc_end__
|
||||
bl memory_set
|
||||
ldr r0, =__stack_start__
|
||||
ldr r1, =__stack_end__
|
||||
bl memory_set
|
||||
#endif
|
||||
|
||||
/* Copy initialised memory sections into RAM (if necessary). */
|
||||
ldr r0, =__data_load_start__
|
||||
ldr r1, =__data_start__
|
||||
ldr r2, =__data_end__
|
||||
bl memory_copy
|
||||
ldr r0, =__text_load_start__
|
||||
ldr r1, =__text_start__
|
||||
ldr r2, =__text_end__
|
||||
bl memory_copy
|
||||
ldr r0, =__fast_load_start__
|
||||
ldr r1, =__fast_start__
|
||||
ldr r2, =__fast_end__
|
||||
bl memory_copy
|
||||
ldr r0, =__ctors_load_start__
|
||||
ldr r1, =__ctors_start__
|
||||
ldr r2, =__ctors_end__
|
||||
bl memory_copy
|
||||
ldr r0, =__dtors_load_start__
|
||||
ldr r1, =__dtors_start__
|
||||
ldr r2, =__dtors_end__
|
||||
bl memory_copy
|
||||
ldr r0, =__rodata_load_start__
|
||||
ldr r1, =__rodata_start__
|
||||
ldr r2, =__rodata_end__
|
||||
bl memory_copy
|
||||
#ifdef INITIALIZE_SECONDARY_SECTIONS
|
||||
ldr r0, =__data2_load_start__
|
||||
ldr r1, =__data2_start__
|
||||
ldr r2, =__data2_end__
|
||||
bl memory_copy
|
||||
ldr r0, =__text2_load_start__
|
||||
ldr r1, =__text2_start__
|
||||
ldr r2, =__text2_end__
|
||||
bl memory_copy
|
||||
ldr r0, =__rodata2_load_start__
|
||||
ldr r1, =__rodata2_start__
|
||||
ldr r2, =__rodata2_end__
|
||||
bl memory_copy
|
||||
#endif /* #ifdef INITIALIZE_SECONDARY_SECTIONS */
|
||||
|
||||
/* Zero the bss. */
|
||||
ldr r0, =__bss_start__
|
||||
ldr r1, =__bss_end__
|
||||
mov r2, #0
|
||||
bl memory_set
|
||||
#ifdef INITIALIZE_SECONDARY_SECTIONS
|
||||
ldr r0, =__bss2_start__
|
||||
ldr r1, =__bss2_end__
|
||||
mov r2, #0
|
||||
bl memory_set
|
||||
#endif /* #ifdef INITIALIZE_SECONDARY_SECTIONS */
|
||||
|
||||
/* Initialise the heap */
|
||||
ldr r0, = __heap_start__
|
||||
ldr r1, = __heap_end__
|
||||
sub r1, r1, r0
|
||||
cmp r1, #8
|
||||
movge r2, #0
|
||||
strge r2, [r0], #+4
|
||||
strge r1, [r0]
|
||||
|
||||
/* Call constructors */
|
||||
ldr r0, =__ctors_start__
|
||||
ldr r1, =__ctors_end__
|
||||
ctor_loop:
|
||||
cmp r0, r1
|
||||
beq ctor_end
|
||||
ldr r2, [r0], #+4
|
||||
stmfd sp!, {r0-r1}
|
||||
mov lr, pc
|
||||
#ifdef __ARM_ARCH_3__
|
||||
mov pc, r2
|
||||
#else
|
||||
bx r2
|
||||
#endif
|
||||
ldmfd sp!, {r0-r1}
|
||||
b ctor_loop
|
||||
ctor_end:
|
||||
|
||||
.type start, function
|
||||
start:
|
||||
/* Jump to application entry point */
|
||||
#ifdef FULL_LIBRARY
|
||||
mov r0, #ARGSSPACE
|
||||
ldr r1, =args
|
||||
ldr r2, =debug_getargs
|
||||
mov lr, pc
|
||||
#ifdef __ARM_ARCH_3__
|
||||
mov pc, r2
|
||||
#else
|
||||
bx r2
|
||||
#endif
|
||||
ldr r1, =args
|
||||
#else
|
||||
mov r0, #0
|
||||
mov r1, #0
|
||||
#endif
|
||||
ldr r2, =APP_ENTRY_POINT
|
||||
mov lr, pc
|
||||
#ifdef __ARM_ARCH_3__
|
||||
mov pc, r2
|
||||
#else
|
||||
bx r2
|
||||
#endif
|
||||
|
||||
exit:
|
||||
#ifdef FULL_LIBRARY
|
||||
mov r5, r0 // save the exit parameter/return result
|
||||
|
||||
/* Call destructors */
|
||||
ldr r0, =__dtors_start__
|
||||
ldr r1, =__dtors_end__
|
||||
dtor_loop:
|
||||
cmp r0, r1
|
||||
beq dtor_end
|
||||
ldr r2, [r0], #+4
|
||||
stmfd sp!, {r0-r1}
|
||||
mov lr, pc
|
||||
#ifdef __ARM_ARCH_3__
|
||||
mov pc, r2
|
||||
#else
|
||||
bx r2
|
||||
#endif
|
||||
ldmfd sp!, {r0-r1}
|
||||
b dtor_loop
|
||||
dtor_end:
|
||||
|
||||
/* Call atexit functions */
|
||||
ldr r2, =_execute_at_exit_fns
|
||||
mov lr, pc
|
||||
#ifdef __ARM_ARCH_3__
|
||||
mov pc, r2
|
||||
#else
|
||||
bx r2
|
||||
#endif
|
||||
|
||||
/* Call debug_exit with return result/exit parameter */
|
||||
mov r0, r5
|
||||
ldr r2, =debug_exit
|
||||
mov lr, pc
|
||||
#ifdef __ARM_ARCH_3__
|
||||
mov pc, r2
|
||||
#else
|
||||
bx r2
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
/* Returned from application entry point/debug_exit, loop forever. */
|
||||
exit_loop:
|
||||
b exit_loop
|
||||
|
||||
|
||||
|
||||
|
||||
memory_copy:
|
||||
cmp r0, r1
|
||||
moveq pc, lr
|
||||
subs r2, r2, r1
|
||||
moveq pc, lr
|
||||
|
||||
/* if either pointer or length is not word aligned then byte copy */
|
||||
orr r3, r0, r1
|
||||
orr r3, r3, r2
|
||||
tst r3, #0x3
|
||||
bne 2f
|
||||
/* word copy */
|
||||
1:
|
||||
ldr r3, [r0], #+4
|
||||
str r3, [r1], #+4
|
||||
subs r2, r2, #4
|
||||
bne 1b
|
||||
mov pc, lr
|
||||
/* byte copy */
|
||||
2:
|
||||
ldrb r3, [r0], #+1
|
||||
strb r3, [r1], #+1
|
||||
subs r2, r2, #1
|
||||
bne 2b
|
||||
mov pc, lr
|
||||
|
||||
memory_set:
|
||||
cmp r0, r1
|
||||
moveq pc, lr
|
||||
strb r2, [r0], #1
|
||||
b memory_set
|
||||
|
||||
|
||||
.section .init, "ax"
|
||||
.code 32
|
||||
.align 0
|
||||
|
||||
/******************************************************************************
|
||||
* *
|
||||
* Default exception handlers *
|
||||
* *
|
||||
******************************************************************************/
|
||||
/******************************************************************************
|
||||
* *
|
||||
* Default exception handlers *
|
||||
* These are declared weak symbols so they can be redefined in user code. *
|
||||
* *
|
||||
******************************************************************************/
|
||||
undef_handler:
|
||||
b undef_handler
|
||||
|
||||
pabort_handler:
|
||||
b pabort_handler
|
||||
|
||||
dabort_handler:
|
||||
b dabort_handler
|
||||
|
||||
fiq_handler:
|
||||
b fiq_handler
|
||||
|
||||
irq_handler:
|
||||
b irq_handler
|
||||
|
||||
.weak undef_handler, pabort_handler, dabort_handler, fiq_handler, irq_handler
|
||||
|
||||
|
||||
#ifdef FULL_LIBRARY
|
||||
.bss
|
||||
args:
|
||||
.space ARGSSPACE
|
||||
#endif
|
||||
|
||||
/* Setup attibutes of stack and heap sections so they don't take up unnecessary room in the elf file */
|
||||
.section .stack, "wa", %nobits
|
||||
.section .stack_abt, "wa", %nobits
|
||||
.section .stack_irq, "wa", %nobits
|
||||
.section .stack_fiq, "wa", %nobits
|
||||
.section .stack_svc, "wa", %nobits
|
||||
.section .stack_und, "wa", %nobits
|
||||
.section .heap, "wa", %nobits
|
||||
|
|
@ -1,760 +0,0 @@
|
|||
/************************************************************************************//**
|
||||
* \file Source\ARM7_LPC2000\Crossworks\flash.c
|
||||
* \brief Bootloader flash driver source file.
|
||||
* \ingroup Target_ARM7_LPC2000
|
||||
* \internal
|
||||
*----------------------------------------------------------------------------------------
|
||||
* C O P Y R I G H T
|
||||
*----------------------------------------------------------------------------------------
|
||||
* Copyright (c) 2011 by Feaser http://www.feaser.com All rights reserved
|
||||
*
|
||||
*----------------------------------------------------------------------------------------
|
||||
* L I C E N S E
|
||||
*----------------------------------------------------------------------------------------
|
||||
* This file is part of OpenBLT. OpenBLT is free software: you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as published by the Free
|
||||
* Software Foundation, either version 3 of the License, or (at your option) any later
|
||||
* version.
|
||||
*
|
||||
* OpenBLT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
|
||||
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
||||
* PURPOSE. See the GNU General Public License for more details.
|
||||
*
|
||||
* You have received a copy of the GNU General Public License along with OpenBLT. It
|
||||
* should be located in ".\Doc\license.html". If not, contact Feaser to obtain a copy.
|
||||
*
|
||||
* \endinternal
|
||||
****************************************************************************************/
|
||||
|
||||
/****************************************************************************************
|
||||
* Include files
|
||||
****************************************************************************************/
|
||||
#include "boot.h" /* bootloader generic header */
|
||||
|
||||
|
||||
/****************************************************************************************
|
||||
* Macro definitions
|
||||
****************************************************************************************/
|
||||
/** \brief Value for an invalid flash sector. */
|
||||
#define FLASH_INVALID_SECTOR (0xff)
|
||||
/** \brief Value for an invalid flash address. */
|
||||
#define FLASH_INVALID_ADDRESS (0xffffffff)
|
||||
/** \brief Standard size of a flash block for writing. */
|
||||
#define FLASH_WRITE_BLOCK_SIZE (512)
|
||||
/** \brief Total numbers of sectors in array flashLayout[]. */
|
||||
#define FLASH_TOTAL_SECTORS (sizeof(flashLayout)/sizeof(flashLayout[0]))
|
||||
/** \brief Entry address for the IAP algorithms, enabling a switch to thumb mode. */
|
||||
#define IAP_ENTRY_ADDRESS (0x7ffffff1)
|
||||
/** \brief IAP prepare sectos command code. */
|
||||
#define IAP_CMD_PREPARE_SECTORS (50)
|
||||
/** \brief IAP copy ram to flash command code. */
|
||||
#define IAP_CMD_COPY_RAM_TO_FLASH (51)
|
||||
/** \brief IAP erase sectors command code. */
|
||||
#define IAP_CMD_ERASE_SECTORS (52)
|
||||
/** \brief IAP black check sectors command code. */
|
||||
#define IAP_CMD_BLANK_CHECK_SECTORS (53)
|
||||
/** \brief IAP compare command code. */
|
||||
#define IAP_CMD_COMPARE (56)
|
||||
/** \brief IAP result code for success. */
|
||||
#define IAP_CMD_SUCCESS (0)
|
||||
|
||||
|
||||
/****************************************************************************************
|
||||
* Plausibility checks
|
||||
****************************************************************************************/
|
||||
#ifndef BOOT_FLASH_CUSTOM_LAYOUT_ENABLE
|
||||
#define BOOT_FLASH_CUSTOM_LAYOUT_ENABLE (0u)
|
||||
#endif
|
||||
|
||||
|
||||
/****************************************************************************************
|
||||
* Type definitions
|
||||
****************************************************************************************/
|
||||
/** \brief Function pointer type that is needed to call IAP functions of the
|
||||
* NXP LPC2xxx.
|
||||
*/
|
||||
typedef void (*pIapHandler)(blt_int32u command[], blt_int32u result[]);
|
||||
|
||||
/** \brief Flash sector descriptor type. */
|
||||
typedef struct
|
||||
{
|
||||
blt_addr sector_start; /**< sector start address */
|
||||
blt_int32u sector_size; /**< sector size in bytes */
|
||||
blt_int8u sector_num; /**< sector number */
|
||||
} tFlashSector;
|
||||
|
||||
|
||||
/** \brief Structure type for grouping flash block information.
|
||||
* \details Programming is done per block of max FLASH_WRITE_BLOCK_SIZE. for this a
|
||||
* flash block manager is implemented in this driver. this flash block manager
|
||||
* depends on this flash block info structure. It holds the base address of
|
||||
* the flash block and the data that should be programmed into the flash
|
||||
* block. Note that the .data member must be 32-bit aligned by the linker.
|
||||
* the .base_addr must be a multiple of FLASH_WRITE_BLOCK_SIZE.
|
||||
*/
|
||||
typedef struct
|
||||
{
|
||||
blt_addr base_addr; /**< Base address for the flash operation.*/
|
||||
blt_int8u data[FLASH_WRITE_BLOCK_SIZE] __attribute__((aligned(4))); /**< Data array. */
|
||||
} tFlashBlockInfo;
|
||||
|
||||
|
||||
/****************************************************************************************
|
||||
* Function prototypes
|
||||
****************************************************************************************/
|
||||
static blt_bool FlashInitBlock(tFlashBlockInfo *block, blt_addr address);
|
||||
static tFlashBlockInfo *FlashSwitchBlock(tFlashBlockInfo *block, blt_addr base_addr);
|
||||
static blt_bool FlashAddToBlock(tFlashBlockInfo *block, blt_addr address,
|
||||
blt_int8u *data, blt_int32u len);
|
||||
static blt_bool FlashWriteBlock(tFlashBlockInfo *block);
|
||||
static blt_bool FlashEraseSectors(blt_int8u first_sector, blt_int8u last_sector);
|
||||
static blt_int8u FlashGetSector(blt_addr address);
|
||||
|
||||
|
||||
/****************************************************************************************
|
||||
* Local constant declarations
|
||||
****************************************************************************************/
|
||||
/** \brief If desired, it is possible to set BOOT_FLASH_CUSTOM_LAYOUT_ENABLE to > 0
|
||||
* in blt_conf.h and then implement your own version of the flashLayout[] table
|
||||
* in a source-file with the name flash_layout.c. This way you customize the
|
||||
* flash memory size reserved for the bootloader, without having to modify
|
||||
* the flashLayout[] table in this file directly. This file will then include
|
||||
* flash_layout.c so there is no need to compile it additionally with your
|
||||
* project.
|
||||
*/
|
||||
#if (BOOT_FLASH_CUSTOM_LAYOUT_ENABLE == 0)
|
||||
/** \brief Array wit the layout of the flash memory.
|
||||
* \details Also controls what part of the flash memory is reserved for the bootloader.
|
||||
* If the bootloader size changes, the reserved sectors for the bootloader
|
||||
* might need adjustment to make sure the bootloader doesn't get overwritten.
|
||||
* The current flash layout supports the NXP LPC21xx and LPC22xx targets.
|
||||
* LPC23xx has a slightly different layout. To support the LPC23xx, simply
|
||||
* update this flash layout.
|
||||
*/
|
||||
static const tFlashSector flashLayout[] =
|
||||
{
|
||||
#if (BOOT_NVM_SIZE_KB == 64)
|
||||
/* { 0x00000000, 0x02000, 0}, flash sector 0 - reserved for bootloader */
|
||||
{ 0x00002000, 0x02000, 1}, /* flash sector 1 */
|
||||
{ 0x00004000, 0x02000, 2}, /* flash sector 2 */
|
||||
{ 0x00006000, 0x02000, 3}, /* flash sector 3 */
|
||||
{ 0x00008000, 0x02000, 4}, /* flash sector 4 */
|
||||
{ 0x0000A000, 0x02000, 5}, /* flash sector 5 */
|
||||
{ 0x0000C000, 0x02000, 6}, /* flash sector 6 */
|
||||
/* { 0x0000E000, 0x02000, 7}, flash sector 7 - used by NXP bootcode */
|
||||
#endif
|
||||
#if (BOOT_NVM_SIZE_KB == 128)
|
||||
/* { 0x00000000, 0x02000, 0}, flash sector 0 - reserved for bootloader */
|
||||
{ 0x00002000, 0x02000, 1}, /* flash sector 1 */
|
||||
{ 0x00004000, 0x02000, 2}, /* flash sector 2 */
|
||||
{ 0x00006000, 0x02000, 3}, /* flash sector 3 */
|
||||
{ 0x00008000, 0x02000, 4}, /* flash sector 4 */
|
||||
{ 0x0000A000, 0x02000, 5}, /* flash sector 5 */
|
||||
{ 0x0000C000, 0x02000, 6}, /* flash sector 6 */
|
||||
{ 0x0000E000, 0x02000, 7}, /* flash sector 7 */
|
||||
{ 0x00010000, 0x02000, 8}, /* flash sector 8 */
|
||||
{ 0x00012000, 0x02000, 9}, /* flash sector 9 */
|
||||
{ 0x00014000, 0x02000, 10}, /* flash sector 10 */
|
||||
{ 0x00016000, 0x02000, 11}, /* flash sector 11 */
|
||||
{ 0x00018000, 0x02000, 12}, /* flash sector 12 */
|
||||
{ 0x0001A000, 0x02000, 13}, /* flash sector 13 */
|
||||
{ 0x0001C000, 0x02000, 14}, /* flash sector 14 */
|
||||
/* { 0x0001E000, 0x02000, 15}, flash sector 15 - used by NXP bootcode */
|
||||
#endif
|
||||
#if (BOOT_NVM_SIZE_KB == 256)
|
||||
/* { 0x00000000, 0x02000, 0}, flash sector 0 - reserved for bootloader */
|
||||
{ 0x00002000, 0x02000, 1}, /* flash sector 1 */
|
||||
{ 0x00004000, 0x02000, 2}, /* flash sector 2 */
|
||||
{ 0x00006000, 0x02000, 3}, /* flash sector 3 */
|
||||
{ 0x00008000, 0x02000, 4}, /* flash sector 4 */
|
||||
{ 0x0000A000, 0x02000, 5}, /* flash sector 5 */
|
||||
{ 0x0000C000, 0x02000, 6}, /* flash sector 6 */
|
||||
{ 0x0000E000, 0x02000, 7}, /* flash sector 7 */
|
||||
{ 0x00010000, 0x10000, 8}, /* flash sector 8 */
|
||||
{ 0x00020000, 0x10000, 9}, /* flash sector 9 */
|
||||
{ 0x00030000, 0x02000, 10}, /* flash sector 10 */
|
||||
{ 0x00032000, 0x02000, 11}, /* flash sector 11 */
|
||||
{ 0x00034000, 0x02000, 12}, /* flash sector 12 */
|
||||
{ 0x00036000, 0x02000, 13}, /* flash sector 13 */
|
||||
{ 0x00038000, 0x02000, 14}, /* flash sector 14 */
|
||||
{ 0x0003A000, 0x02000, 15}, /* flash sector 15 */
|
||||
{ 0x0003C000, 0x02000, 16}, /* flash sector 16 */
|
||||
/* { 0x0003E000, 0x02000, 17}, flash sector 17 - used by NXP bootcode */
|
||||
#endif
|
||||
};
|
||||
#else
|
||||
#include "flash_layout.c"
|
||||
#endif /* BOOT_FLASH_CUSTOM_LAYOUT_ENABLE == 0 */
|
||||
|
||||
|
||||
/****************************************************************************************
|
||||
* Local data declarations
|
||||
****************************************************************************************/
|
||||
/** \brief Local variable with information about the flash block that is currently
|
||||
* being operated on.
|
||||
* \details The smallest amount of flash that can be programmed is
|
||||
* FLASH_WRITE_BLOCK_SIZE. A flash block manager is implemented in this driver
|
||||
* and stores info in this variable. Whenever new data should be flashed, it
|
||||
* is first added to a RAM buffer, which is part of this variable. Whenever
|
||||
* the RAM buffer, which has the size of a flash block, is full or data needs
|
||||
* to be written to a different block, the contents of the RAM buffer are
|
||||
* programmed to flash. The flash block manager requires some software
|
||||
* overhead, yet results is faster flash programming because data is first
|
||||
* harvested, ideally until there is enough to program an entire flash block,
|
||||
* before the flash device is actually operated on.
|
||||
*/
|
||||
static tFlashBlockInfo blockInfo;
|
||||
|
||||
/** \brief Local variable with information about the flash boot block.
|
||||
* \details The first block of the user program holds the vector table, which on the
|
||||
* LPC2000 is also the where the checksum is written to. Is it likely that the
|
||||
* vector table is first flashed and then, at the end of the programming
|
||||
* sequence, the checksum. This means that this flash block need to be written
|
||||
* to twice. Normally this is not a problem with flash memory, as long as you
|
||||
* write the same values to those bytes that are not supposed to be changed and
|
||||
* the locations where you do write to are still in the erased 0xFF state.
|
||||
* Unfortunately, writing twice to flash this way, does not work reliably on
|
||||
* the LPC2000. This is why we need to have an extra block, the bootblock,
|
||||
* placed under the management of the block manager. This way is it possible
|
||||
* to implement functionality so that the bootblock is only written to once at
|
||||
* the end of the programming sequency.
|
||||
*/
|
||||
static tFlashBlockInfo bootBlockInfo;
|
||||
|
||||
|
||||
/************************************************************************************//**
|
||||
** \brief Initializes the flash driver.
|
||||
** \return none.
|
||||
**
|
||||
****************************************************************************************/
|
||||
void FlashInit(void)
|
||||
{
|
||||
/* check the flash block data buffer alignments */
|
||||
if ((((blt_addr)blockInfo.data % 4) != 0) || (((blt_addr)bootBlockInfo.data % 4) != 0))
|
||||
{
|
||||
/* incorrect alignment */
|
||||
ASSERT_RT(BLT_FALSE);
|
||||
}
|
||||
/* init the flash block info structs by setting the address to an invalid address */
|
||||
blockInfo.base_addr = FLASH_INVALID_ADDRESS;
|
||||
bootBlockInfo.base_addr = FLASH_INVALID_ADDRESS;
|
||||
} /*** end of FlashInit ***/
|
||||
|
||||
|
||||
/************************************************************************************//**
|
||||
** \brief Reinitializes the flash driver.
|
||||
** \return none.
|
||||
**
|
||||
****************************************************************************************/
|
||||
void FlashReinit(void)
|
||||
{
|
||||
/* init the flash block info structs by setting the address to an invalid address */
|
||||
blockInfo.base_addr = FLASH_INVALID_ADDRESS;
|
||||
bootBlockInfo.base_addr = FLASH_INVALID_ADDRESS;
|
||||
} /*** end of FlashReinit ***/
|
||||
|
||||
|
||||
/************************************************************************************//**
|
||||
** \brief Writes the data to flash through a flash block manager. Note that this
|
||||
** function also checks that no data is programmed outside the flash
|
||||
** memory region, so the bootloader can never be overwritten.
|
||||
** \param addr Start address.
|
||||
** \param len Length in bytes.
|
||||
** \param data Pointer to the data buffer.
|
||||
** \return BLT_TRUE if successful, BLT_FALSE otherwise.
|
||||
**
|
||||
****************************************************************************************/
|
||||
blt_bool FlashWrite(blt_addr addr, blt_int32u len, blt_int8u *data)
|
||||
{
|
||||
blt_addr base_addr;
|
||||
|
||||
/* make sure the addresses are within the flash device */
|
||||
if ((FlashGetSector(addr) == FLASH_INVALID_SECTOR) || \
|
||||
(FlashGetSector(addr+len-1) == FLASH_INVALID_SECTOR))
|
||||
{
|
||||
return BLT_FALSE;
|
||||
}
|
||||
|
||||
/* if this is the bootblock, then let the boot block manager handle it */
|
||||
base_addr = (addr/FLASH_WRITE_BLOCK_SIZE)*FLASH_WRITE_BLOCK_SIZE;
|
||||
if (base_addr == flashLayout[0].sector_start)
|
||||
{
|
||||
/* let the boot block manager handle it */
|
||||
return FlashAddToBlock(&bootBlockInfo, addr, data, len);
|
||||
}
|
||||
/* let the block manager handle it */
|
||||
return FlashAddToBlock(&blockInfo, addr, data, len);
|
||||
} /*** end of FlashWrite ***/
|
||||
|
||||
|
||||
/************************************************************************************//**
|
||||
** \brief Erases the flash memory. Note that this function also checks that no
|
||||
** data is erased outside the flash memory region, so the bootloader can
|
||||
** never be erased.
|
||||
** \param addr Start address.
|
||||
** \param len Length in bytes.
|
||||
** \return BLT_TRUE if successful, BLT_FALSE otherwise.
|
||||
**
|
||||
****************************************************************************************/
|
||||
blt_bool FlashErase(blt_addr addr, blt_int32u len)
|
||||
{
|
||||
blt_int8u first_sector;
|
||||
blt_int8u last_sector;
|
||||
|
||||
/* obtain the first and last sector number */
|
||||
first_sector = FlashGetSector(addr);
|
||||
last_sector = FlashGetSector(addr+len-1);
|
||||
/* check them */
|
||||
if ((first_sector == FLASH_INVALID_SECTOR) || (last_sector == FLASH_INVALID_SECTOR))
|
||||
{
|
||||
return BLT_FALSE;
|
||||
}
|
||||
/* erase the sectors */
|
||||
return FlashEraseSectors(first_sector, last_sector);
|
||||
} /*** end of FlashErase ***/
|
||||
|
||||
|
||||
/************************************************************************************//**
|
||||
** \brief Writes a checksum of the user program to non-volatile memory. This is
|
||||
** performed once the entire user program has been programmed. Through
|
||||
** the checksum, the bootloader can check if the programming session
|
||||
** was completed, which indicates that a valid user programming is
|
||||
** present and can be started.
|
||||
** \return BLT_TRUE if successful, BLT_FALSE otherwise.
|
||||
**
|
||||
****************************************************************************************/
|
||||
blt_bool FlashWriteChecksum(void)
|
||||
{
|
||||
blt_int32u signature_checksum = 0;
|
||||
|
||||
/* The ARM7 core already has a spot reserved for a checksum that the bootloader can
|
||||
* store at the end of a programming session.
|
||||
*
|
||||
* Layout of the vector table (* = don't care)
|
||||
* 0x******00 Reset Exception
|
||||
* 0x******04 Undefined Instruction Exception
|
||||
* 0x******08 Software Interrupt Exception
|
||||
* 0x******0C Prefetch Exception
|
||||
* 0x******10 Abort Exception
|
||||
* 0x******14 [reserved for signature checksum]
|
||||
* 0x******18 IRQ Exception
|
||||
* 0x******1C FIQ Exception
|
||||
*
|
||||
* signature_checksum = Two's complement of (SUM(exception address values))
|
||||
*/
|
||||
|
||||
/* first check that the bootblock contains valid data. if not, this means the
|
||||
* bootblock is not part of the reprogramming this time and therefore no
|
||||
* new checksum needs to be written
|
||||
*/
|
||||
if (bootBlockInfo.base_addr == FLASH_INVALID_ADDRESS)
|
||||
{
|
||||
return BLT_TRUE;
|
||||
}
|
||||
|
||||
/* compute the checksum. note that the user program's vectors are not yet written
|
||||
* to flash but are present in the bootblock data structure at this point.
|
||||
*/
|
||||
signature_checksum += *((blt_int32u *)(&bootBlockInfo.data[0+0x00]));
|
||||
signature_checksum += *((blt_int32u *)(&bootBlockInfo.data[0+0x04]));
|
||||
signature_checksum += *((blt_int32u *)(&bootBlockInfo.data[0+0x08]));
|
||||
signature_checksum += *((blt_int32u *)(&bootBlockInfo.data[0+0x0C]));
|
||||
signature_checksum += *((blt_int32u *)(&bootBlockInfo.data[0+0x10]));
|
||||
signature_checksum += *((blt_int32u *)(&bootBlockInfo.data[0+0x18]));
|
||||
signature_checksum += *((blt_int32u *)(&bootBlockInfo.data[0+0x1C]));
|
||||
signature_checksum = ~signature_checksum; /* one's complement */
|
||||
signature_checksum += 1; /* two's complement */
|
||||
|
||||
/* write the checksum */
|
||||
return FlashWrite(flashLayout[0].sector_start+0x14, sizeof(blt_addr),
|
||||
(blt_int8u *)&signature_checksum);
|
||||
} /*** end of FlashWriteChecksum ***/
|
||||
|
||||
|
||||
/************************************************************************************//**
|
||||
** \brief Verifies the checksum, which indicates that a valid user program is
|
||||
** present and can be started.
|
||||
** \return BLT_TRUE if successful, BLT_FALSE otherwise.
|
||||
**
|
||||
****************************************************************************************/
|
||||
blt_bool FlashVerifyChecksum(void)
|
||||
{
|
||||
blt_int32u signature_checksum = 0;
|
||||
|
||||
/* verify the checksum based on how it was written by CpuWriteChecksum() */
|
||||
signature_checksum += *((blt_int32u *)(flashLayout[0].sector_start));
|
||||
signature_checksum += *((blt_int32u *)(flashLayout[0].sector_start+0x04));
|
||||
signature_checksum += *((blt_int32u *)(flashLayout[0].sector_start+0x08));
|
||||
signature_checksum += *((blt_int32u *)(flashLayout[0].sector_start+0x0C));
|
||||
signature_checksum += *((blt_int32u *)(flashLayout[0].sector_start+0x10));
|
||||
signature_checksum += *((blt_int32u *)(flashLayout[0].sector_start+0x14));
|
||||
signature_checksum += *((blt_int32u *)(flashLayout[0].sector_start+0x18));
|
||||
signature_checksum += *((blt_int32u *)(flashLayout[0].sector_start+0x1C));
|
||||
|
||||
/* sum should add up to an unsigned 32-bit value of 0 */
|
||||
if (signature_checksum == 0)
|
||||
{
|
||||
/* checksum okay */
|
||||
return BLT_TRUE;
|
||||
}
|
||||
/* checksum incorrect */
|
||||
return BLT_FALSE;
|
||||
} /*** end of FlashVerifyChecksum ***/
|
||||
|
||||
|
||||
/************************************************************************************//**
|
||||
** \brief Finalizes the flash driver operations. There could still be data in
|
||||
** the currently active block that needs to be flashed.
|
||||
** \return BLT_TRUE if successful, BLT_FALSE otherwise.
|
||||
**
|
||||
****************************************************************************************/
|
||||
blt_bool FlashDone(void)
|
||||
{
|
||||
/* check if there is still data waiting to be programmed in the boot block */
|
||||
if (bootBlockInfo.base_addr != FLASH_INVALID_ADDRESS)
|
||||
{
|
||||
if (FlashWriteBlock(&bootBlockInfo) == BLT_FALSE)
|
||||
{
|
||||
return BLT_FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
/* check if there is still data waiting to be programmed */
|
||||
if (blockInfo.base_addr != FLASH_INVALID_ADDRESS)
|
||||
{
|
||||
if (FlashWriteBlock(&blockInfo) == BLT_FALSE)
|
||||
{
|
||||
return BLT_FALSE;
|
||||
}
|
||||
}
|
||||
/* still here so all is okay */
|
||||
return BLT_TRUE;
|
||||
} /*** end of FlashDone ***/
|
||||
|
||||
|
||||
/************************************************************************************//**
|
||||
** \brief Obtains the base address of the flash memory available to the user program.
|
||||
** This is basically the first address in the flashLayout table.
|
||||
** \return Base address.
|
||||
**
|
||||
****************************************************************************************/
|
||||
blt_addr FlashGetUserProgBaseAddress(void)
|
||||
{
|
||||
return flashLayout[0].sector_start;
|
||||
} /*** end of FlashGetUserProgBaseAddress ***/
|
||||
|
||||
|
||||
/************************************************************************************//**
|
||||
** \brief Copies data currently in flash to the block->data and sets the
|
||||
** base address.
|
||||
** \param block Pointer to flash block info structure to operate on.
|
||||
** \param address Base address of the block data.
|
||||
** \return BLT_TRUE if successful, BLT_FALSE otherwise.
|
||||
**
|
||||
****************************************************************************************/
|
||||
static blt_bool FlashInitBlock(tFlashBlockInfo *block, blt_addr address)
|
||||
{
|
||||
/* check address alignment */
|
||||
if ((address % FLASH_WRITE_BLOCK_SIZE) != 0)
|
||||
{
|
||||
return BLT_FALSE;
|
||||
}
|
||||
/* make sure that we are initializing a new block and not the same one */
|
||||
if (block->base_addr == address)
|
||||
{
|
||||
/* block already initialized, so nothing to do */
|
||||
return BLT_TRUE;
|
||||
}
|
||||
/* set the base address and copies the current data from flash */
|
||||
block->base_addr = address;
|
||||
CpuMemCopy((blt_addr)block->data, address, FLASH_WRITE_BLOCK_SIZE);
|
||||
return BLT_TRUE;
|
||||
} /*** end of FlashInitBlock ***/
|
||||
|
||||
|
||||
/************************************************************************************//**
|
||||
** \brief Switches blocks by programming the current one and initializing the
|
||||
** next.
|
||||
** \param block Pointer to flash block info structure to operate on.
|
||||
** \param base_addr Base address of the next block.
|
||||
** \return The pointer of the block info struct that is no being used, or a NULL
|
||||
** pointer in case of error.
|
||||
**
|
||||
****************************************************************************************/
|
||||
static tFlashBlockInfo *FlashSwitchBlock(tFlashBlockInfo *block, blt_addr base_addr)
|
||||
{
|
||||
/* check if a switch needs to be made away from the boot block. in this case the boot
|
||||
* block shouldn't be written yet, because this is done at the end of the programming
|
||||
* session by FlashDone(), this is right after the checksum was written.
|
||||
*/
|
||||
if (block == &bootBlockInfo)
|
||||
{
|
||||
/* switch from the boot block to the generic block info structure */
|
||||
block = &blockInfo;
|
||||
}
|
||||
/* check if a switch back into the bootblock is needed. in this case the generic block
|
||||
* doesn't need to be written here yet.
|
||||
*/
|
||||
else if (base_addr == flashLayout[0].sector_start)
|
||||
{
|
||||
/* switch from the generic block to the boot block info structure */
|
||||
block = &bootBlockInfo;
|
||||
base_addr = flashLayout[0].sector_start;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* need to switch to a new block, so program the current one and init the next */
|
||||
if (FlashWriteBlock(block) == BLT_FALSE)
|
||||
{
|
||||
return BLT_NULL;
|
||||
}
|
||||
}
|
||||
|
||||
/* initialize tne new block when necessary */
|
||||
if (FlashInitBlock(block, base_addr) == BLT_FALSE)
|
||||
{
|
||||
return BLT_NULL;
|
||||
}
|
||||
|
||||
/* still here to all is okay */
|
||||
return block;
|
||||
} /*** end of FlashSwitchBlock ***/
|
||||
|
||||
|
||||
/************************************************************************************//**
|
||||
** \brief Programming is done per block. This function adds data to the block
|
||||
** that is currently collecting data to be written to flash. If the
|
||||
** address is outside of the current block, the current block is written
|
||||
** to flash an a new block is initialized.
|
||||
** \param block Pointer to flash block info structure to operate on.
|
||||
** \param address Flash destination address.
|
||||
** \param data Pointer to the byte array with data.
|
||||
** \param len Number of bytes to add to the block.
|
||||
** \return BLT_TRUE if successful, BLT_FALSE otherwise.
|
||||
**
|
||||
****************************************************************************************/
|
||||
static blt_bool FlashAddToBlock(tFlashBlockInfo *block, blt_addr address,
|
||||
blt_int8u *data, blt_int32u len)
|
||||
{
|
||||
blt_addr current_base_addr;
|
||||
blt_int8u *dst;
|
||||
blt_int8u *src;
|
||||
|
||||
/* determine the current base address */
|
||||
current_base_addr = (address/FLASH_WRITE_BLOCK_SIZE)*FLASH_WRITE_BLOCK_SIZE;
|
||||
|
||||
/* make sure the blockInfo is not uninitialized */
|
||||
if (block->base_addr == FLASH_INVALID_ADDRESS)
|
||||
{
|
||||
/* initialize the blockInfo struct for the current block */
|
||||
if (FlashInitBlock(block, current_base_addr) == BLT_FALSE)
|
||||
{
|
||||
return BLT_FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
/* check if the new data fits in the current block */
|
||||
if (block->base_addr != current_base_addr)
|
||||
{
|
||||
/* need to switch to a new block, so program the current one and init the next */
|
||||
block = FlashSwitchBlock(block, current_base_addr);
|
||||
if (block == BLT_NULL)
|
||||
{
|
||||
return BLT_FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
/* add the data to the current block, but check for block overflow */
|
||||
dst = &(block->data[address - block->base_addr]);
|
||||
src = data;
|
||||
do
|
||||
{
|
||||
/* keep the watchdog happy */
|
||||
CopService();
|
||||
/* buffer overflow? */
|
||||
if ((blt_addr)(dst-&(block->data[0])) >= FLASH_WRITE_BLOCK_SIZE)
|
||||
{
|
||||
/* need to switch to a new block, so program the current one and init the next */
|
||||
block = FlashSwitchBlock(block, current_base_addr+FLASH_WRITE_BLOCK_SIZE);
|
||||
if (block == BLT_NULL)
|
||||
{
|
||||
return BLT_FALSE;
|
||||
}
|
||||
/* reset destination pointer */
|
||||
dst = &(block->data[0]);
|
||||
}
|
||||
/* write the data to the buffer */
|
||||
*dst = *src;
|
||||
/* update pointers */
|
||||
dst++;
|
||||
src++;
|
||||
/* decrement byte counter */
|
||||
len--;
|
||||
}
|
||||
while (len > 0);
|
||||
/* still here so all is good */
|
||||
return BLT_TRUE;
|
||||
} /*** end of FlashAddToBlock ***/
|
||||
|
||||
|
||||
/************************************************************************************//**
|
||||
** \brief Programs FLASH_WRITE_BLOCK_SIZE bytes to flash from the block->data
|
||||
** array.
|
||||
** \param block Pointer to flash block info structure to operate on.
|
||||
** \return BLT_TRUE if successful, BLT_FALSE otherwise.
|
||||
**
|
||||
****************************************************************************************/
|
||||
static blt_bool FlashWriteBlock(tFlashBlockInfo *block)
|
||||
{
|
||||
blt_int32u iap_command[5];
|
||||
blt_int32u iap_result[3];
|
||||
blt_int8u sector_num;
|
||||
pIapHandler iapHandler = (void *)IAP_ENTRY_ADDRESS;
|
||||
|
||||
/* check that address is actually within flash */
|
||||
sector_num = FlashGetSector(block->base_addr);
|
||||
if (sector_num == FLASH_INVALID_SECTOR)
|
||||
{
|
||||
return BLT_FALSE;
|
||||
}
|
||||
/* send the prepare sector command for just this one sector */
|
||||
iap_command[0] = IAP_CMD_PREPARE_SECTORS;
|
||||
iap_command[1] = sector_num;
|
||||
iap_command[2] = sector_num;
|
||||
iap_result[0] = !IAP_CMD_SUCCESS;
|
||||
/* service the watchdog before calling the IAP handler */
|
||||
CopService();
|
||||
iapHandler(iap_command, iap_result);
|
||||
if (iap_result[0] != IAP_CMD_SUCCESS)
|
||||
{
|
||||
return BLT_FALSE;
|
||||
}
|
||||
/* send the erase sector command */
|
||||
iap_command[0] = IAP_CMD_COPY_RAM_TO_FLASH;
|
||||
iap_command[1] = (blt_int32u)block->base_addr;
|
||||
iap_command[2] = (blt_int32u)block->data;
|
||||
iap_command[3] = FLASH_WRITE_BLOCK_SIZE;
|
||||
iap_command[4] = BOOT_CPU_SYSTEM_SPEED_KHZ;
|
||||
iap_result[0] = !IAP_CMD_SUCCESS;
|
||||
/* service the watchdog before calling the IAP handler */
|
||||
CopService();
|
||||
iapHandler(iap_command, iap_result);
|
||||
if (iap_result[0] != IAP_CMD_SUCCESS)
|
||||
{
|
||||
return BLT_FALSE;
|
||||
}
|
||||
/* perform a comparison for verification purposes */
|
||||
iap_command[0] = IAP_CMD_COMPARE;
|
||||
iap_command[1] = (blt_int32u)block->base_addr;
|
||||
iap_command[2] = (blt_int32u)block->data;
|
||||
iap_command[3] = FLASH_WRITE_BLOCK_SIZE;
|
||||
iap_result[0] = !IAP_CMD_SUCCESS;
|
||||
/* service the watchdog before calling the IAP handler */
|
||||
CopService();
|
||||
iapHandler(iap_command, iap_result);
|
||||
if (iap_result[0] != IAP_CMD_SUCCESS)
|
||||
{
|
||||
return BLT_FALSE;
|
||||
}
|
||||
/* still here so all is okay */
|
||||
return BLT_TRUE;
|
||||
|
||||
} /*** end of FlashWriteBlock ***/
|
||||
|
||||
|
||||
/************************************************************************************//**
|
||||
** \brief Erases the flash sectors from first_sector up until last_sector.
|
||||
** \param first_sector First flash sector number.
|
||||
** \param last_sector Last flash sector number.
|
||||
** \return BLT_TRUE if successful, BLT_FALSE otherwise.
|
||||
**
|
||||
****************************************************************************************/
|
||||
static blt_bool FlashEraseSectors(blt_int8u first_sector, blt_int8u last_sector)
|
||||
{
|
||||
blt_int32u iap_command[5];
|
||||
blt_int32u iap_result[3];
|
||||
pIapHandler iapHandler = (void *)IAP_ENTRY_ADDRESS;
|
||||
|
||||
/* validate the sector numbers */
|
||||
if (first_sector > last_sector)
|
||||
{
|
||||
return BLT_FALSE;
|
||||
}
|
||||
if ((first_sector < flashLayout[0].sector_num) || \
|
||||
(last_sector > flashLayout[FLASH_TOTAL_SECTORS-1].sector_num))
|
||||
{
|
||||
return BLT_FALSE;
|
||||
}
|
||||
|
||||
/* send the prepare sector command for just this one sector */
|
||||
iap_command[0] = IAP_CMD_PREPARE_SECTORS;
|
||||
iap_command[1] = first_sector;
|
||||
iap_command[2] = last_sector;
|
||||
iap_result[0] = !IAP_CMD_SUCCESS;
|
||||
/* service the watchdog before calling the IAP handler */
|
||||
CopService();
|
||||
iapHandler(iap_command, iap_result);
|
||||
if (iap_result[0] != IAP_CMD_SUCCESS)
|
||||
{
|
||||
return BLT_FALSE;
|
||||
}
|
||||
/* send the erase sector command */
|
||||
iap_command[0] = IAP_CMD_ERASE_SECTORS;
|
||||
iap_command[1] = first_sector;
|
||||
iap_command[2] = last_sector;
|
||||
iap_command[3] = BOOT_CPU_SYSTEM_SPEED_KHZ;
|
||||
iap_result[0] = !IAP_CMD_SUCCESS;
|
||||
/* service the watchdog before calling the IAP handler */
|
||||
CopService();
|
||||
iapHandler(iap_command, iap_result);
|
||||
if (iap_result[0] != IAP_CMD_SUCCESS)
|
||||
{
|
||||
return BLT_FALSE;
|
||||
}
|
||||
/* perform a blank check for verification purposes */
|
||||
iap_command[0] = IAP_CMD_BLANK_CHECK_SECTORS ;
|
||||
iap_command[1] = first_sector;
|
||||
iap_command[2] = last_sector;
|
||||
iap_result[0] = !IAP_CMD_SUCCESS;
|
||||
/* service the watchdog before calling the IAP handler */
|
||||
CopService();
|
||||
iapHandler(iap_command, iap_result);
|
||||
if (iap_result[0] != IAP_CMD_SUCCESS)
|
||||
{
|
||||
return BLT_FALSE;
|
||||
}
|
||||
/* still here so all went okay */
|
||||
return BLT_TRUE;
|
||||
} /*** end of FlashEraseSectors ***/
|
||||
|
||||
|
||||
/************************************************************************************//**
|
||||
** \brief Determines the flash sector the address is in.
|
||||
** \param address Address in the flash sector.
|
||||
** \return Flash sector number or FLASH_INVALID_SECTOR.
|
||||
**
|
||||
****************************************************************************************/
|
||||
static blt_int8u FlashGetSector(blt_addr address)
|
||||
{
|
||||
blt_int8u sectorIdx;
|
||||
|
||||
/* search through the sectors to find the right one */
|
||||
for (sectorIdx = 0; sectorIdx < FLASH_TOTAL_SECTORS; sectorIdx++)
|
||||
{
|
||||
/* keep the watchdog happy */
|
||||
CopService();
|
||||
/* is the address in this sector? */
|
||||
if ((address >= flashLayout[sectorIdx].sector_start) && \
|
||||
(address < (flashLayout[sectorIdx].sector_start + \
|
||||
flashLayout[sectorIdx].sector_size)))
|
||||
{
|
||||
/* return the sector number */
|
||||
return flashLayout[sectorIdx].sector_num;
|
||||
}
|
||||
}
|
||||
/* still here so no valid sector found */
|
||||
return FLASH_INVALID_SECTOR;
|
||||
} /*** end of FlashGetSector ***/
|
||||
|
||||
|
||||
/*********************************** end of flash.c ************************************/
|
|
@ -1,45 +0,0 @@
|
|||
/************************************************************************************//**
|
||||
* \file Source\ARM7_LPC2000\Crossworks\flash.h
|
||||
* \brief Bootloader flash driver header file.
|
||||
* \ingroup Target_ARM7_LPC2000
|
||||
* \internal
|
||||
*----------------------------------------------------------------------------------------
|
||||
* C O P Y R I G H T
|
||||
*----------------------------------------------------------------------------------------
|
||||
* Copyright (c) 2011 by Feaser http://www.feaser.com All rights reserved
|
||||
*
|
||||
*----------------------------------------------------------------------------------------
|
||||
* L I C E N S E
|
||||
*----------------------------------------------------------------------------------------
|
||||
* This file is part of OpenBLT. OpenBLT is free software: you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as published by the Free
|
||||
* Software Foundation, either version 3 of the License, or (at your option) any later
|
||||
* version.
|
||||
*
|
||||
* OpenBLT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
|
||||
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
||||
* PURPOSE. See the GNU General Public License for more details.
|
||||
*
|
||||
* You have received a copy of the GNU General Public License along with OpenBLT. It
|
||||
* should be located in ".\Doc\license.html". If not, contact Feaser to obtain a copy.
|
||||
*
|
||||
* \endinternal
|
||||
****************************************************************************************/
|
||||
#ifndef FLASH_H
|
||||
#define FLASH_H
|
||||
|
||||
/****************************************************************************************
|
||||
* Function prototypes
|
||||
****************************************************************************************/
|
||||
void FlashInit(void);
|
||||
void FlashReinit(void);
|
||||
blt_bool FlashWrite(blt_addr addr, blt_int32u len, blt_int8u *data);
|
||||
blt_bool FlashErase(blt_addr addr, blt_int32u len);
|
||||
blt_bool FlashWriteChecksum(void);
|
||||
blt_bool FlashVerifyChecksum(void);
|
||||
blt_bool FlashDone(void);
|
||||
blt_addr FlashGetUserProgBaseAddress(void);
|
||||
|
||||
|
||||
#endif /* FLASH_H */
|
||||
/*********************************** end of flash.h ************************************/
|
|
@ -1,356 +0,0 @@
|
|||
MEMORY
|
||||
{
|
||||
UNPLACED_SECTIONS (wx) : ORIGIN = 0x100000000, LENGTH = 0
|
||||
AHB_Peripherals (wx) : ORIGIN = 0xffe00000, LENGTH = 0x00200000
|
||||
VPB_Peripherals (wx) : ORIGIN = 0xe0000000, LENGTH = 0x00200000
|
||||
BANK3 (wx) : ORIGIN = 0x83000000, LENGTH = 0x01000000
|
||||
BANK2 (wx) : ORIGIN = 0x82000000, LENGTH = 0x01000000
|
||||
External_SRAM (wx) : ORIGIN = 0x81000000, LENGTH = 0x00100000
|
||||
External_FLASH (rx) : ORIGIN = 0x80000000, LENGTH = 0x00400000
|
||||
SRAM (wx) : ORIGIN = 0x40000200, LENGTH = 0x00001CE0
|
||||
FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00002000
|
||||
}
|
||||
|
||||
|
||||
SECTIONS
|
||||
{
|
||||
__AHB_Peripherals_segment_start__ = 0xffe00000;
|
||||
__AHB_Peripherals_segment_end__ = 0x00000000;
|
||||
__VPB_Peripherals_segment_start__ = 0xe0000000;
|
||||
__VPB_Peripherals_segment_end__ = 0xe0200000;
|
||||
__BANK3_segment_start__ = 0x83000000;
|
||||
__BANK3_segment_end__ = 0x84000000;
|
||||
__BANK2_segment_start__ = 0x82000000;
|
||||
__BANK2_segment_end__ = 0x83000000;
|
||||
__External_SRAM_segment_start__ = 0x81000000;
|
||||
__External_SRAM_segment_end__ = 0x81100000;
|
||||
__External_FLASH_segment_start__ = 0x80000000;
|
||||
__External_FLASH_segment_end__ = 0x80400000;
|
||||
__SRAM_segment_start__ = 0x40000200;
|
||||
__SRAM_segment_end__ = 0x40001EE0;
|
||||
__FLASH_segment_start__ = 0x00000000;
|
||||
__FLASH_segment_end__ = 0x00002000;
|
||||
|
||||
__STACKSIZE__ = 1024;
|
||||
__STACKSIZE_IRQ__ = 256;
|
||||
__STACKSIZE_FIQ__ = 256;
|
||||
__STACKSIZE_SVC__ = 0;
|
||||
__STACKSIZE_ABT__ = 0;
|
||||
__STACKSIZE_UND__ = 0;
|
||||
__HEAPSIZE__ = 1024;
|
||||
|
||||
__text2_load_start__ = ALIGN(__External_FLASH_segment_start__ , 4);
|
||||
.text2 ALIGN(__External_FLASH_segment_start__ , 4) : AT(ALIGN(__External_FLASH_segment_start__ , 4))
|
||||
{
|
||||
__text2_start__ = .;
|
||||
*(.text2 .text2.*)
|
||||
}
|
||||
__text2_end__ = __text2_start__ + SIZEOF(.text2);
|
||||
|
||||
__text2_load_end__ = __text2_end__;
|
||||
|
||||
. = ASSERT(__text2_end__ >= __External_FLASH_segment_start__ && __text2_end__ <= (__External_FLASH_segment_start__ + 0x00400000) , "error: .text2 is too large to fit in External_FLASH memory segment");
|
||||
|
||||
__rodata2_load_start__ = ALIGN(__text2_end__ , 4);
|
||||
.rodata2 ALIGN(__text2_end__ , 4) : AT(ALIGN(__text2_end__ , 4))
|
||||
{
|
||||
__rodata2_start__ = .;
|
||||
*(.rodata2 .rodata2.*)
|
||||
}
|
||||
__rodata2_end__ = __rodata2_start__ + SIZEOF(.rodata2);
|
||||
|
||||
__rodata2_load_end__ = __rodata2_end__;
|
||||
|
||||
. = ASSERT(__rodata2_end__ >= __External_FLASH_segment_start__ && __rodata2_end__ <= (__External_FLASH_segment_start__ + 0x00400000) , "error: .rodata2 is too large to fit in External_FLASH memory segment");
|
||||
|
||||
__data2_load_start__ = ALIGN(__rodata2_end__ , 4);
|
||||
.data2 ALIGN(__External_SRAM_segment_start__ , 4) : AT(ALIGN(__rodata2_end__ , 4))
|
||||
{
|
||||
__data2_start__ = .;
|
||||
*(.data2 .data2.*)
|
||||
}
|
||||
__data2_end__ = __data2_start__ + SIZEOF(.data2);
|
||||
|
||||
__data2_load_end__ = __data2_load_start__ + SIZEOF(.data2);
|
||||
|
||||
__External_FLASH_segment_used_end__ = ALIGN(__rodata2_end__ , 4) + SIZEOF(.data2);
|
||||
|
||||
. = ASSERT((__data2_load_start__ + SIZEOF(.data2)) >= __External_FLASH_segment_start__ && (__data2_load_start__ + SIZEOF(.data2)) <= (__External_FLASH_segment_start__ + 0x00400000) , "error: .data2 is too large to fit in External_FLASH memory segment");
|
||||
|
||||
.data2_run ALIGN(__External_SRAM_segment_start__ , 4) (NOLOAD) :
|
||||
{
|
||||
__data2_run_start__ = .;
|
||||
. = MAX(__data2_run_start__ + SIZEOF(.data2), .);
|
||||
}
|
||||
__data2_run_end__ = __data2_run_start__ + SIZEOF(.data2_run);
|
||||
|
||||
__data2_run_load_end__ = __data2_run_end__;
|
||||
|
||||
. = ASSERT(__data2_run_end__ >= __External_SRAM_segment_start__ && __data2_run_end__ <= (__External_SRAM_segment_start__ + 0x00100000) , "error: .data2_run is too large to fit in External_SRAM memory segment");
|
||||
|
||||
__bss2_load_start__ = ALIGN(__data2_run_end__ , 4);
|
||||
.bss2 ALIGN(__data2_run_end__ , 4) (NOLOAD) : AT(ALIGN(__data2_run_end__ , 4))
|
||||
{
|
||||
__bss2_start__ = .;
|
||||
*(.bss2 .bss2.*)
|
||||
}
|
||||
__bss2_end__ = __bss2_start__ + SIZEOF(.bss2);
|
||||
|
||||
__bss2_load_end__ = __bss2_end__;
|
||||
|
||||
__External_SRAM_segment_used_end__ = ALIGN(__data2_run_end__ , 4) + SIZEOF(.bss2);
|
||||
|
||||
. = ASSERT(__bss2_end__ >= __External_SRAM_segment_start__ && __bss2_end__ <= (__External_SRAM_segment_start__ + 0x00100000) , "error: .bss2 is too large to fit in External_SRAM memory segment");
|
||||
|
||||
__vectors_ram_load_start__ = __SRAM_segment_start__;
|
||||
.vectors_ram __SRAM_segment_start__ (NOLOAD) : AT(__SRAM_segment_start__)
|
||||
{
|
||||
__vectors_ram_start__ = .;
|
||||
*(.vectors_ram .vectors_ram.*)
|
||||
. = MAX(__vectors_ram_start__ + 0x0000003C , .);
|
||||
}
|
||||
__vectors_ram_end__ = __vectors_ram_start__ + SIZEOF(.vectors_ram);
|
||||
|
||||
__vectors_ram_load_end__ = __vectors_ram_end__;
|
||||
|
||||
. = ASSERT(__vectors_ram_end__ >= __SRAM_segment_start__ && __vectors_ram_end__ <= (__SRAM_segment_start__ + 0x00004000) , "error: .vectors_ram is too large to fit in SRAM memory segment");
|
||||
|
||||
__vectors_load_start__ = __FLASH_segment_start__;
|
||||
.vectors __FLASH_segment_start__ : AT(__FLASH_segment_start__)
|
||||
{
|
||||
__vectors_start__ = .;
|
||||
*(.vectors .vectors.*)
|
||||
}
|
||||
__vectors_end__ = __vectors_start__ + SIZEOF(.vectors);
|
||||
|
||||
__vectors_load_end__ = __vectors_end__;
|
||||
|
||||
. = ASSERT(__vectors_end__ >= __FLASH_segment_start__ && __vectors_end__ <= (__FLASH_segment_start__ + 0x00040000) , "error: .vectors is too large to fit in FLASH memory segment");
|
||||
|
||||
__init_load_start__ = ALIGN(__vectors_end__ , 4);
|
||||
.init ALIGN(__vectors_end__ , 4) : AT(ALIGN(__vectors_end__ , 4))
|
||||
{
|
||||
__init_start__ = .;
|
||||
*(.init .init.*)
|
||||
}
|
||||
__init_end__ = __init_start__ + SIZEOF(.init);
|
||||
|
||||
__init_load_end__ = __init_end__;
|
||||
|
||||
. = ASSERT(__init_end__ >= __FLASH_segment_start__ && __init_end__ <= (__FLASH_segment_start__ + 0x00040000) , "error: .init is too large to fit in FLASH memory segment");
|
||||
|
||||
__text_load_start__ = ALIGN(__init_end__ , 4);
|
||||
.text ALIGN(__init_end__ , 4) : AT(ALIGN(__init_end__ , 4))
|
||||
{
|
||||
__text_start__ = .;
|
||||
*(.text .text.* .glue_7t .glue_7 .gnu.linkonce.t.* .gcc_except_table)
|
||||
}
|
||||
__text_end__ = __text_start__ + SIZEOF(.text);
|
||||
|
||||
__text_load_end__ = __text_end__;
|
||||
|
||||
. = ASSERT(__text_end__ >= __FLASH_segment_start__ && __text_end__ <= (__FLASH_segment_start__ + 0x00040000) , "error: .text is too large to fit in FLASH memory segment");
|
||||
|
||||
__dtors_load_start__ = ALIGN(__text_end__ , 4);
|
||||
.dtors ALIGN(__text_end__ , 4) : AT(ALIGN(__text_end__ , 4))
|
||||
{
|
||||
__dtors_start__ = .;
|
||||
KEEP (*(SORT(.dtors.*))) KEEP (*(.dtors))
|
||||
}
|
||||
__dtors_end__ = __dtors_start__ + SIZEOF(.dtors);
|
||||
|
||||
__dtors_load_end__ = __dtors_end__;
|
||||
|
||||
. = ASSERT(__dtors_end__ >= __FLASH_segment_start__ && __dtors_end__ <= (__FLASH_segment_start__ + 0x00040000) , "error: .dtors is too large to fit in FLASH memory segment");
|
||||
|
||||
__ctors_load_start__ = ALIGN(__dtors_end__ , 4);
|
||||
.ctors ALIGN(__dtors_end__ , 4) : AT(ALIGN(__dtors_end__ , 4))
|
||||
{
|
||||
__ctors_start__ = .;
|
||||
KEEP (*(SORT(.ctors.*))) KEEP (*(.ctors))
|
||||
}
|
||||
__ctors_end__ = __ctors_start__ + SIZEOF(.ctors);
|
||||
|
||||
__ctors_load_end__ = __ctors_end__;
|
||||
|
||||
. = ASSERT(__ctors_end__ >= __FLASH_segment_start__ && __ctors_end__ <= (__FLASH_segment_start__ + 0x00040000) , "error: .ctors is too large to fit in FLASH memory segment");
|
||||
|
||||
__rodata_load_start__ = ALIGN(__ctors_end__ , 4);
|
||||
.rodata ALIGN(__ctors_end__ , 4) : AT(ALIGN(__ctors_end__ , 4))
|
||||
{
|
||||
__rodata_start__ = .;
|
||||
*(.rodata .rodata.* .gnu.linkonce.r.*)
|
||||
}
|
||||
__rodata_end__ = __rodata_start__ + SIZEOF(.rodata);
|
||||
|
||||
__rodata_load_end__ = __rodata_end__;
|
||||
|
||||
. = ASSERT(__rodata_end__ >= __FLASH_segment_start__ && __rodata_end__ <= (__FLASH_segment_start__ + 0x00040000) , "error: .rodata is too large to fit in FLASH memory segment");
|
||||
|
||||
__data_load_start__ = ALIGN(__rodata_end__ , 4);
|
||||
.data ALIGN(__vectors_ram_end__ , 4) : AT(ALIGN(__rodata_end__ , 4))
|
||||
{
|
||||
__data_start__ = .;
|
||||
*(.data .data.* .gnu.linkonce.d.*)
|
||||
}
|
||||
__data_end__ = __data_start__ + SIZEOF(.data);
|
||||
|
||||
__data_load_end__ = __data_load_start__ + SIZEOF(.data);
|
||||
|
||||
. = ASSERT((__data_load_start__ + SIZEOF(.data)) >= __FLASH_segment_start__ && (__data_load_start__ + SIZEOF(.data)) <= (__FLASH_segment_start__ + 0x00040000) , "error: .data is too large to fit in FLASH memory segment");
|
||||
|
||||
.data_run ALIGN(__vectors_ram_end__ , 4) (NOLOAD) :
|
||||
{
|
||||
__data_run_start__ = .;
|
||||
. = MAX(__data_run_start__ + SIZEOF(.data), .);
|
||||
}
|
||||
__data_run_end__ = __data_run_start__ + SIZEOF(.data_run);
|
||||
|
||||
__data_run_load_end__ = __data_run_end__;
|
||||
|
||||
. = ASSERT(__data_run_end__ >= __SRAM_segment_start__ && __data_run_end__ <= (__SRAM_segment_start__ + 0x00004000) , "error: .data_run is too large to fit in SRAM memory segment");
|
||||
|
||||
__bss_load_start__ = ALIGN(__data_run_end__ , 4);
|
||||
.bss ALIGN(__data_run_end__ , 4) (NOLOAD) : AT(ALIGN(__data_run_end__ , 4))
|
||||
{
|
||||
__bss_start__ = .;
|
||||
*(.bss .bss.* .gnu.linkonce.b.*) *(COMMON)
|
||||
}
|
||||
__bss_end__ = __bss_start__ + SIZEOF(.bss);
|
||||
|
||||
__bss_load_end__ = __bss_end__;
|
||||
|
||||
. = ASSERT(__bss_end__ >= __SRAM_segment_start__ && __bss_end__ <= (__SRAM_segment_start__ + 0x00004000) , "error: .bss is too large to fit in SRAM memory segment");
|
||||
|
||||
__non_init_load_start__ = ALIGN(__bss_end__ , 4);
|
||||
.non_init ALIGN(__bss_end__ , 4) (NOLOAD) : AT(ALIGN(__bss_end__ , 4))
|
||||
{
|
||||
__non_init_start__ = .;
|
||||
*(.non_init .non_init.*)
|
||||
}
|
||||
__non_init_end__ = __non_init_start__ + SIZEOF(.non_init);
|
||||
|
||||
__non_init_load_end__ = __non_init_end__;
|
||||
|
||||
. = ASSERT(__non_init_end__ >= __SRAM_segment_start__ && __non_init_end__ <= (__SRAM_segment_start__ + 0x00004000) , "error: .non_init is too large to fit in SRAM memory segment");
|
||||
|
||||
__heap_load_start__ = ALIGN(__non_init_end__ , 4);
|
||||
.heap ALIGN(__non_init_end__ , 4) (NOLOAD) : AT(ALIGN(__non_init_end__ , 4))
|
||||
{
|
||||
__heap_start__ = .;
|
||||
*(.heap .heap.*)
|
||||
. = ALIGN(MAX(__heap_start__ + __HEAPSIZE__ , .), 4);
|
||||
}
|
||||
__heap_end__ = __heap_start__ + SIZEOF(.heap);
|
||||
|
||||
__heap_load_end__ = __heap_end__;
|
||||
|
||||
. = ASSERT(__heap_end__ >= __SRAM_segment_start__ && __heap_end__ <= (__SRAM_segment_start__ + 0x00004000) , "error: .heap is too large to fit in SRAM memory segment");
|
||||
|
||||
__stack_load_start__ = ALIGN(__heap_end__ , 4);
|
||||
.stack ALIGN(__heap_end__ , 4) (NOLOAD) : AT(ALIGN(__heap_end__ , 4))
|
||||
{
|
||||
__stack_start__ = .;
|
||||
*(.stack .stack.*)
|
||||
. = ALIGN(MAX(__stack_start__ + __STACKSIZE__ , .), 4);
|
||||
}
|
||||
__stack_end__ = __stack_start__ + SIZEOF(.stack);
|
||||
|
||||
__stack_load_end__ = __stack_end__;
|
||||
|
||||
. = ASSERT(__stack_end__ >= __SRAM_segment_start__ && __stack_end__ <= (__SRAM_segment_start__ + 0x00004000) , "error: .stack is too large to fit in SRAM memory segment");
|
||||
|
||||
__stack_irq_load_start__ = ALIGN(__stack_end__ , 4);
|
||||
.stack_irq ALIGN(__stack_end__ , 4) (NOLOAD) : AT(ALIGN(__stack_end__ , 4))
|
||||
{
|
||||
__stack_irq_start__ = .;
|
||||
*(.stack_irq .stack_irq.*)
|
||||
. = ALIGN(MAX(__stack_irq_start__ + __STACKSIZE_IRQ__ , .), 4);
|
||||
}
|
||||
__stack_irq_end__ = __stack_irq_start__ + SIZEOF(.stack_irq);
|
||||
|
||||
__stack_irq_load_end__ = __stack_irq_end__;
|
||||
|
||||
. = ASSERT(__stack_irq_end__ >= __SRAM_segment_start__ && __stack_irq_end__ <= (__SRAM_segment_start__ + 0x00004000) , "error: .stack_irq is too large to fit in SRAM memory segment");
|
||||
|
||||
__stack_fiq_load_start__ = ALIGN(__stack_irq_end__ , 4);
|
||||
.stack_fiq ALIGN(__stack_irq_end__ , 4) (NOLOAD) : AT(ALIGN(__stack_irq_end__ , 4))
|
||||
{
|
||||
__stack_fiq_start__ = .;
|
||||
*(.stack_fiq .stack_fiq.*)
|
||||
. = ALIGN(MAX(__stack_fiq_start__ + __STACKSIZE_FIQ__ , .), 4);
|
||||
}
|
||||
__stack_fiq_end__ = __stack_fiq_start__ + SIZEOF(.stack_fiq);
|
||||
|
||||
__stack_fiq_load_end__ = __stack_fiq_end__;
|
||||
|
||||
. = ASSERT(__stack_fiq_end__ >= __SRAM_segment_start__ && __stack_fiq_end__ <= (__SRAM_segment_start__ + 0x00004000) , "error: .stack_fiq is too large to fit in SRAM memory segment");
|
||||
|
||||
__stack_svc_load_start__ = ALIGN(__stack_fiq_end__ , 4);
|
||||
.stack_svc ALIGN(__stack_fiq_end__ , 4) (NOLOAD) : AT(ALIGN(__stack_fiq_end__ , 4))
|
||||
{
|
||||
__stack_svc_start__ = .;
|
||||
*(.stack_svc .stack_svc.*)
|
||||
. = ALIGN(MAX(__stack_svc_start__ + __STACKSIZE_SVC__ , .), 4);
|
||||
}
|
||||
__stack_svc_end__ = __stack_svc_start__ + SIZEOF(.stack_svc);
|
||||
|
||||
__stack_svc_load_end__ = __stack_svc_end__;
|
||||
|
||||
. = ASSERT(__stack_svc_end__ >= __SRAM_segment_start__ && __stack_svc_end__ <= (__SRAM_segment_start__ + 0x00004000) , "error: .stack_svc is too large to fit in SRAM memory segment");
|
||||
|
||||
__stack_abt_load_start__ = ALIGN(__stack_svc_end__ , 4);
|
||||
.stack_abt ALIGN(__stack_svc_end__ , 4) (NOLOAD) : AT(ALIGN(__stack_svc_end__ , 4))
|
||||
{
|
||||
__stack_abt_start__ = .;
|
||||
*(.stack_abt .stack_abt.*)
|
||||
. = ALIGN(MAX(__stack_abt_start__ + __STACKSIZE_ABT__ , .), 4);
|
||||
}
|
||||
__stack_abt_end__ = __stack_abt_start__ + SIZEOF(.stack_abt);
|
||||
|
||||
__stack_abt_load_end__ = __stack_abt_end__;
|
||||
|
||||
. = ASSERT(__stack_abt_end__ >= __SRAM_segment_start__ && __stack_abt_end__ <= (__SRAM_segment_start__ + 0x00004000) , "error: .stack_abt is too large to fit in SRAM memory segment");
|
||||
|
||||
__stack_und_load_start__ = ALIGN(__stack_abt_end__ , 4);
|
||||
.stack_und ALIGN(__stack_abt_end__ , 4) (NOLOAD) : AT(ALIGN(__stack_abt_end__ , 4))
|
||||
{
|
||||
__stack_und_start__ = .;
|
||||
*(.stack_und .stack_und.*)
|
||||
. = ALIGN(MAX(__stack_und_start__ + __STACKSIZE_UND__ , .), 4);
|
||||
}
|
||||
__stack_und_end__ = __stack_und_start__ + SIZEOF(.stack_und);
|
||||
|
||||
__stack_und_load_end__ = __stack_und_end__;
|
||||
|
||||
. = ASSERT(__stack_und_end__ >= __SRAM_segment_start__ && __stack_und_end__ <= (__SRAM_segment_start__ + 0x00004000) , "error: .stack_und is too large to fit in SRAM memory segment");
|
||||
|
||||
__fast_load_start__ = ALIGN(__data_load_start__ + SIZEOF(.data) , 4);
|
||||
.fast ALIGN(__stack_und_end__ , 4) : AT(ALIGN(__data_load_start__ + SIZEOF(.data) , 4))
|
||||
{
|
||||
__fast_start__ = .;
|
||||
*(.fast .fast.*)
|
||||
}
|
||||
__fast_end__ = __fast_start__ + SIZEOF(.fast);
|
||||
|
||||
__fast_load_end__ = __fast_load_start__ + SIZEOF(.fast);
|
||||
|
||||
__FLASH_segment_used_end__ = ALIGN(__data_load_start__ + SIZEOF(.data) , 4) + SIZEOF(.fast);
|
||||
|
||||
. = ASSERT((__fast_load_start__ + SIZEOF(.fast)) >= __FLASH_segment_start__ && (__fast_load_start__ + SIZEOF(.fast)) <= (__FLASH_segment_start__ + 0x00040000) , "error: .fast is too large to fit in FLASH memory segment");
|
||||
|
||||
.fast_run ALIGN(__stack_und_end__ , 4) (NOLOAD) :
|
||||
{
|
||||
__fast_run_start__ = .;
|
||||
. = MAX(__fast_run_start__ + SIZEOF(.fast), .);
|
||||
}
|
||||
__fast_run_end__ = __fast_run_start__ + SIZEOF(.fast_run);
|
||||
|
||||
__fast_run_load_end__ = __fast_run_end__;
|
||||
|
||||
__SRAM_segment_used_end__ = ALIGN(__stack_und_end__ , 4) + SIZEOF(.fast_run);
|
||||
|
||||
. = ASSERT(__fast_run_end__ >= __SRAM_segment_start__ && __fast_run_end__ <= (__SRAM_segment_start__ + 0x00004000) , "error: .fast_run is too large to fit in SRAM memory segment");
|
||||
|
||||
}
|
||||
|
Loading…
Reference in New Issue