; -------------------------------------------------------------------------------- ; @Title: OMAP-L138 eMMC FLASH Programming Script ; @Description: ; FLASH Type: eMMC FLASH(Numonyx, NAND16GXH) connected to the MMC controller ; ; SDRAM: 0x80002000 ; MMC Controller Register : 0x01C40000 ; ; @Author: jjeong ; @Chip: OMAP-L138 ; @Keywords: Numonyx NAND16GXH L138 eMMC ; @Copyright: (C) 1989-2022 Lauterbach GmbH, licensed for use with TRACE32(R) only ; -------------------------------------------------------------------------------- ; $Id: omapl138-emmc.cmm 10516 2022-02-02 11:39:30Z bschroefel $ LOCAL &arg1 ENTRY &arg1 &arg1=STRing.UPpeR("&arg1") // for example "PREPAREONLY" LOCAL &MMC_BASE &MMC_BASE=0x01C40000 SYStem.RESet SYStem.CPU OMAP-L138 SYStem.Option EnReset OFF SYStem.CONFIG.Slave OFF SYStem.JtagClock RTCK SYStem.Mode Up PER.Set.simple C15:0x1 %Long 0x00053078 ; disable MMU & Cache //pll configuration to do cpu speed up Data.Set 0x01C11100 %Long 0x00000049 //Setup PSC for LPSC_MMCSD0 ( ex. "GOSUB Setup_Psc_All_On" or "GOSUB psc_change_state 5. 0x3" ) Data.Set A:0x1C10A14 %Long Data.Long(A:0x1C10A14)&~0x1F Data.Set A:0x1C10A14 %Long Data.Long(A:0x1C10A14)|0x3 Data.Set A:0x1C10120 %Long Data.Long(A:0x1C10120)|0x1 // enable MMC and pin muxing Data.Set A:0x1C14038 %Long 0x83E70B13 ; unlock code1 for pin muxing Data.Set A:0x1C1403C %Long 0x95A4F1E0 ; unlock code2 for pin muxing Data.Set A:0x1C14148 %Long 0x22222222 Data.Set A:0x1C1414C %Long 0x22 //Init MMCSD0 Data.Set A:0x01C40004 %Long 0x01A0 ;MMC CLK Data.Set A:0x01C40000 %Long 0x0007 ;MMCCTL , reset Data.Set A:0x01C40000 %Long 0x0000 ;MMCCTL , release Data.Set A:0x01C40014 %Long 0x00FF ;MMCTOR Data.Set A:0x01C40018 %Long 0xFFFF ;MMCTOD Data.Set A:0x01C40020 %Long 0x1 ;MMCNBLK Data.Set A:0x01C40074 %Long 0x0 ;4bytes, 256bits fifo or 512bits fifo (0x4) //FLASH READ ID TEST AREA.CLEAR AREA.view GOSUB READ_ID_TEST DIALOG.YESNO "the flash id is correct on AREA window?" ENTRY &result IF !&result ( PRINT "pls, check your register configuration to enable your flash controller" ENDDO ) //S(D)RAM TEST for algorithm file ;GOSUB SDRAM_INIT Data.Test 0x80002000++0x3FFF /Prime ;s(d)ram test IF FOUND() ( PRINT "s(d)ram is NOT initialized around 0x" ADDRESS.OFFSET(TRACK.ADDRESS()) ENDDO ) programFlash: //FLASHFILE configuration FLASHFILE.RESet Break.RESet //FLASHFILE.CONFIG 0x0 0x0 FLASHFILE.CONFIG &MMC_BASE 0x0 0x0 //FLASHFILE.TARGET FLASHFILE.TARGET 0x80002000++0x1FFF 0x80004000++0x1FFF ~~/demo/arm/flash/byte/emmc_dm365.bin /KEEP Data.Set A:0x01C40004 %Long 0x01A0 ; MMC_CLK have to be less than "<400khz" FLASHFILE.GETID Data.Set A:0x01C40004 %Long 0x0101 ; MMC_CLK speed up 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.binary * 0x0 //Verify FLASH ;FLASHFILE.LOAD * 0x0 /ComPare ENDDO Setup_Psc_All_On: LOCAL &i &i=0x0 PRINT "Setup Power Modules (All on)... " RePeaT 53. ( IF &i!=41. ( GOSUB psc_change_state &i 0x3 ) &i=&i+0x1 ) // GOSUB psc_change_state 41. 0x3 PRINT "[Done]" RETURN psc_change_state: LOCAL &id LOCAL &state ENTRY &id &state LOCAL &PSC_PTCMD LOCAL &PSC_PTSTAT LOCAL &mdstat LOCAL &mdctl &PSC_PTCMD=0x1C10120 &PSC_PTSTAT=0x1C10128 &mdstat=0x1C10800+(0x4*&id) &mdctl=0x1C10A00+(0x4*&id) IF (Data.Long(SD:&mdstat)&0x1F)==&state RETURN WAIT 10.ms Data.Set &mdctl %Long Data.Long(SD:&mdctl)&~0x1F Data.Set &mdctl %Long Data.Long(SD:&mdctl)|&state Data.Set &PSC_PTCMD %Long Data.Long(SD:&PSC_PTCMD)|0x1 WAIT 10.ms RETURN READ_ID_TEST: //MMC interface, not SD(HC) &MMCCMD_REG=&MMC_BASE+0x30 &MMCARG_REG=&MMC_BASE+0x34 //CMD0 RePeaT 2. ( Data.Set &MMCARG_REG %Long 0x0 ;arg Data.Set &MMCCMD_REG %Long 0x4000 ;cmd WAIT 10.ms ) //CMD1 RePeaT 10. ( Data.Set &MMCARG_REG %Long 0x40FF8000 ;arg Data.Set &MMCCMD_REG %Long 0x0601 ;cmd1 WAIT 100.ms &resp=Data.Long(A:(&MMC_BASE+0x44)) //print "CMD1 resp: 0x" &resp IF (&resp&0x80000000)==0x80000000 ( GOTO jump_cmd2 ) ) PRINT "CMD1 fail" END jump_cmd2: //CMD2 Data.Set &MMCARG_REG %Long 0x0 ;arg Data.Set &MMCCMD_REG %Long 0x0402 ;cmd2 WAIT 10.ms //CMD3 Data.Set &MMCARG_REG %Long 0x00010000 ; arg, MMC RCA is (0x0001<<16.) Data.Set &MMCCMD_REG %Long 0x0203 ;cmd3 WAIT 10.ms //CMD10 Data.Set &MMCARG_REG %Long 0x00010000 ; arg, MMC RCA is (0x0001<<16.) Data.Set &MMCCMD_REG %Long 0x040a ;cmd10 WAIT 10.ms //Response2 PRINT "CID register" PRINT "[127:104] 0x" Data.Long(A:(&MMC_BASE+0x44)) PRINT "[103:72] 0x" Data.Long(A:(&MMC_BASE+0x40)) PRINT "[71:40] 0x" Data.Long(A:(&MMC_BASE+0x3C)) PRINT "[39:8] 0x" Data.Long(A:(&MMC_BASE+0x38)) RETURN