304 lines
8.7 KiB
Plaintext
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
|
|
)
|