138 lines
4.6 KiB
Plaintext
138 lines
4.6 KiB
Plaintext
; --------------------------------------------------------------------------------
|
|
; @Title: ATSAMA5D24 Quad SPI Serial FLASH Programming Script
|
|
; @Description:
|
|
; Serial FLASH (ISSI, IS25LP064A) is connected to QSPI Controller
|
|
;
|
|
; Internal SRAM : 0xD0000000
|
|
; Serial FLASH Controller Addr: 0xF0020000
|
|
;
|
|
; QSPI0_SCK :PA22
|
|
; QSPI0_SS :PA23
|
|
; QSPI0_IO[0:3]:PA[24:27]
|
|
;
|
|
; @Author: jjeong
|
|
; @Chip: ATSAMA5D24
|
|
; @Keywords: flash SPI
|
|
; @Copyright: (C) 1989-2022 Lauterbach GmbH, licensed for use with TRACE32(R) only
|
|
; --------------------------------------------------------------------------------
|
|
; $Id: atsama5d2-qspi.cmm 10516 2022-02-02 11:39:30Z bschroefel $
|
|
|
|
&QSPI_BASE=0xF0020000
|
|
|
|
PRIVATE ¶meters
|
|
ENTRY %LINE ¶meters
|
|
|
|
PRIVATE ¶m_prepareonly ¶m_cpu ¶m_dualport
|
|
¶m_prepareonly=(STRing.SCAN(STRing.UPpeR("¶meters"),"PREPAREONLY",0)!=-1)
|
|
¶m_cpu=STRing.SCANAndExtract(STRing.UPpeR("¶meters"),"CPU=","")
|
|
¶m_dualport=STRing.SCANAndExtract(STRing.UPpeR("¶meters"),"DUALPORT=","0")
|
|
|
|
; ------------------------------------------------------------------------------
|
|
; Setup CPU
|
|
RESet
|
|
SYStem.RESet
|
|
SYStem.CPU ATSAMA5D24
|
|
IF VERSION.BUILD()<84227.
|
|
(
|
|
SYStem.CONFIG L2CACHE Type L2C-310
|
|
SYStem.CONFIG L2CACHE Base ANC:0xA00000
|
|
)
|
|
SYStem.Option ResBreak OFF
|
|
SYStem.Option WaitIDCODE 1s
|
|
SYStem.JtagClock CTCK 10MHz
|
|
Trace.DISable
|
|
SYStem.Up
|
|
|
|
Break.RESet
|
|
GOSUB DisableWatchdog
|
|
|
|
; ------------------------------------------------------------------------------
|
|
; Flash Power & Clock Enable
|
|
PER.Set.simple AZSD:0xF0014100 %Long 0x100000 ;QSPI0 enable
|
|
|
|
; ------------------------------------------------------------------------------
|
|
; Flash Pin Mux Configuration
|
|
PER.Set.simple AZSD:0xFC038000 %Long 0x0FC00000 ;PA[27:22]non mask
|
|
PER.Set.simple AZSD:0xFC038004 %Long 0x206 ;Periph_f port_A
|
|
|
|
; ------------------------------------------------------------------------------
|
|
; Flash Controller Init
|
|
PER.Set.simple AZSD:&QSPI_BASE+0x0000 %Long (0x1<<7) ; reset & disable all values
|
|
PER.Set.simple AZSD:&QSPI_BASE+0x0004 %Long 0x02000001 ; !!DLYCS very important!!
|
|
PER.Set.simple AZSD:&QSPI_BASE+0x0014 %Long 0x7FF ; interrupt enable
|
|
PER.Set.simple AZSD:&QSPI_BASE+0x0020 %Long 0x000200 ; 44.Mhz
|
|
PER.Set.simple AZSD:&QSPI_BASE+0x0034 %Long 0x03 ; Read command:03
|
|
PER.Set.simple AZSD:&QSPI_BASE+0x0038 %Long 0x10b0 ; for the memory mapped
|
|
PER.Set.simple AZSD:&QSPI_BASE+0x0000 %Long 0x1 ; Enable QSPI controller
|
|
|
|
; ------------------------------------------------------------------------------
|
|
; Flash Read ID Test
|
|
GOSUB READ_ID_TEST
|
|
|
|
; ------------------------------------------------------------------------------
|
|
; Flash declaration
|
|
FLASH.RESet
|
|
FLASH.Create 0xD0000000++0xFFFFFF 0x10000 TARGET Byte
|
|
FLASH.TARGET A:0x00201000 0x00203000 0x2000 ~~/demo/arm/flash/byte/snor3b_atsama5d2.bin /STACKSIZE 0x200
|
|
|
|
; Flash script ends here if called with parameter PREPAREONLY
|
|
IF ¶m_prepareonly
|
|
ENDDO PREPAREDONE
|
|
|
|
; -------------------------------------------------------------------------------
|
|
; Flash programming example
|
|
DIALOG.YESNO "Program flash memory?"
|
|
LOCAL &progflash
|
|
ENTRY &progflash
|
|
IF &progflash
|
|
(
|
|
FLASH.ReProgram.ALL
|
|
Data.LOAD.auto *
|
|
;Data.LOAD.Binary * 0xD0000000
|
|
FLASH.ReProgram.off
|
|
|
|
; Reset device
|
|
PRINT "Please power-cycle the board after flash program is complete"
|
|
)
|
|
|
|
ENDDO
|
|
|
|
DisableWatchdog:
|
|
(
|
|
; disable the Watchdog
|
|
Data.Set AD:0xF8048044 %Long Data.Long(AD:0xF8048044)|0x8000
|
|
RETURN
|
|
)
|
|
|
|
READ_ID_TEST:
|
|
(
|
|
&tx_reg=&QSPI_BASE+0x000C
|
|
&rx_reg=&QSPI_BASE+0x0008
|
|
&cs_reg=&QSPI_BASE+0x0000
|
|
|
|
PER.Set.simple AZSD:&QSPI_BASE+0x0004 %Long 0x02000018
|
|
|
|
Data.Set &cs_reg %Long ((0x1<<24.)) ;CS Eable
|
|
Data.Set &tx_reg %Long 0x9f9f9f9F ; Write command
|
|
PRINT "read 1st: 0x" Data.Byte(A:&rx_reg) ; dummy
|
|
|
|
Data.Set &tx_reg %Long 0x00 ; Write dummy
|
|
PRINT "read 2nd: 0x" Data.Byte(SD:&rx_reg) " (Manufacture ID)"
|
|
|
|
Data.Set &tx_reg %Long 0x00 ; Write dummy
|
|
PRINT "read 3rd: 0x" Data.Byte(SD:&rx_reg) " (Deveice ID)"
|
|
|
|
Data.Set &tx_reg %Long 0x00 ; Write dummy
|
|
PRINT "read 4th: 0x" Data.Byte(SD:&rx_reg)
|
|
|
|
PER.Set.simple AZSD:&QSPI_BASE+0x0000 %Long (0x1<<7) ; reset & disable all values
|
|
PER.Set.simple AZSD:&QSPI_BASE+0x0004 %Long 0x02000001 ; !!DLYCS very important!!
|
|
PER.Set.simple AZSD:&QSPI_BASE+0x0014 %Long 0x7FF ; interrupt enable
|
|
PER.Set.simple AZSD:&QSPI_BASE+0x0020 %Long 0x000200 ; 44.Mhz
|
|
PER.Set.simple AZSD:&QSPI_BASE+0x0034 %Long 0x03 ; Read command:03
|
|
PER.Set.simple AZSD:&QSPI_BASE+0x0038 %Long 0x10b0 ; for the memory mapped
|
|
PER.Set.simple AZSD:&QSPI_BASE+0x0000 %Long 0x1 ; Enable QSPI controller
|
|
|
|
RETURN
|
|
)
|