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

📄 reset_db1550.s

📁 MIPS下的boottloader yamon 的源代码
💻 S
📖 第 1 页 / 共 3 页
字号:

initDRAM:

	/* Only perform DRAM init if running from ROM/Flash */
	addu	t2, ra, zero	/* preserve ra */
    b		getPC
    nop

getPC:
    lui		t0, 0x1F00      /* ROM/flash address? */
    and		t1, t0, ra
	addu	ra, t2, zero	/* restore ra */
    bne		t0, t1, initDRAMdone
    nop

	/* wait 1mS before setup */
	li		t1, MEM_1MS
1:	add		t1, -1
	bne		t1, zero, 1b
	nop

initDDR:

	li		t0, AU1550_MEM_ADDR
#ifndef USE_S5
	li		t1, MEM_SDCONFIGA_DDR
	li		t2, MEM_SDCONFIGB_DDR
	li		t3, MEM_SDMODE_DDR
	li		v0, MEM_MR0_DDR
#else
	lw		t1, MEM_SDCONFIGA(a0)
	lw		t2, MEM_SDCONFIGB(a0)
	lw		t3, MEM_SDMODE(a0)
	lw		v0, MEM_MR0(a0)
#endif
	li		t4, MEM_SDADDR0_DDR
	li		t5, MEM_SDADDR1_DDR
	li		t6, MEM_SDADDR2_DDR

	sw		t1, mem_sdconfiga(t0)
	sync
	sw		t2, mem_sdconfigb(t0)
	sync
	sw		t3, mem_sdmode0(t0)
	sw		t3, mem_sdmode1(t0)
	sw		t3, mem_sdmode2(t0)
	sw		t4, mem_sdaddr0(t0)
	sw		t5, mem_sdaddr1(t0)
	sw		t6, mem_sdaddr2(t0)
	sync

	li		v1, MEM_MR1_DDR
	li		a2, MEM_MR2_DDR
	li		a3, MEM_MR3_DDR

	/*
	 * Initialization per Micron data sheet, page 72:
	 * 0. Power sequence
	 * 1. 200us delay
	 * 2. NOP w/ CKE
	 * 3. PRECHARGE ALL
	 * 4. LOAD MODE REGISTER for the extended mode register (normal, not reduced, drive strength)
	 * 5. LOAD MODE REGISTER for the normal mode register (DLL reset activated)
	 * 6. 200 clocks of idle
	 * 7. PRECHARGE ALL
	 * 8. AUTO REFRESH x 2
	 * 9. LOAD MODE REGISTER (DLL reset de-activated)
	 * Devices are now ready for use.
	 */

	/* NOP w/ CKE */
	lw		t1, mem_sdconfigb(t0)
	li		t2, MEM_SDCONFIGB_BA
	or		t1, t2, t1
	sw		t1, mem_sdconfigb(t0)
	sync

	/* PRECHARGE ALL */
	sw		zero, mem_sdprecmd(t0)
	sync

	/* LOAD MODE REGISTER extended mode register 3 */
	sw		a3, mem_sdwrmd0(t0)
	sync
	sw		a3, mem_sdwrmd1(t0)
	sync
	sw		a3, mem_sdwrmd2(t0)
	sync

	/* LOAD MODE REGISTER extended mode register 2 */
	sw		a2, mem_sdwrmd0(t0)
	sync
	sw		a2, mem_sdwrmd1(t0)
	sync
	sw		a2, mem_sdwrmd2(t0)
	sync

	/* LOAD MODE REGISTER extended mode register 1 */
	sw		v1, mem_sdwrmd0(t0)
	sync
	sw		v1, mem_sdwrmd1(t0)
	sync
	sw		v1, mem_sdwrmd2(t0)
	sync

	/* LOAD MODE REGISTER normal mode register DLL reset */
