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

166 lines
5.5 KiB
Plaintext

; --------------------------------------------------------------------------------
; @Title: SPI(Serial NOR) Flash Program script for LX2160A
; @Description:
; The 2ea MT35XU512ABA1G12(Micron) are connected serially to the FLEXSPI_A
; controller ( XSPI1_A_CS0_B, XSPI_CS1_A_CS1_B, XSPI_A_SCK, XSPI_A_D[0:7] )
;
; SRAM: 0x18010000
; FlexSPI(controller) Base: 0x20c0000
;
; Prerequisites:
; * connect Debug Cable/Combiprobe to J11 JTAG using LA-3770
; * the RCW_SRC & RCW gives access to QSPI
;
; @Keywords: ARM, Cortex-A72, LX2160A, QorIQ, FlexSPI
; @Author: JIM
; @Board: X-LX2160A-RDB
; @Chip: LX2160A
; @Copyright: (C) 1989-2022 Lauterbach GmbH, licensed for use with TRACE32(R) only
; --------------------------------------------------------------------------------
; $Id: lx2160-spi.cmm 13132 2024-03-08 00:20:49Z jjeong $
LOCAL &arg1
ENTRY &arg1
&arg1=STRing.UPpeR("&arg1") // for example "PREPAREONLY"
&FLEXSPI_BASE=0x20c0000 ;FLEXSPI0 controller base address
LOCAL &pdd
&pdd=OS.PresentDemoDirectory()
IF SYStem.MODE()<5
(
AREA.view
; initialize and start the debugger
do &pdd/hardware/lx2xxx/scripts/sysup_single.cmm
)
Register.Set M 0x5 ;EL1h
;FlexSPICR1[4:0] divisor, change to /12(0xB) (default: /80(0x14))
Data.Set A:0x1E00900 %Long 0xB
GOSUB FLEXSPIconfig
GOSUB READ_ID_TEST
FLASHFILE.RESet
FLASHFILE.Create 0x0000000--0x3FFFFFF 0x20000 Byte /DIEBASE 0x0
FLASHFILE.Create 0x4000000--0x7FFFFFF 0x20000 Byte /DIEBASE 0x4000000
//FLASHFILE.CONFIG <QuadSPI Base>
FLASHFILE.CONFIG &FLEXSPI_BASE
//FLASHFILE.TARGET <Code_range> <Data_range> <Algorithm file>
FLASHFILE.TARGET 0x18010000++0x2FFF 0x18014000++0x23FF &pdd/flash/byte/spi4b64_flexspi.bin /KEEP /STACKSIZE 0x200
FLASHFILE.GETID
//End of the test prepareonly
IF "&arg1"=="PREPAREONLY"
ENDDO
FLASHFILE.DUMP 0x0
//Erase Serial FLASH
;FLASHFILE.ERASE 0x0--0xFFFFF
//Write
;FLASHFILE.LOAD * 0x0
;FLASHFILE.LOAD * 0x0 /ComPare ;verify
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 0xFFFF8000
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 0x10000 ; 0x10000 * 0x400(KB unit size) = 64MB Flash_A0 size.
Data.Set A:&FLEXSPI_BASE+0x064 %LE %Long 0x10000 ; 0x10000 * 0x400(KB unit size) = 64MB Flash_A1 size.
Data.Set A:&FLEXSPI_BASE+0x068 %LE %Long 0x10000
Data.Set A:&FLEXSPI_BASE+0x06C %LE %Long 0x10000
//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 %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
// Octal Fast Read I/O 1-8-8, 16 dummy cycles
; Data.Set A:&FLEXSPI_BASE+0x200 %LE %Long 0x0B2004CC ; 0xCB/0xCC: 3/4Bytes Octal Fast Read
; Data.Set A:&FLEXSPI_BASE+0x204 %LE %Long 0x27043310
; Data.Set A:&FLEXSPI_BASE+0x208 %LE %Long 0x00
; Data.Set A:&FLEXSPI_BASE+0x20C %LE %Long 0x00
//FAST READ Quad I/O 1-4-4, 6 dummy cycles
; 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 1-1-1, no dummy cycles
; 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
)
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 0x1 ;IPRXFCR
Data.Set A:&FLEXSPI_BASE+0xBC %Long 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 " (Manufacturer)"
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
)