202 lines
6.6 KiB
Plaintext
202 lines
6.6 KiB
Plaintext
; --------------------------------------------------------------------------------
|
|
; @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 <MMC Controller Base> 0x0 0x0
|
|
FLASHFILE.CONFIG &MMC_BASE+0x200 0x0 0x0
|
|
|
|
//FLASHFILE.target <Code_range> <Data_range> <Algorithm file>
|
|
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
|
|
) |