123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308 |
- MODULE ZynqInitializer;
- IMPORT SYSTEM;
- (** Performs hardware initialization, initial stack setup and interrupt vector setup *)
- PROCEDURE {INITIAL} Init;
- CODE
- ; interrupt vectors at address 0
- RESET: ldr pc, [pc, #reset-$-8]; RESET
- UNDEF: ldr pc, [pc, #undef-$-8]; UNDEF
- SWI: ldr pc, [pc, #swi-$-8]; SWI
- PREF: ldr pc, [pc, #prefetch-$-8]; Prefetch Abort
- DATA: ldr pc, [pc, #data-$-8]; Data Abort
- INVALID: B INVALID ; (not assigned)
- IRQ: ldr pc, [pc, #irq-$-8]; IRQ
- FIQ: ldr pc, [pc, #fiq-$-8]; FIQ
- ; initial interrupt vector setup such that inifinte loop is triggered
- reset: d32 init
- undef: d32 UNDEF
- swi: d32 SWI
- prefetch: d32 PREF
- data: d32 DATA
- empty: d32 0
- irq: d32 IRQ
- fiq: d32 FIQ
- init:
- ; let only processor 0 through
- mrc p15,0,r1,c0,c0,5
- and r1, r1, #0xf
- cmp r1, #0
- beq OKToRun
- EndlessLoop0:
- d32 0b11100011001000001111000000000010 ;WFE
- B EndlessLoop0
- OKToRun:
- ; call initialization script as provided by Xilinx Tools
- ldr FP, [pc, #InitialFP-$-8] ; set stack pointer
- ldr SP, [pc, #InitialFP-$-8] ; set frame pointer
- bl InitializeHW
- loop:
- b loop
- ; constants used
- InitialFP: d32 00030000H ; initial frame pointer address, internal memory bank
- END Init;
- CONST
- (* the following initialization sequences have been inferred from ps7_init.tcl and ps7_init.c for the Zynq board *)
- mask_write = 0;
- mask_poll = 1;
- ps7_pll_init_data = [
- mask_write ,0xF8000008 ,0x0000FFFF ,0x0000DF0D
- ,mask_write ,0xF8000110 ,0x003FFFF0 ,0x000FA220
- ,mask_write ,0xF8000100 ,0x0007F000 ,0x00028000
- ,mask_write ,0xF8000100 ,0x00000010 ,0x00000010
- ,mask_write ,0xF8000100 ,0x00000001 ,0x00000001
- ,mask_write ,0xF8000100 ,0x00000001 ,0x00000000
- ,mask_poll ,0xF800010C ,0x00000001
- ,mask_write ,0xF8000100 ,0x00000010 ,0x00000000
- ,mask_write ,0xF8000120 ,0x1F003F30 ,0x1F000200
- ,mask_write ,0xF8000114 ,0x003FFFF0 ,0x0012C220
- ,mask_write ,0xF8000104 ,0x0007F000 ,0x00020000
- ,mask_write ,0xF8000104 ,0x00000010 ,0x00000010
- ,mask_write ,0xF8000104 ,0x00000001 ,0x00000001
- ,mask_write ,0xF8000104 ,0x00000001 ,0x00000000
- ,mask_poll ,0xF800010C ,0x00000002
- ,mask_write ,0xF8000104 ,0x00000010 ,0x00000000
- ,mask_write ,0xF8000124 ,0xFFF00003 ,0x0C200003
- ,mask_write ,0xF8000118 ,0x003FFFF0 ,0x001452C0
- ,mask_write ,0xF8000108 ,0x0007F000 ,0x0001E000
- ,mask_write ,0xF8000108 ,0x00000010 ,0x00000010
- ,mask_write ,0xF8000108 ,0x00000001 ,0x00000001
- ,mask_write ,0xF8000108 ,0x00000001 ,0x00000000
- ,mask_poll ,0xF800010C ,0x00000004
- ,mask_write ,0xF8000108 ,0x00000010 ,0x00000000
- ,mask_write ,0xF8000004 ,0x0000FFFF ,0x0000767B
- ];
- ps7_clock_init_data=[
- mask_write ,0xF8000008 ,0x0000FFFF ,0x0000DF0D
- ,mask_write ,0xF8000128 ,0x03F03F01 ,0x00302301
- ,mask_write ,0xF8000138 ,0x00000011 ,0x00000001
- ,mask_write ,0xF8000140 ,0x03F03F71 ,0x00100801
- ,mask_write ,0xF800014C ,0x00003F31 ,0x00000721
- ,mask_write ,0xF8000150 ,0x00003F33 ,0x00001401
- ,mask_write ,0xF8000154 ,0x00003F33 ,0x00001402
- ,mask_write ,0xF8000168 ,0x00003F31 ,0x00000501
- ,mask_write ,0xF8000170 ,0x03F03F30 ,0x00100A00
- ,mask_write ,0xF8000180 ,0x03F03F30 ,0x00100700
- ,mask_write ,0xF8000190 ,0x03F03F30 ,0x00101400
- ,mask_write ,0xF80001A0 ,0x03F03F30 ,0x00101400
- ,mask_write ,0xF80001C4 ,0x00000001 ,0x00000001
- ,mask_write ,0xF800012C ,0x01FFCCCD ,0x01EC044D
- ,mask_write ,0xF8000004 ,0x0000FFFF ,0x0000767B
- ];
- ps7_ddr_init_data =[
- mask_write ,0xF8006000 ,0x0001FFFF ,0x00000080
- ,mask_write ,0xF8006004 ,0x1FFFFFFF ,0x00081081
- ,mask_write ,0xF8006008 ,0x03FFFFFF ,0x03C0780F
- ,mask_write ,0xF800600C ,0x03FFFFFF ,0x02001001
- ,mask_write ,0xF8006010 ,0x03FFFFFF ,0x00014001
- ,mask_write ,0xF8006014 ,0x001FFFFF ,0x0004159B
- ,mask_write ,0xF8006018 ,0xF7FFFFFF ,0x452460D2
- ,mask_write ,0xF800601C ,0xFFFFFFFF ,0x720238E5
- ,mask_write ,0xF8006020 ,0xFFFFFFFC ,0x272872D0
- ,mask_write ,0xF8006024 ,0x0FFFFFFF ,0x0000003C
- ,mask_write ,0xF8006028 ,0x00003FFF ,0x00002007
- ,mask_write ,0xF800602C ,0xFFFFFFFF ,0x00000008
- ,mask_write ,0xF8006030 ,0xFFFFFFFF ,0x00040930
- ,mask_write ,0xF8006034 ,0x13FF3FFF ,0x00010694
- ,mask_write ,0xF8006038 ,0x00001FC3 ,0x00000000
- ,mask_write ,0xF800603C ,0x000FFFFF ,0x00000777
- ,mask_write ,0xF8006040 ,0xFFFFFFFF ,0xFFF00000
- ,mask_write ,0xF8006044 ,0x0FFFFFFF ,0x0FF66666
- ,mask_write ,0xF8006048 ,0x3FFFFFFF ,0x0003C248
- ,mask_write ,0xF8006050 ,0xFF0F8FFF ,0x77010800
- ,mask_write ,0xF8006058 ,0x0001FFFF ,0x00000101
- ,mask_write ,0xF800605C ,0x0000FFFF ,0x00005003
- ,mask_write ,0xF8006060 ,0x000017FF ,0x0000003E
- ,mask_write ,0xF8006064 ,0x00021FE0 ,0x00020000
- ,mask_write ,0xF8006068 ,0x03FFFFFF ,0x00284141
- ,mask_write ,0xF800606C ,0x0000FFFF ,0x00001610
- ,mask_write ,0xF80060A0 ,0x00FFFFFF ,0x00008000
- ,mask_write ,0xF80060A4 ,0xFFFFFFFF ,0x10200802
- ,mask_write ,0xF80060A8 ,0x0FFFFFFF ,0x0690CB73
- ,mask_write ,0xF80060AC ,0x000001FF ,0x000001FE
- ,mask_write ,0xF80060B0 ,0x1FFFFFFF ,0x1CFFFFFF
- ,mask_write ,0xF80060B4 ,0x000007FF ,0x00000200
- ,mask_write ,0xF80060B8 ,0x01FFFFFF ,0x00200066
- ,mask_write ,0xF80060BC ,0x00FFFFFF ,0x00000000
- ,mask_write ,0xF80060C4 ,0x00000003 ,0x00000000
- ,mask_write ,0xF80060C8 ,0x000000FF ,0x00000000
- ,mask_write ,0xF80060DC ,0x00000001 ,0x00000000
- ,mask_write ,0xF80060F0 ,0x0000FFFF ,0x00000000
- ,mask_write ,0xF80060F4 ,0x0000000F ,0x00000008
- ,mask_write ,0xF8006114 ,0x000000FF ,0x00000000
- ,mask_write ,0xF8006118 ,0x7FFFFFFF ,0x40000001
- ,mask_write ,0xF800611C ,0x7FFFFFFF ,0x40000001
- ,mask_write ,0xF8006120 ,0x7FFFFFFF ,0x40000001
- ,mask_write ,0xF8006124 ,0x7FFFFFFF ,0x40000001
- ,mask_write ,0xF800612C ,0x000FFFFF ,0x00033C03
- ,mask_write ,0xF8006130 ,0x000FFFFF ,0x00034003
- ,mask_write ,0xF8006134 ,0x000FFFFF ,0x0002F400
- ,mask_write ,0xF8006138 ,0x000FFFFF ,0x00030400
- ,mask_write ,0xF8006140 ,0x000FFFFF ,0x00000035
- ,mask_write ,0xF8006144 ,0x000FFFFF ,0x00000035
- ,mask_write ,0xF8006148 ,0x000FFFFF ,0x00000035
- ,mask_write ,0xF800614C ,0x000FFFFF ,0x00000035
- ,mask_write ,0xF8006154 ,0x000FFFFF ,0x00000083
- ,mask_write ,0xF8006158 ,0x000FFFFF ,0x00000083
- ,mask_write ,0xF800615C ,0x000FFFFF ,0x0000007F
- ,mask_write ,0xF8006160 ,0x000FFFFF ,0x00000078
- ,mask_write ,0xF8006168 ,0x001FFFFF ,0x00000124
- ,mask_write ,0xF800616C ,0x001FFFFF ,0x00000125
- ,mask_write ,0xF8006170 ,0x001FFFFF ,0x00000112
- ,mask_write ,0xF8006174 ,0x001FFFFF ,0x00000116
- ,mask_write ,0xF800617C ,0x000FFFFF ,0x000000C3
- ,mask_write ,0xF8006180 ,0x000FFFFF ,0x000000C3
- ,mask_write ,0xF8006184 ,0x000FFFFF ,0x000000BF
- ,mask_write ,0xF8006188 ,0x000FFFFF ,0x000000B8
- ,mask_write ,0xF8006190 ,0xFFFFFFFF ,0x10040080
- ,mask_write ,0xF8006194 ,0x000FFFFF ,0x0001FC82
- ,mask_write ,0xF8006204 ,0xFFFFFFFF ,0x00000000
- ,mask_write ,0xF8006208 ,0x000F03FF ,0x000803FF
- ,mask_write ,0xF800620C ,0x000F03FF ,0x000803FF
- ,mask_write ,0xF8006210 ,0x000F03FF ,0x000803FF
- ,mask_write ,0xF8006214 ,0x000F03FF ,0x000803FF
- ,mask_write ,0xF8006218 ,0x000F03FF ,0x000003FF
- ,mask_write ,0xF800621C ,0x000F03FF ,0x000003FF
- ,mask_write ,0xF8006220 ,0x000F03FF ,0x000003FF
- ,mask_write ,0xF8006224 ,0x000F03FF ,0x000003FF
- ,mask_write ,0xF80062A8 ,0x00000FF7 ,0x00000000
- ,mask_write ,0xF80062AC ,0xFFFFFFFF ,0x00000000
- ,mask_write ,0xF80062B0 ,0x003FFFFF ,0x00005125
- ,mask_write ,0xF80062B4 ,0x0003FFFF ,0x000012A8
- ,mask_write ,0xF8006000 ,0x0001FFFF ,0x00000081
- ,mask_poll ,0xF8006054 ,0x00000007
- ];
- ps7_mio_init_data =[
- mask_write ,0xF8000008 ,0x0000FFFF ,0x0000DF0D
- ,mask_write ,0xF8000B40 ,0x00000FFF ,0x00000600
- ,mask_write ,0xF8000B44 ,0x00000FFF ,0x00000600
- ,mask_write ,0xF8000B48 ,0x00000FFF ,0x00000672
- ,mask_write ,0xF8000B4C ,0x00000FFF ,0x00000672
- ,mask_write ,0xF8000B50 ,0x00000FFF ,0x00000674
- ,mask_write ,0xF8000B54 ,0x00000FFF ,0x00000674
- ,mask_write ,0xF8000B58 ,0x00000FFF ,0x00000600
- ,mask_write ,0xF8000B5C ,0xFFFFFFFF ,0x00D6861C
- ,mask_write ,0xF8000B60 ,0xFFFFFFFF ,0x00F9861C
- ,mask_write ,0xF8000B64 ,0xFFFFFFFF ,0x00F9861C
- ,mask_write ,0xF8000B68 ,0xFFFFFFFF ,0x00D6861C
- ,mask_write ,0xF8000B6C ,0x00007FFF ,0x00000E09
- ,mask_write ,0xF8000B70 ,0x00000021 ,0x00000021
- ,mask_write ,0xF8000B70 ,0x00000021 ,0x00000020
- ,mask_write ,0xF8000B70 ,0x07FFFFFF ,0x00000823
- ,mask_write ,0xF8000700 ,0x00003FFF ,0x00000600
- ,mask_write ,0xF8000704 ,0x00003FFF ,0x00000702
- ,mask_write ,0xF8000708 ,0x00003FFF ,0x00000702
- ,mask_write ,0xF800070C ,0x00003FFF ,0x00000702
- ,mask_write ,0xF8000710 ,0x00003FFF ,0x00000702
- ,mask_write ,0xF8000714 ,0x00003FFF ,0x00000702
- ,mask_write ,0xF8000718 ,0x00003FFF ,0x00000702
- ,mask_write ,0xF800071C ,0x00003FFF ,0x00000600
- ,mask_write ,0xF8000720 ,0x00003FFF ,0x00000702
- ,mask_write ,0xF8000724 ,0x00003FFF ,0x00000600
- ,mask_write ,0xF8000728 ,0x00003FFF ,0x00000600
- ,mask_write ,0xF800072C ,0x00003FFF ,0x00000600
- ,mask_write ,0xF8000730 ,0x00003FFF ,0x00000600
- ,mask_write ,0xF8000734 ,0x00003FFF ,0x00000600
- ,mask_write ,0xF8000738 ,0x00003FFF ,0x00000600
- ,mask_write ,0xF800073C ,0x00003FFF ,0x00000600
- ,mask_write ,0xF8000740 ,0x00003FFF ,0x00000302
- ,mask_write ,0xF8000744 ,0x00003FFF ,0x00000302
- ,mask_write ,0xF8000748 ,0x00003FFF ,0x00000302
- ,mask_write ,0xF800074C ,0x00003FFF ,0x00000302
- ,mask_write ,0xF8000750 ,0x00003FFF ,0x00000302
- ,mask_write ,0xF8000754 ,0x00003FFF ,0x00000302
- ,mask_write ,0xF8000758 ,0x00003FFF ,0x00000303
- ,mask_write ,0xF800075C ,0x00003FFF ,0x00000303
- ,mask_write ,0xF8000760 ,0x00003FFF ,0x00000303
- ,mask_write ,0xF8000764 ,0x00003FFF ,0x00000303
- ,mask_write ,0xF8000768 ,0x00003FFF ,0x00000303
- ,mask_write ,0xF800076C ,0x00003FFF ,0x00000303
- ,mask_write ,0xF8000770 ,0x00003FFF ,0x00000304
- ,mask_write ,0xF8000774 ,0x00003FFF ,0x00000305
- ,mask_write ,0xF8000778 ,0x00003FFF ,0x00000304
- ,mask_write ,0xF800077C ,0x00003FFF ,0x00000305
- ,mask_write ,0xF8000780 ,0x00003FFF ,0x00000304
- ,mask_write ,0xF8000784 ,0x00003FFF ,0x00000304
- ,mask_write ,0xF8000788 ,0x00003FFF ,0x00000304
- ,mask_write ,0xF800078C ,0x00003FFF ,0x00000304
- ,mask_write ,0xF8000790 ,0x00003FFF ,0x00000305
- ,mask_write ,0xF8000794 ,0x00003FFF ,0x00000304
- ,mask_write ,0xF8000798 ,0x00003FFF ,0x00000304
- ,mask_write ,0xF800079C ,0x00003FFF ,0x00000304
- ,mask_write ,0xF80007A0 ,0x00003FFF ,0x00000380
- ,mask_write ,0xF80007A4 ,0x00003FFF ,0x00000380
- ,mask_write ,0xF80007A8 ,0x00003FFF ,0x00000380
- ,mask_write ,0xF80007AC ,0x00003FFF ,0x00000380
- ,mask_write ,0xF80007B0 ,0x00003FFF ,0x00000380
- ,mask_write ,0xF80007B4 ,0x00003FFF ,0x00000380
- ,mask_write ,0xF80007B8 ,0x00003F01 ,0x00000201
- ,mask_write ,0xF80007BC ,0x00003F01 ,0x00000201
- ,mask_write ,0xF80007C0 ,0x00003FFF ,0x000002E0
- ,mask_write ,0xF80007C4 ,0x00003FFF ,0x000002E1
- ,mask_write ,0xF80007C8 ,0x00003FFF ,0x00000201
- ,mask_write ,0xF80007CC ,0x00003FFF ,0x00000201
- ,mask_write ,0xF80007D0 ,0x00003FFF ,0x00000280
- ,mask_write ,0xF80007D4 ,0x00003FFF ,0x00000280
- ,mask_write ,0xF8000830 ,0x003F003F ,0x002F002E
- ,mask_write ,0xF8000004 ,0x0000FFFF ,0x0000767B
- ];
- ps7_peripherals_init_data=[
- mask_write ,0xE0001034 ,0x000000FF ,0x00000006
- ,mask_write ,0xE0001018 ,0x0000FFFF ,0x0000003E
- ,mask_write ,0xE0001000 ,0x000001FF ,0x00000017
- ,mask_write ,0xE0001004 ,0x00000FFF ,0x00000020
- ,mask_write ,0xE000D000 ,0x00080000 ,0x00080000
- ,mask_write ,0xF8007000 ,0x20000000 ,0x00000000
- ];
- (* initialization procedure -- parses data from above and executes. This approach was chosen because it would not produce as many instructions
- as would be required if everything was done with procedure calls. This is even more true on ARM platform, where the large immediates would be stored
- in (instruction) memory anyway.
- *)
- PROCEDURE InitSubset(CONST data: ARRAY [*] OF LONGINT);
- VAR val, valo, mask: SET; i: LONGINT; opcode, adr: LONGINT;
- BEGIN
- i := 0;
- WHILE i < LEN(data,0) DO
- opcode := data[i];
- IF opcode = mask_write THEN
- adr := data[i+1]; mask := SYSTEM.VAL(SET,data[i+2]); val := SYSTEM.VAL(SET,data[i+3]); INC(i,4);
- SYSTEM.GET(adr, valo);
- val := mask*val + (-mask) * valo;
- SYSTEM.PUT(adr, val);
- ELSIF opcode = mask_poll THEN
- adr := data[i+1]; mask := SYSTEM.VAL(SET, data[i+2]); INC(i,3);
- REPEAT
- SYSTEM.GET(adr, val)
- UNTIL val * mask # {}
- END;
- END;
- END InitSubset;
- PROCEDURE InitializeHW;
- BEGIN
- InitSubset(ps7_mio_init_data);
- InitSubset(ps7_pll_init_data);
- InitSubset(ps7_clock_init_data);
- InitSubset(ps7_ddr_init_data);
- InitSubset(ps7_peripherals_init_data);
- END InitializeHW;
- END ZynqInitializer.
|