375 lines
11 KiB
Plaintext
375 lines
11 KiB
Plaintext
; --------------------------------------------------------------------------------
|
|
; @Title: Hyper Flash Program script for E3600 Target Board
|
|
; @Description:
|
|
; The S26HS512TGABHM(64MB, U501) is to the XSPI1 controller
|
|
;
|
|
; SRAM: 0x40000
|
|
; XSPI(controller) Base: 0xF0700000
|
|
; XSPI AHB memory mapped ADDRESS: 0x10000000
|
|
;
|
|
; Prerequisites:
|
|
; * Connect Debug Cable/Combiprobe to J301
|
|
; Boot_Mode[3:0]=0000b (1,2,3,4=OFF) : Hyper flash boot
|
|
; Boot_Mode[3:0]=1110b (1=OFF 2,3,4=ON) : jtag boot
|
|
;
|
|
; @Keywords: ARM, Cortex-R5
|
|
; @Author: JIM
|
|
; @Board: SD109-E3600-DEV-KIT
|
|
; @Chip: E3640
|
|
; @Copyright: (C) 1989-2023 Lauterbach GmbH, licensed for use with TRACE32(R) only
|
|
; --------------------------------------------------------------------------------
|
|
; $Id: e3600-hyper.cmm 12852 2023-12-18 06:47:29Z jjeong $
|
|
|
|
PRIVATE ¶meters ¶m_prepareonly
|
|
ENTRY %LINE ¶meters
|
|
¶m_prepareonly=(STRing.SCAN(STRing.UPpeR("¶meters"),"PREPAREONLY",0)!=-1)
|
|
|
|
&XSPI_BASE=0xF0700000
|
|
; ------------------------------------------------------------------------------
|
|
; Flash parameters
|
|
&fl_size=0x4000000 ;HyperFlash size 64MBytes
|
|
&fl_dummyCycles=0x10 ;HyperFlash dummy cycles for Read Data (e. 0xB, 0x10 ... )
|
|
|
|
; --------------------------------------------------------------------------------
|
|
; initialize and start the debugger
|
|
RESet
|
|
SYStem.CPU E3640
|
|
SYStem.JtagClock 10MHz
|
|
CORE.ASSIGN 1.
|
|
SYStem.Option.WaitReset 1.s
|
|
SYStem.Up
|
|
|
|
; ------------------------------------------------------------------------------
|
|
; Flash Controller Configuration
|
|
|
|
//BOOT_MODE; [3:0] boot pin state
|
|
IF (Data.Long(A:0xF0693004)&0xF)==0x00
|
|
GOSUB HYPERBUS_INIT_XSPI_BOOT ;hyper flash boot mode == 0000
|
|
ELSE
|
|
GOSUB HYPERBUS_INIT_JTAG_BOOT ;jtag boot mode == 1110
|
|
|
|
; ------------------------------------------------------------------------------
|
|
; Flash Read ID Test
|
|
GOSUB READ_ID_TEST
|
|
|
|
Break.RESet
|
|
|
|
FLASH.RESet
|
|
FLASH.Create 0x10000000++(&fl_size-1) 0x40000 TARGET Byte
|
|
FLASH.TARGET 0x00400000 0x00402000 0x2000 ~~/demo/arm/flash/word/hyper_e36xx.bin
|
|
|
|
; Flash script ends here if called with parameter PREPAREONLY
|
|
IF ¶m_prepareonly
|
|
ENDDO PREPAREDONE
|
|
|
|
; ------------------------------------------------------------------------------
|
|
; Flash programming example
|
|
DIALOG.YESNO "Program flash memory?"
|
|
LOCAL &progflash
|
|
ENTRY &progflash
|
|
IF &progflash
|
|
(
|
|
FLASH.ReProgram.ALL /Erase
|
|
Data.LOAD.auto *
|
|
FLASH.ReProgram.off
|
|
|
|
; Reset device
|
|
SYStem.Down
|
|
SYStem.Up
|
|
)
|
|
|
|
ENDDO
|
|
|
|
HYPERBUS_INIT_XSPI_BOOT:
|
|
(
|
|
// hyperbus_en(nor);
|
|
Data.Set A:0xF0700080 %Long 0x30053FF
|
|
Data.Set A:0xF0700000 %Long 0x40001100 ;Byte swap
|
|
Data.Set A:0xF07000D0 %Long 0x09 ;Hyperbus enable
|
|
|
|
Data.Set A:0xF0700080 %Long 0x30052FF
|
|
Data.Set A:0xF0700304 %Long 0x7003F0F ;sdrv_xspi_writel(ph_ctrl, xspi->apb_base + XSPI_INDIRECT_RD_PH_CTRL)
|
|
Data.Set A:0xF0700308 %Long 0x00 ;sdrv_xspi_writel(cmd_code, xspi->apb_base + XSPI_INDIRECT_RD_CMD_CODE);
|
|
Data.Set A:0xF0700314 %Long (&fl_dummyCycles-1) ;sdrv_xspi_writel(dummy, xspi->apb_base + XSPI_INDIRECT_RD_CYC);
|
|
|
|
Data.Set A:0xF0700080 %Long 0x30053FF
|
|
Data.Set A:0xF0700204 %Long 0x07003F0F ;XSPI_INDIRECT_RD_PH_CTRL
|
|
Data.Set A:0xF0700208 %Long 0x0 ;XSPI_INDIRECT_RD_CMD_CODE
|
|
Data.Set A:0xF0700214 %Long 0x0 ;dummy
|
|
|
|
// hyperbus_direct_setup(nor);
|
|
Data.Set A:0xF070090C %Long 0x0
|
|
Data.Set A:0xF0700908 %Long 0x0
|
|
Data.Set A:0xF0700080 %Long 0x30052FF
|
|
Data.Set A:0xF0700100 %Long 0x7001F0F //sdrv_xspi_writel(ph_ctrl, xspi->apb_base + XSPI_DIRECT_RD_PH_CTRL);
|
|
Data.Set A:0xF0700114 %Long 0x00 //sdrv_xspi_writel(ph_ctrl, xspi->apb_base + XSPI_DIRECT_RD_PH_CTRL);
|
|
Data.Set A:0xF0700120 %Long (&fl_dummyCycles-1) //dummy
|
|
|
|
//sdrv_xspi_proto_setup(nor, NULL, XSPI_DIRECT_ACCESS_MODE, SPI_NOR_OPS_WRITE);
|
|
Data.Set A:0xF0700104 %Long 0x07001F0F
|
|
Data.Set A:0xF0700114 %Long 0x00
|
|
Data.Set A:0xF0700120 %Long (&fl_dummyCycles-1)
|
|
|
|
//sdrv_xspi_dll_enable
|
|
Data.Set A:0xF07000E0 %Long 0x0000
|
|
Data.Set A:0xF07000E0 %Long 0x0E00
|
|
Data.Set A:0xF07000E0 %Long 0x0F00
|
|
Data.Set A:0xF0700000 %Long 0xC0001100
|
|
WAIT 100.ms
|
|
Data.Set A:0xF0700000 %Long 0x40001100
|
|
Data.Set A:0xF07000C0 %Long 0x2 ;dll enable
|
|
|
|
//sdrv_xspi_dll_enable
|
|
Data.Set A:0xF07000E8 %Long 0x0000
|
|
Data.Set A:0xF07000E8 %Long 0x0E00
|
|
Data.Set A:0xF07000E8 %Long 0x0F00
|
|
Data.Set A:0xF0700000 %Long 0xC0001100
|
|
WAIT 100.ms
|
|
Data.Set A:0xF0700000 %Long 0x40001100
|
|
Data.Set A:0xF07000C0 %Long 0x2 ;dll enable
|
|
|
|
GOSUB DLL_PATTERN_TRAINING
|
|
|
|
RETURN
|
|
)
|
|
|
|
HYPERBUS_INIT_JTAG_BOOT:
|
|
(
|
|
//reset xspi disable
|
|
Data.Set A:0xF0691350 %Long 0x1
|
|
Data.Set A:0xF0691354 %Long 0x7
|
|
|
|
;Data.Set A:0xF06A10D4 %Long 0xE8001Db0
|
|
//ip config, ip_slice_ctl
|
|
Data.Set A:0xF06A10D4 %Long 0xC0001DA4
|
|
|
|
//mux
|
|
Data.Set A:0xF0632004--0xF0632047 %Long 0x1
|
|
Data.Set A:0xF0632060 %Long 0x4
|
|
Data.Set A:0xF0632064 %Long 0x4
|
|
|
|
//pad config
|
|
Data.Set A:0xF0631018 %Long 0x11
|
|
Data.Set A:0xF063101C--0xF0631047 %Long 0x10
|
|
Data.Set A:0xF0631020 %Long 0x13
|
|
Data.Set A:0xF0631044 %Long 0x13
|
|
Data.Set A:0xF0631060 %Long 0x13
|
|
Data.Set A:0xF0631064 %Long 0x13
|
|
|
|
//hyperbus_en(nor);
|
|
Data.Set A:0xF0700080 %Long 0x30053FF
|
|
Data.Set A:0xF0700000 %Long 0x40001100 ;Byte swap
|
|
WAIT 200.ms
|
|
Data.Set A:0xF07000D0 %Long 0x09 ;Hyperbus enable
|
|
|
|
Data.Set A:0xF0700080 %Long 0x30052FF
|
|
Data.Set A:0xF0700304 %Long 0x7003F0F ;sdrv_xspi_writel(ph_ctrl, xspi->apb_base + XSPI_INDIRECT_RD_PH_CTRL)
|
|
Data.Set A:0xF0700308 %Long 0x00 ;sdrv_xspi_writel(cmd_code, xspi->apb_base + XSPI_INDIRECT_RD_CMD_CODE);
|
|
Data.Set A:0xF0700314 %Long (&fl_dummyCycles-1) ;sdrv_xspi_writel(dummy, xspi->apb_base + XSPI_INDIRECT_RD_CYC);
|
|
|
|
Data.Set A:0xF0700080 %Long 0x30053FF
|
|
Data.Set A:0xF0700204 %Long 0x07003F0F ;XSPI_INDIRECT_RD_PH_CTRL
|
|
Data.Set A:0xF0700208 %Long 0x0 ;XSPI_INDIRECT_RD_CMD_CODE
|
|
Data.Set A:0xF0700214 %Long 0x0 ;dummy
|
|
|
|
//hyperbus_direct_setup(nor);
|
|
Data.Set A:0xF070090C %Long 0x0
|
|
Data.Set A:0xF0700908 %Long 0x0
|
|
Data.Set A:0xF0700080 %Long 0x30052FF
|
|
Data.Set A:0xF0700100 %Long 0x7001F0F //sdrv_xspi_writel(ph_ctrl, xspi->apb_base + XSPI_DIRECT_RD_PH_CTRL);
|
|
Data.Set A:0xF0700114 %Long 0x00 //sdrv_xspi_writel(ph_ctrl, xspi->apb_base + XSPI_DIRECT_RD_PH_CTRL);
|
|
Data.Set A:0xF0700120 %Long (&fl_dummyCycles-1) //dummy
|
|
|
|
//sdrv_xspi_proto_setup(nor, NULL, XSPI_DIRECT_ACCESS_MODE, SPI_NOR_OPS_WRITE);
|
|
Data.Set A:0xF0700104 %Long 0x07001F0F
|
|
Data.Set A:0xF0700114 %Long 0x00
|
|
Data.Set A:0xF0700120 %Long (&fl_dummyCycles-1)
|
|
|
|
;do this command if the flash contents are wrong order
|
|
Data.Set A:0xF07000E0 %Long 0x0F00 ;DLL Control register
|
|
Data.Set A:0xF07000C0 %Long 0x2 ;dll enable with no dqs, jtag boot
|
|
|
|
GOSUB DLL_PATTERN_TRAINING
|
|
|
|
RETURN
|
|
)
|
|
|
|
READ_ID_TEST:
|
|
(
|
|
PRINT "READ_ID_TEST..."
|
|
PRIVATE &data
|
|
|
|
Data.Set A:0xF07000D0 %Long 0x0D ;Hyperbus enable (send the address directly)
|
|
|
|
GOSUB HYPER_WRITE_WORD "0x555" "0xFF" ; addr 0x555 <-RESET
|
|
GOSUB HYPER_WRITE_WORD "0x555" "0x98" ; addr 0x555 <SFDP
|
|
GOSUB HYPER_READ_LONG "0x00"
|
|
|
|
RETURNVALUES &data
|
|
PRINT "Read WORD [1:0]: 0x" (&data&0xFFFF) %Ascii "(" (&data>>8)&0xFF (&data)&0xFF ")"
|
|
PRINT "Read WORD [3:2]: 0x" ((&data>>16.)&0xFFFF) %Ascii "(" (&data>>24.)&0xFF (&data>>16.)&0xFF ")"
|
|
|
|
GOSUB HYPER_WRITE_WORD "0x555" "0xF0" ; addr 0x555 <- RESET
|
|
|
|
Data.Set A:0xF07000D0 %Long 0x09 ;Hyperbus enable (send the address/2, ex. 0xAAA-> 0x555)
|
|
|
|
RETURN
|
|
)
|
|
|
|
HYPER_WRITE_WORD:
|
|
(
|
|
|
|
PRIVATE &addr &data
|
|
PARAMETERS &addr &data
|
|
|
|
Data.Set A:0xF0700014 %Long 0x102
|
|
Data.Set A:0xF0700010 %Long 0x7FF ;clear status
|
|
Data.Set A:0xF0700080 %Long 0x30053FF
|
|
Data.Set A:0xF0700204 %Long 0x07003F0F ;XSPI_INDIRECT_RD_PH_CTRL
|
|
Data.Set A:0xF0700208 %Long 0x0 ;XSPI_INDIRECT_RD_CMD_CODE
|
|
Data.Set A:0xF070020C %Long &addr ;addr
|
|
Data.Set A:0xF0700210 %Long 0x02 ;2bytes
|
|
Data.Set A:0xF0700214 %Long 0x0 ;dummy
|
|
|
|
Data.Set A:0xF0700280 %Word &data ;cmd
|
|
Data.Set A:0xF0700200 %Long 0x1 ;XSPI_INDIRECT_WR_CTRL
|
|
|
|
RETURN
|
|
)
|
|
|
|
HYPER_READ_WORD:
|
|
(
|
|
PRIVATE &addr &data
|
|
PARAMETERS &addr
|
|
|
|
//Read16 at 0x0
|
|
Data.Set A:0xF0700014 %Long 0x102
|
|
Data.Set A:0xF0700010 %Long 0x7FF ;clear status
|
|
Data.Set A:0xF0700080 %Long 0x30052FF
|
|
Data.Set A:0xF0700304 %Long 0x07003F0F ;XSPI_INDIRECT_RD_PH_CTRL
|
|
Data.Set A:0xF0700308 %Long 0x0 ;XSPI_INDIRECT_RD_CMD_CODE
|
|
Data.Set A:0xF070030C %Long &addr ;addr
|
|
Data.Set A:0xF0700310 %Long 0x02 ;2bytes
|
|
Data.Set A:0xF0700314 %Long 0x0F ;dummy
|
|
|
|
;/* Start the indirect read */
|
|
Data.Set 0xF0700300 %Long 0x1 ;XSPI_INDIRECT_WR_CTRL
|
|
|
|
&data=Data.Long(A:0xF0700380)
|
|
RETURN "&data"
|
|
)
|
|
|
|
HYPER_READ_LONG:
|
|
(
|
|
PRIVATE &addr &data
|
|
PARAMETERS &addr
|
|
|
|
//Read16 at 0x0
|
|
Data.Set A:0xF0700014 %Long 0x102
|
|
Data.Set A:0xF0700010 %Long 0x7FF ;clear status
|
|
Data.Set A:0xF0700080 %Long 0x30052FF
|
|
Data.Set A:0xF0700304 %Long 0x07003F0F ;XSPI_INDIRECT_RD_PH_CTRL
|
|
Data.Set A:0xF0700308 %Long 0x0 ;XSPI_INDIRECT_RD_CMD_CODE
|
|
Data.Set A:0xF070030C %Long &addr ;addr
|
|
Data.Set A:0xF0700310 %Long 0x04 ;4bytes
|
|
Data.Set A:0xF0700314 %Long 0x0F ;dummy
|
|
|
|
;/* Start the indirect read */
|
|
Data.Set 0xF0700300 %Long 0x1 ;XSPI_INDIRECT_WR_CTRL
|
|
|
|
&data=Data.Long(A:0xF0700380)
|
|
RETURN "&data"
|
|
)
|
|
|
|
WRITE_DLL_PATTERN:
|
|
(
|
|
Data.Set VM:0x00 %LE %Long 0x05391C44
|
|
Data.Set VM:0x04 %LE %Long 0x043C7AD3
|
|
Data.Set VM:0x08 %LE %Long 0x8B0C4216
|
|
Data.Set VM:0x0C %LE %Long 0xA289127D
|
|
Data.Set VM:0x10 %LE %Long 0xE8F7B1B8
|
|
Data.Set VM:0x14 %LE %Long 0x1CCA49B7
|
|
Data.Set VM:0x18 %LE %Long 0x7EF29BAA
|
|
Data.Set VM:0x1C %LE %Long 0x8C609701
|
|
RETURN
|
|
)
|
|
|
|
FIND_DLL_DATA_FOCUS:
|
|
(
|
|
ENTRY &rising
|
|
LOCAL &val
|
|
|
|
IF &rising==TRUE() //find the delay value for equal data
|
|
(
|
|
&val=1.; or 0.
|
|
Data.Set A:0xF07000E0 %LE %Long 0x100|&val<<9.
|
|
Data.COPY A:0x10040000++0x1F vm:0x0 /DIFF ;true()
|
|
WHILE FOUND()==TRUE()&&(&val<0x80) // loop if it is different
|
|
(
|
|
; print "test ... val=" &val ", 0x" %Hex &val
|
|
Data.Set A:0xF07000E0 %LE %Long 0x100|&val<<9.
|
|
Data.Set A:0x10040000 %LE %Long -1 ;dummy, bcz of cache
|
|
Data.COPY A:0x10040000++0x1F vm:0x0 /DIFF
|
|
&val=&val+1.
|
|
)
|
|
)
|
|
ELSE // find the delay value for non equal data
|
|
(
|
|
&val=(Data.Long(A:0xF07000E0)>>9)&0x7F
|
|
Data.Set A:0xF07000E0 %LE %Long 0x100|&val<<9.
|
|
Data.COPY A:0x10040000++0x1F vm:0x0 /DIFF ;false()
|
|
WHILE FOUND()==FALSE()&&(&val<0x80) //loop if it is same
|
|
(
|
|
; print "test ... val=" &val ", 0x" %Hex &val
|
|
Data.Set A:0xF07000E0 %LE %Long 0x100|&val<<9.
|
|
Data.Set A:0x10040000 %LE %Long -1 ;dummy, bcz of cache
|
|
Data.COPY A:0x10040000++0x1F vm:0x0 /DIFF
|
|
&val=&val+1.
|
|
)
|
|
)
|
|
&val=&val-1.
|
|
RETURN &val
|
|
)
|
|
|
|
DLL_PATTERN_TRAINING:
|
|
(
|
|
LOCAL &dll_val &cnt
|
|
PRIVATE &start_val &end_val &middle_val
|
|
|
|
PRINT "xspi dll training...(find data focus)"
|
|
|
|
GOSUB WRITE_DLL_PATTERN
|
|
|
|
&cnt=0.
|
|
&middle_val=0.
|
|
WHILE (&middle_val<10.)&&(&cnt<10.)
|
|
(
|
|
GOSUB FIND_DLL_DATA_FOCUS TRUE() ;rising, first find eye
|
|
ENTRY &start_val
|
|
|
|
GOSUB FIND_DLL_DATA_FOCUS FALSE() ;falling, last find eye
|
|
ENTRY &end_val
|
|
|
|
&middle_val=&end_val-&start_val
|
|
&cnt=&cnt+1.
|
|
)
|
|
|
|
&dll_val=0x7 ;default dll
|
|
IF &middle_val>9.
|
|
(
|
|
&dll_val=&start_val+(&middle_val>>1)
|
|
PRINT "found. dll value: " &dll_val ".(0x" %Hex &dll_val ")"
|
|
)
|
|
ELSE
|
|
(
|
|
PRINT "fail to find dll pattern, so the dll value is set to default"
|
|
PRINT "there may be no pattern data at 0x10040000"
|
|
)
|
|
|
|
PRINT "Data.Set A:0xF07000E0 %LE %Long 0x100|(&dll_val<<9.)"
|
|
Data.Set A:0xF07000E0 %LE %Long 0x100|(&dll_val<<9.)
|
|
|
|
RETURN
|
|
)
|
|
|