177 lines
4.9 KiB
Plaintext
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
|
|
|