; -------------------------------------------------------------------------------- ; @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 0x0 0x0 FLASHFILE.CONFIG 0x4809C200 0x0 0x0 //FLASHFILE.target 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