initmpmc.s

来自「realview22.rar」· S 代码 · 共 300 行

S
300
字号
;;  Copyright ARM Ltd 2004. All rights reserved.
;;
;;  This code initializes the SDRAM on the Versatile platform.
        
        AREA InitMPMC, CODE, READONLY

        EXPORT InitMPMCentry
        
; Mpmc Dynamic Memory Config
; --------------------------

MPMC_Base               EQU 0x10110000
MPMC_Base_Plus_256      EQU 0x10110100
MPMC_Base_Plus_1024     EQU 0x10110400
MPMC_Base_Plus_1152     EQU 0x10110480

MPMCControl             EQU 0x10110000
MPMCStatus              EQU 0x10110004
MPMCConfig              EQU 0x10110008
MPMCDynamicControl      EQU 0x10110020
MPMCDynamicRefresh      EQU 0x10110024
MPMCDynamicReadConfig   EQU 0x10110028
MPMCDynamictRP          EQU 0x10110030
MPMCDynamictRAS         EQU 0x10110034
MPMCDynamictSREX        EQU 0x10110038
MPMCDynamictWR          EQU 0x10110044
MPMCDynamictRC          EQU 0x10110048
MPMCDynamictRFC         EQU 0x1011004c
MPMCDynamictXSR         EQU 0x10110050
MPMCDynamictRRD         EQU 0x10110054
MPMCDynamictMRD         EQU 0x10110058
MPMCDynamictCDLR        EQU 0x1011005c
MPMCStaticExtendedWait  EQU 0x10110080
MPMCDynamicConfig0      EQU 0x10110100
MPMCDynamicRasCas0      EQU 0x10110104
MPMCDynamicConfig1      EQU 0x10110120
MPMCDynamicRasCas1      EQU 0x10110124
MPMCDynamicConfig2      EQU 0x10110140
MPMCDynamicRasCas2      EQU 0x10110144
MPMCDynamicConfig3      EQU 0x10110160
MPMCDynamicRasCas3      EQU 0x10110164
MPMCAHBTimeout0         EQU 0x10110408
MPMCAHBTimeout1         EQU 0x10110428
MPMCAHBTimeout2         EQU 0x10110448  
MPMCAHBTimeout3         EQU 0x10110468
MPMCAHBTimeout4         EQU 0x10110488
MPMCAHBTimeout5         EQU 0x101104a8

; Define constants
; ----------------

ModeRegAddr             EQU 0x20000       ; Define Mode Register address, used when reading from rams
SDRAMUpperAddrLimit     EQU 0x04000000    ; Define upper limit of SDRAM
SDRAMReadWriteLoc       EQU 0x00000160    ; Define SDRAM location to perform Data Bus checks at (should be 32-bit wide databus)

SRAMBank0AddrLimit      EQU 0x00040000    ; Bank 0 is only 512K
SRAMUpperAddrLimit      EQU 0x04000000    ; Banks (1-3) are 16M
SRAMReadWriteLoc        EQU 0x30000000    ; Define SRAM location to perform Data Bus checks at (should be 32-bit wide databus)

SRAMBank0BaseAddr       EQU 0x30000000    ; Define SRAM Bank 0 base addr
SRAMBank1BaseAddr       EQU 0x34000000    ; Define SRAM Bank 1 base addr
SRAMBank2BaseAddr       EQU 0x38000000    ; Define SRAM Bank 2 base addr
SRAMBank3BaseAddr       EQU 0x3C000000    ; Define SRAM Bank 3 base addr

SDRAMBank4BaseAddr      EQU 0x00000000                          ; Define SDRAM Bank 4 base addr
SDRAMBank4BaseAddrMod   EQU 0x04000000                          ; Define SDRAM Bank 4 base addr
SDRAM4ModeRegAddr       EQU SDRAMBank4BaseAddrMod + ModeRegAddr ; Define SDRAM Bank 4 mode register addr

SDRAMBank5BaseAddr      EQU 0x08000000                          ; Define SDRAM Bank 5 base addr
SDRAM5ModeRegAddr       EQU SDRAMBank5BaseAddr + ModeRegAddr    ; Define SDRAM Bank 5 mode register addr

SDRAMBank6BaseAddr      EQU 0x70000000                          ; Define SDRAM Bank 6 base addr
SDRAM6ModeRegAddr       EQU SDRAMBank6BaseAddr + ModeRegAddr    ; Define SDRAM Bank 6 mode register addr

