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

313 lines
11 KiB
Plaintext

; --------------------------------------------------------------------------------
; @Title: SPI(Serial NOR) Flash Program script for iMXRT1062 OEM(EmbeddedArtists)
; @Description:
; The ATXP32(Adestro) is connected to the FLEXSPI controller
; ATXP32 is the OPI DDR Mode supported flash memory
;
; SRAM: 0x20001000
; FlexSPI(controller) Base: 0x402A8000
; FlexSPI AHB memory mapped ADDRESS: //NC:0x60000000
;
; Prerequisites:
;
; @Keywords: ARM, Cortex-M7
; @Author: JIM
; @Board: iMXRT1062-OEM
; @Chip: IMXRT106?
; @Copyright: (C) 1989-2022 Lauterbach GmbH, licensed for use with TRACE32(R) only
; --------------------------------------------------------------------------------
; $Id: imxrt1062oem-spi.cmm 12049 2023-04-20 12:32:16Z bschroefel $
WinCLEAR
PRIVATE &parameters &param_prepareonly
ENTRY %LINE &parameters
&param_prepareonly=(STRing.SCAN(STRing.UPpeR("&parameters"),"PREPAREONLY",0)!=-1)
&FLEXSPI_BASE=0x402A8000 ;FLEXSPI0 controller base address
AREA.view
; initialize and start the debugger
SYStem.RESet
SYStem.CPU IMXRT1062
SYStem.CONFIG.DEBUGPORTTYPE SWD
IF hardware.COMBIPROBE()||hardware.UTRACE()
(
SYStem.CONFIG.CONNECTOR MIPI20T
)
SYStem.Option DUALPORT ON
SYStem.MemAccess DAP
SYStem.JtagClock 10MHz
Trace.DISable
SYStem.Up
//GOSUB OPIDDR2SPI ; enable this line if the current SPI flash mode is the OPI DDR
GOSUB clockInit
GOSUB IOMUXconfig
GOSUB FLEXSPIconfig
GOSUB READ_ID_TEST
; disable Watchdog
GOSUB DisableWatchdog
FLASH.RESet
FLASH.Create 0x60000000++0x3FFFFF 0x10000 TARGET Byte
FLASH.TARGET 0x20001000 EAHB:0x20003000 0x2000 ~~/demo/arm/flash/byte/snoratxp32_flexspi.bin /DualPort
//spi flash lock check
FLASH.SPI.CMD 1. 0x05 /READ 0x4 vm:0x0
IF ((Data.Byte(vm:0x0)&0x3C)!=0x0) //if the flash is locked, then make it unlock
(
print "unlock spi flash ..."
FLASH.SPI.CMD 1. 0x6
FLASH.SPI.CMD 1. 0x1 0x0
)
IF &param_prepareonly
ENDDO
;FLASH.ReProgram ALL
;Data.LOAD.auto *
;Data.LOAD.Binary * 0x60000000
;FLASH.ReProgram OFF
Data.dump NC:0x60000000 ; Memory Class NC (Non-cache....)
ENDDO
; --------------------------------------------------------------------------------
FLEXSPIconfig:
(
//unlock
Data.Set A:&FLEXSPI_BASE+0x018 %LE %Long 0x5AF05AF0
Data.Set A:&FLEXSPI_BASE+0x01C %LE %Long 2
PER.Set.simple ASD:0x402A8000 %Long 0xFFFF8003
WAIT 100.ms
PER.Set.simple ASD:0x402A8000 %Long 0xFFFF8000
//controller init
Data.Set A:&FLEXSPI_BASE+0x004 %LE %Long 0xFFFFFFFF
Data.Set A:&FLEXSPI_BASE+0x008 %LE %Long 0x200001F7
Data.Set A:&FLEXSPI_BASE+0x00C %LE %Long 0x58
Data.Set A:&FLEXSPI_BASE+0x020 %LE %Long 0x80000000
Data.Set A:&FLEXSPI_BASE+0x024 %LE %Long 0x80000000
Data.Set A:&FLEXSPI_BASE+0x028 %LE %Long 0x80000000
Data.Set A:&FLEXSPI_BASE+0x060 %LE %Long 0x00200000
Data.Set A:&FLEXSPI_BASE+0x060 %LE %Long 0x1000 ; 0x4000 * 0x400(KB unit size) = 16MB Flash_A0 size.
Data.Set A:&FLEXSPI_BASE+0x064 %LE %Long 0x1000
Data.Set A:&FLEXSPI_BASE+0x068 %LE %Long 0x1000
Data.Set A:&FLEXSPI_BASE+0x06C %LE %Long 0x1000
//timing
Data.Set A:&FLEXSPI_BASE+0x070 %LE %Long 0x44; 0x00000063
Data.Set A:&FLEXSPI_BASE+0x074 %LE %Long 0x44; 0x00000063
Data.Set A:&FLEXSPI_BASE+0x078 %LE %Long 0x44; 0x00000063
Data.Set A:&FLEXSPI_BASE+0x07C %LE %Long 0x44; 0x00000063
Data.Set A:&FLEXSPI_BASE+0x080 %LE %Long 0x00000900
Data.Set A:&FLEXSPI_BASE+0x084 %LE %Long 0x00000900
Data.Set A:&FLEXSPI_BASE+0x088 %LE %Long 0x00000900
Data.Set A:&FLEXSPI_BASE+0x08C %LE %Long 0x00000900
Data.Set A:&FLEXSPI_BASE+0x0B8 %LE %Long 0x1 ; water marker level 0 , reset assert 0x1
Data.Set A:&FLEXSPI_BASE+0x0BC %LE %Long 0x1 ; water marker level 0 , reset assert 0x1
Data.Set A:&FLEXSPI_BASE+0x0C0 %LE %Long 0x0100
Data.Set A:&FLEXSPI_BASE+0x0C4 %LE %Long 0x0100
//LUT0 for read the spi memory data to the AHB
//FAST READ Quad I/O
; Data.Set A:&FLEXSPI_BASE+0x200 %LE %Long 0x0A1804EB
; Data.Set A:&FLEXSPI_BASE+0x204 %LE %Long 0x26043206
; Data.Set A:&FLEXSPI_BASE+0x208 %LE %Long 0x00
; Data.Set A:&FLEXSPI_BASE+0x20C %LE %Long 0x00
//Normal Read Mode
Data.Set A:&FLEXSPI_BASE+0x200 %LE %Long 0x08180403
Data.Set A:&FLEXSPI_BASE+0x204 %LE %Long 0x00002404
Data.Set A:&FLEXSPI_BASE+0x208 %LE %Long 0x00
Data.Set A:&FLEXSPI_BASE+0x20C %LE %Long 0x00
//AHB update automatically even though the window size is < 1KB
Data.Set A:&FLEXSPI_BASE+0x00C %LE %Long Data.Long(A:&FLEXSPI_BASE+0x00C)&~0x20
RETURN
)
IOMUXconfig:
(
//pin mux
Data.Set A:0x401F81EC %LE %Long 0x1 ; IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B1_06_FLEXSPIA_SS0_B, 1U);
Data.Set A:0x401F81F0 %LE %Long 0x11 ; IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B1_07_FLEXSPIA_SCLK, 1U);
Data.Set A:0x401F81E4 %LE %Long 0x5 ; IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B1_04_FLEXSPIB_SCLK, 1U);
Data.Set A:0x401F81E8 %LE %Long 0x11 ; IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B1_05_FLEXSPIA_DQS, 1U);
Data.Set A:0x401F81F4 %LE %Long 0x1 ; IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B1_08_FLEXSPIA_DATA00, 1U);
Data.Set A:0x401F81F8 %LE %Long 0x1 ; IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B1_09_FLEXSPIA_DATA01, 1U);
Data.Set A:0x401F81FC %LE %Long 0x1 ; IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B1_10_FLEXSPIA_DATA02, 1U);
Data.Set A:0x401F8200 %LE %Long 0x1 ; IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B1_11_FLEXSPIA_DATA03, 1U);
Data.Set A:0x401F81E0 %LE %Long 0x5 ; IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B1_03_FLEXSPIB_DATA00, 1U);
Data.Set A:0x401F81DC %LE %Long 0x5 ; IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B1_02_FLEXSPIB_DATA01, 1U);
Data.Set A:0x401F81D8 %LE %Long 0x5 ; IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B1_01_FLEXSPIB_DATA02, 1U);
Data.Set A:0x401F81D4 %LE %Long 0x5 ; IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B1_00_FLEXSPIB_DATA03, 1U);
//pin config
Data.Set A:0x401F83DC %LE %Long 0x000F1 ; IOMUXC_SetPinConfig(IOMUXC_GPIO_SD_B1_06_FLEXSPIA_SS0_B, 0x10F1u);
Data.Set A:0x401F83E0 %LE %Long 0x000F1 ; IOMUXC_SetPinConfig(IOMUXC_GPIO_SD_B1_07_FLEXSPIA_SCLK, 0x10F1u);
Data.Set A:0x401F83D4 %LE %Long 0x010B0 ; IOMUXC_SetPinConfig(IOMUXC_GPIO_SD_B1_04_FLEXSPIB_SCLK, 0x10F1u);
Data.Set A:0x401F83D8 %LE %Long 0x130F1 ; IOMUXC_SetPinConfig(IOMUXC_GPIO_SD_B1_05_FLEXSPIA_DQS, 0x0130F1u);
Data.Set A:0x401F83E4 %LE %Long 0x000F1 ; IOMUXC_SetPinConfig(IOMUXC_GPIO_SD_B1_08_FLEXSPIA_DATA00, 0x10F1u);
Data.Set A:0x401F83E8 %LE %Long 0x000F1 ; IOMUXC_SetPinConfig(IOMUXC_GPIO_SD_B1_09_FLEXSPIA_DATA01, 0x10F1u);
Data.Set A:0x401F83EC %LE %Long 0x000F1 ; IOMUXC_SetPinConfig(IOMUXC_GPIO_SD_B1_10_FLEXSPIA_DATA02, 0x10F1u);
Data.Set A:0x401F83F0 %LE %Long 0x000F1 ; IOMUXC_SetPinConfig(IOMUXC_GPIO_SD_B1_11_FLEXSPIA_DATA03, 0x10F1u);
Data.Set A:0x401F83D0 %LE %Long 0x010B0 ; IOMUXC_SetPinConfig(IOMUXC_GPIO_SD_B1_03_FLEXSPIB_DATA00, 0x10F1u);
Data.Set A:0x401F83CC %LE %Long 0x010B0 ; IOMUXC_SetPinConfig(IOMUXC_GPIO_SD_B1_02_FLEXSPIB_DATA01, 0x10F1u);
Data.Set A:0x401F83C8 %LE %Long 0x010B0 ; IOMUXC_SetPinConfig(IOMUXC_GPIO_SD_B1_01_FLEXSPIB_DATA02, 0x10F1u);
Data.Set A:0x401F83C4 %LE %Long 0x010B0 ; IOMUXC_SetPinConfig(IOMUXC_GPIO_SD_B1_00_FLEXSPIB_DATA03, 0x10F1u);
RETURN
)
clockInit: ;()
(
// Enable all clocks
Data.Set A:0x400FC068 %Long 0xffffffff
Data.Set A:0x400FC06C %Long 0xffffffff
;Data.Set A:0x400FC070 %Long 0xffffffff
;Data.Set A:0x400FC074 %Long 0xffffffff
Data.Set A:0x400FC078 %Long 0xffffffff
Data.Set A:0x400FC07C %Long 0xffffffff
Data.Set A:0x400FC080 %Long 0xffffffff ;CCGR6.CG5[11:10]: FLEXSPI enable clk
Data.Set A:0x400D8000 %Long 0x00012042
Data.Set A:0x400D8030 %Long 0x80012042
Data.Set A:0x400D8100 %Long 0x58535858
Data.Set A:0x400D8010 %Long 0x3000
Data.Set A:0x400D8010 %Long 0x80003000
Data.Set A:0x400D80A0 %LE %Long 0x0001100C ;CCM_ANALOG_PLL_VIDEOn, !!! influence on the FLEXSPI data flickering !!!
Data.Set A:0x400D80F0 %Long 0x4F5A6363
Data.Set A:0x400FC010 %Long 0x1 ;CCM_CACRR
Data.Set A:0x400FC024 %Long 0x06490b03
Data.Set A:0x400FC018 %Long 0x2dae8324 ;CCM_CBCMR
Data.Set A:0x400FC018 %Long 0x35AE8304 ;CCM_CBCMR
Data.Set A:0x400FC01C %LE %Long 0x07900001 ;CCM_CSCMR1, FLEXSPI_PODF[25:23]
Data.Set A:0x400FC01C %LE %Long 0x07930001
Data.Set A:0x400FC024 %LE %Long 0x06490B03
Data.Set A:0x400D8000 %Long 0x80002042
Data.Set A:0x400D8030 %Long 0x80002001 ;CCM_ANALOG_PLL_SYSn
Data.Set A:0x400D8010 %Long 0x80003000 ;CCM_ANALOG_PLL_USB1n
RETURN
)
READ_ID_TEST:
(
PRINT "READ_ID_TEST..."
&readSize=0x10
Data.Set A:&FLEXSPI_BASE+0x210 %LE %Long 0x2400049F|((&readSize&0xFF)<<16.) ;readid with 16 bytes READ data
Data.Set A:&FLEXSPI_BASE+0x214 %LE %Long 0x0 ;
GOSUB LUT_EXECUTE &readSize
RETURN
)
ADESTO_OPIDDR2SPI:
(
PRINT "Adesto OPI 2 SPI ..."
&readSize=0x0
Data.Set A:&FLEXSPI_BASE+0x210 %LE %Long 0x0706 ;readid with 16 bytes READ data
Data.Set A:&FLEXSPI_BASE+0x214 %LE %Long 0x0 ;
GOSUB LUT_EXECUTE &readSize
Data.Set A:&FLEXSPI_BASE+0x210 %LE %Long 0x07FF ;readid with 16 bytes READ data
Data.Set A:&FLEXSPI_BASE+0x214 %LE %Long 0x0 ;
GOSUB LUT_EXECUTE &readSize
RETURN
)
LUT_EXECUTE:
(
ENTRY &data_size
// Data.Set ASD:&FLEXSPI_BASE+0x80 %LE %Long 0x80000900 ;FLASHCR2
Data.Set ASD:&FLEXSPI_BASE+0x14 %LE %Long -1 ;INTR clear
Data.Set A:&FLEXSPI_BASE+0xB8 %Long 0x1 ;IPRXFCR
Data.Set A:&FLEXSPI_BASE+0xBC %Long 0x1 ;IPTXFCR
Data.Set A:&FLEXSPI_BASE+0x0A4 %LE %Long (1.<<16.)|&data_size
Data.Set A:&FLEXSPI_BASE+0x0B0 %LE %Long 1 ;start
&readbuffer_addr=&FLEXSPI_BASE+0x100
IF &data_size>0
(
&byteCnt=0.
RePeaT 4.
(
PRINT "0x" Data.Long(A:&readbuffer_addr)&0xFF " ;" &byteCnt "."
PRINT "0x" (Data.Long(A:&readbuffer_addr)>>8.)&0xFF " ;" &byteCnt+1. "."
PRINT "0x" (Data.Long(A:&readbuffer_addr)>>16.)&0xFF " ;" &byteCnt+2. "."
PRINT "0x" Data.Long(A:&readbuffer_addr)>>24. " ;" &byteCnt+3. "."
&byteCnt=&byteCnt+4.
&readbuffer_addr=&readbuffer_addr+0x4
&data_size=&data_size-4.
)
)
RETURN
)
DisableWatchdog:
(
LOCAL &tmp1 &tmp2
&tmp1=Data.Long(ST:0x20000000)
&tmp2=Data.Long(ST:0x20000004)
Register.SWAP
; The watchdog has a restrictive timing. It has to be configured and unlocked within a peripod
; of 128 cycles. Therefor the unlock sequence need to be done by a small target program.
Data.Assemble ST:0x20000000 str r1,[r0] ;SD:0x400BC004 = 0xD928C520 (Key)
Data.Assemble , str r3,[r2] ;SD:0x400BC000 = 0x00002120 (Control register)
Data.Assemble , str r5,[r4] ;SD:0x40052008 = 0x0000FFFF (Timeout value)
Data.Assemble , bkpt #0
Register.Set PC 0x20000000
Register.Set SP 0x20001000
Register.Set R0 0x400BC004
Register.Set R1 0xD928C520
Register.Set R2 0x400BC000
Register.Set R3 0x00002100
Register.Set R4 0x400BC008
Register.Set R5 0x0000FFFF
Go.direct
WAIT !STATE.RUN()
Data.Set ST:0x20000000 %Long &tmp1
Data.Set ST:0x20000004 %Long &tmp2
Register.SWAP
RETURN
)
OPIDDR2SPI:
(
Data.Set A:&FLEXSPI_BASE+0x018 %LE %Long 0x5AF05AF0
Data.Set A:&FLEXSPI_BASE+0x01C %LE %Long 2
GOSUB ADESTO_OPIDDR2SPI //switch back opi(ddr) -> dafault spi mode
RETURN
)