Files
Gen4_R-Car_Trace32/2_Trunk/demo/arm/flash/zc702-spi64.cmm
2025-10-14 09:52:32 +09:00

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