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

231 lines
8.4 KiB
Plaintext

; --------------------------------------------------------------------------------
; @Title: Hyper Flash Program script for NXP RT1176 MaaXBoard (AVNET)
; @Description:
; The S26KS256SDPBHI020(32MB) is to the FLEXSPI1 controller
;
; SRAM: 0x20001000
; FlexSPI(controller) Base: 0x400CC000
; FlexSPI AHB memory mapped ADDRESS: 0x30000000
;
; @Keywords: ARM, Cortex-M7
; @Author: JIM
; @Board: MaaXBoardRT
; @Chip: IMXRT1176-CM7
; @Copyright: (C) 1989-2022 Lauterbach GmbH, licensed for use with TRACE32(R) only
; --------------------------------------------------------------------------------
; $Id: imxrt1176-hyper.cmm 12049 2023-04-20 12:32:16Z bschroefel $
PRIVATE &parameters &param_prepareonly
ENTRY %LINE &parameters
&param_prepareonly=(STRing.SCAN(STRing.UPpeR("&parameters"),"PREPAREONLY",0)!=-1)
&FLEXSPI_BASE=0x400CC000 ;FLEXSPI1 controller base address
; ------------------------------------------------------------------------------
; Flash parameters
&fl_size=0x2000000 ;HyperFlash size 32MBytes
// Default NVCR latency setting when the device is shipped from the factory is 16 clocks
&fl_dummyCycles=0x10 ;HyperFlash dummy cycles for Read Data (ex. 5~16 clocks )
; ------------------------------------------------------------------------------
; Setup CPU
SYStem.Down
IF SYStem.Mode()<5
(
RESet
SYStem.RESet
SYStem.CPU IMXRT1176-CM7
SYStem.CONFIG.DEBUGPORTTYPE SWD
SYStem.Option.DUALPORT ON
SYStem.Option.WaitReset 1.5s
SYStem.MemAccess DAP
SYStem.JtagClock 10MHz
SYStem.Up
)
; ------------------------------------------------------------------------------
; Flash Pin Mux
GOSUB IOMUXconfig
; ------------------------------------------------------------------------------
; Flash Controller Configuration
GOSUB FLEXSPIconfig
; ------------------------------------------------------------------------------
; Flash Read ID Test
GOSUB READ_ID_TEST
FLASH.RESet
FLASH.Create 0x30000000++(&fl_size-1) 0x40000 TARGET Word
FLASH.TARGET 0x20001000 EAHB:0x20003000 0x2000 ~~/demo/arm/flash/word/hyper_imxrt117x.bin /DualPort
; flash alias
;FLASH.CreateALIAS 0x08000000++0xffffff 0x30000000
IF &param_prepareonly
ENDDO
; ReProgram Flash
;FLASH.ReProgram ALL
;Data.LOAD.Elf * ; or Data.LOAD.Binary * 0x30000000
;FLASH.ReProgram OFF
ENDDO
FLEXSPIconfig:
(
//unlock
Data.Set A:&FLEXSPI_BASE+0x018 %LE %Long 0x5AF05AF0
Data.Set A:&FLEXSPI_BASE+0x01C %LE %Long 2
//controller init
Data.Set A:&FLEXSPI_BASE+0x000 %LE %Long 0xFFFFA010 ;Dummy Read strobe generated by FlexSPI
;Data.Set A:&FLEXSPI_BASE+0x000 %LE %Long 0xFFFFA030 ;DQS from Flash pad if DQS is enabled
Data.Set A:&FLEXSPI_BASE+0x004 %LE %Long 0xFFFFFFFF
Data.Set A:&FLEXSPI_BASE+0x008 %LE %Long 0x200801F7
Data.Set A:&FLEXSPI_BASE+0x00C %LE %Long 0x78
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 0x00010000 ; 32MB(0x10000*1KB size), Max 256MB
//timing
Data.Set A:&FLEXSPI_BASE+0x070 %LE %Long 0x00001C63
Data.Set A:&FLEXSPI_BASE+0x074 %LE %Long 0x00001C63
Data.Set A:&FLEXSPI_BASE+0x078 %LE %Long 0x00001C63
Data.Set A:&FLEXSPI_BASE+0x07C %LE %Long 0x00001C63
Data.Set A:&FLEXSPI_BASE+0x080 %LE %Long 0x00002900
Data.Set A:&FLEXSPI_BASE+0x084 %LE %Long 0x00002900
Data.Set A:&FLEXSPI_BASE+0x088 %LE %Long 0x00002900
Data.Set A:&FLEXSPI_BASE+0x08C %LE %Long 0x00002900
Data.Set A:&FLEXSPI_BASE+0x0C0 %LE %Long 0x79
Data.Set A:&FLEXSPI_BASE+0x0C4 %LE %Long 0x0100
Data.Set A:&FLEXSPI_BASE+0x200 %LE %Long 0x8B1887A0
Data.Set A:&FLEXSPI_BASE+0x204 %LE %Long ((0xB700|&fl_dummyCycles)<<16.)|0x8F10 ; fl_dummycycles
Data.Set A:&FLEXSPI_BASE+0x208 %LE %Long 0x0000A708
Data.Set A:&FLEXSPI_BASE+0x20C %LE %Long 0x0
//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 control : 0x400E_8000
Data.Set SD:0x400E8554 %LE %Long 0x1 ;FLEXSPI1_I_IO_FA_SELECT_INPUT_0 DAISY
Data.Set SD:0x400E8558 %LE %Long 0x1 ;FLEXSPI1_I_IO_FA_SELECT_INPUT_1 DAISY
Data.Set SD:0x400E855C %LE %Long 0x1 ;FLEXSPI1_I_IO_FA_SELECT_INPUT_2 DAISY
Data.Set SD:0x400E8560 %LE %Long 0x1 ;FLEXSPI1_I_IO_FA_SELECT_INPUT_3 DAISY
Data.Set SD:0x400E8564 %LE %Long 0x1 ;FLEXSPI1_I_IO_FB_SELECT_INPUT_0 DAISY
Data.Set SD:0x400E8568 %LE %Long 0x1 ;FLEXSPI1_I_IO_FB_SELECT_INPUT_1 DAISY
Data.Set SD:0x400E856C %LE %Long 0x1 ;FLEXSPI1_I_IO_FB_SELECT_INPUT_2 DAISY
Data.Set SD:0x400E8570 %LE %Long 0x1 ;FLEXSPI1_I_IO_FB_SELECT_INPUT_3 DAISY
Data.Set SD:0x400E81B4 %LE %Long 0x1 ;GPIO_SD_B2_00_FLEXSPI1_B_DATA03
Data.Set SD:0x400E81B8 %LE %Long 0x1 ;GPIO_SD_B2_01_FLEXSPI1_B_DATA02
Data.Set SD:0x400E81BC %LE %Long 0x1 ;GPIO_SD_B2_02_FLEXSPI1_B_DATA01
Data.Set SD:0x400E81C0 %LE %Long 0x1 ;GPIO_SD_B2_03_FLEXSPI1_B_DATA00
Data.Set SD:0x400E81C4 %LE %Long 0x1 ;GPIO_SD_B2_04_FLEXSPI1_B_SCLK
Data.Set SD:0x400E81C8 %LE %Long 0x11 ;GPIO_SD_B2_05_FLEXSPI1_A_DQS
Data.Set SD:0x400E81CC %LE %Long 0x1 ;GPIO_SD_B2_06_FLEXSPI1_A_SS0
Data.Set SD:0x400E81D0 %LE %Long 0x11 ;GPIO_SD_B2_07_FLEXSPI1_A_SCLK
Data.Set SD:0x400E81D4 %LE %Long 0x1 ;GPIO_SD_B2_08_FLEXSPI1_A_DATA00
Data.Set SD:0x400E81D8 %LE %Long 0x1 ;GPIO_SD_B2_09_FLEXSPI1_A_DATA01
Data.Set SD:0x400E81DC %LE %Long 0x1 ;GPIO_SD_B2_10_FLEXSPI1_A_DATA02
Data.Set SD:0x400E81E0 %LE %Long 0x1 ;GPIO_SD_B2_11_FLEXSPI1_A_DATA03
//Hyper Flash Reset pin High (GPIO3_IO2)
//GPIO3 Base: 0x4013_0000
Data.Set A:0x400E8118 %LE %Long 0x5 ;IOMUXC_GPIO_AD_03_GPIO_MUX3_IO02
Data.Set A:0x40134004 %LE %Long Data.Long(A:0x40134004)|(0x1<<2) ;GDIR
Data.Set A:0x40134084 %LE %Long (0x1<<2) ;DR_SET
RETURN
)
READ_ID_TEST:
(
PRINT "READ_ID_TEST..."
PRIVATE &data
GOSUB HYPER_WRITE_WORD "0x555" "0xFF" ; addr 0x555 <- RESET
GOSUB HYPER_WRITE_WORD "0x555" "0x98" ; addr 0x555 <- SFDP
GOSUB HYPER_READ_LONG "0x0" ; READ addr 0x0 LONG word
RETURNVALUES &data
PRINT "Read WORD [0:1]: 0x" (&data&0xFFFF) %Ascii "(" (&data>>8)&0xFF (&data)&0xFF ")"
PRINT "Read WORD [2:3]: 0x" ((&data>>16.)&0xFFFF) %Ascii "(" (&data>>24.)&0xFF (&data>>16.)&0xFF ")"
GOSUB HYPER_WRITE_WORD "0x555" "0xF0" ; addr 0x555 <- RESET
RETURN
)
HYPER_WRITE_WORD:
(
PRIVATE &addr &data
PARAMETERS &addr &data
PRIVATE &addr_0 &addr_1 &addr_2 &addr_3 &data_up &data_down
&addr_0=(&addr>>19.)&0xFF
&addr_1=(&addr>>11.)&0xFF
&addr_2=(&addr>>3.)&0xFF
&addr_3=(&addr&0x7)
&data_up=(&data>>8.)&0xFF
&data_down=(&data)&0xFF
Data.Set A:&FLEXSPI_BASE+0x080 %LE %Long 0x80000900 ;FLASHCR2
Data.Set A:&FLEXSPI_BASE+0x014 %LE %Long -1 ;INTR clear
Data.Set A:&FLEXSPI_BASE+0x0BC %LE %Long 0x1 ;IPTXFCR
Data.Set A:&FLEXSPI_BASE+0x0B8 %LE %Long 0x1 ;IPRXFCR
Data.Set A:&FLEXSPI_BASE+0x0A0 %LE %Long 0x0 ;IPCR0, SFAR
Data.Set A:&FLEXSPI_BASE+0x250 %LE %Long ((0x21<<10.)|(3<<8.)|&addr_0)<<16.|((0x21<<10.)|(3<<8.)|0x20) ;CMD_DDR(0x21) , Octal, inst: 0x20
Data.Set A:&FLEXSPI_BASE+0x254 %LE %Long ((0x21<<10.)|(3<<8.)|&addr_2)<<16.|((0x21<<10.)|(3<<8.)|&addr_1)
Data.Set A:&FLEXSPI_BASE+0x258 %LE %Long ((0x21<<10.)|(3<<8.)|&addr_3)<<16.|((0x21<<10.)|(3<<8.)|0x00)
Data.Set A:&FLEXSPI_BASE+0x25C %LE %Long ((0x21<<10.)|(3<<8.)|&data_down)<<16.|((0x21<<10.)|(3<<8.)|&data_up)
Data.Set A:&FLEXSPI_BASE+0x0A4 %LE %Long (5.<<16.)
Data.Set A:&FLEXSPI_BASE+0x0B0 %LE %Long 1 ;start
WAIT 100.ms
RETURN
)
HYPER_READ_LONG:
(
PRIVATE &addr
PARAMETERS &addr
PRIVATE &data
Data.Set A:&FLEXSPI_BASE+0x080 %LE %Long 0x80000900 ;FLASHCR2
Data.Set A:&FLEXSPI_BASE+0x014 %LE %Long -1 ;INTR clear
Data.Set A:&FLEXSPI_BASE+0x0BC %LE %Long 0x1 ;IPTXFCR
Data.Set A:&FLEXSPI_BASE+0x0B8 %LE %Long 0x1 ;IPRXFCR
Data.Set A:&FLEXSPI_BASE+0x0A0 %LE %Long &addr ;IPCR0, SFAR
Data.Set A:&FLEXSPI_BASE+0x250 %LE %Long ((0x22<<10.)|(3<<8.)|0x18)<<16.|((0x21<<10.)|(3<<8.)|0xA0)
Data.Set A:&FLEXSPI_BASE+0x254 %LE %Long ((0x2D<<10.)|(3<<8.)|&fl_dummyCycles)<<16.|((0x23<<10.)|(3<<8.)|0x10)
Data.Set A:&FLEXSPI_BASE+0x258 %LE %Long ((0x00<<10.)|(3<<8.)|00)<<16.|((0x29<<10.)|(3<<8.)|0x04) ; 0x4 read byte size
Data.Set A:&FLEXSPI_BASE+0x25C %LE %Long 0x0
Data.Set A:&FLEXSPI_BASE+0x0A4 %LE %Long (5.<<16.)
Data.Set A:&FLEXSPI_BASE+0x0B0 %LE %Long 1 ;start
WAIT 100.ms
&data=Data.Long(A:&FLEXSPI_BASE+0x100)
RETURN "&data"
)