309 lines
9.0 KiB
Plaintext
309 lines
9.0 KiB
Plaintext
; --------------------------------------------------------------------------------
|
|
; @Title: SD/eMMC Flash script for S32G399A-M7 on S32G-PROCEVB3 (RAM)
|
|
; @Description:
|
|
; SD card into the slot (J34)
|
|
; eMMC is MTFC32GAPALBH (U60A)
|
|
; the jumper J50 setting is
|
|
; 1-2 : SD card (default)
|
|
; 2-3 : eMMC
|
|
;
|
|
; @Keywords: ARM, Cortex-M7, Flash
|
|
; @Author: JIM
|
|
; @Board: S32G-PROCEVB3
|
|
; @Chip: S32G399A
|
|
; @Copyright: (C) 1989-2024 Lauterbach GmbH, licensed for use with TRACE32(R) only
|
|
; --------------------------------------------------------------------------------
|
|
; $Id: s32g399-cm7-emmcsd.cmm 13204 2024-03-19 09:53:12Z jjeong $
|
|
|
|
&MMC_BASE=0x402F0000
|
|
&SDCARD=TRUE() ; SDCARD=TRUE() for SDCARD , SDCARD=FALSE() for eMMC
|
|
|
|
PRIVATE ¶meters
|
|
ENTRY %LINE ¶meters
|
|
|
|
LOCAL ¶m_prepareonly
|
|
¶m_prepareonly=(STRing.SCAN(STRing.UPpeR("¶meters"),"PREPAREONLY",0)!=-1)
|
|
|
|
; ------------------------------------------------------------------------------
|
|
; Setup CPU
|
|
SYStem.Down
|
|
IF !SYStem.Up()
|
|
(
|
|
; --------------------------------------------------------------------------------
|
|
; initialize and start the debugger
|
|
RESet
|
|
SYStem.CPU S32G399A-M7
|
|
CORE.ASSIGN 1.
|
|
SYStem.CONFIG.DEBUGPORTTYPE JTAG
|
|
SYStem.Option.DUALPORT ON
|
|
SYStem.MemAccess DAP
|
|
SYStem.JtagClock 10MHz
|
|
Trace.DISable
|
|
ETM.OFF
|
|
ITM.OFF
|
|
|
|
&pdd=OS.PresentDemoDirectory()
|
|
|
|
ON ERROR GOSUB
|
|
(
|
|
ON ERROR DEFault
|
|
DO &pdd/hardware/s32g3/misc/s32g3_connect_m7_0.cmm
|
|
RETURN
|
|
)
|
|
SYStem.Up
|
|
ON ERROR inherit
|
|
|
|
; Disable all watchdogs
|
|
DO &pdd/hardware/s32g3/misc/s32g3_disable_watchdog.cmm
|
|
|
|
; Init SRAM
|
|
DO &pdd/hardware/s32g3/misc/s32g3_init_sram.cmm
|
|
)
|
|
|
|
; ------------------------------------------------------------------------------
|
|
; Flash Pin Mux Configuration
|
|
GOSUB Pin_Mux_Configuration
|
|
|
|
; ------------------------------------------------------------------------------
|
|
; Flash Controller Power & Clock Enable
|
|
Data.Set A:0x40030680 %LE %Long 0x0 ;MUX_14_CSC, Clock Mux 14 Selet Control Register
|
|
Data.Set A:0x40030688 %Long %LE 0x80070000 ;MUX_14_DC_0, Clock Mux 14 divider 0 Control Register, around 10.Mhz
|
|
|
|
; ------------------------------------------------------------------------------
|
|
; Flash Controller Init
|
|
Data.Set AD:&MMC_BASE+0x04 %LE %Long 0x00010200 ; blk size (512 bytes),cnt (1 byte)
|
|
Data.Set AD:&MMC_BASE+0x28 %LE %Long 0x08800020 ; burst length enabled (INCR1), little endian
|
|
Data.Set AD:&MMC_BASE+0x2C %LE %Long 0x008E0408 ; clk
|
|
Data.Set AD:&MMC_BASE+0x34 %LE %Long 0x007F0037 ; BRR,BWR, TCI, CCI interrupt enable
|
|
Data.Set AD:&MMC_BASE+0x38 %LE %Long 0x007F0037 ; BRR,BWR, TCI, CCI interrupt enable
|
|
Data.Set AD:&MMC_BASE+0x44 %LE %Long 0x00100010 ;read/write fifo threshold level 64bytes
|
|
|
|
; ------------------------------------------------------------------------------
|
|
; Flash Read ID Test
|
|
GOSUB READ_ID_TEST
|
|
|
|
; ------------------------------------------------------------------------------
|
|
; Init SRAM (16KB) for the flash algorithm
|
|
Data.Set AD:0x34000000++0x3FFF %Long 0x0
|
|
|
|
; ------------------------------------------------------------------------------
|
|
; Flash declaration
|
|
IF !&SDCARD
|
|
&flash_algorithm="~~/demo/arm/flash/byte/emmc_imx6.bin"
|
|
ELSE
|
|
&flash_algorithm="~~/demo/arm/flash/byte/emmcsd_imx6.bin"
|
|
|
|
Break.RESet
|
|
|
|
FLASHFILE.RESet
|
|
|
|
;FLASHFILE.CONFIG <eMMC controller> <0x0> <0x0>
|
|
FLASHFILE.CONFIG &MMC_BASE 0x0 0x0
|
|
|
|
//FLASHFILE.TARGET <Code_range> <Data_range> <Algorithm file>
|
|
FLASHFILE.TARGET 0x34000000++0x1FFF E:0x34002000++0x27FF &flash_algorithm /KEEP /DualPort
|
|
|
|
//maybe, do not need the sd/mmc clock down
|
|
Data.Set &MMC_BASE+0x2C %LE %Long 0x008E1018 ; 400KHz clk
|
|
FLASHFILE.GETID
|
|
|
|
Data.Set &MMC_BASE+0x2C %LE %Long 0x008E0008 ; 25Mhz clk
|
|
|
|
IF !&SDCARD
|
|
FLASHFILE.GETEXTCSD ;MMC command
|
|
|
|
; Flash script ends here if called with parameter PREPAREONLY
|
|
IF ¶m_prepareonly
|
|
ENDDO PREPAREDONE
|
|
|
|
//When you access to the other partition on the flash
|
|
;IF !&SDCARD
|
|
;(
|
|
; FLASHFILE.SETEXTCSD 179. 0x00 ; access: partition null, no boot, access: no boot partition
|
|
; FLASHFILE.SETEXTCSD 179. 0x48 ; access: partition null
|
|
; FLASHFILE.SETEXTCSD 179. 0x49 ; access: partition boot 1
|
|
; FLASHFILE.SETEXTCSD 179. 0x4A ; access: partition boot 2
|
|
;)
|
|
|
|
FLASHFILE.DUMP 0x0 ; Read eMMC
|
|
;FLASHFILE.ERASE 0x0--0xFFFFF ; Erase eMMC
|
|
;FLASHFILE.LOAD * 0x0 ; Write eMMC
|
|
|
|
ENDDO
|
|
|
|
READ_ID_TEST:
|
|
(
|
|
LOCAL &cardaddress
|
|
|
|
IF !&SDCARD
|
|
&OCR=0x40FF8080 ; init with low voltage power 1.7~1.95v, ex. eMMC
|
|
ELSE
|
|
&OCR=0x40FF8000 ; init with defualt voltage power 2.7~3.6v, ex. SD
|
|
|
|
//CMD0
|
|
RePeaT 2.
|
|
(
|
|
Data.Set &MMC_BASE+0x30 %Long 0xFFFFFFFF ;clear status
|
|
Data.Set &MMC_BASE+0x8 %Long 0x0 ;arg
|
|
Data.Set &MMC_BASE+0xc %Long 0x0 ;cmd
|
|
WAIT 10.ms
|
|
)
|
|
|
|
IF !&SDCARD
|
|
(
|
|
//CMD1
|
|
RePeaT 10.
|
|
(
|
|
Data.Set &MMC_BASE+0x30 %Long 0xFFFFFFFF ;clear status
|
|
Data.Set &MMC_BASE+0x8 %Long &OCR ;arg
|
|
Data.Set &MMC_BASE+0xc %Long 0x01020000 ;cmd1
|
|
&resp=Data.Long(A:(&MMC_BASE+0x10))
|
|
WAIT 100.ms
|
|
//print "CMD1 resp: 0x" &resp
|
|
IF (&resp&0x80000000)==0x80000000
|
|
(
|
|
GOTO jump_cmd2
|
|
)
|
|
)
|
|
|
|
PRINT "CMD1 fail"
|
|
END
|
|
)
|
|
ELSE
|
|
(
|
|
|
|
//CMD8, is madatory to intialize High Capacity SD Memory Card
|
|
RePeaT 2.
|
|
(
|
|
Data.Set &MMC_BASE+0x30 %Long 0xFFFFFFFF ;clear status
|
|
Data.Set &MMC_BASE+0x8 %Long 0x1AA ;arg
|
|
Data.Set &MMC_BASE+0xc %Long 0x08020000 ;cmd
|
|
WAIT 10.ms
|
|
|
|
&status=Data.Long(A:&MMC_BASE+0x30)
|
|
IF (&status&0x30000)==0x0
|
|
(
|
|
PRINT "passed CMD8(voltage check)"
|
|
GOTO jump_cmd55
|
|
)
|
|
ELSE
|
|
(
|
|
//CMD0
|
|
Data.Set &MMC_BASE+0x30 %Long 0xFFFFFFFF ;clear status
|
|
Data.Set &MMC_BASE+0x8 %Long 0x0 ;arg
|
|
Data.Set &MMC_BASE+0xc %Long 0x0 ;cmd
|
|
WAIT 10.ms
|
|
)
|
|
)
|
|
|
|
jump_cmd55:
|
|
//CMD55
|
|
RePeaT 10.
|
|
(
|
|
Data.Set &MMC_BASE+0x30 %Long 0xFFFFFFFF ;clear status
|
|
Data.Set &MMC_BASE+0x8 %Long 0x0 ;arg
|
|
Data.Set &MMC_BASE+0xc %Long 0x37020000 ;cmd55, resp1
|
|
WAIT 100.ms
|
|
|
|
//ACMD41
|
|
Data.Set &MMC_BASE+0x30 %Long 0xFFFFFFFF ;clear status
|
|
Data.Set &MMC_BASE+0x8 %Long &OCR ;arg
|
|
Data.Set &MMC_BASE+0xc %Long 0x29020000 ;cmd41, resp1
|
|
WAIT 100.ms
|
|
|
|
&resp=Data.Long(A:(&MMC_BASE+0x10))
|
|
//print "CMD1 resp: 0x" &resp
|
|
IF (&resp&0x80000000)==0x80000000
|
|
(
|
|
GOTO jump_cmd2
|
|
)
|
|
)
|
|
)
|
|
|
|
jump_cmd2:
|
|
//CMD2
|
|
Data.Set &MMC_BASE+0x30 %Long 0xFFFFFFFF ;clear status
|
|
Data.Set &MMC_BASE+0x8 %Long 0x0 ;arg
|
|
Data.Set &MMC_BASE+0xc %Long 0x02010000 ;cmd2
|
|
WAIT 10.ms
|
|
|
|
//CMD3
|
|
Data.Set &MMC_BASE+0x30 %Long 0xFFFFFFFF ;clear status
|
|
Data.Set &MMC_BASE+0x8 %Long 0x00010000 ; arg, MMC RCA is (0x0001<<16.)
|
|
Data.Set &MMC_BASE+0xc %Long 0x03020000 ;cmd3
|
|
WAIT 10.ms
|
|
|
|
IF !&SDCARD
|
|
(
|
|
&cardaddress=0x00010000 ; arg, MMC RCA is (0x0001<<16.)
|
|
)
|
|
ELSE
|
|
(
|
|
&cardaddress=Data.Long(A:(&MMC_BASE+0x10))
|
|
&cardaddress=&cardaddress&0xFFFF0000
|
|
)
|
|
|
|
//CMD10
|
|
Data.Set &MMC_BASE+0x30 %Long 0xFFFFFFFF ;clear status
|
|
Data.Set &MMC_BASE+0x8 %Long &cardaddress ; arg, card address
|
|
Data.Set &MMC_BASE+0xc %Long 0x0A010000 ;cmd10
|
|
WAIT 10.ms
|
|
|
|
//Response2
|
|
PRINT "CID register"
|
|
PRINT "[127:104] 0x" Data.Long(A:(&MMC_BASE+0x1c))
|
|
PRINT "[103:72] 0x" Data.Long(A:(&MMC_BASE+0x18))
|
|
PRINT "[71:40] 0x" Data.Long(A:(&MMC_BASE+0x14))
|
|
PRINT "[39:8] 0x" Data.Long(A:(&MMC_BASE+0x10))
|
|
|
|
RETURN
|
|
)
|
|
|
|
|
|
SDRAM_INIT:
|
|
(
|
|
RETURN
|
|
)
|
|
|
|
|
|
Pin_Mux_Configuration:
|
|
(
|
|
Data.Set A:0x4009C2F8 %LE %Long 0x00282021 ; PC_14(46),SD0_CLK_O
|
|
Data.Set A:0x4009CAE0 %LE %Long 0x0 ; Input Mux PC_14(552)
|
|
|
|
Data.Set A:0x4009C2FC %LE %Long 0x00283021 ; PC_15(47),SD0_CMD_0
|
|
Data.Set A:0x4009CA4C %LE %Long 0x2 ; Input Mux PC_14(515), SD0_CMD_I
|
|
|
|
Data.Set A:0x4009C300 %LE %Long 0x00283021 ; PD_00(48) ,SD0_D_O[0]
|
|
Data.Set A:0x4009CA50 %LE %Long 0x2 ; Input Mux PD_00(516) SD0_D_I[0]
|
|
|
|
Data.Set A:0x4009C304 %LE %Long 0x00283021 ; PD_01(49) ,SD0_D_O[1]
|
|
Data.Set A:0x4009CA54 %LE %Long 0x2 ; Input Mux PD_01(517) SD0_D_I[1]
|
|
|
|
Data.Set A:0x4009C308 %LE %Long 0x00283021 ; PD_02(50) ,SD0_D_O[2]
|
|
Data.Set A:0x4009CA60 %LE %Long 0x2 ; Input Mux PD_02(520) SD0_D_I[2]
|
|
|
|
Data.Set A:0x4009C30C %LE %Long 0x00283021 ; PD_03(51) ,SD0_D_O[3]
|
|
Data.Set A:0x4009CA64 %LE %Long 0x2 ; Input Mux PD_03(521) SD0_D_I[3]
|
|
|
|
Data.Set A:0x4009C310 %LE %Long 0x00283021 ; PD_04(52) ,SD0_D_O[4]
|
|
Data.Set A:0x4009CA68 %LE %Long 0x2 ; Input Mux PD_04(522) SD0_D_I[4]
|
|
|
|
Data.Set A:0x4009C314 %LE %Long 0x00283021 ; PD_05(53) ,SD0_D_O[5]
|
|
Data.Set A:0x4009CA6C %LE %Long 0x2 ; Input Mux PD_05(523) SD0_D_I[5]
|
|
|
|
Data.Set A:0x4009C318 %LE %Long 0x00283021 ; PD_06(54) ,SD0_D_O[6]
|
|
Data.Set A:0x4009CA5C %LE %Long 0x2 ; Input Mux PD_06(519) SD0_D_I[6]
|
|
|
|
Data.Set A:0x4009C31C %LE %Long 0x00283021 ; PD_07(55) ,SD0_D_O[7]
|
|
Data.Set A:0x4009CA58 %LE %Long 0x2 ; Input Mux PD_07(518) SD0_D_I[7]
|
|
|
|
Data.Set A:0x4009C320 %LE %Long 0x00202021 ; PD_08(56), SD0_RST
|
|
|
|
Data.Set A:0x4009C324 %LE %Long 0x00010000 ; PD_09(57), GPIO[57]
|
|
|
|
Data.Set A:0x4009C328 %LE %Long 0x00082020 ; PD_10(58), GPIO[58]
|
|
|
|
RETURN
|
|
)
|