192 lines
6.1 KiB
Plaintext
192 lines
6.1 KiB
Plaintext
; --------------------------------------------------------------------------------
|
|
; @Title: TDA3x EVM QSPI FLASH Program script
|
|
; @Description:
|
|
; SRAM: 0x40300000
|
|
; QSPI Base Register Address : 0x4B300000
|
|
; Prerequisites:
|
|
; * Connect Debug Cable to J17 using Adapter
|
|
; Spectrum Digital 701282-0001 (TI20Compact -> MIPI60)
|
|
; Lauterbach LA-3780 (ARM20 -> TI20Compact) please do not use TI-14!
|
|
; or
|
|
; Connect Debug Cable to J17 using Adapter
|
|
; Lauterbach LA-3818 (ARM20/Mictor38 -> MIPI60)
|
|
; * The RESET line must be wired to the EVM, using the TI20Compact/MIPI60
|
|
; header this is possible.
|
|
; * set SYSBOOT[3..0] = 0y0000 - QSPI_1 nonXIP
|
|
; * set SYSBOOT[4] = 0y1 - Memory preferred booting
|
|
;
|
|
; @Keywords: TDA3xx (ADAS Low) QSPI
|
|
; @Author: AME JIM
|
|
; @Board: TDA3X EVM
|
|
; @Chip: TDA3x
|
|
; @Copyright: (C) 1989-2022 Lauterbach GmbH, licensed for use with TRACE32(R) only
|
|
; --------------------------------------------------------------------------------
|
|
; $Id: tda3x-spi.cmm 10516 2022-02-02 11:39:30Z bschroefel $
|
|
|
|
&QSPI_BASE=0x4B300000
|
|
|
|
LOCAL &arg1
|
|
ENTRY &arg1
|
|
&arg1=STRing.UPpeR("&arg1") // for example "PREPAREONLY"
|
|
|
|
; --------------------------------------------------------------------------------
|
|
; check prerequisites
|
|
IF VERSION.BUILD.BASE()<76582.
|
|
(
|
|
PRINT %ERROR "Please use more recent Software! Contact support@lauterbach.com."
|
|
ENDDO
|
|
)
|
|
|
|
; --------------------------------------------------------------------------------
|
|
; initialize and start the debugger
|
|
RESet
|
|
SYStem.RESet
|
|
SYStem.CPU TDA3XIPU-CORE0
|
|
SYStem.CONFIG.DEBUGPORTTYPE JTAG
|
|
SYStem.Option DUALPORT ON
|
|
; enable RESET using the reset line only
|
|
; <reset settings>
|
|
SYStem.Option EnReset ON
|
|
SYStem.Option ResBreak ON
|
|
SYStem.Option SYSRESETREQ OFF
|
|
SYStem.Option VECTRESET OFF
|
|
SYStem.Option ICEPICK SystemReset.OFF WaitInReset.OFF
|
|
; </reset settings>
|
|
SYStem.MemAccess DAP
|
|
SYStem.JtagClock CTCK 10MHz
|
|
; assert RESET line and stop at reset vector
|
|
SYStem.Up
|
|
|
|
; clear the ROM_AUXBOOT0 and reset again
|
|
Data.Set AD:0x4A003CA8 %Long 0x00
|
|
SYStem.Up
|
|
|
|
; setup MMU
|
|
; mapping channel=0, size=large, 0x40000000++0x1fffffff->0x40000000
|
|
; => OCRAM, QSPI controller, Clock controller, IO Mux
|
|
GOSUB SetMmuEntry "0." "0." "0x40000000" "0x40000000" "0x3"
|
|
; mapping channel=0; size=small; 0x0++0x3fff->0x55020000
|
|
GOSUB SetMmuEntry "0." "2." "0x0" "0x55020000" "0x1000B "
|
|
|
|
// Enable source clocks to qspi... could also ensure pll lock but will skip
|
|
Data.Set AD:0x4A009838 %Long 0x01000002
|
|
|
|
// setup io's for 15x15 package on cs0
|
|
Data.Set AD:0x4A002558 %Long 0x00000100 ; make linear show up at 0x5c000000
|
|
Data.Set AD:0x4A00341C %Long 0x00010001 ; qspi1_cs0, CTRL_CORE_PAD_GPMC_CS1, GPMC_CS1_MUXMODE
|
|
Data.Set AD:0x4A003420 %Long 0x00060001 ; qspi1_d3, CTRL_CORE_PAD_GPMC_CS2, GPMC_CS2_MUXMODE
|
|
Data.Set AD:0x4A003424 %Long 0x00060001 ; qspi1_d2, CTRL_CORE_PAD_GPMC_CS3, GPMC_CS3_MUXMODE
|
|
Data.Set AD:0x4A003428 %Long 0x00060001 ; qspi1_d0, CTRL_CORE_PAD_GPMC_CS4, GPMC_CS4_MUXMODE
|
|
Data.Set AD:0x4A00342C %Long 0x00060001 ; qspi1_d1, CTRL_CORE_PAD_GPMC_CS5, GPMC_CS5_MUXMODE
|
|
Data.Set AD:0x4A003430 %Long 0x00010001 ; qspi1_sclk , CTRL_CORE_PAD_GPMC_CS6, GPMC_CS6_MUXMODE
|
|
Data.Set AD:0x4A003444 %Long 0x00060001 ; spi1_rtclk, CTRL_CORE_PAD_GPMC_AD3, GPMC_AD3_MUXMODE
|
|
|
|
Data.Set AD:&QSPI_BASE+0x40 %LE %Long 0x00000009 ; clk DIV (can be faster)
|
|
Data.Set AD:&QSPI_BASE+0x40 %LE %Long 0x80000009 ; QSPI_SPI_CLOCK_CNTRL_REG, clken[31] + clk div[11:0]
|
|
Data.Set AD:&QSPI_BASE+0x44 %LE %Long 0x00000005 ; sck-parks-at-1, falling edge shift
|
|
|
|
//[28:24] dummy bits if Dbyte=0 (0)
|
|
//[23:16] write command (use cmd2 for writes)
|
|
//[13:12] read type (reads are quad using all dataX)
|
|
//[11:10] Number of Dummy bytes (0 dummy bytes)
|
|
//[9:8] Number of Bytes n-1 (3 addr bytes)
|
|
//[7:0] Read CMD (use cmd3 for reads)
|
|
Data.Set AD:&QSPI_BASE+0x54 %LE %Long 0x20203 ; QSPI_SPI_SETUP0_REG
|
|
|
|
GOSUB READ_ID_TEST
|
|
|
|
programFlash:
|
|
|
|
FLASHFILE.RESet
|
|
|
|
//FLASHFILE.CONFIG <QuadSPI Base> 0x0 0x0 <cs>
|
|
FLASHFILE.CONFIG &QSPI_BASE 0x0 0x0 0x0
|
|
|
|
//FLASHFILE.TARGET <Code_range> <Data_range> <Algorithm file>
|
|
FLASHFILE.TARGET 0x1000++0x1FFF EAHB2:0x40302000++0x1FFF ~~/demo/arm/flash/byte/spi4b64_tiqspi.bin /STACKSIZE 0x200 /DualPort /KEEP
|
|
|
|
FLASHFILE.GETID
|
|
|
|
//End of the test prepareonly
|
|
IF "&arg1"=="PREPAREONLY"
|
|
ENDDO
|
|
|
|
FLASHFILE.DUMP 0x0
|
|
|
|
;FLASHFILE.Erase 0x0--0xFFFFF ; erase range
|
|
;FLASHFILE.LOAD * 0x0
|
|
|
|
ENDDO
|
|
|
|
READ_ID_TEST:
|
|
(
|
|
&QSPI_CMD_REG=&QSPI_BASE+0x48
|
|
&QSPI_DAT_REG=&QSPI_BASE+0x50
|
|
&QSPI_STAT_REG=&QSPI_BASE+0x4C
|
|
|
|
&RE=(0x1<<16.) ; read
|
|
&WR=(0x2<<16.) ; write
|
|
&END=(0x4<<16.) ;
|
|
&cmd_reg_def=0x0|(0x7<<19.)|(0x0<<28.)|0xFFF ;
|
|
|
|
Data.Set AD:&QSPI_DAT_REG %Long 0x9F ;write data reg
|
|
Data.Set AD:&QSPI_CMD_REG %Long (&cmd_reg_def|&WR);cmd reg
|
|
//print "status 0x" data.long(A:&QSPI_STAT_REG) ;read status reg
|
|
|
|
Data.Set AD:&QSPI_CMD_REG %Long (&cmd_reg_def|&RE) ;cmd reg
|
|
PRINT "read 1st 0x" Data.Long(AD:&QSPI_DAT_REG) " (manufacture ID)" ; read data reg
|
|
|
|
Data.Set AD:&QSPI_CMD_REG %Long (&cmd_reg_def|&RE) ;cmd reg
|
|
PRINT "read 2nd 0x" Data.Long(AD:&QSPI_DAT_REG) " (device ID)" ; read data reg
|
|
|
|
Data.Set AD:&QSPI_CMD_REG %Long (&cmd_reg_def|&RE);cmd reg
|
|
PRINT "read 3rd 0x" Data.Long(AD:&QSPI_DAT_REG) ; read data reg
|
|
|
|
Data.Set AD:&QSPI_BASE+0x48 %Long (&cmd_reg_def|&END)
|
|
WAIT 100.ms
|
|
|
|
RETURN
|
|
)
|
|
|
|
SetMmuEntry: ;(channel, small=2/med=1/large=0, virt, phys, policy)
|
|
(
|
|
PRIVATE &base
|
|
PARAMETERS &channel &size &virt &phys &policy
|
|
&base=0x55080800
|
|
&base=&base+&channel*0x4
|
|
IF (&size==0.) ; large
|
|
(
|
|
; ADDR
|
|
Data.Set AD:&base+0x00 %Long &virt
|
|
; XLTE
|
|
Data.Set AD:&base+0x20 %Long &phys
|
|
; POLICY
|
|
Data.Set AD:&base+0x40 %Long &policy
|
|
)
|
|
ELSE IF (&size==1.) ; medium
|
|
(
|
|
; ADDR
|
|
Data.Set AD:&base+0x60 %Long &virt
|
|
; XLTE
|
|
Data.Set AD:&base+0xA0 %Long &phys
|
|
; POLICY
|
|
Data.Set AD:&base+0xE0 %Long &policy
|
|
)
|
|
ELSE IF (&size==2.)
|
|
(
|
|
; ADDR
|
|
Data.Set AD:&base+0x120 %Long &virt
|
|
; XLTE
|
|
Data.Set AD:&base+0x1A0 %Long &phys
|
|
; POLICY
|
|
Data.Set AD:&base+0x220 %Long &policy
|
|
)
|
|
ELSE
|
|
(
|
|
PRINT %ERROR "Wrong Usage"
|
|
STOP
|
|
ENDDO
|
|
)
|
|
RETURN
|
|
)
|