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

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 &parameters &param_prepareonly
ENTRY %LINE &parameters
&param_prepareonly=(STRing.SCAN(STRing.UPpeR("&parameters"),"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 &param_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
)