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

213 lines
4.6 KiB
Plaintext

; --------------------------------------------------------------------------------
; @Title: SD/MMC FLASH Programming script for PANDABOARD(OMAP4430)
; @Description:
; SD(HC)CARD is connected
;
; Internal SRAM: 0x40301000
;
; SD/MMC Controller Register : 0x4809C200
;
;
; @Author: jjeong
; @Chip: OMAP4430
; @Board: PandaBoard
; @Copyright: (C) 1989-2022 Lauterbach GmbH, licensed for use with TRACE32(R) only
; --------------------------------------------------------------------------------
; $Id: pandaboard-emmcsd.cmm 10516 2022-02-02 11:39:30Z bschroefel $
LOCAL &arg1
ENTRY &arg1
&arg1=STRing.UPpeR("&arg1") // for example "PREPAREONLY"
WinCLEAR
AREA.view
LOCAL &MMCHS
&MMCHS=0x4809C200 ;on MMCHS1
;&MMCHS=0x480B4200 ;on MMCHS2
&MMC_BASE=&MMCHS
SYStem.RESet
SYStem.CPU OMAP4430
SYStem.JtagClock 10.Mhz
SYStem.Option DACR ON ; Give Debugger global write permissions
SETUP.IMASKASM OFF ; Lock interrupts while single stepping
SYStem.MemAccess DAP ; Enable DAP access
TrOnchip.Set DABORT OFF
TrOnchip.Set PABORT OFF
TrOnchip.Set UNDEF OFF
SYStem.Mode go
WAIT 5.s
IF STATE.RUN()
Break.direct
PER.Set.simple C15:0x1 %Long 0x00C50878 ; disable MMU & Cache
GOSUB disable_watchdog
Data.Set 0x4809C22C %LE %Long 0xE3C87 ; MMCHS_SYSCTL Clock frequency, 400Khz
Data.Set 0x4809C234 %LE %Long 0x307f0033 ; enable the BRR bit
GOSUB READ_ID_TEST
Break.RESet
FLASHFILE.RESet
//FLASHFILE.CONFIG <MMC Controller Base> 0x0 0x0
FLASHFILE.CONFIG 0x4809C200 0x0 0x0
//FLASHFILE.target <Code_range> <Data_range> <Algorithm file>
FLASHFILE.TARGET 0x40301000++0x1FFF 0x40303000++0x1FFF ~~/demo/arm/flash/byte/emmcsd_omap.bin /KEEP
//Read FLASH Manufacture and Device ID
Data.Set 0x4809C22C %LE %Long 0xE3C87 ; 400Khz , the Card identification mode
FLASHFILE.GETID
Data.Set 0x4809C22C %LE %Long 0xE1087 ; 16Mhz, the Data transfer mode
//End of the test prepareonly
IF "&arg1"=="PREPAREONLY"
ENDDO
FLASHFILE.DUMP 0x0
; FLASHFILE.ERASE 0x0--0xFFFFFF
; FLASHFILE.LOAD * 0x0
; FLASHFILE.LOAD * 0x0 /ComPare
ENDDO
disable_watchdog:
(
PRINT "DISABLE WATCHDOG ..."
// Enable Clock
Data.Set SR:0x4A307830 %Long 0x02
// Check that module is IDLE
WHILE ((Data.Long(SR:0x4A307830)&0x20000)==0x20000)
// Wait until reset complete
WHILE ((Data.Long(SR:0x4A314014)&0x01)!=0x1)
//Disable watchdog timer
Data.Set SR:0x4A314048 %LE %Long 0x0000AAAA;
WHILE ((Data.Long(SR:0x4A314034)&0x10)==0x10)
Data.Set SR:0x4A314048 %LE %Long 0x00005555;
WHILE ((Data.Long(SR:0x4A314034)&0x10)==0x10)
)
RETURN
READ_ID_TEST:
//SD(HC) interface, not MMC
//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
)
//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 0x40FF8000 ;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
)
)
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
&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