; -------------------------------------------------------------------------------- ; @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 <0x0> <0x0> FLASHFILE.CONFIG &MMC_BASE 0x0 0x0 //FLASHFILE.TARGET 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 )