Files
2025-10-14 09:52:32 +09:00

189 lines
5.6 KiB
Plaintext

; --------------------------------------------------------------------------------
; @Title: SPI FLASH Program script for the MSR1(STA800C)
;
; @Description:
; The MT25QU128 (Micron) is connected to the SQIO controller
;
; SRAM: 0x20001000 (TCM 64KB)
; SQIO(controller) Base: 0x51000000
; SQIO memory mapped ADDRESS: 0x50000000 (only 16MB mapped, Alias 0x88000000)
;
; GPIOE_4[0] FLASH_QSPI_D0
; GPIOE_4[1] FLASH_QSPI_D1
; GPIOE_4[2] FLASH_QSPI_D2
; GPIOE_4[3] FLASH_QSPI_D3
; GPIOE_4[4] GPIO70
; GPIOE_4[5] GPIO71
; GPIOE_4[6] GPIO72
; GPIOE_4[7] GPIO73
; GPIOE_4[8] FLASH_QSPI_CS
; GPIOE_4[9] FLASH_QSPI_CLK
;
; Script arguments:
;
; DO msr1-spi [PREPAREONLY] [CPU=<cpu>] [DUALPORT=0|1]
;
; PREPAREONLY only declares flash but does not execute flash programming
;
; CPU=<cpu> selects CPU derivative <cpu>
;
; DUALPORT=0|1 default value is 0 (disabled).
;
; Example:
;
; DO ~~/demo/arm/flash/msr1-spi.cmm PREPAREONLY DUALPORT=1
;
; @Chip: MSR1-CM7
; @Board: STA800C
; @Author: JIM
; @Keywords: ARM, MSR1, Cortex-M7 SPI SQI
; @Copyright: (C) 1989-2022 Lauterbach GmbH, licensed for use with TRACE32(R) only
; --------------------------------------------------------------------------------
; $Id: msr1-spi.cmm 12739 2023-11-17 07:38:12Z mschaeffner $
&SQI_BASE=0x51000000
PRIVATE &parameters
ENTRY %LINE &parameters
PRIVATE &param_prepareonly &param_cpu &param_dualport
&param_prepareonly=(STRing.SCAN(STRing.UPpeR("&parameters"),"PREPAREONLY",0)!=-1)
&param_cpu=STRing.SCANAndExtract(STRing.UPpeR("&parameters"),"CPU=","")
&param_dualport=STRing.SCANAndExtract(STRing.UPpeR("&parameters"),"DUALPORT=","0")
; --------------------------------------------------------------------------------
; initialize and start the debugger
RESet
SYStem.RESet
SYStem.CPU MSR1-CM7
IF hardware.COMBIPROBE()||hardware.UTRACE()
(
SYStem.CONFIG.CONNECTOR MIPI20T
)
SYStem.Option DUALPORT ON
SYStem.JtagClock 10MHz
SYStem.Option EnReset OFF
; try to guess TSEL
SYStem.DETECT.IDCode
IF IDCODE(0)!=0x6BA00477 ; the ARM DAP should be the first in the JTAG chain
(
PRINT %ERROR "No ARM Debug Access Port detected"
ENDDO
)
IF IDCODENUMBER()>1.
(
SYStem.CONFIG.DAPIRPRE 5.
SYStem.CONFIG.DAPDRPRE 1.
)
Trace.DISable
ETM.OFF
ITM.OFF
STM.OFF
SYStem.Up
; ------------------------------------------------------------------------------
; clk enable
&PRCC=0x41700000
Data.Set A:&PRCC+0x0210 %LE %Long 0xC0000001 ;GPIO instance 4 clock/reset Control Register(GPIO4APBiCR)
Data.Set A:&PRCC+0x0248 %LE %Long 0xC0000001 ;SQIO AHB interface clock/reset Control Register(SQIOAHBiCR)
Data.Set A:&PRCC+0x029C %LE %Long 0xC0000001 ;SQIO kernel clock/reset Control Register(SQIOTXCR)
Data.Set A:&PRCC+0x0A80 %LE %Long 0xFFFFFC00 ;Gpio_4 Input buffer Disable Register(G4INDISR)
Data.Set A:&PRCC+0x0A88 %LE %Long 0x3FF ;Gpio_4 DRIVE0 Register(G4DRIVE0R)
Data.Set A:&PRCC+0x0A8C %LE %Long 0x3FF ;Gpio_4 DRIVE1 Register(G4DRIVE1R)
Data.Set A:&PRCC+0x0A90 %LE %Long 0x3FF ;Gpio_4 DRIVE2 Register(G4DRIVE2R)
; ------------------------------------------------------------------------------
; pin mux setting (alternative function setting)
&GPIOE_BASE=0x40E00000
Data.Set A:&GPIOE_BASE+0x0020 %LE %Long 0x3FF ;GPIO Alternate Function Select A register(GPIO_AFSLA)
; ------------------------------------------------------------------------------
; spi controller setting
GOSUB SQI_INIT ; enable memory map mode (ahb: 0x5000_0000)
GOSUB READ_ID_TEST
; ------------------------------------------------------------------------------
; Flash declaration
GOSUB FlashDeclaration "&param_dualport"
; 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
Data.LOAD.auto *
FLASH.ReProgram.off
; Reset device
SYStem.Down
SYStem.Up
)
ENDDO
READ_ID_TEST:
(
Data.Set A:&SQI_BASE+0x104 %Long (0x3<<24.)|0x0 ;length 4Bytes read data
&regData=(0x2<<12.)|0x9F ; cmd + cmd_type:cmd->data
Data.Set A:&SQI_BASE+0x100 %Long &regData ;command execute
&temp=Data.Long(A:&SQI_BASE+0x108)
PRINT "1st 0x" (&temp>>24.)&0xFF " (Manufacturer)"
PRINT "2nd 0x" (&temp>>16.)&0xFF " (Device ID)"
PRINT "3rd 0x" (&temp>>8.)&0xFF
PRINT "4th 0x" (&temp)&0xFF
GOSUB SQI_INIT ; enable memory map mode (ahb: 0x5000_0000)
RETURN
)
SQI_INIT:
(
&regData=(0x03<<16.) ;SPI READ OPCODE for AHB
&regData=&regData|(0x01<<24.); WR_CNF_OPCD
&regData=&regData|(0x0<<12.) ; CMD type <<SQI_CMDTY_C
Data.Set A:&SQI_BASE+0x108 %Long 0x0 ;DISABLE Performance enhance micron
Data.Set A:&SQI_BASE+0x10C %Long 0x40001 ;no dummy cycle, baud rate (around 10Mhz)
Data.Set A:&SQI_BASE+0x118 %Long 0x20000000 ;3B address mode
Data.Set A:&SQI_BASE+0x100 %Long &regData ;comstate
RETURN
)
FlashDeclaration:
(
PRIVATE &FlashSize &FlashDriver &FlashBaseAddr
PARAMETERS &DualPort
FLASH.RES
&FlashDriver="snor3b_msr1.bin"
&FlashSize=0x1000000 ;16Mbytes
&FlashBaseAddr=0x50000000 ;SPI AHB base address
&FlashMemStart=0x88000000 ;SPI AHB base address(Alias)
FLASH.Create 2. &FlashBaseAddr++(&FlashSize-0x1) 0x10000 TARGET2 Byte
FLASH.CreateAlias &FlashMemStart++(&FlashSize-0x1) &FlashBaseAddr
IF "&DualPort"=="0"
FLASH.TARGET2 0x20001000 0x20002000 0x2000 ~~/demo/arm/flash/byte/&FlashDriver
ELSE
FLASH.TARGET2 0x20001000 E:0x20002000 0x2000 ~~/demo/arm/flash/byte/&FlashDriver /DualPort
FLASH.List
RETURN
)