Files
Gen4_R-Car_Trace32/2_Trunk/demo/arm/flash/s32g399-cm7-emmcsd.cmm
2025-10-14 09:52:32 +09:00

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 &parameters
ENTRY %LINE &parameters
LOCAL &param_prepareonly
&param_prepareonly=(STRing.SCAN(STRing.UPpeR("&parameters"),"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 &param_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
)