📄 reset_pb1550.s
字号:
/* Examine Index[P], 1=no matching entry */
mfc0 t3, CP0_Index
li t4, 0x80000000
and t3, t4, t3
addiu t1, t1, 1 # increment t1 (asid)
beq zero, t3, tlbloop
nop
/* Initialize the TLB entry */
mtc0 t0, CP0_Index
mtc0 zero, CP0_EntryLo0
mtc0 zero, CP0_EntryLo1
mtc0 zero, CP0_PageMask
tlbwi
/* Do it again */
addiu t0, t0, 1
bne t0, t2, tlbloop
nop
/* Establish Wired (and Random) */
mtc0 zero, CP0_Wired
nop
/*
* Run-time determination of the CPU, SBUS, and DDR frequency.
* Switch S9.[2345] is utilized to encode a value an index 0 to 15.
*/
#ifdef USE_S9
b lookup_table
nop
/* Table entry is multiple of 16 words so that offset into table is
* simple shift of index value.
* Offset Description
* 0: 0x00: sys_cpupll value
* 1: 0x04: sys_powerctrl value
* 7: 0x08: mem_sttime0 value
* 8: 0x0C: mem_sttime1 value
* 9: 0x10: mem_sttime2 value
* A: 0x14: mem_sttime3 value
* 3: 0x1C: mem_sdconfiga value
* 4: 0x18: mem_sdconfigb value
* 2: 0x20: mem_sdmode value
* 5: 0x24: mem_mr0 value
* 6: 0x28: unused
* B: 0x2C: unused
* C: 0x30: unused
* D: 0x34: unused
* E: 0x38: unused
* F: 0x3C: unused
*
* When utilizing the tables, throughout this reset code, a0 will
* point to the selected configuration.
*/
#undef SYS_CPUPLL
#undef SYS_POWERCTRL
#undef MEM_STTIME0
#undef MEM_STTIME1
#undef MEM_STTIME2
#undef MEM_STTIME3
#define SYS_CPUPLL 0x00
#define SYS_POWERCTRL 0x04
#define MEM_STTIME0 0x08
#define MEM_STTIME1 0x0C
#define MEM_STTIME2 0x10
#define MEM_STTIME3 0x14
#define MEM_SDCONFIGA 0x18
#define MEM_SDCONFIGB 0x1c
#define MEM_SDMODE 0x20
#define MEM_MR0 0x24
SDR_SPEEDS:
sdr_396_198_198:
.long 33, 0, 0x40181D7, 0x00007774, 0x22080A20, 0x280E3E07, 0x5030061a, 0x0002801F, 0x00141114, 0x00000033, 0, 0, 0, 0, 0, 0
.long 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
.long 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
.long 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
.long 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
.long 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
.long 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
.long 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
.long 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
.long 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
.long 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
.long 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
.long 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
.long 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
.long 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
.long 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
DDR_SPEEDS:
ddr_396_198_198:
.long 33, 0, 0x40181D7, 0x00007774, 0x22080A20, 0x280E3E07, 0xD030060B, 0x0002801F, 0x05276222, 0x00000033, 0, 0, 0, 0, 0, 0
//ddr_192_96_96:
// .long 16, 0, 0x200C0CB, 0x00001999, 0x1103C50F, 0x1406DD03, 0x403002EE, 0x0002801F, 0x04135113, 0x00000023, 0, 0, 0, 0, 0, 0
ddr_336_168_168:
.long 28, 0, 0x4014194, 0x00006EEC, 0x2206C9DB, 0x270C35C6, 0x703004F2, 0x0002801F, 0x04266221, 0x00000063, 0, 0, 0, 0, 0, 0
ddr_396_198_99:
.long 33, 0, 0x40181D7, 0x00007774, 0x22080A20, 0x280E3E07, 0x40300306, 0x0002001F, 0x04135113, 0x00000023, 0, 0, 0, 0, 0, 0
ddr_396_198_198_default:
.long 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
ddr_492_123_123:
.long 41, 2, 0x301010E, 0x00006220, 0x11050554, 0x1508E544, 0x9030060a, 0x0000001F, 0x04276221, 0x00000063, 0, 0, 0, 0, 0, 0
ddr_492_164_164:
.long 41, 1, 0x4014193, 0x00006EEB, 0x2206C9DB, 0x270BF5C6, 0x80300502, 0x0002801F, 0x04266221, 0x00000063, 0, 0, 0, 0, 0, 0
ddr_492_246_123:
.long 41, 0, 0x602025D, 0x0000BFFF, 0x330A0EE8, 0x3B0FFEC9, 0x9030060a, 0x0002001F, 0x04276221, 0x00000063, 0, 0, 0, 0, 0, 0
ddr_552_276_138:
.long 46, 0, 0x60242E1, 0x0000BFFF, 0x440B532D, 0x4C0FFF0B, 0x503003D9, 0x0002001F, 0x04155113, 0x00000023, 0, 0, 0, 0, 0, 0
ddr_600_150_150:
.long 50, 2, 0x3014151, 0x00006AA8, 0x22060998, 0x260AED85, 0x70300494, 0x0002801F, 0x04256224, 0x00000033, 0, 0, 0, 0, 0, 0
ddr_600_200_100:
.long 50, 1, 0x40181D7, 0x00007775, 0x22084A21, 0x280E7E07, 0x4030030E, 0x0002001F, 0x04135113, 0x00000023, 0, 0, 0, 0, 0, 0
ddr_600_200_200:
.long 50, 1, 0x40181D7, 0x00007775, 0x22084A21, 0x280E7E07, 0xA030061B, 0x0002801F, 0x04276224, 0x00000033, 0, 0, 0, 0, 0, 0
ddr_600_300_150:
.long 50, 0, 0x70282E3, 0x0000BFFF, 0x440C5371, 0x4D0FFF4B, 0x70300494, 0x0002001F, 0x04256223, 0x00000023, 0, 0, 0, 0, 0, 0
ddr_756_151_151:
.long 63, 3, 0x3014192, 0x00006AA8, 0x22064999, 0x260AF186, 0x70300494, 0x0002801F, 0x04256223, 0x00000023, 0, 0, 0, 0, 0, 0
ddr_756_189_189:
.long 63, 2, 0x40181D6, 0x00007772, 0x2207CA1F, 0x280DBE07, 0x903005C5, 0x0002801F, 0x04276224, 0x00000033, 0, 0, 0, 0, 0, 0
ddr_756_252_126:
.long 63, 1, 0x602029E, 0x0000BFFF, 0x330A4EE9, 0x3B0FFECA, 0x503003D9, 0x0002001F, 0x04155113, 0x00000023, 0, 0, 0, 0, 0, 0
ddr_756_378_189:
.long 63, 0, 0x90343ED, 0x0000FFFF, 0x550F97FE, 0x5F0FFFCF, 0x903005C5, 0x0002001F, 0x04276224, 0x00000033, 0, 0, 0, 0, 0, 0
lookup_table:
la a0, DDR_SPEEDS
/* check for SDR vs DDR */
li t0, PB1550_BCSR_ADDR
lw t1, bcsr_whoami(t0)
andi t1, t1, PB1550_ID_MSK
beq zero, t1, read_switch
nop
la a0, SDR_SPEEDS
read_switch:
li t1, 0x20000000 /* convert to KSEG1 */
or a0, a0, t1
/* Read S9 to determine which setting, test if valid */
lw t1, bcsr_switches(t0)
andi t1, t1, 0x0078
xori t1, t1, 0x0078 /* invert to get user perspective of value */
sll t2, t1, 3
addu t3, a0, t2
lw t3, 0(t3)
beq zero, t3, default_config /* if cpupll is 0, use first speed setting */
nop
addu a0, a0, t2
default_config:
/* The correct table and configuration setting is pointed to by a0 */
/*
* Step 10) Establish CPU PLL frequency
*
* Upon arriving here, the processor is one of these two situations:
* a) reset with core at 192MHz, default timing on RCE0, or
* b) core at previous freq, optimized timing for previous freq for RCE0
* Situation A happens with either hardware-, runtime-, hibernate- or
* wake-up reset.
* Situation B happens when software jumps to 0xBFC00000 to reboot.
*
* This code allows for selecting processor frequency (from a table of
* settings) at boot-time. To do so, the S9 dip switches selects
* the configuration, and the sys_cpupll, sys_powerctrl, and RCE0 are
* updated [here] to reflect the new frequency. These three items must
* be properly configured for the Au1550 to change frequency and continue
* fetching code from Flash on RCE0.
*
* The configuration table contains values for all registers that affect
* timing in some fashion.
*
*/
li t0, AU1550_SYS_ADDR
lw t1, SYS_CPUPLL(a0)
lw t2, SYS_POWERCTRL(a0)
li t3, MEM_STCFG0
lw t4, MEM_STTIME0(a0)
#ifdef EB
ori t3, t3, 0x0200 /* mem_stcfg0[BE] */
#endif
li t5, AU1550_MEM_ADDR
/*
* Reduce system bus to /4 for (large PLL jumps) and then
* jump to cache-aligned code which changes the frequency
*/
li t6, 2
sw t6, sys_powerctrl(t0)
sync
beq zero, zero, rampPLL
nop
/*
* Place the following code on an icache line boundary to force
* an icache fetch of the 8 insns below which change critical
* timing.
*
* If these insns are not in cache, then an icache miss
* results in potentially unusually-timed access to Flash,
* depending upon where the icache miss happens in the
* sequence below, which can have unpredictable results...
*/
.align 5
rampPLL:
/*
* Update sys_cpupll, RCE0, and sys_powerctrl (order is important)
*/
sw t1, sys_cpupll(t0)
sync
sw t4, mem_sttime0(t5)
sw t3, mem_stcfg0(t5)
sw t2, sys_powerctrl(t0)
sync
/* End of critical timing code */
#else
/*
* Step 10) Establish CPU PLL frequency
*/
li t0, AU1550_SYS_ADDR
li t1, SYS_CPUPLL
sw t1, sys_cpupll(t0)
sync
nop
nop
/*
* Step 11) Establish system bus divider
*/
li t1, SYS_POWERCTRL
sw t1, sys_powerctrl(t0)
sync
#endif
/*
* Step 12) Establish AUX PLL frequency
*/
li t0, AU1550_SYS_ADDR
li t1, SYS_AUXPLL
sw t1, sys_auxpll(t0)
sync
/*
* Step 13) Start the 32kHz oscillator
*/
li t1, 0x00000100
sw t1, sys_cntctrl(t0)
sync
/*
* Step 14) Initialize static memory controller
*/
li t0, AU1550_MEM_ADDR
#ifndef USE_S9
/* RCE0 - can not change while fetching, do so from icache */
updateRCE0:
la t1,updateRCE0
cache 0x14,0(t1)
cache 0x14,32(t1)
li t1, MEM_STTIME0
#else
lw t1, MEM_STTIME0(a0)
#endif
li t2, MEM_STCFG0
li t3, MEM_STADDR0
sw t1, mem_sttime0(t0)
sw t2, mem_stcfg0(t0)
sw t3, mem_staddr0(t0)
sync
/* RCE1 */
li t1, MEM_STCFG1
#ifndef USE_S9
li t2, MEM_STTIME1
#else
lw t2, MEM_STTIME1(a0)
#endif
li t3, MEM_STADDR1
sw t1, mem_stcfg1(t0)
sw t2, mem_sttime1(t0)
sw t3, mem_staddr1(t0)
/* RCE2 */
li t1, MEM_STCFG2
#ifndef USE_S9
li t2, MEM_STTIME2
#else
lw t2, MEM_STTIME2(a0)
#endif
li t3, MEM_STADDR2
sw t1, mem_stcfg2(t0)
sw t2, mem_sttime2(t0)
sw t3, mem_staddr2(t0)
/* RCE3 */
li t1, MEM_STCFG3
#ifndef USE_S9
li t2, MEM_STTIME3
#else
lw t2, MEM_STTIME3(a0)
#endif
li t3, MEM_STADDR3
sw t1, mem_stcfg3(t0)
sw t2, mem_sttime3(t0)
sw t3, mem_staddr3(t0)
/* NAND */
sw zero, mem_stndctrl(t0)
sync
/*
* Step 15) Set peripherals to a known state
*/
li t0, AU1550_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, AU1550_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, AU1550_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, AU1550_DDMA_ADDR
sw zero, ddma_inten(t0)
sync
li t0, AU1550_USBH_ADDR
li t1, usbh_enable
addu t0, t1, t0
sw zero, 0(t0)
sync
li t0, AU1550_USBD_ADDR
sw zero, usbd_enable(t0)
sync
li t0, AU1550_MACEN_ADDR
sw zero, macen_mac0(t0)
sw zero, macen_mac1(t0)
sync
li t0, AU1550_UART0_ADDR
sw zero, uart_enable(t0)
sync
li t0, AU1550_UART1_ADDR
sw zero, uart_enable(t0)
sync
li t0, AU1550_UART3_ADDR
sw zero, uart_enable(t0)
sync
li t0, AU1550_PSC0_ADDR
sw zero, psc_enable(t0)
sync
li t0, AU1550_PSC1_ADDR
sw zero, psc_enable(t0)
sync
li t0, AU1550_PSC2_ADDR
sw zero, psc_enable(t0)
sync
li t0, AU1550_PSC3_ADDR
sw zero, psc_enable(t0)
sync
li t0, AU1550_CRYPTO_ADDR
sw zero, crypt_enable(t0)
sync
/*
* Step 16) Determine cause of reset
*/
/* wait 10mS to debounce external signals */
li t1, MEM_1MS*10
1: add t1, -1
bne t1, zero, 1b
nop
li t0, AU1550_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 Hibernate Reset first */
andi t2, t1, 0x04
bne zero, t2, hibernatereset
nop
/* Check for Hardware Reset */
andi t2, t1, 0x01
bne zero, t2, hardwarereset
nop
/* Check for Sleep Wakeup */
andi t2, t1, 0x02
bne zero, t2, sleepwakeup
nop
/* Assume run-time reset */
beq zero, zero, runtimereset
nop
/************************************************************************/
hardwarereset:
runtimereset:
hibernatereset:
/*
* Step 1) Initialize DRAM
* Step 2) Initialize board
* Step 3) Invoke application
*/
bal initDRAM
nop
bal initBOARD
nop
beq zero, zero, alldone
nop
sleepwakeup:
/*
* Step 1) Wakeup DRAM
* Step 2) Initialize board
* Step 3) Resume application
*/
bal wakeupDRAM
nop
bal initBOARD
nop
la t0, AU1550_SYS_ADDR
lw sp, sys_scratch0(t0)
lw ra, sys_scratch1(t0)
jr ra
nop
/*************************************************************************/
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
/* check for SDR vs DDR */
li t0, PB1550_BCSR_ADDR
lw t1, bcsr_whoami(t0)
sync
and t2, t1, PB1550_ID_MSK
beq zero, t2, initDDR
nop
initSDR:
li t0, AU1550_MEM_ADDR
#ifndef USE_S9
li t1, MEM_SDCONFIGA_SDR
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -