; -------------------------------------------------------------------------------- ; @Title: Vayu EVM CPU TI Jacinto6 eMMC FLASH Programming script ; ; @Description: ; eMMC: MTFC8GLDDQ on MMCHS2 ; SRAM: 0x40300000 ; SD/MMC Controller Register : 0x4809C200(MMC1), 0x480B4000(MMC2) ; ; @Author: jjeong ; @Chip: DRA7xx ; @Board: Vayu EVM ; @Keywords: DRA7xx (Jacinto 6) EMMC ; @Copyright: (C) 1989-2022 Lauterbach GmbH, licensed for use with TRACE32(R) only ; -------------------------------------------------------------------------------- ; $Id: dra7xx-emmc.cmm 12049 2023-04-20 12:32:16Z bschroefel $ LOCAL &arg1 ENTRY &arg1 &arg1=STRing.UPpeR("&arg1") // for example "PREPAREONLY" LOCAL &pdd LOCAL &MMC_BASE ;&MMC_BASE=0x4809C000 ;on MMCHS1 &MMC_BASE=0x480B4000 ;on MMCHS2 ; ------------------------------------------------------------------------------ ; Setup CPU RESet SYStem.CPU DRA7XX CORE.ASSIGN 1 SYStem.MemAccess DAP SYStem.JtagClock 20Mhz SYStem.Up &pdd=OS.PresentDemoDirectory() //disable MMU & cache PER.Set.simple C15:0x1 %Long Data.Long(C15:0x1)&~0x1005 ; ------------------------------------------------------------------------------ ; Flash Controller Power & Clock Enable //CM_L3INIT_MMC1_CLKCTRL , This register manages the MMC1 clocks. ;Data.Set A:0x4A009300+0x28 %Long 0x2 ;Enable mmc1 clk //CM_L3INIT_MMC2_CLKCTRL , This register manages the MMC2 clocks. Data.Set A:0x4A009300+0x30 %Long Data.Long(A:0x4A009300+0x30)|0x2 ;Enable mmc2 clk ; ------------------------------------------------------------------------------ ; Flash Pin Mux Configuration ;//MMC1 ;Data.Set A:(0x4A003754) %Long 0x0 ;SYSCFG_PAD_MMC1_CLK ;Data.Set A:(0x4A003758) %Long 0x0 ;SYSCFG_PAD_MMC1_CMD ;Data.Set A:(0x4A00375C) %Long 0x0 ;SYSCFG_PAD_MMC1_DAT0 ;Data.Set A:(0x4A003760) %Long 0x0 ;SYSCFG_PAD_MMC1_DAT1 ;Data.Set A:(0x4A003764) %Long 0x0 ;SYSCFG_PAD_MMC1_DAT2 ;Data.Set A:(0x4A003768) %Long 0x0 ;SYSCFG_PAD_MMC1_DAT3 ;Data.Set A:(0x4A00376C) %Long 0x0 ;SYSCFG_PAD_MMC1_SDCD ;Data.Set A:(0x4A003770) %Long 0x0 ;SYSCFG_PAD_MMC1_SDWP ;//MMC2 Data.Set A:(0x4A00348C) %Long 0x70001 ;mmc2_dat4 ,gpio2_09 Data.Set A:(0x4A003490) %Long 0x70001 ;mmc2_dat5 Data.Set A:(0x4A003494) %Long 0x70001 ;mmc2_dat6 Data.Set A:(0x4A003498) %Long 0x70001 ;mmc2_dat7 Data.Set A:(0x4A00349C) %Long 0x40001 ;mmc2_clk Data.Set A:(0x4A0034A0) %Long 0x70001 ;mmc2_dat0 Data.Set A:(0x4A0034A4) %Long 0x70001 ;mmc2_dat1 Data.Set A:(0x4A0034A8) %Long 0x70001 ;mmc2_dat2 Data.Set A:(0x4A0034AC) %Long 0x70001 ;mmc2_dat3 Data.Set A:(0x4A0034B0) %Long 0x60001 ;mmc2_cmd ,gpio2_18 Data.Set A:(0x4A0034D0) %Long 0x6000F ;mmc2_sdcd ,gpio1_14 Data.Set A:(0x4A0034D4) %Long 0x6000F ;mmc2_sdwp ,gpio1_15 ; ------------------------------------------------------------------------------ ; Flash Controller Init Data.Set A:(&MMC_BASE+0x0240) %LE %Long 0x22E90080 ; MMCHS_CAPA, Voltage support 1.8 & 3.x Data.Set A:(&MMC_BASE+0x0110) %LE %Long 0x00002015 ; MMCHS_SYSCONFIG, default Data.Set A:(&MMC_BASE+0x012C) %LE %Long 0x00000680 ; MMCHS_CON Data.Set A:(&MMC_BASE+0x0204) %LE %Long 0x0200 ; MMCHS_BLK, block size: 512B Data.Set A:(&MMC_BASE+0x0228) %LE %Long 0x0c10 ; power level 3.0v, sd bus power off WAIT 10.ms Data.Set A:(&MMC_BASE+0x0228) %LE %Long 0x0d10 ; power level 3.0v, sd bus power on Data.Set A:(&MMC_BASE+0x22C) %LE %Long 0xE3C87 ; MMCHS_SYSCTL Clock frequency, 400Khz Data.Set A:(&MMC_BASE+0x234) %LE %Long 0x307f0033 ; enable the BRR bit ; ------------------------------------------------------------------------------ ; Flash Read ID Test GOSUB READ_ID_TEST ; ------------------------------------------------------------------------------ ; Init SRAM (16KB) for the flash algorithm Data.Test A:0x40301000++0x3FFF ; ------------------------------------------------------------------------------ ; Flash declaration Break.RESet FLASHFILE.RESet //FLASHFILE.CONFIG 0x0 0x0 FLASHFILE.CONFIG &MMC_BASE+0x200 0x0 0x0 //FLASHFILE.target FLASHFILE.TARGET 0x40301000++0x1FFF E:0x40303000++0x23FF ~~/demo/arm/flash/byte/emmc_omap.bin /KEEP /DUALPORT //Read FLASH Manufacture and Device ID Data.Set A:&MMC_BASE+0x22C %LE %Long 0xE3C87 ; 400Khz , the Card identification mode FLASHFILE.GETID //Increase the eMMC freq for Data Transfer Mode Data.Set A:&MMC_BASE+0x22C %LE %Long 0x10047 ; please find the best eMMC clk freq (around 10 Mhz), MMCHS_SYSCTL[15:6] ;GOSUB MMC_8BIT_MODE //Get EXTended CSD registers FLASHFILE.GETEXTCSD //End of the test prepareonly IF "&arg1"=="PREPAREONLY" ENDDO //When you access to the other partition on the flash ; FLASHFILE.SETEXTCSD 179. 0x00 ; access: partition null, no boot, access: no boot partition ; FLASHFILE.SETEXTCSD 179. 0x48 ; access: partition null ; FLASHFILE.SETEXTCSD 179. 0x49 ; access: partition boot 1 ; FLASHFILE.SETEXTCSD 179. 0x4A ; access: partition boot 2 FLASHFILE.DUMP 0x0 ; FLASHFILE.ERASE 0x0--0xFFFFFF ; FLASHFILE.LOAD * 0x0 ; FLASHFILE.LOAD * 0x0 /ComPare ENDDO READ_ID_TEST: ( //MMC interface, not SD(HC) //CMD0 RePeaT 2. ( Data.Set A:&MMC_BASE+0x230 %Long 0xFFFFFFFF ;clear status Data.Set A:&MMC_BASE+0x208 %Long 0x0 ;arg Data.Set A:&MMC_BASE+0x20c %Long 0x0 ;cmd WAIT 10.ms ) //CMD1 RePeaT 10. ( Data.Set A:&MMC_BASE+0x230 %Long 0xFFFFFFFF ;clear status Data.Set A:&MMC_BASE+0x208 %Long 0x40FF8000 ;arg Data.Set A:&MMC_BASE+0x20c %Long 0x01020000 ;cmd1 WAIT 100.ms &resp=Data.Long(A:(&MMC_BASE+0x210)) //print "CMD1 resp: 0x" &resp IF (&resp&0x80000000)==0x80000000 ( GOTO jump_cmd2 ) ) PRINT "CMD1 fail" END jump_cmd2: //CMD2 Data.Set A:&MMC_BASE+0x230 %Long 0xFFFFFFFF ;clear status Data.Set A:&MMC_BASE+0x208 %Long 0x0 ;arg Data.Set A:&MMC_BASE+0x20c %Long 0x02010000 ;cmd2 WAIT 10.ms //CMD3 Data.Set A:&MMC_BASE+0x230 %Long 0xFFFFFFFF ;clear status Data.Set A:&MMC_BASE+0x208 %Long 0x00010000 ; arg, MMC RCA is (0x0001<<16.) Data.Set A:&MMC_BASE+0x20c %Long 0x03020000 ;cmd3 WAIT 10.ms //CMD10 Data.Set A:&MMC_BASE+0x230 %Long 0xFFFFFFFF ;clear status Data.Set A:&MMC_BASE+0x208 %Long 0x00010000 ; arg, MMC RCA is (0x0001<<16.) Data.Set A:&MMC_BASE+0x20c %Long 0x0A010000 ;cmd10 WAIT 10.ms //Response2 PRINT "CID register" PRINT "[127:104] 0x" Data.Long(A:(&MMC_BASE+0x21c)) PRINT "[103:72] 0x" Data.Long(A:(&MMC_BASE+0x218)) PRINT "[71:40] 0x" Data.Long(A:(&MMC_BASE+0x214)) PRINT "[39:8] 0x" Data.Long(A:(&MMC_BASE+0x210)) RETURN ) MMC_8BIT_MODE: ( FLASHFILE.SETEXTCSD 183. 0x2 ; change bus width to 8 bits. ( 0:1bit, 1:4bits, 2:8bits ) Data.Set A:(&MMC_BASE+0x012C) %Long Data.Long(A:&MMC_BASE+0x012C)|(0x1<<5) ; MMCHS_CON, Enable 8bit mode (DW8) RETURN )