📄 lowlevel_init.s
字号:
#include <config.h>#include <version.h>#include <asm/arch/pxa-regs.h>DRAM_SIZE: .long CFG_DRAM_SIZE.globl lowlevel_initlowlevel_init: mov r10, lr/* ---- GPIO INITIALISATION ---- *//* Set up GPIO pins first (3 groups [31:0] [63:32] [80:64]) */ /* General purpose set registers */ ldr r0, =GPSR0 ldr r1, =CFG_GPSR0_VAL str r1, [r0] ldr r0, =GPSR1 ldr r1, =CFG_GPSR1_VAL str r1, [r0] ldr r0, =GPSR2 ldr r1, =CFG_GPSR2_VAL str r1, [r0] /* General purpose clear registers */ ldr r0, =GPCR0 ldr r1, =CFG_GPCR0_VAL str r1, [r0] ldr r0, =GPCR1 ldr r1, =CFG_GPCR1_VAL str r1, [r0] ldr r0, =GPCR2 ldr r1, =CFG_GPCR2_VAL str r1, [r0] /* General rising edge registers */ ldr r0, =GRER0 ldr r1, =CFG_GRER0_VAL str r1, [r0] ldr r0, =GRER1 ldr r1, =CFG_GRER1_VAL str r1, [r0] ldr r0, =GRER2 ldr r1, =CFG_GRER2_VAL str r1, [r0] /* General falling edge registers */ ldr r0, =GFER0 ldr r1, =CFG_GFER0_VAL str r1, [r0] ldr r0, =GFER1 ldr r1, =CFG_GFER1_VAL str r1, [r0] ldr r0, =GFER2 ldr r1, =CFG_GFER2_VAL str r1, [r0] /* General edge detect registers */ ldr r0, =GPDR0 ldr r1, =CFG_GPDR0_VAL str r1, [r0] ldr r0, =GPDR1 ldr r1, =CFG_GPDR1_VAL str r1, [r0] ldr r0, =GPDR2 ldr r1, =CFG_GPDR2_VAL str r1, [r0] /* General alternate function registers */ ldr r0, =GAFR0_L /* [0:15] */ ldr r1, =CFG_GAFR0_L_VAL str r1, [r0] ldr r0, =GAFR0_U /* [31:16] */ ldr r1, =CFG_GAFR0_U_VAL str r1, [r0] ldr r0, =GAFR1_L /* [47:32] */ ldr r1, =CFG_GAFR1_L_VAL str r1, [r0] ldr r0, =GAFR1_U /* [63:48] */ ldr r1, =CFG_GAFR1_U_VAL str r1, [r0] ldr r0, =GAFR2_L /* [79:64] */ ldr r1, =CFG_GAFR2_L_VAL str r1, [r0] ldr r0, =GAFR2_U /* [80] */ ldr r1, =CFG_GAFR2_U_VAL str r1, [r0] /* General purpose direction registers */ ldr r0, =GPDR0 ldr r1, =CFG_GPDR0_VAL str r1, [r0] ldr r0, =GPDR1 ldr r1, =CFG_GPDR1_VAL str r1, [r0] ldr r0, =GPDR2 ldr r1, =CFG_GPDR2_VAL str r1, [r0] /* Power manager sleep status */ ldr r0, =PSSR ldr r1, =CFG_PSSR_VAL str r1, [r0]/* ---- MEMORY INITIALISATION ---- *//* Initialize Memory Controller, see PXA250 Operating System Developer's Guide *//* pause for 200 uSecs- allow internal clocks to settle */ ldr r3, =OSCR /* reset the OS Timer Count to zero */ mov r2, #0 str r2, [r3] ldr r4, =0x300 /* really 0x2E1 is about 200usec, so 0x300 should be plenty */1: ldr r2, [r3] cmp r4, r2 bgt 1bmem_init:/* get memory controller base address */ ldr r1, =MEMC_BASE/* ---- FLASH INITIALISATION ---- *//* Write MSC0 and read back to ensure data change is accepted by cpu */ ldr r2, =CFG_MSC0_VAL str r2, [r1, #MSC0_OFFSET] ldr r2, [r1, #MSC0_OFFSET]/* ---- SDRAM INITIALISATION ---- *//* get the MDREFR settings */ ldr r2, =CFG_MDREFR_VAL str r2, [r1, #MDREFR_OFFSET]/* fetch platform value of MDCNFG */ ldr r2, =CFG_MDCNFG_VAL/* disable all sdram banks */ bic r2, r2, #(MDCNFG_DE0 | MDCNFG_DE1) bic r2, r2, #(MDCNFG_DE2 | MDCNFG_DE3)/* write initial value of MDCNFG, w/o enabling sdram banks */ str r2, [r1, #MDCNFG_OFFSET]/* pause for 200 uSecs */ ldr r3, =OSCR /* reset the OS Timer Count to zero */ mov r2, #0 str r2, [r3] ldr r4, =0x300 /* about 200 usec */1: ldr r2, [r3] cmp r4, r2 bgt 1b/* Access memory *not yet enabled* for CBR refresh cycles (8) *//* CBR is generated for all banks */ ldr r2, =CFG_DRAM_BASE str r2, [r2] str r2, [r2] str r2, [r2] str r2, [r2] str r2, [r2] str r2, [r2] str r2, [r2] str r2, [r2]/* get memory controller base address */ ldr r2, =MEMC_BASE/* Enable SDRAM bank 0 in MDCNFG register */ ldr r2, [r1, #MDCNFG_OFFSET] orr r2, r2, #MDCNFG_DE0 str r2, [r1, #MDCNFG_OFFSET]/* write MDMRS to trigger an MSR command to all enabled SDRAM banks */ ldr r2, =CFG_MDMRS_VAL str r2, [r1, #MDMRS_OFFSET]/* ---- INTERRUPT INITIALISATION ---- *//* Disable (mask) all interrupts at the interrupt controller *//* clear the interrupt level register (use IRQ, not FIQ) */ mov r1, #0 ldr r2, =ICLR str r1, [r2]/* Set interrupt mask register */ ldr r1, =CFG_ICMR_VAL ldr r2, =ICMR str r1, [r2]/* ---- CLOCK INITIALISATION ---- *//* Disable the peripheral clocks, and set the core clock *//* Turn Off ALL on-chip peripheral clocks for re-configuration */ ldr r1, =CKEN mov r2, #0 str r2, [r1]/* set core clocks */ ldr r2, =CFG_CCCR_VAL ldr r1, =CCCR str r2, [r1]#ifdef ENABLE32KHZ/* enable the 32Khz oscillator for RTC and PowerManager */ ldr r1, =OSCC mov r2, #OSCC_OON str r2, [r1]/* NOTE: spin here until OSCC.OOK get set, meaning the PLL has settled. */60: ldr r2, [r1] ands r2, r2, #1 beq 60b#endif/* Turn on needed clocks */ ldr r1, =CKEN ldr r2, =CFG_CKEN_VAL str r2, [r1] mov pc, r10
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -