⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 early_init.s

📁 AT91RM9200的完整启动代码:包括loader, boot及U-boot三部分均已编译通过!欢迎下载使用!
💻 S
📖 第 1 页 / 共 2 页
字号:
#define MC3_RAS6P			0		/* 0-15 */
#define MC3_CAS5			0		/* 0-7 */
#define MC3_CP4				0		/* 0-7 */
#define MC3_CAS3			0		/* 0-7 */
#define MC3_RCD2			0		/* 0-7 */
#define MC3_RP1				0		/* 0-7 */

	LOADPTR (r3, MEM_CONT3_ADR)	/* Set MCCR3 (F8) */
	stwbrx	r3,0,r5
	LOADPTR(r4, \
		MC3_BSTOPRE_U << 28 | MC3_REFREC << 24 | \
		MC3_RDLAT << 20 | MC3_CPX << 19 | \
		MC3_RAS6P << 15 | MC3_CAS5 << 12 | MC3_CP4 << 9 | \
		MC3_CAS3 << 6 | MC3_RCD2 << 3 | MC3_RP1)
        cmpl	0, 0, r7, r9              /* Check for Kahlua2 */
        bne     notK2b
        /* clear Kahlua2 reserved bits */
	LOADPTR (r3, 0xff000000)
	and	r4, r4, r3
notK2b:
	stwbrx	r4,0,r6

	/*------- MCCR4 */

#define MC4_PRETOACT			3		/* 0-15 */
#define MC4_ACTOPRE			5		/* 0-15 */
#define MC4_WMODE			0		/* 0-1 */
#define MC4_INLINE			MC_ECC		/* 0-1 */
#define MC4_REGISTERED			(1-MC_ECC)	/* 0-1 */
#define MC4_BSTOPRE_UU			(MC_BSTOPRE >> 8 & 3)
#define MC4_REGDIMM			0		/* 0-1 */
#define MC4_SDMODE_CAS			2		/* 0-7 */
#define MC4_DBUS_RCS1			1		/* 0-1, 8-bit */
#define MC4_SDMODE_WRAP			0		/* 0-1 */
#define MC4_SDMODE_BURST		2		/* 0-7 */
#define MC4_ACTORW			3		/* 0-15 */
#define MC4_BSTOPRE_L			(MC_BSTOPRE & 0xf)

	LOADPTR (r3, MEM_CONT4_ADR)	/* Set MCCR4 (FC) */
	stwbrx	r3,0,r5
	LOADPTR(r4, \
		MC4_PRETOACT << 28 | MC4_ACTOPRE << 24 | \
		MC4_WMODE << 23 | MC4_INLINE << 22 | \
		MC4_REGISTERED << 20 | MC4_BSTOPRE_UU << 18 | \
		MC4_DBUS_RCS1 << 17 | \
		MC4_REGDIMM << 15 | MC4_SDMODE_CAS << 12 | \
		MC4_SDMODE_WRAP << 11 | MC4_SDMODE_BURST << 8 | \
		MC4_ACTORW << 4 | MC4_BSTOPRE_L)
        cmpl	0, 0, r7, r9                /* Check for Kahlua 2 */
        bne     notK2c
        /* Turn on Kahlua2 extended ROM space */
	LOADPTR (r3, 0x00200000)
	or	r4, r4, r3
notK2c:
	stwbrx	r4,0,r6

#ifdef INCLUDE_ECC
	/*------- MEM_ERREN1 */

	LOADPTR (r3, MEM_ERREN1_ADR)	/* Set MEM_ERREN1 (c0) */
	stwbrx	r3,0,r5
	lwbrx	r4,0,r6
	ori	r4,r4,4			/* Set MEM_PERR_EN */
	stwbrx	r4,0,r6
#endif /* INCLUDE_ECC */

	/*------- MSAR/MEAR */

	LOADPTR (r3, MEM_START1_ADR)	/* Set MSAR1 (80) */
	stwbrx	r3,0,r5
	LOADPTR (r4, 0xc0804000)
	stwbrx	r4,0,r6

	LOADPTR (r3, MEM_START2_ADR)	/* Set MSAR2 (84) */
	stwbrx	r3,0,r5
	LOADPTR (r4, 0xc0804000)
	stwbrx	r4,0,r6

	LOADPTR (r3, XMEM_START1_ADR)	/* Set MESAR1 (88) */
	stwbrx	r3,0,r5
	LOADPTR (r4, 0x00000000)
	stwbrx	r4,0,r6

	LOADPTR (r3, XMEM_START2_ADR)	/* Set MESAR2 (8c) */
	stwbrx	r3,0,r5
	LOADPTR (r4, 0x01010101)
	stwbrx	r4,0,r6

	LOADPTR (r3, MEM_END1_ADR)	/* Set MEAR1 (90) */
	stwbrx	r3,0,r5
	LOADPTR (r4, 0xffbf7f3f)
	stwbrx	r4,0,r6

	LOADPTR (r3, MEM_END2_ADR)	/* Set MEAR2 (94) */
	stwbrx	r3,0,r5
	LOADPTR (r4, 0xffbf7f3f)
	stwbrx	r4,0,r6

	LOADPTR (r3, XMEM_END1_ADR)	/* MEEAR1 (98) */
	stwbrx	r3,0,r5
	LOADPTR (r4, 0x00000000)
	stwbrx	r4,0,r6

	LOADPTR (r3, XMEM_END2_ADR)	/* MEEAR2 (9c) */
	stwbrx	r3,0,r5
	LOADPTR (r4, 0x01010101)
	stwbrx	r4,0,r6

	/*-------ODCR */

	LOADPTR (r3, ODCR_ADR_X)	/* Set ODCR */
	stwbrx	r3,0,r5

	li	r4, 0x7f
	stb	r4, ODCR_SHIFT(r6)	/* ODCR is at +3 offset */

	/*-------MBEN */

	LOADPTR (r3, MEM_EN_ADR)	/* Set MBEN (a0) */
	stwbrx	r3,0,r5
	li	r4, 0x01		/* Enable bank 0 */
	stb	r4, 0(r6)		/* MBEN is at +0 offset */

#if 0   /* Jimmy:  I think page made is broken */
	/*-------PGMAX */

	LOADPTR (r3, MPM_ADR_X)
	stwbrx	r3,0,r5
	li	r4, 0x32
	stb	r4, MPM_SHIFT(r6)		/* PAGE_MODE is at +3 offset */
#endif

	/* Wait before initializing other registers */

	lis	r4,0x0001
	mtctr	r4

KahluaX4wait200us:
	bdnz	KahluaX4wait200us

	/* Set MEMGO bit */

	LOADPTR (r3, MEM_CONT1_ADR)	/* MCCR1 (F0) |= PGMAX */
	stwbrx	r3,0,r5
	lwbrx	r4,0,r6			/* old MCCR1 */
	oris	r4,r4,0x0008		/* MEMGO=1 */
	stwbrx	r4, 0, r6

	/* Wait again */

	addis	r4,r0,0x0002
	ori	r4,r4,0xffff

	mtctr	r4

KahluaX4wait8ref:
	bdnz	KahluaX4wait8ref

	sync
	eieio
        mtlr    r11
	blr

#else /* USE_V2_INIT */



/* U-Boot works, but memory will not run reliably for all address ranges.
 * Early U-Boot Working init, but 2.4.19 kernel will crash since memory is not
 * initialized correctly. Could work if debugged.
 */
/* PCI Support routines */

    .globl __pci_config_read_32
__pci_config_read_32:
    lis     r4, 0xfec0
    stwbrx   r3, r0, r4
    sync
    lis     r4, 0xfee0
    lwbrx   r3, 0, r4
    blr
    .globl __pci_config_read_16
__pci_config_read_16:
    lis     r4, 0xfec0
    andi.    r5, r3, 2
    stwbrx  r3, r0, r4
    sync
    oris     r4, r5, 0xfee0
    lhbrx    r3, r0, r4
    blr
    .globl __pci_config_read_8
__pci_config_read_8:
    lis     r4, 0xfec0
    andi.    r5, r3, 3
    stwbrx  r3, r0, r4
    sync
    oris     r4, r5, 0xfee0
    lbz      r3, 0(4)
    blr
    .globl __pci_config_write_32
__pci_config_write_32:
    lis     r5, 0xfec0
    stwbrx   r3, r0, r5
    sync
    lis      r5, 0xfee0
    stwbrx   r4, r0, r5
    sync
    blr
    .globl __pci_config_write_16
__pci_config_write_16:
    lis     r5, 0xfec0
    andi.    r6, r3, 2
    stwbrx  r3, r0, 5
    sync
    oris     r5, r6, 0xfee0
    sthbrx    r4, r0, r5
    sync
    blr
    .globl __pci_config_write_8
__pci_config_write_8:
    lis      r5, 0xfec0
    andi.    r6, r3, 3
    stwbrx   r3, r0, r5
    sync
    oris      r5, r6, 0xfee0
    stb       r4, 0(r5)
    sync
    blr
    .globl  in_8
in_8:
    oris    r3, r3, 0xfe00
    lbz     r3,0(r3)
    blr
    .globl  in_16
in_16:
    oris    r3, r3, 0xfe00
    lhbrx   r3, 0, r3
    blr
    .globl in_16_ne
in_16_ne:
    oris    r3, r3, 0xfe00
    lhzx    r3, 0, r3
    blr
    .globl  in_32
in_32:
    oris    r3, r3, 0xfe00
    lwbrx   r3, 0, r3
    blr
    .globl  out_8
out_8:
    oris    r3, r3, 0xfe00
    stb     r4, 0(r3)
    eieio
    blr
    .globl  out_16
out_16:
    oris    r3, r3, 0xfe00
    sthbrx  r4, 0, r3
    eieio
    blr
    .globl  out_16_ne
out_16_ne:
    oris    r3, r3, 0xfe00
    sth     r4, 0(r3)
    eieio
    blr
    .globl  out_32
out_32:
    oris    r3, r3, 0xfe00
    stwbrx  r4, 0, r3
    eieio
    blr
    .globl  read_8
read_8:
    lbz     r3,0(r3)
    blr
    .globl  read_16
read_16:
    lhbrx   r3, 0, r3
    blr
    .globl  read_32
read_32:
    lwbrx   r3, 0, r3
    blr
    .globl  read_32_ne
read_32_ne:
    lwz     r3, 0(r3)
    blr
    .globl  write_8
write_8:
    stb     r4, 0(r3)
    eieio
    blr
    .globl  write_16
write_16:
    sthbrx  r4, 0, r3
    eieio
    blr
    .globl  write_32
write_32:
    stwbrx  r4, 0, r3
    eieio
    blr
    .globl  write_32_ne
write_32_ne:
    stw     r4, 0(r3)
    eieio
    blr


.globl  early_init_f

early_init_f:
        mflr    r11
        lis     r10, 0x8000

        /* PCI Latency Timer */
        li      r4, 0x0d
        ori     r3, r10, PLTR@l
        bl      __pci_config_write_8

        /* Cache Line Size */
        li      r4, 0x08
        ori     r3, r10, PCLSR@l
        bl      __pci_config_write_8

        /* PCI Cmd */
        li      r4, 6
        ori     r3, r10, PCICR@l
        bl      __pci_config_write_16

#if 1
        /* PCI Stat */
        ori     r3, r10, PCISR@l
        bl      __pci_config_read_16
        ori     r4, r4, 0xffff
        ori     r3, r10, PCISR@l
        bl      __pci_config_write_16
#endif

        /* PICR1 */
        lis     r4, 0xff14
        ori     r4, r4, 0x1b98
        ori     r3, r10, PICR1@l
        bl      __pci_config_write_32


        /* PICR2 */
        lis     r4, 0x0404
        ori     r4, r4, 0x0004
        ori     r3, r10, PICR2@l
        bl      __pci_config_write_32

	/* MIOCR1 */
        li      r4, 0x04
        ori     r3, r10, MIOCR1@l
        bl      __pci_config_write_8

	/* For the MPC8245, set register 77 to %00100000 (see Errata #15) */
	/* SDRAM_CLK_DEL (0x77)*/
        li      r4, 0x10
        ori     r3, r10, MIOCR2@l
        bl      __pci_config_write_8

        /* EUMBBAR */
        lis     r4, 0xfc00
        ori     r3, r10, EUMBBAR@l
        bl      __pci_config_write_32

	/* AMBOR */

       /* Even if Address Map B is not being used (though it should),
        * the memory DLL needs to be cleared/set/cleared before using memory.
	*/

        ori     r3, r10, AMBOR@l
        bl      __pci_config_read_8	/* get Current bits */

        andi.   r4, r4, 0xffdf
        ori     r3, r10, AMBOR@l
        bl      __pci_config_write_16	/* Clear DLL_RESET */

        ori    r4, r4, 0x0020
        ori     r3, r10, AMBOR@l
        bl      __pci_config_write_16	/* Set DLL_RESET */

        andi.   r4, r4, 0xffdf
        ori     r3, r10, AMBOR@l
        bl      __pci_config_write_16	/* Clear DLL_RESET */

        /* ERCR1 */
        lis     r4, 0x8040		/* Enable RCS2, use supplied timings */
        ori     r4, r4, 0x8000
        ori     r3, r10, ERCR1@l
        bl      __pci_config_write_32

        /* ERCR2 */
        lis     r4, 0x0000		/* Disable RCS3 parms */
        ori     r4, r4, 0x0000
        ori     r3, r10, ERCR2@l
        bl      __pci_config_write_32

        /* ERCR3 */
        lis     r4, 0x0000		/* RCS3 at 0x70000000, 64K bytes */
        ori     r4, r4, 0x0004
        ori     r3, r10, ERCR2@l
        bl      __pci_config_write_32

	/* Preserve memgo bit */
        /* MCCR1 */

/*	lis     r4, 0x75a8		/  Safe Local ROM = 11+3 clocks */
  	lis     r4, 0x75a0              /* Safe Local ROM = 11+3 clocks */
/*      lis     r4, 0x73a0              /  Fast Local ROM = 7+3 clocks */
/*      oris    r4, r4, 0x0010          /  Burst ROM/Flash enable */
/*      oris    r4, r4, 0x0004          /  Self-refresh enable */

/*      ori     r4,r4,0xFFFF            /  16Mbit  2bank SDRAM */
/*      ori     r4,r4,0xAAAA            /  256Mbit 4bank SDRAM (8245 only) */
/*      ori     r4,r4,0x5555            /  64Mbit  2bank SDRAM */
        ori     r4,r4,0x0000            /* 64Mbit  4bank SDRAM */

        ori     r3, r10, MCCR1@l
        bl      __pci_config_write_32

        /* MCCR2 */

        lis     r4,0x0000
/*      oris    r4,r4,0x4000            /  TS_WAIT_TIMER = 3 clocks */
        oris    r4,r4,0x1000            /* ASRISE = 8 clocks */
        oris    r4,r4,0x0080            /* ASFALL = 8 clocks */
/*      oris    r4,r4,0x0010            /  SDRAM Parity (else ECC) */
/*      oris    r4,r4,0x0008            /  Write parity check */
/*      oris    r4,r4,0x0004            /  SDRAM inline reads */


/* Select a refresh rate; it needs to match the bus speed; if too */
/* slow, data may be lost; if too fast, performance is lost.  We */
/* use the fastest value so we run at all speeds. */
/* Refresh = (15600ns/busclk) - (213 (see UM)). */

/*      ori     r4,r4,0x1d2c            /  133 MHz mem bus        = 1867 */
/*      ori     r4,r4,0x150c            /  100 MHz mem bus        = 1347 */
/*      ori     r4,r4,0x10fc            /   83 MHz mem bus        = 1087 */
/*      ori     r4,r4,0x0cc4            /   66 MHz mem bus        =  817 */
        ori     r4,r4,0x04cc            /*  33 MHz mem bus (SAFE) =  307 */
/*      ori     r4,r4,0x0002            /  Reserve a page */
/*      ori     r4,r4,0x0001            /  RWM parity */

        ori     r3, r10, MCCR2@l
        bl      __pci_config_write_32


        /* MCCR3 */
        lis     r4,0x0000               /* BSTOPRE_M = 7 (see A/N) */
        oris    r4,r4,0x0500            /* REFREC    = 8 clocks */
        ori     r3, r10, MCCR3@l
        bl      __pci_config_write_32

        /* MCCR4 */                     /* Turn on registered buffer mode */
        lis     r4, 0x2000              /* PRETOACT = 3 clocks */
        oris    r4,r4,0x0400            /* ACTOPRE  = 5 clocks */
