277 lines
12 KiB
Plaintext
277 lines
12 KiB
Plaintext
; --------------------------------------------------------------------------------
|
|
; @Title: Xilinx ZYNQ-ZC702 baord QSPI Flash Programming Script
|
|
; @Description:
|
|
; Board info: ZC702 evaluation board featuring the XC7Z020 CLG484-1
|
|
; Flash info: QSPI Flash(SPANSION, S25Q128)
|
|
;
|
|
; internal RAM: 0x00001000
|
|
; SDRAM: 0x00101000
|
|
; SPI Tx Register : 0xE000D080
|
|
; SPI Rx Register : 0xE000D020
|
|
; SPI CS Register : 0xE000D000
|
|
; Prerequisites:
|
|
; * ZYNQ BOOTMODE: CASCADED, JTAG BOOT, PLL ON
|
|
; * IF reset is not wired please power cycle the board
|
|
; * QSPI /HOLD pin (=QSPI_IO3) should be pulled up (SW16 00010)
|
|
;
|
|
; @Author: jjeong
|
|
; @Copyright: (C) 1989-2022 Lauterbach GmbH, licensed for use with TRACE32(R) only
|
|
; @Chip: Zynq-7000
|
|
; @Board: ZC702
|
|
; @Keywords: Zynq Zynq7000 XC7Z020 Spansion S25Q128 flash spi
|
|
; --------------------------------------------------------------------------------
|
|
; $Id: zc702-spi64.cmm 10516 2022-02-02 11:39:30Z bschroefel $
|
|
|
|
LOCAL &arg1
|
|
ENTRY &arg1
|
|
&arg1=STRing.UPpeR("&arg1") // for example "PREPAREONLY"
|
|
|
|
LOCAL &ctrl_reg
|
|
LOCAL &tx_reg
|
|
LOCAL &rx_reg
|
|
|
|
&ctrl_reg=0xE000D000
|
|
&tx_reg=0xE000D080 ;Register TXD1 for the 1-byte instruction
|
|
&rx_reg=0xE000D020
|
|
|
|
WinCLEAR
|
|
|
|
SYStem.RESet
|
|
RESet
|
|
SYStem.CPU ZYNQ-7000
|
|
|
|
SYStem.MemAccess DAP
|
|
|
|
; This selects the DAP for accessing the ARM cores
|
|
; (accessing the TAP of the FPGA logic requires different settings)
|
|
SYStem.CONFIG DAPIRPRE 6.
|
|
SYStem.CONFIG DAPIRPOST 0.
|
|
SYStem.CONFIG DAPDRPRE 1.
|
|
SYStem.CONFIG DAPDRPOST 0.
|
|
|
|
TrOnchip.Set.RESET OFF
|
|
TrOnchip.Set.UNDEF OFF
|
|
TrOnchip.Set.DABORT OFF
|
|
TrOnchip.Set.PABORT OFF
|
|
|
|
SYStem.JtagClock Ctck 10.0MHz
|
|
CORE.ASSIGN 1.
|
|
|
|
SYStem.Mode.Attach
|
|
|
|
if STATE.RUN()
|
|
break
|
|
|
|
//disable MMU & Cache
|
|
PER.Set C15:0x1 %Long 0x18c52c78
|
|
|
|
; PC should be around 0xfffc0000--0xffffffff
|
|
|
|
; SLCR - UNLOCK WRITE
|
|
Data.Set ASD:0XF8000008 %Long 0x0000DF0D
|
|
; Assert Reset of Second core - we are save to remap memories
|
|
Data.Set ASD:0xF8000244 %LONG 0x2
|
|
; MMU disable, Exception Vectors HIGH
|
|
Data.Set C15:0x1 %Long 0x18C52478
|
|
; OCM_CFG - OCM[0..2]=0x0--0x2ffff OCM[3]=0xffff0000
|
|
Data.Set AZSD:0xF8000910 %Long 0x18
|
|
|
|
; exception Vectors
|
|
Data.Assemble R:0xffff0000 b $+0
|
|
Data.Assemble , b $+0
|
|
Data.Assemble , b $+0
|
|
Data.Assemble , b $+0
|
|
Data.Assemble , b $+0
|
|
Data.Assemble , b $+0
|
|
Data.Assemble , b $+0
|
|
|
|
; set PC to a endless loop in OCM - prevent issues with XIP mode
|
|
Register.Set PC 0xffff0020
|
|
Data.Assemble R:0xffff0020 b $+0
|
|
|
|
GOSUB ps7_mio_init_data ; qspi pin configuration
|
|
|
|
;Data.Set AZSD:0xF800014C %LE %Long 0x2821 ;default clk for qspi
|
|
Data.Set AZSD:0xF800014C %LE %Long 0x521 ; 173Mhz clk for qspi
|
|
|
|
Data.Set AZSD:0xF800012C %LE %Long Data.Long(AZSD:0xF800012C)|0x800000 ; Enable Clock of QSPI
|
|
Data.Set AZSD:0xF8000230 %LE %Long 0x3 ; assert RESET
|
|
WAIT 100.ms
|
|
Data.Set AZSD:0xF8000230 %LE %Long 0x0 ; deassert RESET
|
|
WAIT 100.ms
|
|
Data.Set AZSD:0xE000D014 %LE %Long 0x0 ; Disable QSPI
|
|
Data.Set AZSD:0xE000D000 %LE %Long 0x80020021 ; Configuration SPI, CS0, 8bits, Master Mode
|
|
Data.Set AZSD:0xE000D000 %LE %Long Data.Long(AZSD:0xE000D000)|(0x1<<14.) ;manual CS mode
|
|
Data.Set AZSD:0xE000D008 %LE %Long 0xFF ; Enable SPI Interupt
|
|
Data.Set AZSD:0xE000D0A0 %Long 0x00000003 ; disable LQ_MODE, enable TWO_MEM & SEP_BUS for dual spi devices
|
|
Data.Set AZSD:0xE000D028 %Long 0x1
|
|
Data.Set AZSD:0xE000D02C %Long 0x1
|
|
Data.Set AZSD:0xE000D038 %Long 0x33
|
|
Data.Set AZSD:0xE000D014 %LE %Long 0x1 ; Enable QSPI
|
|
|
|
//FLASH READ ID TEST
|
|
AREA.view
|
|
GOSUB READ_ID_TEST
|
|
DIALOG.YESNO "Is the flash ID correctly shown in the AREA window?"
|
|
LOCAL &result
|
|
ENTRY &result
|
|
IF !&result
|
|
(
|
|
PRINT "Please check your register configuration to enable your flash controller"
|
|
ENDDO
|
|
)
|
|
|
|
//RAM TEST for algorithm file
|
|
Data.Test 0x00001000++0x7FFF /Prime
|
|
IF FOUND()
|
|
(
|
|
PRINT "RAM is NOT initialized around 0x" ADDRESS.OFFSET(TRACK.ADDRESS())
|
|
ENDDO
|
|
)
|
|
|
|
FLASHFILE.RESet
|
|
FLASHFILE.CONFIG 0xE000D080 0xE000D020 0xE000D000
|
|
FLASHFILE.TARGET 0x00001000++0x2FFF E:0x00004000++0x27FF ~~/demo/arm/flash/byte/spi64_zynq7xxx.bin /KEEP /DUALPORT ; internal RAM
|
|
FLASHFILE.GETID
|
|
|
|
//End of the test prepareonly
|
|
IF "&arg1"=="PREPAREONLY"
|
|
ENDDO
|
|
|
|
|
|
//Dump window for Serial FLASH
|
|
FLASHFILE.DUMP 0x0 ; Also can read the spi flash data at 0xFC00_0000 after LQSPI_CFG.LQ_MODE is enabled
|
|
|
|
//Unlock Serial FLASH
|
|
;FLASHFILE.UNLOCK 0x00--0xFFFFF
|
|
|
|
//Write Serial FLASH
|
|
;FLASHFILE.ERASE 0x00--0xFFFFF
|
|
|
|
//Write Serial FLASH
|
|
;FLASHFILE.LOAD * 0x00
|
|
;FLASHFILE.LOAD * 0x00 /ComPare
|
|
|
|
ENDDO
|
|
|
|
ps7_mio_init_data:
|
|
Data.Set ASD:0xF8000008 %Long %LE (Data.Long(ASD:0xF8000B00)&~0x0000FFFF)|0x0000DF0D
|
|
Data.Set ASD:0xF8000B00 %Long %LE (Data.Long(ASD:0xF8000B00)&~0x00000FFF)|0x00000011
|
|
Data.Set ASD:0xF8000B40 %Long %LE (Data.Long(ASD:0xF8000B40)&~0x00000FFF)|0x00000600
|
|
Data.Set ASD:0xF8000B44 %Long %LE (Data.Long(ASD:0xF8000B44)&~0x00000FFF)|0x00000600
|
|
Data.Set ASD:0xF8000B48 %Long %LE (Data.Long(ASD:0xF8000B48)&~0x00000FFF)|0x00000672
|
|
Data.Set ASD:0xF8000B4C %Long %LE (Data.Long(ASD:0xF8000B4C)&~0x00000FFF)|0x00000672
|
|
Data.Set ASD:0xF8000B50 %Long %LE (Data.Long(ASD:0xF8000B50)&~0x03FF8FFF)|0x00000674
|
|
Data.Set ASD:0xF8000B54 %Long %LE (Data.Long(ASD:0xF8000B54)&~0x00000FFF)|0x00000674
|
|
Data.Set ASD:0xF8000B58 %Long %LE (Data.Long(ASD:0xF8000B58)&~0x00000FFF)|0x00000600
|
|
Data.Set ASD:0xF8000B5C %Long %LE 0x00D6861C
|
|
Data.Set ASD:0xF8000B60 %Long %LE 0x00F9861C
|
|
Data.Set ASD:0xF8000B64 %Long %LE 0x00F9861C
|
|
Data.Set ASD:0xF8000B68 %Long %LE 0x00D6861C
|
|
Data.Set ASD:0xF8000B6C %Long %LE (Data.Long(ASD:0xF8000B6C)&~0x00007FFF)|0x00000E09
|
|
Data.Set ASD:0xF8000B70 %Long %LE (Data.Long(ASD:0xF8000B70)&~0x00000021)|0x00000021
|
|
Data.Set ASD:0xF8000B70 %Long %LE (Data.Long(ASD:0xF8000B70)&~0x00000021)|0x00000020
|
|
Data.Set ASD:0xF8000B70 %Long %LE (Data.Long(ASD:0xF8000B70)&~0x07FFFFFF)|0x00000823
|
|
Data.Set ASD:0xF8000700 %Long %LE (Data.Long(ASD:0xF8000700)&~0x00003FFF)|0x00003302 ; For the second QSPI
|
|
Data.Set ASD:0xF8000704 %Long %LE (Data.Long(ASD:0xF8000704)&~0x00003FFF)|0x00003302
|
|
Data.Set ASD:0xF8000708 %Long %LE (Data.Long(ASD:0xF8000708)&~0x00003FFF)|0x00000302
|
|
Data.Set ASD:0xF800070C %Long %LE (Data.Long(ASD:0xF800070C)&~0x00003FFF)|0x00000302
|
|
Data.Set ASD:0xF8000710 %Long %LE (Data.Long(ASD:0xF8000710)&~0x00003FFF)|0x00000302
|
|
Data.Set ASD:0xF8000714 %Long %LE (Data.Long(ASD:0xF8000714)&~0x00003FFF)|0x00000302
|
|
Data.Set ASD:0xF8000718 %Long %LE (Data.Long(ASD:0xF8000718)&~0x00003FFF)|0x00002302
|
|
Data.Set ASD:0xF8000720 %Long %LE (Data.Long(ASD:0xF8000720)&~0x00003FFF)|0x00002302
|
|
Data.Set ASD:0xF8000724 %Long %LE (Data.Long(ASD:0xF8000724)&~0x00003FFF)|0x00002302 ; For the second QSPI
|
|
Data.Set ASD:0xF8000728 %Long %LE (Data.Long(ASD:0xF8000728)&~0x00003FFF)|0x00002302 ; For the second QSPI
|
|
Data.Set ASD:0xF800072C %Long %LE (Data.Long(ASD:0xF800072C)&~0x00003FFF)|0x00002302 ; For the second QSPI
|
|
Data.Set ASD:0xF8000740 %Long %LE (Data.Long(ASD:0xF8000740)&~0x00003FFF)|0x00003902
|
|
Data.Set ASD:0xF8000744 %Long %LE (Data.Long(ASD:0xF8000744)&~0x00003FFF)|0x00003902
|
|
Data.Set ASD:0xF8000748 %Long %LE (Data.Long(ASD:0xF8000748)&~0x00003FFF)|0x00003902
|
|
Data.Set ASD:0xF800074C %Long %LE (Data.Long(ASD:0xF800074C)&~0x00003FFF)|0x00003902
|
|
Data.Set ASD:0xF8000750 %Long %LE (Data.Long(ASD:0xF8000750)&~0x00003FFF)|0x00003902
|
|
Data.Set ASD:0xF8000754 %Long %LE (Data.Long(ASD:0xF8000754)&~0x00003FFF)|0x00003902
|
|
Data.Set ASD:0xF8000758 %Long %LE (Data.Long(ASD:0xF8000758)&~0x00003FFF)|0x00001903
|
|
Data.Set ASD:0xF800075C %Long %LE (Data.Long(ASD:0xF800075C)&~0x00003FFF)|0x00001903
|
|
Data.Set ASD:0xF8000760 %Long %LE (Data.Long(ASD:0xF8000760)&~0x00003FFF)|0x00001903
|
|
Data.Set ASD:0xF8000764 %Long %LE (Data.Long(ASD:0xF8000764)&~0x00003FFF)|0x00001903
|
|
Data.Set ASD:0xF8000768 %Long %LE (Data.Long(ASD:0xF8000768)&~0x00003FFF)|0x00001903
|
|
Data.Set ASD:0xF800076C %Long %LE (Data.Long(ASD:0xF800076C)&~0x00003FFF)|0x00001903
|
|
Data.Set ASD:0xF8000770 %Long %LE (Data.Long(ASD:0xF8000770)&~0x00003FFF)|0x00001304
|
|
Data.Set ASD:0xF8000774 %Long %LE (Data.Long(ASD:0xF8000774)&~0x00003FFF)|0x00001305
|
|
Data.Set ASD:0xF8000778 %Long %LE (Data.Long(ASD:0xF8000778)&~0x00003FFF)|0x00003304
|
|
Data.Set ASD:0xF800077C %Long %LE (Data.Long(ASD:0xF800077C)&~0x00003FFF)|0x00001305
|
|
Data.Set ASD:0xF8000780 %Long %LE (Data.Long(ASD:0xF8000780)&~0x00003FFF)|0x00001304
|
|
Data.Set ASD:0xF8000784 %Long %LE (Data.Long(ASD:0xF8000784)&~0x00003FFF)|0x00001304
|
|
Data.Set ASD:0xF8000788 %Long %LE (Data.Long(ASD:0xF8000788)&~0x00003FFF)|0x00001304
|
|
Data.Set ASD:0xF800078C %Long %LE (Data.Long(ASD:0xF800078C)&~0x00003FFF)|0x00001304
|
|
Data.Set ASD:0xF8000790 %Long %LE (Data.Long(ASD:0xF8000790)&~0x00003FFF)|0x00001305
|
|
Data.Set ASD:0xF8000794 %Long %LE (Data.Long(ASD:0xF8000794)&~0x00003FFF)|0x00001304
|
|
Data.Set ASD:0xF8000798 %Long %LE (Data.Long(ASD:0xF8000798)&~0x00003FFF)|0x00001304
|
|
Data.Set ASD:0xF800079C %Long %LE (Data.Long(ASD:0xF800079C)&~0x00003FFF)|0x00001304
|
|
Data.Set ASD:0xF80007A0 %Long %LE (Data.Long(ASD:0xF80007A0)&~0x00003FFF)|0x00003380
|
|
Data.Set ASD:0xF80007A4 %Long %LE (Data.Long(ASD:0xF80007A4)&~0x00003FFF)|0x00001380
|
|
Data.Set ASD:0xF80007A8 %Long %LE (Data.Long(ASD:0xF80007A8)&~0x00003FFF)|0x00001380
|
|
Data.Set ASD:0xF80007AC %Long %LE (Data.Long(ASD:0xF80007AC)&~0x00003FFF)|0x00001380
|
|
Data.Set ASD:0xF80007B0 %Long %LE (Data.Long(ASD:0xF80007B0)&~0x00003FFF)|0x00001380
|
|
Data.Set ASD:0xF80007B4 %Long %LE (Data.Long(ASD:0xF80007B4)&~0x00003FFF)|0x00001380
|
|
Data.Set ASD:0xF80007B8 %Long %LE (Data.Long(ASD:0xF80007B8)&~0x00003FFF)|0x00001221
|
|
Data.Set ASD:0xF80007BC %Long %LE (Data.Long(ASD:0xF80007BC)&~0x00003FFF)|0x00003220
|
|
Data.Set ASD:0xF80007C0 %Long %LE (Data.Long(ASD:0xF80007C0)&~0x00003FFF)|0x000032E0
|
|
Data.Set ASD:0xF80007C4 %Long %LE (Data.Long(ASD:0xF80007C4)&~0x00003FFF)|0x000012E1
|
|
Data.Set ASD:0xF80007C8 %Long %LE (Data.Long(ASD:0xF80007C8)&~0x00003FFF)|0x00001240
|
|
Data.Set ASD:0xF80007CC %Long %LE (Data.Long(ASD:0xF80007CC)&~0x00003FFF)|0x00001240
|
|
Data.Set ASD:0xF80007D0 %Long %LE (Data.Long(ASD:0xF80007D0)&~0x00003FFF)|0x00003280
|
|
Data.Set ASD:0xF80007D4 %Long %LE (Data.Long(ASD:0xF80007D4)&~0x00003FFF)|0x00001280
|
|
Data.Set ASD:0xF8000900 %Long %LE (Data.Long(ASD:0xF8000900)&~0x0000000F)|0x0000000F
|
|
Data.Set ASD:0xF8000004 %Long %LE (Data.Long(ASD:0xF8000004)&~0x0000FFFF)|0x0000767B
|
|
RETURN
|
|
|
|
|
|
|
|
READ_ID_TEST:
|
|
LOCAL &data
|
|
&data=Data.Long(A:&ctrl_reg)
|
|
PRINT "ctrl_reg : &data "
|
|
|
|
Data.Set &ctrl_reg %Long (&data&(~(0x1<<10.))) ; cs low
|
|
|
|
Data.Set &tx_reg %Byte 0x9F
|
|
&data=Data.Long(A:&ctrl_reg)
|
|
Data.Set &ctrl_reg %Long (&data|(0x1<<16.)) ; start cmd
|
|
WAIT 1.ms
|
|
PRINT " 0x" FORMAT.HEX(2,(Data.Long(A:&rx_reg)>>24.)&0xFF)
|
|
|
|
Data.Set &tx_reg %Byte 0x00
|
|
&data=Data.Long(A:&ctrl_reg)
|
|
Data.Set &ctrl_reg %Long (&data|(0x1<<16.)) ; start cmd
|
|
WAIT 1.ms
|
|
PRINT "1st : 0x" FORMAT.HEX(2,(Data.Long(A:&rx_reg)>>24.)&0xFF)
|
|
|
|
Data.Set &tx_reg %Byte 0x00
|
|
&data=Data.Long(A:&ctrl_reg)
|
|
Data.Set &ctrl_reg %Long (&data|(0x1<<16.)) ; start cmd
|
|
WAIT 1.ms
|
|
PRINT "2nd : 0x" FORMAT.HEX(2,(Data.Long(A:&rx_reg)>>24.)&0xFF)
|
|
|
|
Data.Set &tx_reg %Byte 0x00
|
|
&data=Data.Long(A:&ctrl_reg)
|
|
Data.Set &ctrl_reg %Long (&data|(0x1<<16.)) ; start cmd
|
|
WAIT 1.ms
|
|
PRINT "3rd : 0x" FORMAT.HEX(2,(Data.Long(A:&rx_reg)>>24.)&0xFF)
|
|
|
|
Data.Set &tx_reg %Byte 0x00
|
|
&data=Data.Long(A:&ctrl_reg)
|
|
Data.Set &ctrl_reg %Long (&data|(0x1<<16.)) ; start cmd
|
|
WAIT 1.ms
|
|
PRINT "4th : 0x" FORMAT.HEX(2,(Data.Long(A:&rx_reg)>>24.)&0xFF)
|
|
|
|
|
|
Data.Set &tx_reg %Byte 0x00
|
|
&data=Data.Long(A:&ctrl_reg)
|
|
Data.Set &ctrl_reg %Long (&data|(0x1<<16.)) ; start cmd
|
|
WAIT 1.ms
|
|
PRINT "5th : 0x" FORMAT.HEX(2,(Data.Long(A:&rx_reg)>>24.)&0xFF)
|
|
|
|
Data.Set &ctrl_reg %Long (&data|(0x1<<10.)) ; cs high
|
|
|
|
RETURN
|