#define MR0_DLL 0x0100
	ori		t1, v0, MR0_DLL
	sw		t1, mem_sdwrmd0(t0)
	sync
	sw		t1, mem_sdwrmd1(t0)
	sync
	sw		t1, mem_sdwrmd2(t0)
	sync

	/* 200 clocks of idle */
	lw		t1, mem_sdconfigb(t0)
	li		t2, MEM_SDCONFIGB_BA
	or		t1, t2, t1
	sw		t1, mem_sdconfigb(t0)
	sync

	/* PRECHARGE ALL */
	sw		zero, mem_sdprecmd(t0)
	sync

	/* AUTO REFRESH x 2 */
	sw		zero, mem_sdautoref(t0)
	sync
	sw		zero, mem_sdautoref(t0)
	sync

	/* LOAD MODE REGISTER normal mode register */
	sw		v0, mem_sdwrmd0(t0)
	sync
	sw		v0, mem_sdwrmd1(t0)
	sync
	sw		v0, mem_sdwrmd2(t0)
	sync

initDRAMdone:
	li		t0, AU1550_MEM_ADDR

	/* Enable refresh */
	lw		t1, mem_sdconfiga(t0)
	li		t2, MEM_SDCONFIGA_E
	or		t1, t2, t1
	sw		t1, mem_sdconfiga(t0)
	sync

	/* wait 1mS after setup */
	li		t1, MEM_1MS
1:	add		t1, -1
	bne		t1, zero, 1b
	nop

	jr		ra
	nop

/********************************************************************/

wakeupDRAM:

#ifndef USE_S5
	li		t1, MEM_SDCONFIGA_DDR
	li		t2, MEM_SDCONFIGB_DDR
	li		t3, MEM_SDMODE_DDR
#else
	lw		t1, MEM_SDCONFIGA(a0)
	lw		t2, MEM_SDCONFIGB(a0)
	lw		t3, MEM_SDMODE(a0)
#endif
	li		t4, MEM_SDADDR0_DDR
	li		t5, MEM_SDADDR1_DDR
	li		t6, MEM_SDADDR2_DDR

	li		t0, AU1550_MEM_ADDR
	sw		t1, mem_sdconfiga(t0)
	sync
	sw		t2, mem_sdconfigb(t0)
	sync
	sw		t3, mem_sdmode0(t0)
	sw		t3, mem_sdmode1(t0)
	sw		t3, mem_sdmode2(t0)
	sw		t4, mem_sdaddr0(t0)
	sw		t5, mem_sdaddr1(t0)
	sw		t6, mem_sdaddr2(t0)
	sync

	/* Assert DCKE - bring DDR out of self refresh */
	/* Note that two mem_sdsref are needed since state lost during sleep */
	sw		zero, mem_sdsref(t0)
	sw		zero, mem_sdsref(t0)

	/*
	 * Issue 80ns of NOPs
	 */
	lw		t1, mem_sdconfigb(t0)
	li		t2, MEM_SDCONFIGB_BA
	or		t1, t2, t1
	sw		t1, mem_sdconfigb(t0)
	sync
	
	/*
	 * Perform burst refresh of 8K rows
	 */
	li		t1, 8192
burstrefresh:
	sw		zero, mem_sdautoref(t0)
	bne		zero, t1, burstrefresh
	addi	t1, t1, -1

	/* Enable refresh */
	lw		t1, mem_sdconfiga(t0)
	li		t2, MEM_SDCONFIGA_E
	or		t1, t2, t1
	sw		t1, mem_sdconfiga(t0)
	sync

	jr		ra
	nop

/********************************************************************/

