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

187 lines
4.8 KiB
Plaintext

; --------------------------------------------------------------------------------
; @Title: PXA920 eMMC FLASH Programming Script
; @Description:
; eMMC FLASH(SAMSUNG, 4GB eMMC) is connected MMC3
;
; S(D)RAM: 0xD100A000
; MMC3 Register : 0xD4281000
;
; @Author: jjeong
; @Chip: PXA920
; @Keywords: SAMSUNG eMMC
; @Copyright: (C) 1989-2022 Lauterbach GmbH, licensed for use with TRACE32(R) only
; --------------------------------------------------------------------------------
; $Id: pxa920-emmc.cmm 10516 2022-02-02 11:39:30Z bschroefel $
LOCAL &arg1
ENTRY &arg1
&arg1=STRing.UPpeR("&arg1") // for example "PREPAREONLY"
&MMC_BASE=0xD4281000
AREA.RESet
AREA.view
SYStem.RESet
SYStem.CPU PXA920
SYStem.MemAccess Denied
SYStem.JtagClock 10000000.
SYStem.Option IMASKASM OFF
SYStem.Option IMASKHLL OFF
SYStem.Option TURBO OFF
SYStem.Option RESBREAK OFF
SYStem.Option INTDIS OFF
SYStem.Option DBGACK ON
SYStem.Option SHOWERROR ON
SYStem.Option ENRESET ON
SYStem.Option WAITRESET 100.ms
SYStem.Option SOFTWORD OFF
SYStem.Option SOFTLONG OFF
SYStem.Option TRST ON
SYStem.Option DACR ON
SYStem.Option AMBA OFF
SYStem.Option NODATA OFF
SYStem.Option EXEC OFF
SYStem.Option DISMODE AUTO
SYStem.Option PC 0x0
SYStem.Mode Up
PER.Set.simple C15:0x1 %Long 0x58878 ; disable mmu & cache
GOSUB MMC_Enable
GOSUB READ_ID_TEST
Break.RESet
FLASHFILE.RESet
;FLASHFILE.CONFIG <eMMC controller> <0x0> <0x0>
FLASHFILE.CONFIG 0xD4281000 0x0 0x0
;FLASHFILE.TARGET <<code range>> <<data range>> <<algorithm file>>
FLASHFILE.TARGET 0xD100A000++0x1fff 0xD100C000++0x1fff ~~/demo/arm/flash/byte/emmc.bin /KEEP
Data.Set A:0xD428102C %LE %Long 0x0E8007 ; pls, make a slower clk around 400Khz for the initialization of MMC
FLASHFILE.GETID
Data.Set A:0xD428102C %LE %Long 0x0E0207 ; pls, make a higher clk around 25Mhz
//Get EXTended CSD registers
FLASHFILE.GETEXTCSD
//End of the test prepareonly
IF "&arg1"=="PREPAREONLY"
ENDDO
;FLASHFILE.DUMP 0x0 ; Read eMMC
;FLASHFILE.ERASE 0x0--0xFFFFF ; Erase eMMC
;FLASHFILE.LOAD * 0x0 ; Write eMMC
ENDDO
MMC_Enable:
PER.Set.simple C15:0x3 %Long 0xFFFFFFFF
Data.Set A:0xD4282110 %LE %Long 0x3
Data.Set A:0xD4282114 %LE %Long 0x3
Data.Set A:0xD4015034 %LE %Long 0x33
Data.Set A:0xD4014084 %LE %Long Data.Long(A:0xD4014084)|0x1
Data.Set A:0xD4282868 %LE %Long 0x9
Data.Set A:0xD401503C %LE %Long 0x7
WAIT 10.ms
Data.Set A:0xD401503C %LE %Long 0x3
Data.Set A:0xD4015024 %LE %Long Data.Long(A:0xD4015024)|0x812
// PMUM_ACGR
Data.Set A:0xD4015024 %LE %Long Data.Long(A:0xD4015024)|0x8816
//PMUA_NF_CLK_RES_CTRL
Data.Set A:0xD4282860 %LE %Long Data.Long(A:0xD4282860)|0x98
//configure SDHC0
Data.Set A:0xd4282854 %LE %Long Data.Long(A:0xd4282854)&0xFFFFFFFC
Data.Set A:0xd4282854 %LE %Long 0x9
//configure SDHC2 for MMC3
Data.Set A:0xD42828E0 %LE %Long Data.Long(A:0xD42828E0)&0xFFFFFFFC
Data.Set A:0xD42828E0 %LE %Long 0x1B
//configure MMC3 MFPR pins
Data.Set A:0xD401E05C %LE %Long 0x10c1
Data.Set A:0xD401E064 %LE %Long 0x10c1
Data.Set A:0xD401E040 %LE %Long 0x10c1
Data.Set A:0xD401E03C %LE %Long 0x10c1
Data.Set A:0xD401E038 %LE %Long 0x10c1
Data.Set A:0xD401E034 %LE %Long 0x10c1
Data.Set A:0xD401E030 %LE %Long 0x10c1
Data.Set A:0xD401E02C %LE %Long 0x10c1
Data.Set A:0xD401E028 %LE %Long 0x10c1
Data.Set A:0xD401E024 %LE %Long 0x10c1
//configure SD Host controller
Data.Set A:0xD4281028 %LE %Long 0x0F00 ; SD BUS POWER ON
Data.Set A:0xD428102C %LE %Long 0x0E8007 ; 400Khz clk
Data.Set A:0xD42810E0 %LE %Long 0x405 ; fifo reg
Data.Set A:0xD42810E8 %LE %Long 0x03fff
RETURN
READ_ID_TEST:
//MMC interface, not SD(HC)
//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
)
//CMD1
RePeaT 10.
(
Data.Set &MMC_BASE+0x30 %Long 0xFFFFFFFF ;clear status
Data.Set &MMC_BASE+0x8 %Long 0x40FF8000 ;arg
Data.Set &MMC_BASE+0xc %Long 0x01020000 ;cmd1
WAIT 100.ms
&resp=Data.Long(A:(&MMC_BASE+0x10))
//print "CMD1 resp: 0x" &resp
IF (&resp&0x80000000)==0x80000000
(
GOTO jump_cmd2
)
)
PRINT "CMD1 fail"
END
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
//CMD10
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 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