SDRAMBank7BaseAddr      EQU 0x78000000                          ; Define SDRAM Bank 7 base addr
SDRAM7ModeRegAddr       EQU SDRAMBank7BaseAddr + ModeRegAddr    ; Define SDRAM Bank 7 mode register addr

; -----------------------------------------------------------------------------

SC_BASE         EQU 0x101E0000
SC_CTRL         EQU 0x00
SC_REMAP_STAT   EQU 0x200

; -----------------------------------------------------------------------------

; Initialisation sequence
; -----------------------

InitMPMCentry

        LDR     r6, =MPMCConfig 
        MOV     r0, #0x0

        ; Set endian bit
        STR     r0, [r6]

        LDR     r6, =SC_BASE
        LDR     r7, [r6, #SC_CTRL]

        LDR     r0, =SC_REMAP_STAT
        TST     r7, r0                        ; Check Remap Status
        BNE     __platform_mpmc_init_start

        MOV     pc, lr


__platform_mpmc_init_start
        LDR     r6, =MPMC_Base

; Set AHB Timeouts
; -----------------------------------------------------------------------------
        LDR     r7, =MPMC_Base_Plus_1024

        MOV     r0, #0x2
        STR     r0, [r7, #MPMCAHBTimeout0 - MPMC_Base_Plus_1024]

        MOV     r0, #0x0
        STR     r0, [r7, #MPMCAHBTimeout1 - MPMC_Base_Plus_1024]
        STR     r0, [r7, #MPMCAHBTimeout2 - MPMC_Base_Plus_1024]
        STR     r0, [r7, #MPMCAHBTimeout3 - MPMC_Base_Plus_1024]
        ADD     r7, r7, #0x80
        STR     r0, [r7, #MPMCAHBTimeout4 - MPMC_Base_Plus_1152]
        STR     r0, [r7, #MPMCAHBTimeout5 - MPMC_Base_Plus_1152]

; Set Clocking scheme
; -----------------------------------------------------------------------------
        MOV     r0, #0xFF
        ADD     r0, r0, #0x12
        STR     r0, [r6, #MPMCDynamicReadConfig - MPMC_Base]

; Set SDRAM Initialisation Value (I) to NOP (MPMCDynamicControl [8:7] to 2'b11)
; -----------------------------------------------------------------------------

        ADD     r7, r6, #1
        ADDS    r7, r7, #0xFF           ; MPMC_Base_Plus_256
        
        MOV     r0, #0xC
        MOVS    r0, r0, LSL #12
        ADDS    r0, r0, #0xFF
        ADDS    r0, r0, #0x84           ; 0xC183

        STR     r0, [r6, #MPMCDynamicControl - MPMC_Base]

; Set SDRAM Initialisation Value (I) to PALL (MPMCDynamicControl [8:7] to 2'b10)
; -----------------------------------------------------------------------------

        SUBS    r0, r0, #0x80           ; 0xC103
        STR     r0, [r6, #MPMCDynamicControl - MPMC_Base]


; Write a small value (1) into the refresh register (MPMCDynamicRefresh)
; -----------------------------------------------------------------------------

; 0x1 (x16) = 16 cycles between refreshes

        MOV     r0, #1
        STR     r0, [r6, #MPMCDynamicRefresh - MPMC_Base]

; Perform refresh cycles
; -----------------------------------------------------------------------------

        MOV     r0, #0x10   ; Set required number of loop cycles to allow enough refreshes
1       SUBS    r0, r0, #1
        BNE     %b1

; Write operational value into refresh reg (MPMCDynamicRefresh)
; -----------------------------------------------------------------------------

; For 16us refresh rate, with 60MHz clock = (16 * 60)/16 = 10

        MOV     r0, #0x3C
        STR     r0, [r6, #MPMCDynamicRefresh - MPMC_Base]

; Program RAS/CAS latency (MPMCDynamicRASCAS[0,1,2,3])
; -----------------------------------------------------------------------------

; MPMCDynamicRASCASn [10:7] -> CAS latency in half cycle increments
; MPMCDynamicRASCASn  [3:0] -> RAS latency in one cycle increments
; 32'h0000 0202 => RAS = 2 cycles, CAS = 2 cycles
; 32'h0000 0182 => RAS = 2 cycles, CAS = 1.5 cycles

        MOV     r0, #0xFF
        ADDS    r0, r0, #0x83           ; 0x182
        ADDS    r0, r0, #0x80           ; 0x202
        STR     r0, [r7, #MPMCDynamicRasCas0 - MPMC_Base_Plus_256]
        STR     r0, [r7, #MPMCDynamicRasCas1 - MPMC_Base_Plus_256]
        STR     r0, [r7, #MPMCDynamicRasCas2 - MPMC_Base_Plus_256]
        STR     r0, [r7, #MPMCDynamicRasCas3 - MPMC_Base_Plus_256]

; Write operational value into Config reg (MpmcDynamicConfig n)
; -----------------------------------------------------------------------------

; For RBC : 32'h 0000 4880
; For BRC : 32'h 0000 5880

        MOV     r0, #0xB1
        MOVS    r0, r0, LSL #7              ; 0x5880
        STR     r0, [r7, #MPMCDynamicConfig0 - MPMC_Base_Plus_256]
        STR     r0, [r7, #MPMCDynamicConfig1 - MPMC_Base_Plus_256]
        STR     r0, [r7, #MPMCDynamicConfig2 - MPMC_Base_Plus_256]
        STR     r0, [r7, #MPMCDynamicConfig3 - MPMC_Base_Plus_256]


; Set DynamicRP Register
; -----------------------------------------------------------------------------
        MOV     r0, #0x2
        STR     r0, [r6, #MPMCDynamictRP - MPMC_Base]

; Set DynamicRAS Register
; -----------------------------------------------------------------------------
        MOV     r0, #0x3
        STR     r0, [r6, #MPMCDynamictRAS - MPMC_Base]

; Set DynamicSREX Register
; -----------------------------------------------------------------------------
        MOV     r0, #0x5
        STR     r0, [r6, #MPMCDynamictSREX - MPMC_Base]
        MOV     r1, #0x4

; Set DynamicWR Register
; -----------------------------------------------------------------------------
        STR     r1, [r6, #MPMCDynamictWR - MPMC_Base]
; Set DynamicRC Register
; -----------------------------------------------------------------------------
        STR     r0, [r6, #MPMCDynamictRC - MPMC_Base]
; Set DynamicRFC Register
; -----------------------------------------------------------------------------
        STR     r0, [r6, #MPMCDynamictRFC - MPMC_Base]
; Set DynamicXSR Register
; -----------------------------------------------------------------------------
        STR     r0, [r6, #MPMCDynamictXSR - MPMC_Base]

; Set DynamicRRD Register
; -----------------------------------------------------------------------------
        MOV     r0, #1
        STR     r0, [r6, #MPMCDynamictRRD - MPMC_Base]

; Set DynamicMRD Register
; -----------------------------------------------------------------------------
        MOV     r1, #2
        STR     r1, [r6, #MPMCDynamictMRD - MPMC_Base]

; Set DynamicCDLR Register
; -----------------------------------------------------------------------------
        STR     r0, [r6, #MPMCDynamictCDLR - MPMC_Base]


; Set SDRAM Initialisation Value (I) to MODE (MPMCDynamicControl [8:7] to 2'b01)
; -----------------------------------------------------------------------------

        MOV     r0, #0x83
        STR     r0, [r6, #MPMCDynamicControl - MPMC_Base]

; Program the Mode Registers. SDRAM Addr[5] = 1'b1, all others 0
; -----------------------------------------------------------------------------

; SDRAM Addr[11:0] = 12'h020
; For RBC : SDRAM Addr[11:0] translates to HADDR [25:13] = 0x40000
; For BRC : SDRAM Addr[11:0] translates to HADDR [23:11] = 0x10000
; To program the register, do a read from the memory base addr + the value above

        LDR     r5, =SDRAM4ModeRegAddr
        LDR     r0, [r5]

        LDR     r5, =SDRAM5ModeRegAddr
        LDR     r0, [r5]

        LDR     r5, =SDRAM6ModeRegAddr
        LDR     r0, [r5]

        LDR     r5, =SDRAM7ModeRegAddr
        LDR     r0, [r5]
;

; Set SDRAM Initialisation Value (I) to PALL
; -----------------------------------------------------------------------------

        MOV     r0, #0x83
        ADD     r0, r0, #0x80
        STR     r0, [r6, #MPMCDynamicControl - MPMC_Base]


; Set SDRAM Initialisation Value (I) to NORMAL (MPMCDynamicControl [8:7] to 2'b00)
; -----------------------------------------------------------------------------

        MOV     r0, #3
        STR     r0, [r6, #MPMCDynamicControl - MPMC_Base]


; Mpmc Dynamic Memory Config complete
; -----------------------------------------------------------------------------

        MOV     pc, lr

; -----------------------------------------------------------------------------

        END

; end of file mpmc_init.s

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?