initBOARD:

	/*
	 * External and/or board-specific peripheral initialization
	 */

	/*
	 * Establish MUXed pin functionality
	 *
	 * PSC3=001 I2S, GPIO211
	 * PSC2=011 SMBus, GPIO[208:206]
	 * CS=0   EXTCLK0
	 * USB=0  USBH
	 * U3=0	  U3TXD
	 * U1R=1  GPIO22
	 * U1T=1  GPIO21
	 * EX1=0  GPIO3
	 * EX0=1  EXTCLK0
	 * U3=1   UART3
	 * MBS=1
	 * NI2=0  MAC1
	 * U0=0   U0TXD
	 * MBS=1
	 * S1=1   PSC1_SYNC1
	 * S0=0   GPIO16
	 */
	li		t0, AU1550_SYS_ADDR
	li		t1, (1<<20)|(3<<17)|(1<<13)|(1<<12)|(1<<7)|(1<<5)|(1<<2)|(1<<1)
	sw		t1, sys_pinfunc(t0)

	/*
	 * Establish GPIO direction
	 *
	 * GPIO0 Input PCMCIA Card 0 Fully Inserted#
	 * GPIO1 Input PCMCIA Card 1 Fully Inserted#
	 * GPIO2 EXTCLK0 I2S_MCLK
	 * GPIO3 Input PCMCIA Card 0 IRQ#
	 * GPIO4 Input Daughtercard DMA_REQ
	 * GPIO5 Input PCMCIA Card 1 IRQ#
	 * GPIO6 Input GPIO6_Switch
	 * GPIO7 Input FLASH_BUSY
	 * GPIO8 Input Daughtercard IRQ#
	 * GPIO9  UART3
	 * GPIO10 UART3
	 * GPIO11 UART3
	 * GPIO12 UART3
	 * GPIO13 UART3
	 * GPIO14 UART3
	 * GPIO15 Input Undefined
	 * GPIO16 Output SPI_SEL#
	 * GPIO17 PSC1
	 * GPIO20 UART0
	 * GPIO21 Input PCMCIA Card 0 STSCHG#
	 * GPIO22 Input PCMCIA Card 1 STSCHG#
	 * GPIO23 UART3
	 * GPIO24 MAC1
	 * GPIO25 MAC1
	 * GPIO26 MAC1
	 * GPIO27 MAC1
	 * GPIO28 MAC1
	 */
	li		t1, 0x006081FB
	sw		t1, sys_trioutclr(t0)
	li		t1, 0x00010000
	sw		t1, sys_outputset(t0)
	sync

	/*
	 * Establish GPIO2 direction
	 *
	 * GPIO200 Output PCI_RST#
	 * GPIO201 Input Undefined
	 * GPIO202 Output Greed LED#
	 * GPIO203 Output Red LED#
	 * GPIO204 Input I2S MCLK
	 * GPIO205 Input Undefined
	 * GPIO206 Input GPIO206_Switch
	 * GPIO207 Input USB OTG IRQ#
	 * GPIO208 Output USB_DEV_RDY
	 * GPIO209 PSC2 SMBus
	 * GPIO210 PSC2 SMBus
	 * GPIO211 Output NAND_FORCE_CE#
	 * GPIO212 PSC3 I2S
	 * GPIO213 PSC3 I2S
	 * GPIO214 PSC3 I2S
	 * GPIO215 PSC3 I2S
	 */
	li		t0, AU1550_GPIO2_ADDR
	li		t1, 3
	sw		t1, gpio2_enable(t0)
	sync
	li		t1, 1
	sw		t1, gpio2_enable(t0)
	sync
	sw		zero, gpio2_inten(t0)
	sync
	li		t1, (1<<11)|(1<<8)|(1<<3)|(1<<2)|(1<<0)
	sw		t1, gpio2_dir(t0)
	sync
	li		t1, (1<<27)|(1<<24)|(1<<19)|(1<<18)|(1<<16)|(1<<11)|(0<<8)|(0<<3)|(0<<2)|(0<<0)
	sw		t1, gpio2_output(t0)
	sync

	/* Assert PCI_RST# before PCI clock enabled */
	li		t0, DB1550_BCSR_ADDR
	lh		t1, 0x14(t0)
	ori		t1, t1,(1<<10) /* EN_GPIO200_RST */
	sh		t1, 0x14(t0)
	sync
	li		t0, AU1550_GPIO2_ADDR
	li		t1, (1<<16)|(0<<0)
	sw		t1, gpio2_output(t0)
	sync

	/*
	 * Establish CLOCKing
	 *
	 * FREQ5: unused
	 * FREQ4: unused
	 * FREQ3: unused
	 * FREQ2: PCI (done below in PCI setup)
	 * FREQ1: 48MHz for USBH and USBD
	 * FREQ0: unused
	 */
	li		t0, AU1550_SYS_ADDR
	li		t1, (1<<12)|(1<<11)|(1<<10)
	sw		t1, sys_freqctrl0(t0)
	li		t1, (3<<2)|(1<<1)|(1<<0)
	sw		t1, sys_clksrc(t0)
	sync

	/* Setup PCI Host - See Au1500 PCI app note */
	/* Enable PCI Clock - Internally generated from AUXPLL/FREQ2 */
	li		t0, DB1550_BCSR_ADDR
	lh		t1, 0x14(t0)
	andi	t1, t1,1 /* M66EN */
	beq		zero, t1,pci33mhz
	li		t0, AU1550_SYS_ADDR

