335 lines
10 KiB
Plaintext
335 lines
10 KiB
Plaintext
; --------------------------------------------------------------------------------
|
|
; @Title: AWR2944(TI) EVM QSPI FLASH Program script
|
|
; @Description:
|
|
;
|
|
; FLASH: (8MBytes)
|
|
; GD25B64C (GigaDevice)
|
|
; QSPI Memory Base Address : 0xC6000000 , CS0
|
|
; QSPI Controller Base Address : 0xC8000000
|
|
; SRAM: 0x00020000 (TCMA_RAM_CR5A 0x00020000, TCMB_RAM_CR5A 0x00080000)
|
|
;
|
|
; @Keywords: QSPI
|
|
; @Author: JIM, CMO
|
|
; @Board:
|
|
; @Chip: AWR2944
|
|
; @Copyright: (C) 1989-2024 Lauterbach GmbH, licensed for use with TRACE32(R) only
|
|
; --------------------------------------------------------------------------------
|
|
; $Id: awr2944-snor.cmm 12944 2024-01-17 11:15:41Z cmorgenstern $
|
|
|
|
|
|
; --------------------------------------------------------------------------------
|
|
; Set up helper variables
|
|
LOCAL &SCRIPT_DIR &AUX_SCRIPT_DIR &PRESENT_SCRIPT
|
|
&SCRIPT_DIR=OS.PPD()
|
|
&AUX_SCRIPT_DIR="&SCRIPT_DIR/../hardware/awr2944evm/scripts"
|
|
&PRESENT_SCRIPT=OS.PPF()
|
|
|
|
|
|
; --------------------------------------------------------------------------------
|
|
; Setup target specific callback functions and variables for device setup and HS unlock
|
|
|
|
; Global variable for Secure-AP base address
|
|
LOCAL &TI_SETUP_GLOBALVAR_SECAPBASE
|
|
IF VERSION.BUILD()<153938.
|
|
&TI_SETUP_GLOBALVAR_SECAPBASE=EDBG:(0x40000000+0x100*8.)
|
|
ELSE
|
|
&TI_SETUP_GLOBALVAR_SECAPBASE=DP:(0x100*8.)
|
|
|
|
; Global variable for Power-AP base address
|
|
LOCAL &TI_SETUP_GLOBALVAR_PWRAPBASE
|
|
IF VERSION.BUILD()<153938.
|
|
&TI_SETUP_GLOBALVAR_PWRAPBASE=EDBG:(0x40000000+0x100*7.)
|
|
ELSE
|
|
&TI_SETUP_GLOBALVAR_PWRAPBASE=DP:(0x100*7.)
|
|
|
|
; Callback function for handling DSMC core
|
|
LOCAL &TI_SETUP_CALLBACKFUNC_DSMC_HANDLING
|
|
&TI_SETUP_CALLBACKFUNC_DSMC_HANDLING="TI_SETUP_CALLBACKFUNC_DSMC_HANDLING"
|
|
SUBROUTINE TI_SETUP_CALLBACKFUNC_DSMC_HANDLING
|
|
(
|
|
; Currently nothing to be done
|
|
RETURN
|
|
)
|
|
|
|
; Callback function to disable WIR after an early HS device unlock via 'SETUPMODE=JTAG'
|
|
LOCAL &TI_SETUP_CALLBACKFUNC_EARLYUNLOCK_WIRRELEASE
|
|
&TI_SETUP_CALLBACKFUNC_EARLYUNLOCK_WIRRELEASE="TI_SETUP_CALLBACKFUNC_EARLYUNLOCK_WIRRELEASE"
|
|
SUBROUTINE TI_SETUP_CALLBACKFUNC_EARLYUNLOCK_WIRRELEASE
|
|
(
|
|
; TBD?
|
|
; Data.Set (&TI_SETUP_GLOBALVAR_PWRAPBASE)+0xXX %LE %Long 0yxxxxxxxxxxxxxx0000xxxxxxxxxxxxxx ; Disable WIR mode AWR2944
|
|
|
|
RETURN
|
|
)
|
|
|
|
|
|
; --------------------------------------------------------------------------------
|
|
; Extract script arguments and set default values
|
|
LOCAL &ARGS &GUIMODE &DEVICETYPE &SETUPMODE &SYSFWFILE &SCICLIENTFILE &CERTIFICATEFILE
|
|
ENTRY %LINE &ARGS
|
|
|
|
DO "&AUX_SCRIPT_DIR/ti_setup_parser.cmm" &ARGS "CALLSCRIPT=&PRESENT_SCRIPT" "CPU=AWR2944"
|
|
RETURNVALUES &GUIMODE &DEVICETYPE &SETUPMODE &SYSFWFILE &SCICLIENTFILE &CERTIFICATEFILE
|
|
|
|
; Exit here if the setup dialog was executed
|
|
&GUIMODE=&GUIMODE
|
|
IF (&GUIMODE!=0.)
|
|
ENDDO
|
|
|
|
; File global variables
|
|
LOCAL &TI_SETUP_GLOBALVAR_SYSFWFILE
|
|
&TI_SETUP_GLOBALVAR_SYSFWFILE="&SYSFWFILE"
|
|
LOCAL &TI_SETUP_GLOBALVAR_SCICLIENTFILE
|
|
&TI_SETUP_GLOBALVAR_SCICLIENTFILE="&SCICLIENTFILE"
|
|
LOCAL &TI_SETUP_GLOBALVAR_CERTIFICATEFILE
|
|
&TI_SETUP_GLOBALVAR_CERTIFICATEFILE="&CERTIFICATEFILE"
|
|
|
|
; Setup global variables
|
|
LOCAL &TI_SETUP_GLOBALVAR_DEVICETYPE
|
|
&TI_SETUP_GLOBALVAR_DEVICETYPE="&DEVICETYPE"
|
|
LOCAL &TI_SETUP_GLOBALVAR_SETUPMODE
|
|
&TI_SETUP_GLOBALVAR_SETUPMODE="&SETUPMODE"
|
|
|
|
; --------------------------------------------------------------------------------
|
|
; Setup and parse flash specific parameters
|
|
LOCAL &QSPI_MEMORY_BASE &OSPI_MEMORY_SIZE &QSPI_Ctrl_BASE &RAM_BASE
|
|
&QSPI_MEMORY_BASE=0xC6000000
|
|
&OSPI_MEMORY_SIZE=0x800000 // 8 MBytes
|
|
&QSPI_Ctrl_BASE=0xC8000000
|
|
&RAM_BASE=0x00020000
|
|
|
|
LOCAL &FLASH_PARAM_PREPAREONLY
|
|
&FLASH_PARAM_PREPAREONLY=(STRing.SCAN(STRing.UPpeR("&ARGS"),"PREPAREONLY",0)!=-1)
|
|
|
|
LOCAL &FLASH_PARAM_TARGETSETUP
|
|
&FLASH_PARAM_TARGETSETUP=(STRing.SCAN(STRing.UPpeR("&ARGS"),"TARGETSETUP",0)!=-1)
|
|
|
|
; Check for illegal parameter combinations
|
|
IF ((&FLASH_PARAM_TARGETSETUP&&("&SETUPMODE"!="JTAG"))||(!&FLASH_PARAM_TARGETSETUP&&("&SETUPMODE"!="ATTACH")))
|
|
(
|
|
PRIVATE &targetsetup
|
|
&targetsetup="<no target setup>"
|
|
IF (&FLASH_PARAM_TARGETSETUP)
|
|
&targetsetup="TARGETSETUP"
|
|
|
|
AREA
|
|
PRINT %ERROR "Illegal combination of flash script parameters: &targetsetup + SETUPMODE=&SETUPMODE"
|
|
PRINT %ERROR "Exiting flash setup..."
|
|
ENDDO
|
|
)
|
|
|
|
|
|
; --------------------------------------------------------------------------------
|
|
; Set up helper variables
|
|
PRIVATE &BARE_METAL_SETUP &RET
|
|
&BARE_METAL_SETUP=FALSE()
|
|
|
|
|
|
; --------------------------------------------------------------------------------
|
|
; Target device initialization setup based on '&DEVICETYPE' and '&SETUPMODE'
|
|
|
|
; Cross check device type
|
|
(
|
|
PRIVATE &isHS
|
|
Do "&AUX_SCRIPT_DIR/ti_setup_generic.cmm" DETECT_HS_DEVICE
|
|
RETURNVALUES &isHS
|
|
IF ((!STRing.ComPare("&TI_SETUP_GLOBALVAR_DEVICETYPE","HS*"))&&(&isHS))
|
|
(
|
|
; Essentially: GP was selected, HS detected.
|
|
PRINT %WARNING "Specified device type was '&TI_SETUP_GLOBALVAR_DEVICETYPE' but detected device type is 'HS'. Continuing as '&TI_SETUP_GLOBALVAR_DEVICETYPE' device."
|
|
)
|
|
)
|
|
|
|
; Perform initialization
|
|
Do "&AUX_SCRIPT_DIR/ti_setup_generic.cmm" DEVICE_INIT
|
|
RETURNVALUES &RET &BARE_METAL_SETUP
|
|
&RET=0.
|
|
|
|
IF (&RET!=0.)
|
|
(
|
|
PRINT %ERROR "Device initialization failed. Exiting ..."
|
|
AREA
|
|
ENDDO
|
|
)
|
|
|
|
|
|
; --------------------------------------------------------------------------------
|
|
; Basic debugger setup
|
|
TITLE "TRACE32 for ARM - AWR2944" ; set GUI title
|
|
SYStem.RESet
|
|
|
|
SYStem.CPU AWR2944
|
|
CORE.ASSIGN 1. ; Connect only to first Cortex-R5
|
|
SYStem.CONFIG CORE 1. 1.
|
|
SYStem.Option EnReset OFF
|
|
Trace.METHOD NONE ; Trace components should not be accessed until fully set up
|
|
ETM.OFF
|
|
SYSTEM.JTAGCLOCK CTCK 25MHz
|
|
|
|
IF COMBIPROBE()||UTRACE()
|
|
(
|
|
IF (ID.WHISKER(0.)==0x12)
|
|
SYStem.CONFIG.CONNECTOR MIPI20T
|
|
ELSE
|
|
SYStem.CONFIG.CONNECTOR MIPI34
|
|
)
|
|
|
|
|
|
; --------------------------------------------------------------------------------
|
|
; Basic target setup
|
|
|
|
IF ((STRing.ComPare("&TI_SETUP_GLOBALVAR_DEVICETYPE","HS*"))&&("&SETUPMODE"=="JTAG"))
|
|
(
|
|
; Unlock and stop secure watchdog
|
|
; TBD?
|
|
)
|
|
|
|
IF (&FLASH_PARAM_TARGETSETUP)
|
|
(
|
|
; "Development mode (SOP 2 mode)"
|
|
; Requires full target setup by the debugger
|
|
SYStem.Mode.Prepare
|
|
|
|
; Basic PLL and module setup
|
|
DO "&AUX_SCRIPT_DIR/common_setup.cmm" WARM_RESET
|
|
DO "&AUX_SCRIPT_DIR/configure_pll.cmm" ALL
|
|
DO "&AUX_SCRIPT_DIR/common_setup.cmm" ALL
|
|
|
|
; Enable CortexR5: Single core, lockstep operation mode
|
|
Data.Set EAHB:0x02100014 %Long 0x0 ; RST2ASSERTDLY
|
|
Data.Set EAHB:0x02100018 %Long 0x00000707 ; RST_WFICHECK
|
|
Data.Set EAHB:0x02120624 %Long 0x7 ; MSS_STC_CONTROL
|
|
Data.Set EAHB:0x02120804 %Long 0x7 ; R5_ROM_ECLIPSE
|
|
Data.Set EAHB:0x02120808 %Long 0x0 ; R5_COREA_HALT
|
|
Data.Set EAHB:0x0212080C %Long 0x0 ; R5_COREB_HALT
|
|
|
|
; Connect to first Cortex-R5
|
|
SYStem.Down
|
|
SYStem.Attach
|
|
Break
|
|
|
|
; Try to cleanup the core state - Supervisor, enable TCMA, MPU off
|
|
Register.Init
|
|
PER.Set.Field C15:0x119 %Long 0x00000001 1.
|
|
GOSUB CACHE_MMU_INIT
|
|
|
|
; QSPI Controller CLK Enable
|
|
Data.Set A:0x02100000+0x024 %Long 0x222 ; MSS_QSPI_CLK_SRC_SEL, SYS_CLK 200Mhz
|
|
Data.Set A:0x02100000+0x05C %Long 0x555 ; MSS_QSPI_CLK_DIV_VAL
|
|
Data.Set A:0x02100000+0x0A4 %Long 0x7 ; MSS_QSPI_CLK_GATE, b2:b0 = "111"
|
|
Data.Set A:0x02100000+0x17C %Long 0x0 ; MSS_QSPI_RST_CTRL, b2:b0 = "000"
|
|
|
|
; IOMUX for QSPI flash
|
|
Data.Set A:0x020C002C %LE %Long 0x81 ;QSPI[0], PAD_AL
|
|
Data.Set A:0x020C0030 %LE %Long 0x81 ;QSPI[1], PAD_AM
|
|
Data.Set A:0x020C0034 %LE %Long 0x281 ;QSPI[2], PAD_AN
|
|
Data.Set A:0x020C0038 %LE %Long 0x281 ;QSPI[3], PAD_AO
|
|
Data.Set A:0x020C003C %LE %Long 0x081 ;QSPI_CLK, PAD_AP
|
|
Data.Set A:0x020C0040 %LE %Long 0x281 ;QSPI_CS, PAD_AQ
|
|
)
|
|
ELSE
|
|
(
|
|
; "Functional mode (SOP 4 mode, QSPI boot mode)"
|
|
; The script assumes that the target is already pre-configured for the use of QSPI flash,
|
|
; e.g. by the first stage bootloader.
|
|
SYStem.Attach
|
|
Break
|
|
|
|
GOSUB CACHE_MMU_INIT
|
|
)
|
|
|
|
; QSPI controller setup
|
|
Data.Set A:&QSPI_Ctrl_BASE+0x040 %LE %Long 0x80000009;SPI_CLOCK_CNTRL, SPI Clock Control Register
|
|
Data.Set A:&QSPI_Ctrl_BASE+0x054 %LE %Long 0x20203 ;SPI_SETUP0, Memory Mapped SPI Setup0
|
|
Data.Set A:&QSPI_Ctrl_BASE+0x058 %LE %Long 0x20203 ;SPI_SETUP1
|
|
Data.Set A:&QSPI_Ctrl_BASE+0x05C %LE %Long 0x20203 ;SPI_SETUP2
|
|
Data.Set A:&QSPI_Ctrl_BASE+0x060 %LE %Long 0x20203 ;SPI_SETUP3
|
|
Data.Set A:&QSPI_Ctrl_BASE+0x064 %LE %Long 0x1 ;SPI_SWITCH, Enabled the Memory mapped the QSPI at 0xC000_0000
|
|
|
|
GOSUB READ_ID_TEST
|
|
|
|
; ------------------------------------------------------------------------------
|
|
; Flash declaration
|
|
|
|
FLASH.RESet
|
|
GOSUB FlashDeclaration
|
|
|
|
; Flash script ends here if called with parameter PREPAREONLY
|
|
IF &FLASH_PARAM_PREPAREONLY
|
|
ENDDO PREPAREDONE
|
|
|
|
; ------------------------------------------------------------------------------
|
|
; Flash programming example
|
|
|
|
DIALOG.YESNO "Program flash memory?"
|
|
LOCAL &progflash
|
|
ENTRY &progflash
|
|
IF &progflash
|
|
(
|
|
FLASH.ReProgram.ALL
|
|
Data.LOAD.auto *
|
|
;Data.LOAD.Binary * &QSPI_MEMORY_BASE
|
|
FLASH.ReProgram.off
|
|
|
|
; Reset device
|
|
PRINT "Please power-cycle the board after flash program is complete"
|
|
)
|
|
|
|
ENDDO
|
|
|
|
|
|
; ------------------------------------------------------------------------------
|
|
; Helper functions
|
|
|
|
READ_ID_TEST:
|
|
(
|
|
&QSPI_CMD_REG=&QSPI_Ctrl_BASE+0x48
|
|
&QSPI_DAT_REG=&QSPI_Ctrl_BASE+0x50
|
|
&QSPI_STAT_REG=&QSPI_Ctrl_BASE+0x4C
|
|
|
|
&RE=(0x1<<16.) ; read
|
|
&WR=(0x2<<16.) ; write
|
|
&END=(0x4<<16.) ;
|
|
&cmd_reg_def=0x0|(0x7<<19.)|(0x0<<28.)|0xFFF ;
|
|
|
|
Data.Set A:&QSPI_DAT_REG %Long 0x9F ;write data reg
|
|
Data.Set A:&QSPI_CMD_REG %Long (&cmd_reg_def|&WR);cmd reg
|
|
//print "status 0x" data.long(A:&QSPI_STAT_REG) ;read status reg
|
|
|
|
Data.Set A:&QSPI_CMD_REG %Long (&cmd_reg_def|&RE) ;cmd reg
|
|
PRINT "read 1st 0x" Data.Long(A:&QSPI_DAT_REG) " (manufacture ID)" ; read data reg
|
|
|
|
Data.Set A:&QSPI_CMD_REG %Long (&cmd_reg_def|&RE) ;cmd reg
|
|
PRINT "read 2nd 0x" Data.Long(A:&QSPI_DAT_REG) " (device ID)" ; read data reg
|
|
|
|
Data.Set A:&QSPI_CMD_REG %Long (&cmd_reg_def|&RE);cmd reg
|
|
PRINT "read 3rd 0x" Data.Long(A:&QSPI_DAT_REG) ; read data reg
|
|
|
|
Data.Set A:&QSPI_Ctrl_BASE+0x48 %Long (&cmd_reg_def|&END)
|
|
WAIT 100.ms
|
|
|
|
RETURN
|
|
)
|
|
|
|
FlashDeclaration:
|
|
(
|
|
FLASH.Create &QSPI_MEMORY_BASE++(&OSPI_MEMORY_SIZE-0x1) 0x10000 TARGET Byte
|
|
FLASH.TARGET &RAM_BASE &RAM_BASE+0x2000 0x1000 ~~/demo/arm/flash/byte/snor3b_awr2944.bin
|
|
RETURN
|
|
)
|
|
|
|
CACHE_MMU_INIT:
|
|
(
|
|
PRIVATE &tmpReg
|
|
|
|
; MPU must be disabled for the flash process to succeed!
|
|
; Also, disable I and D caches
|
|
&tmpReg=Data.Long(C15:0x1)
|
|
&tmpReg=(&tmpReg&(~(0x1<<0.))) ; disable MPU
|
|
&tmpReg=(&tmpReg&(~(0x1<<2.))) ; disable D cache
|
|
&tmpReg=(&tmpReg&(~(0x1<<12.))) ; disable I cache
|
|
Data.Set C15:0x1 %long &tmpReg
|
|
|
|
RETURN
|
|
)
|