Files
Gen4_R-Car_Trace32/2_Trunk/demo/arm/flash/hikey-emmc.cmm
2025-10-14 09:52:32 +09:00

177 lines
4.9 KiB
Plaintext

; --------------------------------------------------------------------------------
; @Title: eMMC FLASH Programming Script for Hikey board (96boards.org)
; @Description:
; The eMMC flash program for the HiSilicon based HiKey board.
;
; eMMC FLASH(KLM8G1GEAC or H26M41103) is connected to MMC0 , eMMC bus-width: 1bit
; Internal SRAM: 0xFFF81000
; SD/MMC Controller Register : 0xF723d000( MMC1:0xF723E000, MMC2:0xF723F000 )
;
; @Author: jjeong
; @Copyright: (C) 1989-2022 Lauterbach GmbH, licensed for use with TRACE32(R) only
; @Board: HiKey board (96boards.org)
; @Chip: KIRIN620
; @Keywords: flash eMMC
; --------------------------------------------------------------------------------
; $Id: hikey-emmc.cmm 10516 2022-02-02 11:39:30Z 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
Register.Set M 0x5 ;EL1h
//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
LOCAL &pdd
&pdd=OS.PresentDemoDirectory()
&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="&pdd/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 100.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