222 lines
6.1 KiB
Plaintext
222 lines
6.1 KiB
Plaintext
; --------------------------------------------------------------------------------
|
|
; @Title: PXA2128 eMMC FLASH Programming Script
|
|
; @Description:
|
|
; eMMC FLASH(SanDisk, 8GB eMMC) is connected MMC3
|
|
;
|
|
; S(D)RAM: 0xD100A000
|
|
; MMC3 Register : 0xD4281000
|
|
;
|
|
; @Author: jjeong
|
|
; @Keywords: SanDisk eMMC
|
|
; @Copyright: (C) 1989-2022 Lauterbach GmbH, licensed for use with TRACE32(R) only
|
|
; --------------------------------------------------------------------------------
|
|
; $Id: pxa2128-emmc.cmm 10516 2022-02-02 11:39:30Z bschroefel $
|
|
|
|
LOCAL &arg1
|
|
ENTRY &arg1
|
|
&arg1=STRing.UPpeR("&arg1") // for example "PREPAREONLY"
|
|
|
|
|
|
&MMC_BASE=0xD4281000
|
|
|
|
SYStem.RESet
|
|
|
|
SYStem.CPU PXA2128
|
|
|
|
SYStem.CONFIG CTI.RESET
|
|
SYStem.CONFIG.ETM.RESET
|
|
SYStem.CONFIG ETB1.RESET
|
|
SYStem.CONFIG.TPIU.RESET
|
|
SYStem.CONFIG ITM.RESet
|
|
|
|
SYStem.Mode.Attach
|
|
|
|
IF STATE.RUN()
|
|
Break.direct
|
|
|
|
PER.Set.simple C15:0x1 %Long 0xc5187a ; disable mmu & cache
|
|
|
|
GOSUB MMC_Enable
|
|
|
|
//configure SD Host controller
|
|
Data.Set A:0xD4281004 %LE %Long 0x7200
|
|
Data.Set A:0xD4281028 %LE %Long 0xf00 ; SD BUS POWER ON
|
|
Data.Set A:0xD428102C %LE %Long 0xEFF07
|
|
Data.Set A:0xD4281034 %LE %Long 0xf7ff1fff
|
|
Data.Set A:0xD4281038 %LE %Long 0xf7ff1fff
|
|
|
|
;Data.Set A:0xD42810E0 %LE %LONG 0x405
|
|
;Data.Set A:0xD42810E8 %LE %LONG 0x03fff
|
|
|
|
GOSUB READ_ID_TEST
|
|
|
|
Break.RESet
|
|
|
|
FLASHFILE.RESet
|
|
|
|
;FLASHFILE.CONFIG <eMMC controller> <0> <0x0>
|
|
FLASHFILE.CONFIG 0xD4281000 0x0 0x0
|
|
|
|
;FLASHFILE.TARGET <<code range>> <<data range>> <<algorithm file>>
|
|
FLASHFILE.TARGET 0xD100A000++0x2fff 0xD100D000++0x2fff ~~/demo/arm/flash/byte/emmc_pxa.bin /KEEP
|
|
|
|
Data.Set SD:0xD428102C %LE %Long 0xEFF07 ; lower clk for the initialization
|
|
FLASHFILE.GETID
|
|
Data.Set SD:0xD428102C %LE %Long 0xE0107 ; higher clk for the data transfer
|
|
FLASHFILE.GetEXTCSD
|
|
|
|
//End of the test prepareonly
|
|
IF "&arg1"=="PREPAREONLY"
|
|
ENDDO
|
|
|
|
|
|
//When you access to the other partition on the flash
|
|
; 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 ; Read eMMC
|
|
;FLASHFILE.ERASE 0x0--0xFFFFF ; Erase eMMC
|
|
;FLASHFILE.LOAD * 0x0 ; Write eMMC
|
|
|
|
ENDDO
|
|
|
|
MMC_Enable:
|
|
|
|
// Turn ALL clocks on;
|
|
Data.Set 0xD4050024 %Long 0xFFFFFFFF
|
|
Data.Set 0xD4051024 %Long 0xFFFFFFFF
|
|
Data.Set 0xD42828DC %Long 0x0001ffff
|
|
|
|
//clock/reset control register for AIB
|
|
Data.Set 0xD4015064 %Long 0x7
|
|
Data.Set 0xD4015064 %Long 0x3
|
|
|
|
//APB RTC clock/reset control register
|
|
Data.Set 0xD4015000 %Long 0x3
|
|
//APB clock/reset control register for TIMER1
|
|
Data.Set 0xd4015024 %Long 0x5
|
|
Data.Set 0xd4015024 %Long 0x33
|
|
|
|
//Enable GPIO Clock
|
|
Data.Set 0xd4015038 %Long 0x3;
|
|
|
|
//ND_RE = MMC5_DAT0 0xd401E234
|
|
Data.Set 0xd401E238 %Long 0xD8C4 ;ND_CLE = MMC5_CLK 0xd401E238
|
|
Data.Set 0xd401E254 %Long 0xD8C4 ;SM_INT = MMC5_CMD 0xd401E254
|
|
Data.Set 0xd401E23C %Long 0xD8C4 ;ND_ALE = MMC5_DAT7 0xd401E23C
|
|
Data.Set 0xd401E220 %Long 0xD8C4 ;ND_CS0 = MMC5_DAT6 0xd401E220
|
|
Data.Set 0xd401E240 %Long 0xD8C4 ;SM_SCLK = MMC5_DAT5 0xd401E240
|
|
Data.Set 0xd401E224 %Long 0xD8C4 ;ND_CS1 = MMC5_DAT4 0xd401E224
|
|
Data.Set 0xd401E244 %Long 0xD8C4 ;ND_RDY0 = MMC5_DAT3 0xd401E244
|
|
Data.Set 0xd401E230 %Long 0xD8C4 ;ND_WE_N = MMC5_DAT2 0xd401E230
|
|
Data.Set 0xd401E248 %Long 0xD8C4 ;SM_BEH_N = MMC5_DAT1 0xd401E248
|
|
Data.Set 0xd401E234 %Long 0xD8C4 ;ND_RE = MMC5_DAT0 0xd401E234
|
|
|
|
Data.Set 0xd401E214 %Long 0xd8c2 ;ND_IO<13> - MMC3_CLK
|
|
Data.Set 0xd401E200 %Long 0xd8c2 ;ND_IO<08> - MMC3_CMD
|
|
Data.Set 0xd401E210 %Long 0xd8c2 ;ND_IO<12> - MMC3_DAT7
|
|
Data.Set 0xd401E228 %Long 0xd8c2 ;SM_CS0_N - MMC_DAT6
|
|
Data.Set 0xd401E20c %Long 0xd8c2 ;ND_IO<11> - MMC_DAT5
|
|
Data.Set 0xd401E22c %Long 0xd8c2 ;SM_CS1_N - MMC_DAT4
|
|
Data.Set 0xd401E208 %Long 0xd8c2 ;ND_IO<10> - MMC_DAT3
|
|
Data.Set 0xd401E21c %Long 0xd8c2 ;ND_IO<15> - MMC_DAT2
|
|
Data.Set 0xd401E204 %Long 0xd8c2 ;ND_IO<09> - MMC_DAT1
|
|
Data.Set 0xd401E218 %Long 0xd8c2 ;ND_IO<14> - MMC_DAT0
|
|
|
|
;configure SDHC0 for MMC1
|
|
Data.Set 0xD4282854 %Long (Data.Long(A:0xd4282854)&(~0x3))
|
|
WAIT 10.ms
|
|
|
|
Data.Set 0xD4282854 %Long 0x41b
|
|
WAIT 10.ms
|
|
|
|
;configure SDHC1 for MMC2
|
|
Data.Set 0xD4282858 %Long 0x1b
|
|
WAIT 10.ms
|
|
|
|
;configure SDHC2 for MMC3
|
|
Data.Set 0xd42828E8 %Long 0x1B
|
|
WAIT 10.ms
|
|
|
|
;configure SDHC3 for MMC4
|
|
Data.Set 0xd42828EC %Long 0x1B
|
|
WAIT 10.ms
|
|
|
|
;configure SDHC4 for MMC5
|
|
Data.Set 0xd4282960 %Long 0x1B
|
|
WAIT 10.ms
|
|
|
|
Data.Set 0xd428102C %Word 0XFF05
|
|
PRINT "A:0xd428102C = 0x" Data.Word(A:0xd428102C)
|
|
PRINT "A:0xd428102E = 0x" Data.Word(A:0xd428102E)
|
|
|
|
;set option /memory=long
|
|
;Make GPIO149 output and and set high to get eMMC out of reset.
|
|
Data.Set 0xD401E238 %Long 0xD8C1
|
|
;set value temp1 = PHYS(0xd4019110)
|
|
Data.Set 0xd4019110 %Long (Data.Long(A:0xd4019110)|0x00200000) ; set bit GPIO149 as output
|
|
PRINT "A:0xd4019110 = 0x" Data.Long(A:0xd4019110)
|
|
Data.Set 0xd401911C %Long 0x00200000
|
|
PRINT "A:0xd4019104 = 0x" Data.Long(A:0xd4019104)
|
|
|
|
RETURN
|
|
|
|
|
|
READ_ID_TEST:
|
|
//MMC interface, not SD(HC)
|
|
//CMD0
|
|
RePeaT 2.
|
|
(
|
|
Data.Set &MMC_BASE+0x30 %Long 0xFFFFFFFF ;clear status
|
|
Data.Set &MMC_BASE+0x8 %Long 0x0 ;arg
|
|
Data.Set &MMC_BASE+0xc %Long 0x0 ;cmd
|
|
WAIT 10.ms
|
|
)
|
|
|
|
//CMD1
|
|
RePeaT 10.
|
|
(
|
|
Data.Set &MMC_BASE+0x30 %Long 0xFFFFFFFF ;clear status
|
|
Data.Set &MMC_BASE+0x8 %Long 0x40FF8000 ;arg
|
|
Data.Set &MMC_BASE+0xc %Long 0x01020000 ;cmd1
|
|
WAIT 100.ms
|
|
&resp=Data.Long(A:(&MMC_BASE+0x10))
|
|
//print "CMD1 resp: 0x" &resp
|
|
IF (&resp&0x80000000)==0x80000000
|
|
(
|
|
GOTO jump_cmd2
|
|
)
|
|
)
|
|
|
|
PRINT "CMD1 fail"
|
|
END
|
|
|
|
jump_cmd2:
|
|
//CMD2
|
|
Data.Set &MMC_BASE+0x30 %Long 0xFFFFFFFF ;clear status
|
|
Data.Set &MMC_BASE+0x8 %Long 0x0 ;arg
|
|
Data.Set &MMC_BASE+0xc %Long 0x02010000 ;cmd2
|
|
WAIT 10.ms
|
|
|
|
//CMD3
|
|
Data.Set &MMC_BASE+0x30 %Long 0xFFFFFFFF ;clear status
|
|
Data.Set &MMC_BASE+0x8 %Long 0x00010000 ; arg, MMC RCA is (0x0001<<16.)
|
|
Data.Set &MMC_BASE+0xc %Long 0x03020000 ;cmd3
|
|
WAIT 10.ms
|
|
|
|
//CMD10
|
|
Data.Set &MMC_BASE+0x30 %Long 0xFFFFFFFF ;clear status
|
|
Data.Set &MMC_BASE+0x8 %Long 0x00010000 ; arg, MMC RCA is (0x0001<<16.)
|
|
Data.Set &MMC_BASE+0xc %Long 0x0A010000 ;cmd10
|
|
WAIT 10.ms
|
|
|
|
//Response2
|
|
PRINT "CID register"
|
|
PRINT "[127:104] 0x" Data.Long(A:(&MMC_BASE+0x1c))
|
|
PRINT "[103:72] 0x" Data.Long(A:(&MMC_BASE+0x18))
|
|
PRINT "[71:40] 0x" Data.Long(A:(&MMC_BASE+0x14))
|
|
PRINT "[39:8] 0x" Data.Long(A:(&MMC_BASE+0x10))
|
|
|
|
RETURN
|