; -------------------------------------------------------------------------------- ; @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