; -------------------------------------------------------------------------------- ; @Title: Serial fLash script for IMXRT595-CM33 on IMXRT595-EVK ; @Description: ; ; The MX25UM51345(MXIC) Octal DDR flash memory is on the FlexSPI0_SS0. ; The default boot makes the SPI flash memory to the OPI DDR mode ON ; ; SRAM: 0x20001000 ; FlexSPI Controller Base: 0x40134000 ; FlexSPI memory mapped ADDRESS: 0x08000000 ; ; Prerequisites: ; * Connect Combiprobe/uTrace to J19 ; * Select FlexSPI boot mode on the EVB ; The ISP pins (PIO1_15, PIO3_28, and PIO3_29) ; SP[2:0] == 100 on the SW7, the documentation is opposite ; ; @Keywords: ARM, Cortex-M7, ITM, SWV, SPI, OPI, OCTAL, DDR ; @Author: JIM ; @Board: IMXRT595-EVK ; @Chip: IMXRT595-CM33 ; @Copyright: (C) 1989-2021 Lauterbach GmbH, licensed for use with TRACE32(R) only ; -------------------------------------------------------------------------------- ; $Id: imxrt595-spi.cmm 12049 2023-04-20 12:32:16Z bschroefel $ &FLEXSPI_BASE=0x40134000 ;FLEXSPI0 controller base address ENTRY %LINE ¶meters ¶m_prepareonly=(STRing.SCAN(STRing.UPpeR("¶meters"),"PREPAREONLY",0)!=-1) WinCLEAR RESet SYStem.CPU IMXRT595-CM33 SYStem.CONFIG.DEBUGPORTTYPE SWD IF hardware.COMBIPROBE()||hardware.UTRACE() ( SYStem.CONFIG.CONNECTOR MIPI20T ) SYStem.Option.ResBreak OFF SYStem.Option.DUALPORT ON SYStem.MemAccess DAP SYStem.JtagClock 10MHz ETM.OFF ITM.OFF SYStem.Option.SYSRESETREQ ON ;Allow system reset via the AIRC register ON ERROR GOSUB ( SYStem.Mode Down SYStem.Option.SYSRESETREQ OFF SYStem.Up RETURN ) SYStem.Up ON ERROR inherit PRINT "VTOR(Vector Table Offset): 0x" Data.Long(AZSD:0xE000ED08) IF Data.Long(AZSD:0x08000400)!=0x42464346 // Ascii=='FCFB' ( PRINT "FLASH is Empty" GOSUB ClockInit GOSUB IOMUXconfig GOSUB FLEXSPIconfig GOSUB READ_ID_TEST ) Data.Set ZSD:0x40033000 %LE %Long 0x0 ;disable cache controller FLASH.RESet FLASH.Create 0x08000000++0xFFFFFF 0x10000 TARGET Byte FLASH.TARGET 0x20001000 EAHB:0x20203000 0x4000 ~~/demo/arm/flash/byte/snor_imxrt500.bin /DualPort IF ¶m_prepareonly ENDDO FLASH.List ;ReProgram Flash ;FLASH.ReProgram ALL ;Data.LOAD.Elf * ;Data.LOAD.Binary * 0x08000000 ;FLASH.ReProgram OFF ENDDO ; -------------------------------------------------------------------------------- ClockInit: ( //CLOCK_EnableFroClk(kCLOCK_FroAllOutEn); Data.Set ZSD:0x40001110 %LE %Long 0x1F //CLKCTL0->FRODIVOEN //BOARD_FlexspiClockSafeConfig Data.Set ZSD:0x40001040 %LE %Long 0x10000 //CLKCTL0->PSCCTL0_SET Data.Set ZSD:0x40002110 %LE %Long 0x0 Data.Set ZSD:0x40002604 %LE %Long 0x067FFFFF Data.Set ZSD:0x40002614 %LE %Long 0x067FFFF3 ;PDSLEEPCFG1 Data.Set ZSD:0x40002684 %LE %Long 0x1<<10. Data.Set ZSD:0x40001620 %LE %Long 0x00000000 ;clk sel, main clock for flexspi clk Data.Set ZSD:0x40001624 %LE %Long 0x8000000F ;div 8 RETURN ) FLEXSPIconfig: ( //unlock Data.Set A:&FLEXSPI_BASE+0x018 %LE %Long 0x5AF05AF0 Data.Set A:&FLEXSPI_BASE+0x01C %LE %Long 2 IF Data.Long(A:&FLEXSPI_BASE)==0xFFFFA030 ;current flash state is octal ddr ( GOSUB RESET_Memory_OCTAL_DDR Data.Set A:&FLEXSPI_BASE+0x000 %LE %Long 0xFFFF8101 ;SPI mode & div/2, and SW reset assert ) //controller init Data.Set A:&FLEXSPI_BASE+0x000 %LE %Long 0xFFFF8100 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+0x000 %LE %Long 0xFFFFA030 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 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 ; 0x4000 * 0x400(KB unit size) = 16MB Flash_A0 size. //timing Data.Set A:&FLEXSPI_BASE+0x070 %LE %Long 0x00000063 Data.Set A:&FLEXSPI_BASE+0x074 %LE %Long 0x00000063 Data.Set A:&FLEXSPI_BASE+0x078 %LE %Long 0x00000063 Data.Set A:&FLEXSPI_BASE+0x07C %LE %Long 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 %Long (0x7<<2)|0x1 ;rx watermark size(RXWMRK+1)*64 Bits, read fifo buffer 0x40 Data.Set A:&FLEXSPI_BASE+0x0BC %Long (0x7<<2)|0x1 ;tx watermark size(TXWMRK+1)*64 Bits, write fifo buffer 0x40 Data.Set A:&FLEXSPI_BASE+0x0C0 %LE %Long 0x79 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 //Octal Read Mode ; Data.Set A:&FLEXSPI_BASE+0x200 %LE %Long 0x071307EC ; Data.Set A:&FLEXSPI_BASE+0x204 %LE %Long 0x0F140B20 ; Data.Set A:&FLEXSPI_BASE+0x208 %LE %Long 0x00001F01 ; Data.Set A:&FLEXSPI_BASE+0x20C %LE %Long 0x00 //Octal DDR Read Mode ; Data.Set ZSD:0x40134200 %LE %Long 0x871187EE ; Data.Set ZSD:0x40134204 %LE %Long 0xB3048B20 ; Data.Set ZSD:0x40134208 %LE %Long 0x0000A704 ; Data.Set ZSD:0x4013420C %LE %Long 0x00000000 //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: ( ;PIO1_20= 0+0x80+(20.x4)h ;1_18--1_29 Data.Set ZSD:0x400040C8 %LE %Long 0x141 ;PIO1_18 Data.Set ZSD:0x400040CC %LE %Long 0x141 ;PIO1_19 Data.Set ZSD:0x400040D0 %LE %Long 0x141 ;PIO1_20 Data.Set ZSD:0x400040D4 %LE %Long 0x141 ;PIO1_21 Data.Set ZSD:0x400040D8 %LE %Long 0x141 ;PIO1_22 Data.Set ZSD:0x400040DC %LE %Long 0x141 ;PIO1_23 Data.Set ZSD:0x400040E0 %LE %Long 0x141 ;PIO1_24 Data.Set ZSD:0x400040E4 %LE %Long 0x141 ;PIO1_25 Data.Set ZSD:0x400040E8 %LE %Long 0x141 ;PIO1_26 Data.Set ZSD:0x400040EC %LE %Long 0x141 ;PIO1_27 Data.Set ZSD:0x400040F0 %LE %Long 0x151 ;PIO1_28 Data.Set ZSD:0x400040F4 %LE %Long 0x0 ;PIO1_29 RETURN ) READ_ID_TEST: ( PRINT "READ_ID_TEST..." 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 Data.Long(A:&FLEXSPI_BASE+0xB8)|0x1 ;IPRXFCR Data.Set A:&FLEXSPI_BASE+0xBC %Long Data.Long(A:&FLEXSPI_BASE+0xBC)|0x1 ;IPTXFCR Data.Set A:&FLEXSPI_BASE+0x250 %LE %Long 0x2404049F ;readid with 4 bytes READ data Data.Set A:&FLEXSPI_BASE+0x254 %LE %Long 0x0 ; Data.Set A:&FLEXSPI_BASE+0x258 %LE %Long 0x0 ; Data.Set A:&FLEXSPI_BASE+0x25c %LE %Long 0x0 ; Data.Set A:&FLEXSPI_BASE+0x0A4 %LE %Long (5.<<16.)|0x4 Data.Set A:&FLEXSPI_BASE+0x0B0 %LE %Long 1 ;start PRINT "1st 0x" Data.Long(A:&FLEXSPI_BASE+0x100)&0xFF " (Manufacture)" PRINT "2nd 0x" (Data.Long(A:&FLEXSPI_BASE+0x100)>>8.)&0xFF " (Device ID)" PRINT "3rd 0x" (Data.Long(A:&FLEXSPI_BASE+0x100)>>16.)&0xFF PRINT "4th 0x" Data.Long(A:&FLEXSPI_BASE+0x100)>>24. RETURN ) RESET_Memory: ( PRINT "RESET Memory..." 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 Data.Long(A:&FLEXSPI_BASE+0xB8)|0x1 ;IPRXFCR Data.Set A:&FLEXSPI_BASE+0xBC %Long Data.Long(A:&FLEXSPI_BASE+0xBC)|0x1 ;IPTXFCR Data.Set A:&FLEXSPI_BASE+0x250 %LE %Long 0x00000466 ;readid with 4 bytes READ data Data.Set A:&FLEXSPI_BASE+0x254 %LE %Long 0x0 ; Data.Set A:&FLEXSPI_BASE+0x258 %LE %Long 0x0 ; Data.Set A:&FLEXSPI_BASE+0x25c %LE %Long 0x0 ; Data.Set A:&FLEXSPI_BASE+0x0A4 %LE %Long (5.<<16.)|0x4 Data.Set A:&FLEXSPI_BASE+0x0B0 %LE %Long 1 ;start Data.Set A:&FLEXSPI_BASE+0x250 %LE %Long 0x00000499 ;readid with 4 bytes READ data Data.Set A:&FLEXSPI_BASE+0x254 %LE %Long 0x0 ; Data.Set A:&FLEXSPI_BASE+0x258 %LE %Long 0x0 ; Data.Set A:&FLEXSPI_BASE+0x25c %LE %Long 0x0 ; Data.Set A:&FLEXSPI_BASE+0x0A4 %LE %Long (5.<<16.)|0x4 Data.Set A:&FLEXSPI_BASE+0x0B0 %LE %Long 1 ;start RETURN ) READ_ID_TEST_OCTAL_DDR: ( PRINT "READ_ID_TEST..." 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 Data.Long(A:&FLEXSPI_BASE+0xB8)|0x1 ;IPRXFCR Data.Set A:&FLEXSPI_BASE+0xBC %Long Data.Long(A:&FLEXSPI_BASE+0xBC)|0x1 ;IPTXFCR Data.Set A:&FLEXSPI_BASE+0x250 %LE %Long 0x8760879F ;readid with 4 bytes READ data Data.Set A:&FLEXSPI_BASE+0x254 %LE %Long 0xB3048B20 ; Data.Set A:&FLEXSPI_BASE+0x258 %LE %Long 0x0000A740 ; Data.Set A:&FLEXSPI_BASE+0x25c %LE %Long 0x0 ; Data.Set A:&FLEXSPI_BASE+0x0A0 %Long 0x00000000 ;IPCR0 , address register Data.Set A:&FLEXSPI_BASE+0x0A4 %LE %Long (5.<<16.)|0x40 Data.Set A:&FLEXSPI_BASE+0x0B0 %LE %Long 1 ;start PRINT "1st 0x" Data.Long(A:&FLEXSPI_BASE+0x100)&0xFF " (Manufacture)" PRINT "2nd 0x" (Data.Long(A:&FLEXSPI_BASE+0x100)>>8.)&0xFF " (Device ID)" PRINT "3rd 0x" (Data.Long(A:&FLEXSPI_BASE+0x100)>>16.)&0xFF PRINT "4th 0x" Data.Long(A:&FLEXSPI_BASE+0x100)>>24. PRINT "5st 0x" Data.Long(A:&FLEXSPI_BASE+0x104)&0xFF " (Manufacture)" PRINT "6nd 0x" (Data.Long(A:&FLEXSPI_BASE+0x104)>>8.)&0xFF " (Device ID)" PRINT "7rd 0x" (Data.Long(A:&FLEXSPI_BASE+0x104)>>16.)&0xFF PRINT "8th 0x" Data.Long(A:&FLEXSPI_BASE+0x104)>>24. RETURN ) RESET_Memory_OCTAL_DDR: ( PRINT "RESET Memory..." 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 Data.Long(A:&FLEXSPI_BASE+0xB8)|0x1 ;IPRXFCR Data.Set A:&FLEXSPI_BASE+0xBC %Long Data.Long(A:&FLEXSPI_BASE+0xBC)|0x1 ;IPTXFCR Data.Set A:&FLEXSPI_BASE+0x250 %LE %Long 0x87998766 ;readid with 4 bytes READ data Data.Set A:&FLEXSPI_BASE+0x254 %LE %Long 0x0 ; Data.Set A:&FLEXSPI_BASE+0x258 %LE %Long 0x0 ; Data.Set A:&FLEXSPI_BASE+0x25c %LE %Long 0x0 ; Data.Set A:&FLEXSPI_BASE+0x0A4 %LE %Long (5.<<16.)|0x4 Data.Set A:&FLEXSPI_BASE+0x0B0 %LE %Long 1 ;start 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 Data.Long(A:&FLEXSPI_BASE+0xB8)|0x1 ;IPRXFCR Data.Set A:&FLEXSPI_BASE+0xBC %Long Data.Long(A:&FLEXSPI_BASE+0xBC)|0x1 ;IPTXFCR Data.Set A:&FLEXSPI_BASE+0x250 %LE %Long 0x87668799 ;readid with 4 bytes READ data Data.Set A:&FLEXSPI_BASE+0x254 %LE %Long 0x0 ; Data.Set A:&FLEXSPI_BASE+0x258 %LE %Long 0x0 ; Data.Set A:&FLEXSPI_BASE+0x25c %LE %Long 0x0 ; Data.Set A:&FLEXSPI_BASE+0x0A4 %LE %Long (5.<<16.)|0x4 Data.Set A:&FLEXSPI_BASE+0x0B0 %LE %Long 1 ;start RETURN )