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

304 lines
8.7 KiB
Plaintext

; --------------------------------------------------------------------------------
; @Title: eMMC FLASH Programming template for the S32G274 S32G254 S32G233 S32G234
; @Description:
; The eMMC flash is connected to the uSDHC controller.
;
; SRAM: 0x34000000
; eMMC (controller) Base: 0x402F0000
; Prerequisites:
; set Bootmode to eMMC:
; BootMode0[1:2]=0y10 SDCARD/EMMC
; BootMode1[1:2]=0y00
; BOOT_CFG[6:7] = 0y10 (SD), 0y11 (MMC/eMMC)
; J50 : 2&3 short for eMMC, 1&2 for SD
;
; @Chip: S32G274
; @Board:
; @Author: JIM
; @Keywords: eMMC
; @Copyright: (C) 1989-2022 Lauterbach GmbH, licensed for use with TRACE32(R) only
; --------------------------------------------------------------------------------
; $Id: s32g274-emmc.cmm 12996 2024-01-29 03:23:55Z jjeong $
LOCAL &arg1
ENTRY &arg1
&arg1=STRing.UPpeR("&arg1") // for example "PREPAREONLY"
LOCAL &MMC_BASE
LOCAL &SDCARD
LOCAL &flash_algorithm
&MMC_BASE=0x402F0000
&SDCARD=FALSE() ; SDCARD=TRUE() for SDCARD , SDCARD=FALSE() for eMMC
&SDCARD=TRUE() ; SDCARD(1) or EMMC(0)
IF !&SDCARD
&flash_algorithm="~~/demo/arm/flash/byte/emmc_imx6.bin"
ELSE
&flash_algorithm="~~/demo/arm/flash/byte/emmcsd_imx6.bin"
; ------------------------------------------------------------------------------
; Setup CPU
; Use an error handler for SYStem.Up
; In case the board flash is empty, then no core is booting and we have
; to wake up the core manually
IF !SYStem.Up()
(
RESet
SYStem.CPU S32G274A-M7-0
SYStem.CONFIG.DEBUGPORTTYPE JTAG
SYStem.Option DUALPORT ON
SYStem.MemAccess DAP
SYStem.JtagClock 10MHz
Trace.DISable
ETM.OFF
ITM.OFF
ON ERROR GOSUB
(
ON ERROR DEFault
DO &pdd/hardware/s32g2/scripts/s32g2_connect_m7_0.cmm
RETURN
)
SYStem.Up
ON ERROR inherit
)
; ------------------------------------------------------------------------------
; Flash Controller Power & Clock Enable
Data.Set SD:0x40030680 %LE %Long 0x1C000000 ;MUX_14_CSC, Clock Mux 14 Selet Control Register
Data.Set SD:0x40030688 %LE %Long 0x80030000 ;MUX_14_DC_0, Clock Mux 14 divider 0 Control Register
; ------------------------------------------------------------------------------
; Flash Pin Mux Configuration
GOSUB Pin_Mux_Configuration
; ------------------------------------------------------------------------------
; 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
LOCAL &pdd
&pdd=OS.PresentDemoDirectory()
; ------------------------------------------------------------------------------
; Init SRAM (16KB) for the flash algorithm
Data.Set AD:0x34000000++0x3FFF %Long 0x0
; ------------------------------------------------------------------------------
; Flash declaration
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++0x42FF &flash_algorithm /KEEP /DUALPORT
//maybe, do not need the sd/mmc clock down
//Data.Set &MMC_BASE+0x2C %LE %Long 0x008E10F8 ; 400KHz clk
FLASHFILE.GETID
Data.Set &MMC_BASE+0x2C %LE %Long 0x008E0408 ; 25Mhz clk
IF !&SDCARD
FLASHFILE.GETEXTCSD ;MMC command
//End of the test prepareonly
IF "&arg1"=="PREPAREONLY"
ENDDO
FLASHFILE.DUMP 0x0 ; Read NAND
;FLASHFILE.ERASE 0x0--0xFFFFF ; Erase NAND
;FLASHFILE.LOAD * 0x0 ; Write NAND
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
)