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