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

146 lines
3.5 KiB
Plaintext

; --------------------------------------------------------------------------------
; @Title: R-CARD1 eMMC FLASH Program script
; @Description:
; eMMC FLASH(Micron,MTFC4GM) is connected to MMC Channel 1
;
; SRAM: 0xE63A0000
; MMC(controller) Base: 0xEE220000
;
; @Author: jjeong
; @Chip:
; @Keywords: Flash eMMC RCARD1
; @Copyright: (C) 1989-2022 Lauterbach GmbH, licensed for use with TRACE32(R) only
; --------------------------------------------------------------------------------
; $Id: rcard1-emmc.cmm 10631 2022-02-24 10:36:33Z bschroefel $
LOCAL &arg1
ENTRY &arg1
&arg1=STRing.UPpeR("&arg1") // for example "PREPAREONLY"
SYStem.RESet
SYStem.CPU R7S721063
CORE.ASSIGN 1
SYStem.Up
&pfc_base=0xE6060000
&GPSR2=&pfc_base+0x000C ; PFC_BASE+0x4+n*4
&GPSR3=&pfc_base+0x0010
&IPSR5=&pfc_base+0x0034 ; PFC_BASE+0x20+m*4
&MMC_BASE=0xEE220000
//Enable clk for MMC0
Data.Set A:0xE6150240 %Long Data.Long(A:0xE6150240)&0xFFFFFFEFF ; (1<<8) has to be cleared for MMC0
//Pin mux for MMC0_CLK,CMD,DAT[0:3]
GOSUB WRITE_OR &IPSR5 ((0x1<<29.)|(0x1<<26.)|(0x1<<23.)|(0x1<<20.)|(0x1<<20.)|(0x1<<17.)|(0x1<<14.)|(0x1<<11.)|(0x1<<8.)|(0x1<<5.)|(0x1<<2.)) ;IP5[31:2]
GOSUB WRITE_OR &GPSR3 0x0000003F ; GP3_[5:0]
GOSUB WRITE_OR &GPSR2 0xF0000000 ; GP2_[31:28]
Data.Set &MMC_BASE+0x40 %Long 0x0
Data.Set &MMC_BASE+0x18 %Long 0x01060000 ; clk div /128, clk should be slower <400khz
Data.Set &MMC_BASE+0x44 %Long 0x1cf3f
//FLASH READ ID TEST
GOSUB READ_ID_TEST
programFlash:
FLASHFILE.RESet
FLASHFILE.CONFIG 0xEE220000
// FLASHFILE.TARGET <code range> <data range> <Algorithm file>
FLASHFILE.TARGET 0xe63A0000++0x1FFF 0xe63A2000++0x21FF ~~/demo/arm/flash/byte/emmc_shmmc.bin /KEEP
//Read FLASH Manufacture and Device ID
FLASHFILE.GETID
Data.Set &MMC_BASE+0x18 %Long 0x01000000 ; clk div /2
//print the ECSD registers on AREA
FLASHFILE.GETEXTCSD
//End of the test prepareonly
IF "&arg1"=="PREPAREONLY"
ENDDO
//Read FLASH
FLASHFILE.DUMP 0x0
//Erase FLASH
; FLASHFILE.ERASE 0x0--0xFFFFFF
//Write FLASH
; FLASHFILE.LOAD * 0x0
; FLASHFILE.LOAD * 0x0 /ComPare ;verify
ENDDO
WRITE_OR:
ENTRY &addr &data
&data=((&data)|(Data.Long(A:&addr)))
&not_data=~(&data)
Data.Set &pfc_base %Long &not_data
Data.Set &addr %Long &data
RETURN
READ_ID_TEST:
//CMD0
RePeaT 2.
(
Data.Set &MMC_BASE+0x40 %Long 0xFFFEFFFF ;clear status
Data.Set &MMC_BASE+0x8 %Long 0x0 ;arg
Data.Set &MMC_BASE+0x0 %Long 0x0 ;cmd
WAIT 10.ms
)
//CMD1
RePeaT 10.
(
Data.Set &MMC_BASE+0x40 %Long 0xFFFEFFFF ;clear status
Data.Set &MMC_BASE+0x8 %Long 0x40FF8000 ;arg
Data.Set &MMC_BASE+0x0 %Long (0x1<<24.)|(0x1<<22.) ;cmd1
WAIT 100.ms
&resp=Data.Long(A:(&MMC_BASE+0x2c))
//print "CMD1 resp: 0x" &resp
IF (&resp&0x80000000)==0x80000000
(
GOTO jump_cmd2
)
)
PRINT "CMD1 fail"
END
jump_cmd2:
//CMD2
Data.Set &MMC_BASE+0x40 %Long 0xFFFEFFFF ;clear status
Data.Set &MMC_BASE+0x8 %Long 0x0 ;arg
Data.Set &MMC_BASE+0x0 %Long (0x2<<24.)|(0x2<<22.) ;cmd2
WAIT 10.ms
//CMD3
Data.Set &MMC_BASE+0x40 %Long 0xFFFEFFFF ;clear status
Data.Set &MMC_BASE+0x8 %Long 0x00010000 ; arg, MMC RCA is (0x0001<<16.)
Data.Set &MMC_BASE+0x0 %Long (0x3<<24.)|(0x1<<22.) ;cmd3
WAIT 10.ms
//CMD10
Data.Set &MMC_BASE+0x40 %Long 0xFFFEFFFF ;clear status
Data.Set &MMC_BASE+0x8 %Long 0x00010000 ; arg, MMC RCA is (0x0001<<16.)
Data.Set &MMC_BASE+0x0 %Long (0xA<<24.)|(0x2<<22.);cmd10
WAIT 10.ms
//Response2
PRINT "CID register"
PRINT "[127:104] 0x" Data.Long(A:(&MMC_BASE+0x20))
PRINT "[103:72] 0x" Data.Long(A:(&MMC_BASE+0x24))
PRINT "[71:40] 0x" Data.Long(A:(&MMC_BASE+0x28))
PRINT "[39:8] 0x" Data.Long(A:(&MMC_BASE+0x2C))
RETURN