pci66mhz: /* actually 64mhz */
	lw		t2, sys_freqctrl0(t0)
	li		t1, (2<<22)|(1<<21)|(1<<20) /* div by 6 */
	or		t1, t1,t2
	sw		t1, sys_freqctrl0(t0)
	lw		t2, sys_clksrc(t0)
	li		t1, (4<<17)|(1<<16)|(0<<15) /* no div */
	or		t1, t1,t2
	sw		t1, sys_clksrc(t0)
	b		pcireset
	nop

pci33mhz: /* actually 32mhz */
	lw		t2, sys_freqctrl0(t0)
	li		t1, (2<<22)|(1<<21)|(1<<20) /* div by 6 */
	or		t1, t1,t2
	sw		t1, sys_freqctrl0(t0)
	lw		t2, sys_clksrc(t0)
	li		t1, (4<<17)|(1<<16)|(1<<15) /* div by 2 */
	or		t1, t1,t2
	sw		t1, sys_clksrc(t0)

pcireset:
	/* wait 1mS */
	li		t1, MEM_1MS
1:	add		t1, -1
	bne		t1, zero, 1b
	nop

	/* De-assert PCI_RST# */
	li		t0, AU1550_GPIO2_ADDR
	li		t1, (1<<16)|(1<<0)
	sw		t1, gpio2_output(t0)
	sync

	/* Wait 6 PCI clock cycles */
	li		t1, MEM_1MS
1:	add		t1, -1
	bne		t1, zero, 1b
	nop
	sync

	/* Setup PCI Host - See Au1500 PCI app note */
	li		t0, AU1550_PCI_ADDR
	li		t1, 0x00000000
	sw		t1, pci_cmem(t0)
	li		t1, 0x0008000F
	sw		t1, pci_config(t0)
	li		t1, 0xFFFF0000
	sw		t1, pci_b2bmask_cch(t0)
	li		t1, 0x00000000
	sw		t1, pci_b2bbase0_venid(t0)
	li		t1, 0x00000000
	sw		t1, pci_b2bbase1_id(t0)
	li		t1, 0xE0000000
	sw		t1, pci_mwmask_dev(t0)
	li		t1, 0x00000000
	sw		t1, pci_mwbase_rev_ccl(t0)
	li		t1, 0x02A00356
	sw		t1, pci_statcmd(t0)
	li		t1, 0x00000000
	sw		t1, pci_hdrtype(t0)
	li		t1, 0x00000008
	sw		t1, pci_mbar(t0)
	li		t1, 0x00000000
	sw		t1, pci_timeout(t0)

	/* Take AMD PHYs out of reset */
	li		t0, DB1550_BCSR_ADDR
	li		t1, 3
	sh		t1, 0x0C(t0)

	/* Ensure PCMCIA interface disabled */
	li		t0, DB1550_BCSR_ADDR
	sh		zero, 0x10(t0)

	jr		ra
	nop

/********************************************************************/

alldone:

	/*
	 * Prepare to invoke application main()
	 */
	.set reorder

/********************************************************************/

⌨️ 快捷键说明

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