; -------------------------------------------------------------------------------- ; @Title: R-CARD1 eMMC FLASH Program script ; @Description: ; eMMC FLASH(Micron,MTFC4GM) is connected to MMC Channel 1 ; ; SRAM: 0xE63A0000 ; MMC(controller) Base: 0xEE220000 ; ; @Author: jjeong ; @Chip: ; @Keywords: Flash eMMC RCARD1 ; @Copyright: (C) 1989-2022 Lauterbach GmbH, licensed for use with TRACE32(R) only ; -------------------------------------------------------------------------------- ; $Id: rcard1-emmc.cmm 10631 2022-02-24 10:36:33Z bschroefel $ LOCAL &arg1 ENTRY &arg1 &arg1=STRing.UPpeR("&arg1") // for example "PREPAREONLY" SYStem.RESet SYStem.CPU R7S721063 CORE.ASSIGN 1 SYStem.Up &pfc_base=0xE6060000 &GPSR2=&pfc_base+0x000C ; PFC_BASE+0x4+n*4 &GPSR3=&pfc_base+0x0010 &IPSR5=&pfc_base+0x0034 ; PFC_BASE+0x20+m*4 &MMC_BASE=0xEE220000 //Enable clk for MMC0 Data.Set A:0xE6150240 %Long Data.Long(A:0xE6150240)&0xFFFFFFEFF ; (1<<8) has to be cleared for MMC0 //Pin mux for MMC0_CLK,CMD,DAT[0:3] GOSUB WRITE_OR &IPSR5 ((0x1<<29.)|(0x1<<26.)|(0x1<<23.)|(0x1<<20.)|(0x1<<20.)|(0x1<<17.)|(0x1<<14.)|(0x1<<11.)|(0x1<<8.)|(0x1<<5.)|(0x1<<2.)) ;IP5[31:2] GOSUB WRITE_OR &GPSR3 0x0000003F ; GP3_[5:0] GOSUB WRITE_OR &GPSR2 0xF0000000 ; GP2_[31:28] Data.Set &MMC_BASE+0x40 %Long 0x0 Data.Set &MMC_BASE+0x18 %Long 0x01060000 ; clk div /128, clk should be slower <400khz Data.Set &MMC_BASE+0x44 %Long 0x1cf3f //FLASH READ ID TEST GOSUB READ_ID_TEST programFlash: FLASHFILE.RESet FLASHFILE.CONFIG 0xEE220000 // FLASHFILE.TARGET FLASHFILE.TARGET 0xe63A0000++0x1FFF 0xe63A2000++0x21FF ~~/demo/arm/flash/byte/emmc_shmmc.bin /KEEP //Read FLASH Manufacture and Device ID FLASHFILE.GETID Data.Set &MMC_BASE+0x18 %Long 0x01000000 ; clk div /2 //print the ECSD registers on AREA 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 * 0x0 ; FLASHFILE.LOAD * 0x0 /ComPare ;verify ENDDO WRITE_OR: ENTRY &addr &data &data=((&data)|(Data.Long(A:&addr))) ¬_data=~(&data) Data.Set &pfc_base %Long ¬_data Data.Set &addr %Long &data RETURN READ_ID_TEST: //CMD0 RePeaT 2. ( Data.Set &MMC_BASE+0x40 %Long 0xFFFEFFFF ;clear status Data.Set &MMC_BASE+0x8 %Long 0x0 ;arg Data.Set &MMC_BASE+0x0 %Long 0x0 ;cmd WAIT 10.ms ) //CMD1 RePeaT 10. ( Data.Set &MMC_BASE+0x40 %Long 0xFFFEFFFF ;clear status Data.Set &MMC_BASE+0x8 %Long 0x40FF8000 ;arg Data.Set &MMC_BASE+0x0 %Long (0x1<<24.)|(0x1<<22.) ;cmd1 WAIT 100.ms &resp=Data.Long(A:(&MMC_BASE+0x2c)) //print "CMD1 resp: 0x" &resp IF (&resp&0x80000000)==0x80000000 ( GOTO jump_cmd2 ) ) PRINT "CMD1 fail" END jump_cmd2: //CMD2 Data.Set &MMC_BASE+0x40 %Long 0xFFFEFFFF ;clear status Data.Set &MMC_BASE+0x8 %Long 0x0 ;arg Data.Set &MMC_BASE+0x0 %Long (0x2<<24.)|(0x2<<22.) ;cmd2 WAIT 10.ms //CMD3 Data.Set &MMC_BASE+0x40 %Long 0xFFFEFFFF ;clear status Data.Set &MMC_BASE+0x8 %Long 0x00010000 ; arg, MMC RCA is (0x0001<<16.) Data.Set &MMC_BASE+0x0 %Long (0x3<<24.)|(0x1<<22.) ;cmd3 WAIT 10.ms //CMD10 Data.Set &MMC_BASE+0x40 %Long 0xFFFEFFFF ;clear status Data.Set &MMC_BASE+0x8 %Long 0x00010000 ; arg, MMC RCA is (0x0001<<16.) Data.Set &MMC_BASE+0x0 %Long (0xA<<24.)|(0x2<<22.);cmd10 WAIT 10.ms //Response2 PRINT "CID register" PRINT "[127:104] 0x" Data.Long(A:(&MMC_BASE+0x20)) PRINT "[103:72] 0x" Data.Long(A:(&MMC_BASE+0x24)) PRINT "[71:40] 0x" Data.Long(A:(&MMC_BASE+0x28)) PRINT "[39:8] 0x" Data.Long(A:(&MMC_BASE+0x2C)) RETURN