; -------------------------------------------------------------------------------- ; @Title: eMMC FLASH Programming Script for Hikey board (96boards.org) ; @Description: ; eMMC FLASH(KLM8G1GEAC or H26M41103) is connected to MMC0 , ; eMMC bus-width: 1bit ; Internal SRAM: 0xFFF81000 ; ; SD/MMC Controller Register : 0xF723d000, ; (MMC0 , MMC1:0xF723E000, MMC2:0xF723F000) ; ; @Author: jjeong ; @Chip: KIRIN620 ; @Board: HiKey board (96boards.org) ; @Keywords: flash eMMC ; @Copyright: (C) 1989-2022 Lauterbach GmbH, licensed for use with TRACE32(R) only ; -------------------------------------------------------------------------------- ; $Id: hikey-emmc.cmm 18877 2022-02-02 07:04:07Z bschroefel $ LOCAL &flashbinary &MMC_BASE=0xF723d000 &SRAM=0xFFF81000 &count=0. ENTRY_OF_CMM: SYStem.RESet SYStem.CPU KIRIN620 SYStem.Option WaitReset 1.0s ; Avoid debug port fail SYStem.Option NoPRCRReset ON ; Soft reset not supported ON ERROR CONTinue SYStem.Up ON ERROR DEFault //config the pin mux for eMMC flash Data.Set A:0xF7010100 %LE %Long 0x0 ; /* EMMC_CLK */ Data.Set A:0xF7010104 %LE %Long 0x0 ; /* EMMC_CMD */ Data.Set A:0xF7010108--0xF7010127 %LE %Long 0x0 ; /* EMMC_DAT0 -- EMMC_DAT7*/ Data.Set A:0xF7010900 %LE %Long (0x2<<4) ;DRIVE1_08MA /* EMMC_CLK */ Data.Set A:0xF7010904 %LE %Long 0x11 ;DRIVE1_04MA | PULL_UP; /* EMMC_CMD */ Data.Set A:0xF7010908--0xF7010927 %LE %Long 0x11 ; /* EMMC_DAT0 -- EMMC_DAT7*/ Data.Set A:&MMC_BASE+0x000 %LE %Long 0x1F ;reset all WAIT 100.ms Data.Set A:&MMC_BASE+0x014 %LE %Long 0xFFFFFFFF Data.Set A:&MMC_BASE+0x024 %LE %Long 0xFFFF Data.Set A:&MMC_BASE+0x01C %LE %Long 0x200 Data.Set A:&MMC_BASE+0x020 %LE %Long 0x200 Data.Set A:&MMC_BASE+0x00C %LE %Long 0x0 Data.Set A:&MMC_BASE+0x010 %LE %Long 0x1 //clk enableing Data.Set A:&MMC_BASE+0x008 %Long 0x10 ;clk divider (pls make clk < 400khz) Data.Set A:&MMC_BASE+0x02C %Long 0x80202000 ;update clk Data.Set A:0xF723D018 %LE %Long 000000 ; please check current eMMC bus-width 0x0: 1bit mode, or 0x10000: 8bit mode GOSUB READ_ID_TEST &mode=Register(M) IF (&mode&0x10)==0x10 ;32 bit ( &flashbinary="~~/demo/arm/flash/byte/emmc_dw.bin" //disable the MMU and Cache PER.Set.simple C15:0x1 %Long Data.Long(C15:0x1)&~0x5 ) ELSE ;64 bit ( &flashbinary="~~/demo/arm/flash/byte/emmc_dw.bin" //disable the MMU and Cache for the proper arm64 mode IF ((&mode&0xF)==0x4||(&mode&0xF)==0x5) PER.Set.simple SPR:0x30100 %Long Data.Long(SPR:0x30100)&(~0x5) ELSE IF ((&mode&0xF)==0x8||(&mode&0xF)==0x9) PER.Set.simple SPR:0x34100 %Long Data.Long(SPR:0x34100)&(~0x5) ELSE IF ((&mode&0xF)==0xc||(&mode&0xF)==0xd) PER.Set.simple SPR:0x36100 %Long Data.Long(SPR:0x36100)&(~0x5) ) FLASHFILE.RESet FLASHFILE.CONFIG A:&MMC_BASE FLASHFILE.TARGET A:&SRAM++0x2FFF A:(&SRAM+0x3000)++0x1FFF &flashbinary /KEEP /STACKSIZE 0x400 FLASHFILE.GETID //clock up, speed up PER.Set.simple A:&MMC_BASE+0x008 %Long 0x2 ;clk divider, make a full clock speed of the sdmmc PER.Set.simple A:&MMC_BASE+0x02C %Long 0x80200000 ;update clk FLASHFILE.GETEXTCSD ;FLASHFILE.SETEXTCSD 179. 0x8 ;access partition block 0 ;FLASHFILE.SETEXTCSD 179. 0x9 ;access partition block 1 ;FLASHFILE.SETEXTCSD 179. 0xA ;access partition block 2 ;FLASHFILE.DUMP 0x0 ENDDO READ_ID_TEST: //MMC //CMD0, reset RePeaT 2. ( //CMD0 Data.Set A:&MMC_BASE+0x44 %LE %Long 0xFFFFFFFF ;clear status Data.Set A:&MMC_BASE+0x28 %Long 0x0 ;arg Data.Set A:&MMC_BASE+0x2c %Long 0xA000A000 ;cmd WAIT 10.ms ) //CMD1 RePeaT 20. ( Data.Set A:&MMC_BASE+0x44 %LE %Long 0xFFFFFFFF ;clear status Data.Set A:&MMC_BASE+0x28 %Long 0x40FF8000 ;arg Data.Set A:&MMC_BASE+0x2c %Long 0xA0002041 ;cmd1 WAIT 10.ms &resp=Data.Long(A:(&MMC_BASE+0x30)) //print "CMD1 resp: 0x" &resp IF (&resp&0x80000000)==0x80000000 ( GOTO jump_cmd2 ) ) PRINT "CMD1 fail" IF &count<2. &count=&count+1. GOTO ENTRY_OF_CMM ELSE END END jump_cmd2: //CMD2 Data.Set A:&MMC_BASE+0x44 %LE %Long 0xFFFFFFFF ;clear status Data.Set A:&MMC_BASE+0x28 %Long 0x0 ;arg Data.Set A:&MMC_BASE+0x2c %Long 0xA00021C2 ;cmd2 WAIT 10.ms //CMD3 Data.Set A:&MMC_BASE+0x44 %LE %Long 0xFFFFFFFF ;clear status Data.Set A:&MMC_BASE+0x28 %Long 0x00070000 ; arg, MMC RCA is (0x0001<<16.) Data.Set A:&MMC_BASE+0x2c %Long 0x20002143 ;cmd3 WAIT 10.ms &cardaddress=Data.Long(A:(&MMC_BASE+0x30)) &cardaddress=&cardaddress&0xFFFF0000 //CMD10 Data.Set A:&MMC_BASE+0x44 %LE %Long 0xFFFFFFFF ;clear status Data.Set A:&MMC_BASE+0x28 %Long &cardaddress ; arg, card address Data.Set A:&MMC_BASE+0x2c %Long 0xA00021CA ;cmd10 WAIT 10.ms //Response2 PRINT "CID register" PRINT "[127:104] 0x" Data.Long(A:(&MMC_BASE+0x3c)) PRINT "[103:72] 0x" Data.Long(A:(&MMC_BASE+0x38)) PRINT "[71:40] 0x" Data.Long(A:(&MMC_BASE+0x34)) PRINT "[39:8] 0x" Data.Long(A:(&MMC_BASE+0x30)) RETURN