📄 starto.s.a2
字号:
nop cache FillI, -4(a0) nop bne a0, a1, 1b cache IndexStoreTagI, -4(a0)/* * Do L1 data cache. */ TTYDBG("Init L1 data cache...\r\n") la a0, CACHED_MEMORY_ADDR add a1, a0, s5 /* End = size of D cache */1: addu a0, s6 /* Step by line size */ bne a0, a1, 1b cache IndexStoreTagD, -4(a0) la a0, CACHED_MEMORY_ADDR add a1, a0, s5 /* End = size of D cache */1: addu a0, s6 /* Step by line size */ bne a0, a1, 1b lw zero, -4(a0) la a0, CACHED_MEMORY_ADDR add a1, a0, s5 /* End = size of D cache */1: addu a0, s6 /* Step by line size */ bne a0, a1, 1b cache IndexStoreTagD, -4(a0) beqz s7, no_L2_cache nop/* * Do L2 cache */ TTYDBG("Init L2 unified cache...\r\n") or t3, CF_7_SE /* Enable secondary cache */ mtc0 t3, COP_0_CONFIG NOP8 la a0, CACHED_MEMORY_ADDR add a1, a0, s7 /* End = size of L2 cache */1: addu a0, 32 /* Step by line size */ bne a0, a1, 1b cache IndexStoreTagS, -4(a0) sync la a0, CACHED_MEMORY_ADDR add a1, a0, s7 /* End = size of L2 cache */1: addu a0, 32 /* Step by line size */ bne a0, a1, 1b lw zero, -4(a0) sync la a0, CACHED_MEMORY_ADDR add a1, a0, s7 /* End = size of L2 cache */1: addu a0, 32 /* Step by line size */ bne a0, a1, 1b cache IndexStoreTagS, -4(a0) syncno_L2_cache:/* * Do any L3 cache */ beqz s8, no_L3_cache /* Any L3 size? */ nop TTYDBG("Init L3 unified cache...\r\n") or t3, CF_7_TE /* Enable tertiary cache */ mtc0 t3, COP_0_CONFIG NOP8 mtc0 zero, COP_0_TAG_HI mtc0 zero, COP_0_TAG_LO la a0, CACHED_MEMORY_ADDR addu a1, a0, s8 /* Compute size of L3 */1: cache IndexStoreTagT, 0(a0) addu a0, 32 bne a0, a1, 1b nop lw a0, CPU_CONFIG(s2) /* Set IT8172 for L3 cache */ li a1, HTOLE32(0x00004000) or a0, a0, a1 sw a0, CPU_CONFIG(s2)no_L3_cache: mtc0 t0, COP_0_STATUS_REG /* Restore status reg */ mtc0 t3, COP_0_CONFIG /* Restore cache config */ NOP8cache_done: FLASH_GPIO(0x05) # GPD 2..4 => 0001#ifdef DEBUG_LOCORE TTYDBG("Init caches done, cfg = ") mfc0 a0, COP_0_CONFIG bal hexserial nop TTYDBG("\r\n")#endif#if 1 TTYDBG("Testing memory...\r\n") li t7, 10tmem: li t0, 0xa0000000+1*1024*1024 li t1, 0xa0000000 li t2, 0xffffffff1: sw t2, 0(t1) lw t3, 0(t1) bne t3, t2, 1f nop not t2 sw t2, 0(t1) lw t3, 0(t1) bne t3, t2, 1f nop not t2 addu t2, 1 addu t1, 4 beq t1, t0, 2f nop and t4, t1, 0x000fffff bnez t4, skipdot li a0, '.' bal tgt_putchar nopskipdot: b 1b nop1: TTYDBG("Memory test failed at "); move a0, t1 bal hexserial nop TTYDBG("\r\nWrite="); move a0, t2 bal hexserial nop TTYDBG("\r\nRead="); move a0, t3 bal hexserial nop1: b 1b nop2: TTYDBG("Testing ok...\r\n"); sub t7,1 beqz t7, 1f nop b tmem nop1: b 1b nop#endif/* * At this point all memory controller setup should have been done * and we should be able to function 'normally' and C code can be * used freely from this point. */ TTYDBG("Copy PMON to execute location...\r\n")#ifdef DEBUG_LOCORE TTYDBG("start = ") la a0, start bal hexserial nop TTYDBG("\r\ns0 = ") move a0, s0 bal hexserial nop TTYDBG("\r\n")#endif la a0, start li a1, 0xbfc00000 la a2, _edata subu t1, a2, a0 srl t1, t1, 2 /* copy text section */ li t0, 01: lw v0, 0(a1) nop sw v0, 0(a0) addu a0, 4 bne a2, a0, 1b addu a1, 4 /* Clear BSS */ la a0, _edata la a2, _end2: sw zero, 0(a0) bne a2, a0, 2b addu a0, 4#if 0 la a1, start /* RAM start address */ la v0, copytoram addu v0, s0 /* Compute ROM address of 'copytoram' */ jal v0 add a0, a1, s0 /* ROM start address */ beqz v0, 1f nop move s3, v0 PRINTSTR("\r\nPANIC! Copy to memory failed at 0x") move a0, s3 bal hexserial nop PRINTSTR(".\r\n") b stuck nop#endif1: TTYDBG("Copy PMON to execute location done.\r\n")1: li a0,0x04000000 /* 64Mb */ move t0,a0 TTYDBG("memsize="); bal hexserial move a0,t0 move a0,t0#ifdef SKIPDIMM li a0, 256#endif FLASH_GPIO(0x06) # GPD 2..4 => 0001 la v0, initmips jalr v0 nopstuck:#ifdef DEBUG_LOCORE TTYDBG("Dumping IT8172 setup.\r\n") TTYDBG("offset----data------------------------.\r\n") li s3, 01: move a0, s3 bal hexserial nop TTYDBG(": ")2: add a0, s3, s2 lw a0, 0(a0) bal hexserial addiu s3, 4 TTYDBG(" ") li a0, 0xfff and a0, s3 beqz a0, 3f li a0, 0x01f and a0, s3 bnez a0, 2b TTYDBG("\r\n") b 1b nop3: b 3b nop#else b stuck nop#endif/* * Common functions are defined below *//* * flash_gpio entry */LEAF(__flash_gpio) li t1, 0xb4013802 li t0, 0x550 sh t0, (t1) subu t1, t1, 2 move t0, a0 sll t0, 2 sb t0, (t1) MK_LAT(GPIO_LOOP) j raEND(__flash_gpio)/* * led display */LEAF(__led_display) li t0, 0xb80000f0 sb a0, (t0) li t0, 20009: subu t0, 1 bne t0, 0, 9b nop j raEND(__led_display)/* * Clear the TLB. Normally called from start.S. */LEAF(CPU_TLBClear) li a3, 0 # First TLB index. li a2, PG_SIZE_4K dmtc0 a2, COP_0_TLB_PG_MASK # Whatever...1: dmtc0 zero, COP_0_TLB_HI # Clear entry high. dmtc0 zero, COP_0_TLB_LO0 # Clear entry low0. dmtc0 zero, COP_0_TLB_LO1 # Clear entry low1. mtc0 a3, COP_0_TLB_INDEX # Set the index. addiu a3, 1 li a2, 64 nop nop tlbwi # Write the TLB bne a3, a2, 1b nop jr ra nopEND(CPU_TLBClear)/* * Set up the TLB. Normally called from start.S. */LEAF(CPU_TLBInit) li a3, 0 # First TLB index. li a2, PG_SIZE_16M dmtc0 a2, COP_0_TLB_PG_MASK # All pages are 16Mb.1: and a2, a0, PG_SVPN dmtc0 a2, COP_0_TLB_HI # Set up entry high. move a2, a0 srl a2, a0, PG_SHIFT and a2, a2, PG_FRAME ori a2, PG_IOPAGE dmtc0 a2, COP_0_TLB_LO0 # Set up entry low0. addu a2, (0x01000000 >> PG_SHIFT) dmtc0 a2, COP_0_TLB_LO1 # Set up entry low1. mtc0 a3, COP_0_TLB_INDEX # Set the index. addiu a3, 1 li a2, 0x02000000 subu a1, a2 nop tlbwi # Write the TLB bgtz a1, 1b addu a0, a2 # Step address 32Mb. jr ra nopEND(CPU_TLBInit)/* * Simple character printing routine used before full initialization */LEAF(stringserial) move a2, ra addu a1, a0, s0 lbu a0, 0(a1)1: beqz a0, 2f nop bal tgt_putchar addiu a1, 1 b 1b lbu a0, 0(a1)2: j a2 nopEND(stringserial)LEAF(hexserial) move a2, ra move a1, a0 li a3, 71: rol a0, a1, 4 move a1, a0 and a0, 0xf la v0, hexchar addu v0, s0 addu v0, a0 bal tgt_putchar lbu a0, 0(v0) bnez a3, 1b addu a3, -1 j a2 nopEND(hexserial)LEAF(tgt_putchar) la v0, IT8172_PCI_IO_BASE + IT_UART_BASE addu v0, UNCACHED_MEMORY_ADDR1: lbu v1, NSREG(NS16550_LSR)(v0) and v1, LSR_TXRDY beqz v1, 1b nop sb a0, NSREG(NS16550_DATA)(v0) j ra nop END(tgt_putchar)/* baud rate definitions, matching include/termios.h */#define B0 0#define B50 50 #define B75 75#define B110 110#define B134 134#define B150 150#define B200 200#define B300 300#define B600 600#define B1200 1200#define B1800 1800#define B2400 2400#define B4800 4800#define B9600 9600#define B19200 19200#define B38400 38400#define B57600 57600#define B115200 115200LEAF(initserial)#if 0 la v0, IT8172_PCI_IO_BASE + IT_UART_BASE or v0, UNCACHED_MEMORY_ADDR1: li v1, FIFO_ENABLE|FIFO_RCV_RST|FIFO_XMT_RST|FIFO_TRIGGER_4 sb v1, NSREG(NS16550_FIFO)(v0) li v1, CFCR_DLAB sb v1, NSREG(NS16550_CFCR)(v0) li v1, NS16550HZ/(16*CONS_BAUD) sb v1, NSREG(NS16550_DATA)(v0) srl v1, 8 sb v1, NSREG(NS16550_IER)(v0) li v1, CFCR_8BITS sb v1, NSREG(NS16550_CFCR)(v0) sb v1, NSREG(NS16550_MCR)(v0) li v1, 0x0 sb v1, NSREG(NS16550_IER)(v0) j ra nop#else li a0, KSEG1 addu a0, IT8172_PCI_IO_BASE addu a0, IT_PM_DSR lh a1, (a0) and a1, ~0x0100 sh a1, (a0) li a0, KSEG1 addu a0, IT8172_PCI_IO_BASE addu a0, IT_UART_BASE li a1, 0x80 addu a2, a0, 3 sb a1, (a2) li a1, 0x01 addu a2, a0, 0x0 sb a1, (a2) li a1, 0x03 addu a2, a0, 3 sb a1, (a2) li a1, 0x47 addu a2, a0, 2 sb a1, (a2) li a1, 0x00 addu a2, a0, 1 sb a1, (a2) nop#endifEND(initserial)__main: j ra nop .rdatatransmit_pat_msg: .asciz "\r\nInvalid transmit pattern. Must be DDDD or DDxDDx\r\n"v200_msg: .asciz "\r\nPANIC! Unexpected TLB refill exception!\r\n"v280_msg: .asciz "\r\nPANIC! Unexpected XTLB refill exception!\r\n"v380_msg: .asciz "\r\nPANIC! Unexpected General exception!\r\n"v400_msg: .asciz "\r\nPANIC! Unexpected Interrupt exception!\r\n"hexchar: .ascii "0123456789abcdef" .text .align 2#define I2C_INT_ENABLE 0x80#define I2C_ENABLE 0x40#define I2C_ACK 0x04#define I2C_INT_FLAG 0x08#define I2C_STOP_BIT 0x10#define I2C_START_BIT 0x20#define I2C_AMOD_RD 0x01#define BUS_ERROR 0x00#define START_CONDITION_TRA 0x08#define RSTART_CONDITION_TRA 0x10#define ADDR_AND_WRITE_BIT_TRA_ACK_REC 0x18#define ADDR_AND_READ_BIT_TRA_ACK_REC 0x40#define SLAVE_REC_WRITE_DATA_ACK_TRA 0x28#define MAS_REC_READ_DATA_ACK_NOT_TRA 0x58#define Index_Invalidate_I 0x00#define Index_Writeback_Inv_D 0x01#define Index_Invalidate_SI 0x02#define Index_Writeback_Inv_SD 0x03#define Index_Load_Tag_I 0x04#define Index_Load_Tag_D 0x05#define Index_Load_Tag_SI 0x06#define Index_Load_Tag_SD 0x07#define Index_Store_Tag_I 0x08#define Index_Store_Tag_D 0x09#define Index_Store_Tag_SI 0x0A#define Index_Store_Tag_SD 0x0B#define Create_Dirty_Excl_D 0x0d#define Create_Dirty_Excl_SD 0x0f#define Hit_Invalidate_I 0x10#define Hit_Invalidate_D 0x11#define Hit_Invalidate_SI 0x12#define Hit_Invalidate_SD 0x13#define Fill 0x14#define Hit_Writeback_Inv_D 0x15 /* 0x16 is unused */#define Hit_Writeback_Inv_SD 0x17#define Hit_Writeback_I 0x18
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -