📄 start.s
字号:
move t1, a1 move t2, a2 /* copy text section */ 1: and t3,t0,0x0000ffff bnez t3,2f nop move a0,t0 bal hexserial nop li a0,'\r' bal tgt_putchar nop2: lw t3, 0(t1) nop sw t3, 0(t0) addu t0, 4 addu t1, 4 bne t2, t0, 1b nop PRINTSTR("copy text section done.\r\n") /* Clear BSS */ la a0, _edata la a2, _end2: sw zero, 0(a0) bne a2, a0, 2b addu a0, 4 TTYDBG("Copy PMON to execute location done.\r\n") /*sw 0, CpuTertiaryCacheSize*/ /* Set L3 cache size */ move a0, msize srl a0,20 la v0, initmips jalr v0 nopstuck:#ifdef DEBUG_LOCORE TTYDBG("Dumping GT64240 setup.\r\n") TTYDBG("offset----data------------------------.\r\n") li s3, 01: move a0, s3 bal hexserial nop TTYDBG(": ")2: add a0, s3, bonito 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/* * Clear the TLB. Normally called from start.S. */#if __mips64#define MTC0 dmtc0#else #define MTC0 mtc0#endifLEAF(CPU_TLBClear) li a3, 0 # First TLB index. li a2, PG_SIZE_4K MTC0 a2, COP_0_TLB_PG_MASK # Whatever...1: MTC0 zero, COP_0_TLB_HI # Clear entry high. MTC0 zero, COP_0_TLB_LO0 # Clear entry low0. MTC0 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 MTC0 a2, COP_0_TLB_PG_MASK # All pages are 16Mb.1: and a2, a0, PG_SVPN MTC0 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 MTC0 a2, COP_0_TLB_LO0 # Set up entry low0. addu a2, (0x01000000 >> PG_SHIFT) MTC0 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 */#if 0#define TXWAIT 0x100000LEAF(tgt_putchar) /* blocking transmit, with timeout */ li t0,TXWAIT # timeout1: lbu t1,PHYS_TO_UNCACHED(0x1fd002fd) # get LSR and t1,0x20 # tx ready? bnez t1,1f # yup - go and write nop subu t0,1 # continue until timeout bnez t0,1b nop1: sb a0,PHYS_TO_UNCACHED(0x1fd002f8) # write data li t0,TXWAIT # timeout1: lbu t1,PHYS_TO_UNCACHED(0x1fd003fd) # get LSR and t1,0x20 # tx ready? bnez t1,1f # yup - go and write nop subu t0,1 # continue until timeout bnez t0,1b nop1: sb a0,PHYS_TO_UNCACHED(0x1fd003f8) # write data j ra nopEND(tgt_putchar)#endifLEAF(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(outstring) move a2, ra move a1, a0 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(outstring)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, COM1_BASE_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) la v0, COM1_BASE_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)#if 0 li v1, MCR_DTR|MCR_RTS#endif sb v1, NSREG(NS16550_MCR)(v0) li v1, 0x0 sb v1, NSREG(NS16550_IER)(v0) move v1, v0 la v0, COM2_BASE_ADDR bne v0, v1, 1b nop j ra nopEND(initserial)#define SMBOFFS(reg) I82371_SMB_SMB##regLEAF(i2cdump) move t4,ra li a0,PHYS_TO_UNCACHED(ISAPORT_BASE(SMB_PORT)) lbu a0,SMBOFFS(HSTSTS)(a0) li a1,1 bal hexserial nop PRINTSTR("\r\n") li a0,PHYS_TO_UNCACHED(ISAPORT_BASE(SMB_PORT)) lbu a0,SMBOFFS(SLVSTS)(a0) li a1,1 bal hexserial nop PRINTSTR("\r\n") li a0,PHYS_TO_UNCACHED(ISAPORT_BASE(SMB_PORT)) lbu a0,SMBOFFS(HSTCNT)(a0) li a1,1 bal hexserial nop PRINTSTR("\r\n") li a0,PHYS_TO_UNCACHED(ISAPORT_BASE(SMB_PORT)) lbu a0,SMBOFFS(HSTCMD)(a0) li a1,1 bal hexserial nop PRINTSTR("\r\n") li a0,PHYS_TO_UNCACHED(ISAPORT_BASE(SMB_PORT)) lbu a0,SMBOFFS(HSTADD)(a0) li a1,1 bal hexserial nop PRINTSTR("\r\n") li a0,PHYS_TO_UNCACHED(ISAPORT_BASE(SMB_PORT)) lbu a0,SMBOFFS(HSTDAT0)(a0) li a1,1 bal hexserial nop PRINTSTR("\r\n") li a0,PHYS_TO_UNCACHED(ISAPORT_BASE(SMB_PORT)) lbu a0,SMBOFFS(HSTDAT1)(a0) li a1,1 bal hexserial nop PRINTSTR("\r\n") li a0,PHYS_TO_UNCACHED(ISAPORT_BASE(SMB_PORT)) lbu a0,SMBOFFS(BLKDAT)(a0) li a1,1 bal hexserial nop PRINTSTR("\r\n") li a0,PHYS_TO_UNCACHED(ISAPORT_BASE(SMB_PORT)) lbu a0,SMBOFFS(SLVCNT)(a0) li a1,1 bal hexserial nop PRINTSTR("\r\n") li a0,PHYS_TO_UNCACHED(ISAPORT_BASE(SMB_PORT)) lbu a0,SMBOFFS(SHDWCMD)(a0) li a1,1 bal hexserial nop PRINTSTR("\r\n") li a0,PHYS_TO_UNCACHED(ISAPORT_BASE(SMB_PORT)) lbu a0,SMBOFFS(SLVEVT)(a0) li a1,1 bal hexserial nop PRINTSTR("\r\n") li a0,PHYS_TO_UNCACHED(ISAPORT_BASE(SMB_PORT)) lbu a0,SMBOFFS(SLVDAT)(a0) li a1,1 bal hexserial nop PRINTSTR("\r\n") jr t4 nopEND(i2cdump)LEAF(i2cread) li t0,PHYS_TO_UNCACHED(ISAPORT_BASE(SMB_PORT)) lbu t1,SMBOFFS(HSTSTS)(t0) and t1,~(I82371_SMB_FAILED|I82371_SMB_BUS_ERR|I82371_SMB_DEV_ERR|I82371_SMB_INTER) sb t1,SMBOFFS(HSTSTS)(t0) sll t1,a0,1 or t1,0xa1 # DIMM base address and read bit sb t1,SMBOFFS(HSTADD)(t0) sb a1,SMBOFFS(HSTCMD)(t0) li t1,I82371_SMB_START|I82371_SMB_BDRW sb t1,SMBOFFS(HSTCNT)(t0) li t3,10000 1: lbu t1,SMBOFFS(HSTSTS)(t0) and t2,t1,I82371_SMB_FAILED|I82371_SMB_BUS_ERR|I82371_SMB_DEV_ERR|I82371_SMB_INTER bnez t2,1f nop sub t3,1 bnez t3,1b nop b 9f nop1: # clear pending errors/interrupts sb t1,SMBOFFS(HSTSTS)(t0) and t2,t1,I82371_SMB_FAILED|I82371_SMB_BUS_ERR|I82371_SMB_DEV_ERR bnez t2,9f nop lbu v0,SMBOFFS(HSTDAT0)(t0) j ra nop 9: li v0,-1 j ra nopEND(i2cread) __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/* * I2C Functions used in early startup code to get SPD info from * SDRAM modules. This code must be entirely PIC and RAM independent. *//* Delay macro */#define DELAY(count) \ li v0, count; \99: \ bnz vo, 99b;\ addiu v0, -1#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_Store_Tag_D 0x05#define Index_Invalidate_I 0x00#define Index_Writeback_Inv_D 0x01LEAF(godson1_cache_init)####part 2#### .set mips3cache_detect_2way: mfc0 t4, COP_0_CONFIG andi t5, t4, 0x0e00 srl t5, t5, 9 andi t6, t4, 0x01c0 srl t6, t6, 6 addiu t6, t6, 11 addiu t5, t5, 11 addiu t4, $0, 1 sllv t6, t4, t6 sllv t5, t4, t5 addiu t7, $0, 2####part 3#### lui a0, 0x8000 addu a1, $0, t5 addu a2, $0, t6cache_init_d2way:#a0=0x80000000, a1=icache_size, a2=dcache_size#a3, v0 and v1 used as local registers mtc0 $0, COP_0_TAG_HI addu v0, $0, a0 addu v1, a0, a21: slt a3, v0, v1 beq a3, $0, 1f nop mtc0 $0, COP_0_TAG_LO cache Index_Store_Tag_D, 0x0(v0) mtc0 $0, COP_0_TAG_LO cache Index_Store_Tag_D, 0x1(v0) beq $0, $0, 1b addiu v0, v0, 0x201:cache_flush_i2way: addu v0, $0, a0 addu v1, a0, a11: slt a3, v0, v1 beq a3, $0, 1f nop cache Index_Invalidate_I, 0x0(v0)# cache Index_Invalidate_I, 0x1(v0) beq $0, $0, 1b addiu v0, v0, 0x201:cache_flush_d2way: addu v0, $0, a0 addu v1, a0, a21: slt a3, v0, v1 beq a3, $0, 1f nop cache Index_Writeback_Inv_D, 0x0(v0) cache Index_Writeback_Inv_D, 0x1(v0) beq $0, $0, 1b addiu v0, v0, 0x201:cache_init_finish: nop jr ra nopcache_init_panic: TTYDBG("cache init panic\r\n");1: b 1b nop .set mips2END(godson1_cache_init)LEAF(nullfunction) jr ra nopEND(nullfunction)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -