123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 |
- MODULE ZynqInitializer;
- IMPORT SYSTEM, Platform, Board, TclInit;
- CONST
- InitialStackPointer = 30000H;
- (* initialization, minimal setup: setup initial stack pointer and mask interrupts*)
- (* PROCEDURE {INITIAL} Init; *)
- (*PROCEDURE {NOPAF, FIXED(Board.StartAddress)} Init;
- CODE
- ; set IRQ vector base register to zero
- mov r0, #0
- mcr p15, 0, r0, c12, c0, 0
- ; disable MMU
- mrc p15, 0, r0, c1, c0, 0
- bic r0, r0, #1
- mcr p15, 0, r0, c1, c0, 0
- ldr fp, [pc, #InitialFP-$-8] ; set stack pointer
- ldr sp, [pc, #InitialFP-$-8] ; set frame pointer
- ; have to skip the constants because this is not a procedure that had been called, we are natively in initial code
- ldr r0, [pc, #Initialize-$-8]
- blx r0
- ;bl InitializeTcl
- b end
- ; constants used
- InitialFP: d32 30000H;InitialStackPointer ; initial frame pointer address, internal memory bank
- Initialize: d32 InitializeTcl
- end:
- END Init;*)
- PROCEDURE {FINAL} Finalize;
- BEGIN
- LOOP END;
- END Finalize;
- (** Performs initialization specified in a TCL subset *)
- PROCEDURE InitSubset(CONST data: ARRAY [*] OF ADDRESS);
- VAR val, valo, mask: SET; i, j: LONGINT; opcode, adr: LONGINT;
- BEGIN
- (*IF LEN(data, 0) = 1 THEN RETURN END;*)
- i := 0;
- WHILE i < LEN(data,0) DO
- opcode := data[i];
- IF opcode = TclInit.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 = TclInit.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 # {}
- ELSIF opcode = TclInit.mask_delay THEN
- INC(i, 3);
- FOR j := 0 TO 1000000 DO END
- ELSE
- INC(i)
- END;
- END;
- END InitSubset;
- (** Perform TCL initialization *)
- PROCEDURE InitializeTcl;
- VAR siliconVersion: LONGINT;
- BEGIN
- siliconVersion := LSH(SYSTEM.GET32(Platform.DevCfgBase + Platform.DevCfgMctrlOffset), -Platform.DevCfgMctrlPsVersionOfs) MOD 4;
- CASE siliconVersion OF
- Platform.DevCfgMctrlPsVersion10:
- InitSubset(TclInit.ps7_mio_init_data_1_0);
- InitSubset(TclInit.ps7_pll_init_data_1_0);
- InitSubset(TclInit.ps7_clock_init_data_1_0);
- InitSubset(TclInit.ps7_ddr_init_data_1_0);
- InitSubset(TclInit.ps7_peripherals_init_data_1_0)
- |Platform.DevCfgMctrlPsVersion20:
- InitSubset(TclInit.ps7_mio_init_data_2_0);
- InitSubset(TclInit.ps7_pll_init_data_2_0);
- InitSubset(TclInit.ps7_clock_init_data_2_0);
- InitSubset(TclInit.ps7_ddr_init_data_2_0);
- InitSubset(TclInit.ps7_peripherals_init_data_2_0)
- |Platform.DevCfgMctrlPsVersion30, Platform.DevCfgMctrlPsVersion31:
- InitSubset(TclInit.ps7_mio_init_data_3_0);
- InitSubset(TclInit.ps7_pll_init_data_3_0);
- InitSubset(TclInit.ps7_clock_init_data_3_0);
- InitSubset(TclInit.ps7_ddr_init_data_3_0);
- InitSubset(TclInit.ps7_peripherals_init_data_3_0)
- END
- END InitializeTcl;
- BEGIN
- InitializeTcl
- END ZynqInitializer.
|