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

190 lines
4.2 KiB
Plaintext

; --------------------------------------------------------------------------------
; @Title: eMMC FLASH Programming script for OMAP3530
; @Description:
; eMMC FLASH(Numonyx, NAND16GXH) is connected
;
; Internal SRAM: 0x40200000
;
; SD/MMC Controller Register : 0x4809C100
;
;
; @Author: jjeong
; @Chip: OMAP3530
; @Keywords: Numonyx NAND16GXH eMMC
; @Copyright: (C) 1989-2022 Lauterbach GmbH, licensed for use with TRACE32(R) only
; --------------------------------------------------------------------------------
; $Id: omap3530-emmc.cmm 10516 2022-02-02 11:39:30Z bschroefel $
LOCAL &arg1
ENTRY &arg1
&arg1=STRing.UPpeR("&arg1") // for example "PREPAREONLY"
&MMC_BASE=0x4809C100
SYStem.CPU OMAP3530
SYStem.JtagClock RTCK
ETM.OFF
SYStem.Up
Go.direct
WAIT 2.s
IF STATE.RUN()
Break.direct
Data.Set 0x4809C12C %Long 000E3C07 ; system control
Data.Set 0x4809C108 %Long 0x10000
Data.Set 0x4809C10C %Long 0x0A010000
Data.Set 0x4809C104 %Long 0x200 ; transfer blk size
Data.Set 0x4809C134 %Long 0x307f0033 ; enable the BRR bit
GOSUB disable_watchdog
GOSUB READ_ID_TEST
FLASHFILE.RESet
//FLASHFILE.CONFIG <MMC Controller Base> 0x0 0x0
FLASHFILE.CONFIG 0x4809C100 0x0 0x0
//FLASHFILE.target <Code_range> <Data_range> <Algorithm file>
FLASHFILE.TARGET 0x40200000++0x1FFF 0x40204000++0x1FFF ~~/demo/arm/flash/byte/emmc_omap.bin
//Read FLASH Manufacture and Device ID
Data.Set 0x4809C12C %Long 0x000E3C07 ; 400Khz , the Card identification mode
FLASHFILE.GETID
Data.Set 0x4809C12C %Long 0x000E0807 ; higher clock speed for the Data transfer mode
FLASHFILE.GETEXTCSD
//End of the test prepareonly
IF "&arg1"=="PREPAREONLY"
ENDDO
DIALOG.YESNO "Program flash memory?"
ENTRY &progflash
IF &progflash
(
//Erase FLASH
FLASHFILE.Erase 0x0--0xFFFFFF
//Write FLASH
FLASHFILE.LOAD.binary * 0x0
//Verify FLASH
; FLASHFILE.LOAD * 0x0 /ComPare
)
//Dump FLASH
FLASHFILE.DUMP 0x0
ENDDO
disable_watchdog:
; Enable Interface Clock
Data.Set 0x48004C10 %Long 0x20
; Enable functional clock
Data.Set 0x48004C00 %Long 0x20
; Check that module is IDLE
WAIT (Data.Long(SD:0x48004C20)&0x20)==0
; Disable watchdog timer
Data.Set SD:0x48314048 %Long 0x0000AAAA
WAIT (Data.Long(SD:0x48314034)&0x10)==0
Data.Set SD:0x48314048 %Long 0x00005555
WAIT (Data.Long(SD:0x48314034)&0x10)==0
; Check if the watchdog timer is running
IF (Data.Long(SD:0x48314048)!=0x00005555)
(
; Disable Watchdog 2
; Wait until reset complete
WAIT (Data.Long(SD:0x48314014)&0x01)!=0
; Disable 32Khz watchdog timer
Data.Set 0x48314048 %Long 0x0000AAAA
WAIT (Data.Long(SD:0x48314034)&0x10)==0
; Disable 32Khz watchdog timer
Data.Set 0x48314048 %Long 0x00005555
WAIT (Data.Long(SD:0x48314034)&0x10)==0
)
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