/*      oris    r4,r4,0x0080            /  Enable 8-beat burst (32-bit bus) */
/*      oris    r4,r4,0x0040            /  Enable Inline ECC/Parity */
        oris    r4,r4,0x0020            /* EXTROM enabled */
        oris    r4,r4,0x0010            /* Registered buffers */
/*      oris    r4,r4,0x0000            /  BSTOPRE_U = 0 (see A/N) */
        oris    r4,r4,0x0002            /* DBUS_SIZ[2] (8 bit on RCS1) */

/*      ori     r4,r4,0x8000            /  Registered DIMMs */
        ori     r4,r4,0x2000            /*CAS Latency (CL=3) (see RDLAT) */
/*      ori     r4,r4,0x2000            /  CAS Latency (CL=2) (see RDLAT) */
/*      ori     r4,r4,0x0300            /  Sequential wrap/8-beat burst */
        ori     r4,r4,0x0200            /* Sequential wrap/4-beat burst */
        ori     r4,r4,0x0030            /* ACTORW  = 3 clocks */
        ori     r4,r4,0x0009            /* BSTOPRE_L = 9 (see A/N) */

        ori     r3, r10, MCCR4@l
        bl      __pci_config_write_32

	/* MSAR1 */
        lis     r4, 0xc0804000@h
        ori     r4, r4, 0xc0804000@l
        ori     r3, r10, MSAR1@l
        bl      __pci_config_write_32

	/* MSAR2 */
        lis     r4, 0xc0804000@h
        ori     r4, r4, 0xc0804000@l
        ori     r3, r10, MSAR2@l
        bl      __pci_config_write_32

	/* MESAR1 */
        lis     r4, 0x00000000@h
        ori     r4, r4, 0x00000000@l
        ori     r3, r10, EMSAR1@l
        bl      __pci_config_write_32

	/* MESAR2 */
        lis     r4, 0x01010101@h
        ori     r4, r4, 0x01010101@l
        ori     r3, r10, EMSAR2@l
        bl      __pci_config_write_32

	/* MEAR1 */
        lis     r4, 0xffbf7f3f@h
        ori     r4, r4, 0xffbf7f3f@l
        ori     r3, r10, MEAR1@l
        bl      __pci_config_write_32

	/* MEAR2 */
        lis     r4, 0xffbf7f3f@h
        ori     r4, r4, 0xffbf7f3f@l
        ori     r3, r10, MEAR2@l
        bl      __pci_config_write_32

	/* MEEAR1 */
        lis     r4, 0x00000000@h
        ori     r4, r4, 0x00000000@l
        ori     r3, r10, EMEAR1@l
        bl      __pci_config_write_32

	/* MEEAR2 */
        lis     r4, 0x01010101@h
        ori     r4, r4, 0x01010101@l
        ori     r3, r10, EMEAR2@l
        bl      __pci_config_write_32

	/* ODCR */
        li      r4, 0x7f
        ori     r3, r10, ODCR@l
        bl      __pci_config_write_8

	/* MBER */
        li      r4, 0x01
        ori     r3, r10, MBER@l
        bl      __pci_config_write_8

        /* Page CTR aka PGMAX */
        li      r4, 0x32
        ori     r3, r10, 0x70
        bl      __pci_config_write_8

#if 0
	/* CLK Drive */
        ori     r4, r10, 0xfc01 /* Top bit will be ignored */
        ori     r3, r10, 0x74
        bl      __pci_config_write_16
#endif

	/* delay */
        lis     r7, 1
        mtctr   r7
label1: 	bdnz    label1

        /* Set memgo bit */
        /* MCCR1 */
        ori     r3, r10, MCCR1@l
        bl      __pci_config_read_32
        lis	r7, 0x0008
        or	r4, r3, r7
        ori     r3, r10, MCCR1@l
        bl      __pci_config_write_32

	/* delay again */
        lis     r7, 1
        mtctr   r7
label2: 	bdnz    label2
#if 0
/* DEBUG: Infinite loop, write then read */
loop:
        lis     r7, 0xffff
        mtctr   r7
        li	r3, 0x5004
        lis	r4, 0xa0a0
        ori	r4, r4, 0x5050
	bl write_32_ne
        li	r3, 0x5004
	bl read_32_ne
      	bdnz    loop
#endif
        mtlr    r11
        blr
#endif

⌨️ 快捷键说明

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