📄 reset_ti1500.s
字号:
/* * Step 15) Set peripherals to a known state */ li t0, AU1500_IC0_ADDR li t1, 0xFFFFFFFF sw t1, ic_cfg0clr(t0) sw t1, ic_cfg1clr(t0) sw t1, ic_cfg2clr(t0) sw t1, ic_srcset(t0) sw t1, ic_assignset(t0) sw t1, ic_wakeclr(t0) sw t1, ic_maskclr(t0) sw t1, ic_risingclr(t0) sw t1, ic_fallingclr(t0) sw zero, ic_testbit(t0) sync li t0, AU1500_IC1_ADDR li t1, 0xFFFFFFFF sw t1, ic_cfg0clr(t0) sw t1, ic_cfg1clr(t0) sw t1, ic_cfg2clr(t0) sw t1, ic_srcset(t0) sw t1, ic_assignset(t0) sw t1, ic_wakeclr(t0) sw t1, ic_maskclr(t0) sw t1, ic_risingclr(t0) sw t1, ic_fallingclr(t0) sw zero, ic_testbit(t0) sync li t0, AU1500_SYS_ADDR sw zero, sys_freqctrl0(t0) sw zero, sys_freqctrl1(t0) sw zero, sys_clksrc(t0) sw zero, sys_pininputen(t0) sync li t0, AU1500_AC97_ADDR li t1, 0x2 sw t1, ac97_enable(t0) sync li t0, AU1500_USBH_ADDR li t1, usbh_enable addu t0, t1, t0 sw zero, 0(t0) sync li t0, AU1500_USBD_ADDR sw zero, usbd_enable(t0) sync li t0, AU1500_MACEN_ADDR sw zero, macen_mac0(t0) sw zero, macen_mac1(t0) sync li t0, AU1500_UART0_ADDR sw zero, uart_enable(t0) sync li t0, AU1500_UART3_ADDR sw zero, uart_enable(t0) sync /* * Step 16) Determine cause of reset */ /* wait 10mS to debounce external signals */ li t1, MEM_1MS*101: add t1, -1 bne t1, zero, 1b nop li t0, AU1500_SYS_ADDR lw t1, sys_wakesrc(t0) /* Clear sys_wakemsk to prevent false events */ sw zero, sys_wakemsk(t0) sync /* Clear sys_wakesrc */ //sw zero, sys_wakesrc(t0) sync /* Check for Hardware Reset */ andi t2, t1, 0x01 bne zero, t2, hardwarereset /* Check for Sleep Wakeup */ andi t2, t1, 0x02 bne zero, t2, sleepwakeup nop /* Assume run-time reset */ beq zero, zero, runtimereset nop/********************************************************************/hardwarereset: /* * Step 1) Initialize SDRAM */ bal initSDRAM nop /* * Step 2) Initialize BOARD-specific items */ bal initBOARD nop /* * Step 3) Invoke application */ beq zero, zero, alldone nop/********************************************************************/runtimereset: /* * Step 1) Initialize SDRAM */ bal initSDRAM nop /* * Step 2) Initialize BOARD-specific items */ bal initBOARD nop /* * Step 3) Invoke application */ beq zero, zero, alldone nop /********************************************************************/sleepwakeup:#if 0 /* * Step 1) Initialize SDRAM. The SDRAM must be in self-refresh mode. */ bal wakeupSDRAM nop /* * Step 2) Initialize BOARD-specific items */ bal initBOARD nop /* * Step 3) Invoke application */ la t0, AU1500_SYS_ADDR lw sp, sys_scratch0(t0) lw ra, sys_scratch1(t0) jr ra nop#else /* * Step 1) Initialize SDRAM */ bal initSDRAM nop /* * Step 2) Initialize BOARD-specific items */ bal initBOARD nop /* * Step 3) Invoke application */ beq zero, zero, alldone nop#endif/********************************************************************/ /* * This routine initializes the SDRAM controller from Initial * Power-up Reset or Running Reset. */initSDRAM: /* Only perform SDRAM init if running from ROM/Flash */ addu t2, ra, zero /* preserve ra */ bal getPC nopgetPC: lui t0, 0x1F00 /* ROM/flash address? */ and t1, t0, ra addu ra, t2, zero /* restore ra */ bne t0, t1, initSDRAMdone nop /* wait 1mS before setup */ li t1, MEM_1MS1: add t1, -1 bne t1, zero, 1b nop li t0, AU1500_MEM_ADDR li t1, MEM_SDMODE0 sw t1, mem_sdmode0(t0) li t1, MEM_SDMODE1 sw t1, mem_sdmode1(t0) li t1, MEM_SDMODE2 sw t1, mem_sdmode2(t0) li t1, MEM_SDADDR0 sw t1, mem_sdaddr0(t0) li t1, MEM_SDADDR1 sw t1, mem_sdaddr1(t0) li t1, MEM_SDADDR2 sw t1, mem_sdaddr2(t0) sync li t1, MEM_SDREFCFG_D sw t1, mem_sdrefcfg(t0) sync sw zero, mem_sdprecmd(t0) sync sw zero, mem_sdautoref(t0) sync sw zero, mem_sdautoref(t0) sync li t1, MEM_SDREFCFG_E sw t1, mem_sdrefcfg(t0) sync li t1, MEM_SDWRMD0 sw t1, mem_sdwrmd0(t0) sync li t1, MEM_SDWRMD1 sw t1, mem_sdwrmd1(t0) sync li t1, MEM_SDWRMD2 sw t1, mem_sdwrmd2(t0) sync /* wait 1mS after setup */ li t1, MEM_1MS1: add t1, -1 bne t1, zero, 1b nopinitSDRAMdone: jr ra nop/********************************************************************/wakeupSDRAM: /* ** Assuming that SDRAM is in self refresh mode. All we need to do is update ADDR, MODE and refresh registers *** */ li t0, AU1500_MEM_ADDR li t1, MEM_SDMODE0 sw t1, mem_sdmode0(t0) li t1, MEM_SDMODE1 sw t1, mem_sdmode1(t0) li t1, MEM_SDMODE2 sw t1, mem_sdmode2(t0) li t1, MEM_SDADDR0 sw t1, mem_sdaddr0(t0) li t1, MEM_SDADDR1 sw t1, mem_sdaddr1(t0) li t1, MEM_SDADDR2 sw t1, mem_sdaddr2(t0) sw zero, mem_sdautoref(t0) li t1, MEM_SDREFCFG_E sw t1, mem_sdrefcfg(t0) sync jr ra nop/********************************************************************/initBOARD: /* * External and/or board-specific peripheral initialization */ /* * Establish MUXed pin functionality * * CS=0 * USB=0 USBH * U3=0 UART3 * SRC=0 GPIO6 * EX1=0 GPIO3 * EX0=0 GPIO2 * UR3=1 UART3 * NI2=0 MAC1 * U0=0 UART0 */ li t0, AU1500_SYS_ADDR li t1,(1<<15) sw t1, sys_pinfunc(t0)/***************************************************************************//* *//* IOs on Titanium CPU board default settings *//* ------------------------------------------ *//* *//* GPIO name type default comments *//* --------------------------------------------------------------------- *//* 00 CF_CTRL2 I - CF CD#1 *//* 01 CF_CTRL3 I - CF CD#2 *//* 02 EXT_IO0 I - IOs on expansion connector, *//* 03 EXT_IO1 I - LCD backlight on multimedia board *//* 04 CF_CTRL8 I - CF RDYBSY *//* 05 PHY_CTRL0 I - Phy 1 transmit error *//* 06 PHY_CTRL1 I - Phy 1 receive error *//* 07 PHY_CTRL2 I - Phy 2 transmit error *//* 08 PHY_CTRL3 I - Phy 2 receive error *//* 09 CF_CTRL9 I - CF_INPACK# *//* 10 U3CTS (UART3) - UART3 CTS *//* 11 U3DCD (UART3) - used to monitor RS232_INVALID *//* 12 U3RI (UART3) - USB_CTRL1, used to monitor USB OC#*//* 13 U3RTS (UART3) - UART3 RTS *//* 14 U3DTR (UART3) 1 USB_CTRL0, used to switch USB 5V *//* 15 PHY_CTRL6 I - PHY_INTR# *//* --------------------------------------------------------------------- *//* Au1500 silicon stepping AB: no IRQs on GPIO 2xx *//* --------------------------------------------------------------------- *//* 200 GPIO200 O 1 startup: 0, connected to PCI reset*//* 201 PHY_CTRL5 O 1 PHY FDX (full duplex = 1) *//* 202 PCI_SERR I - monitor PCI_SERR by software *//* 203 PCI_RST# I - monitor PCI reset by software *//* 204 CF_CTRL0 O 1 CF reset *//* 205 CF_CTRL1 O 1 CF CSEL# *//* 206 AUDIO_CTRL0 O 0 audio amp volume clock *//* 207 AUDIO_CTRL1 O 0 audio amp volume up/down *//* 208 CF_CTRL4 I - CF VS1# *//* 209 CF_CTRL5 I - CF VS2# *//* 210 CF_CTRL6 I - CF BVD1 *//* 211 CF_CTRL7 I - CF BVD2 *//* 212 nc I - not connected, USB_CTRL0 next rev.*//* 213 PHY_CTRL4 O 1 Phy low power = 1 *//* 214 CF_CTRL10 O 1 CF power switch (0 = on) *//* 215 WDI O 0 watchdog trigger *//* *//***************************************************************************/ li t1, 0x000000FF sw t1, sys_trioutclr(t0) li t1, 0x00008000 sw t1, sys_outputclr(t0) sync /* Set GPIO2 direction */ /* Reset GPIO module */ li t0, AU1500_GPIO2_ADDR li t1, 3 sw t1, gpio2_enable(t0) sync li t1, 1 sw t1, gpio2_enable(t0) sync /* Clear interrupt Enable bits */ sw zero,gpio2_inten(t0) sync /* Set Outputs and Direction */ /* Also Assert PCI_RST# before PCI clock enabled */ li t1, 0x0000E0F3 sw t1, gpio2_dir(t0) sync li t1, 0xE0F36032 /* enable and set PCIReset 200 */ sw t1, gpio2_output(t0) /* see table above */ sync /* * Establish CLOCKing * * FREQ5: unused * FREQ4: unused * FREQ3: unused * FREQ2: PCI (done below in PCI setup) * FREQ1: USBH and USBD * FREQ0: unused */ li t0, AU1500_SYS_ADDR li t1, (1<<12)|(1<<11)|(1<<10) sw t1, sys_freqctrl0(t0) li t1, (3<<12)|(1<<11)|(1<<10)|(3<<7)|(1<<6)|(1<<5) sw t1, sys_clksrc(t0) sync /* Setup PCI Host - See Au1500 PCI app note */ /* Enable PCI Clock - Internally generated from AUXPLL/FREQ2 */ /* Titanium board forces PCI Clock to 32MHz */ b pci33mhz /* add conditional to 66 here if desired */ noppci66mhz: /* actually 64mhz - routine included but not used */ 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 noppci33mhz: /* 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_1MS1: add t1, -1 bne t1, zero, 1b nop /* De-assert PCI_RST# */ li t0, AU1500_GPIO2_ADDR li t1, 0xE0F36033 /* deassert PCIReset 200 */ sw t1, gpio2_output(t0) sync /* Wait another millisecond - way more than the required time */ li t1, MEM_1MS1: add t1, -1 bne t1, zero, 1b nop sync /* Configure the PCI interface */ li t0, AU1500_PCI_ADDR li t1, 0x00000000 sw t1, pci_cmem(t0) li t1, 0x0000000F 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 PHYs out of low-power mode */ li t0, AU1500_GPIO2_ADDR li t1, 0xE0F34033 /* enable phy */ sw t1, gpio2_output(t0) sync sync jr ra nop/********************************************************************/alldone: /* * Prepare to invoke application main() */ .set reorder/********************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -