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