📄 reset_db1550.s
字号:
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 + -