📄 init.s.bak
字号:
;MOVE.L D0,A1
MOVE.L #___RTEXT_START,A2
_Copy_Main_Code:
MOVE.L (A1)+, D0
MOVE.L D0, (A2)+
MOVE.L (A1)+, D0
MOVE.L D0, (A2)+
MOVE.L (A1)+, D0
MOVE.L D0, (A2)+
MOVE.L (A1)+, D0
MOVE.L D0, (A2)+
CMP.L #___RTEXT_END,A2
BLT _Copy_Main_Code
_Jmp_To_Main:
MOVE.W #$2000,SR
MOVE.L #___RTEXT_START, A0
JMP (A0)
; // Send DRAM Error message
_DRAM_Error:
MOVE.L #_Test_Dram_Failed_Msg,A0
JSR _BOOT_Send_Msg
JMP _WAIT_INPUT
; // Send ISRAM Error message
_ISRAM_Error:
MOVE.L #_Test_Isram_Failed_Msg,A0
JSR _BOOT_Send_Msg
JMP _WAIT_INPUT
_LOAD_CTRL_Error:
MOVE.L #_Load_Ctrl_Failed_Msg,A0
JSR _BOOT_Send_Msg
; // HOW TO DEAL WITH WATCHDOG
_WAIT_INPUT:
HALT
JMP _WAIT_INPUT
; end
; Version Message
ALIGN 4
XDEF _BOOT_Version_Msg
_BOOT_Version_Msg:
; ASCII "\r\n\r\nSTAR NETWORKS TECHNOLOGY CO.,LTD."
ASCII "\r\n\r\n"
; ASCII "Boot Version 01-03-03.\r\n"
ASCII "Boot Running... \r\n\0"
DC.L 0
; XDEF _MAC_Address_Msg
;_MAC_Address_Msg:
; ASCII "Base ethernet MAC Address: \0"
XDEF _Test_Dram_Passed_Msg
_Test_Dram_Passed_Msg:
ASCII "\r\nDRAM Test: Passed\r\n\0"
XDEF _Test_Dram_Failed_Msg
_Test_Dram_Failed_Msg:
ASCII "\r\nDRAM Test: Failed\r\n\0"
XDEF _Test_Isram_Passed_Msg
_Test_Isram_Passed_Msg:
ASCII "ISRAM Test: Passed\r\n\0"
XDEF _Test_Isram_Failed_Msg
_Test_Isram_Failed_Msg:
ASCII "ISRAM Test: Failed\r\n\0"
XDEF _Check_Ctrl_Passed_Msg
_Check_Ctrl_Passed_Msg:
ASCII "CTRL Test: Passed\r\n\0"
XDEF _Check_Ctrl_Failed_Msg
_Check_Ctrl_Failed_Msg:
ASCII "\r\nCTRL Test: Failed\r\n\0"
XDEF _Load_Ctrl_Msg
_Load_Ctrl_Msg:
ASCII "\r\nLoading Ctrl software...\r\n\0"
XDEF _Load_Ctrl_Passed_Msg
_Load_Ctrl_Passed_Msg:
ASCII "Load Ctrl software: Passed\r\n\0"
XDEF _Load_Ctrl_Failed_Msg:
_Load_Ctrl_Failed_Msg:
ASCII "Load Ctrl software: Failed\r\n\0"
XDEF _BOOT_Passed_Msg
_BOOT_Passed_Msg:
ASCII "\r\nBOOT Passed!\r\n"
ASCII "\r\nCTRL Running...\r\n\0"
XDEF _Enter_Msg
_Enter_Msg:
ASCII "\r\n\0"
; ctoa function
; d1 used
ALIGN 4
; XDEF _BOOT_ctoa
;_BOOT_ctoa:
; CMP.L #9,D1
; BLE _BOOT_ctoa_0_9
;_BOOT_ctoa_a_f:
; SUB.L #10,D1
; ADD.L #'a',D1
; RTS
;_BOOT_ctoa_0_9:
; ADD.L #'0',D1
; RTS
;Send_Msg function
;A0 - Msg
ALIGN 4
XDEF _BOOT_Send_Msg
_BOOT_Send_Msg:
MOVE.L #0,D1
_BOOT_Send_Msg_Loop:
MOVE.B (A0)+,D1
CMP.L #0,D1
BEQ _BOOT_Send_Msg_End
JSR _UART_Put_Char2
JMP _BOOT_Send_Msg_Loop
_BOOT_Send_Msg_End:
RTS
;----------------------------------------------------------------
; UART_Get_Char()接收数据
; D0 :0成功 1失败
; D1 :接收数据
ALIGN 4
XDEF _UART_Get_Char2
_UART_Get_Char2:
; {
; wait for 1s
MOVE.L #6000000,D2
;
; /* Process every character in the receive FIFO */
; while ((READ_USR() & USR_RXRDY)==0);
; need clocks = 3+1+1+1+1 = 7 clocks = 7*25ns = 175ns
_UART_Get_Char_Loop:
MOVE.B (MBAR_ADDR+$184),D0 ;3 clocks
BTST #0,D0
JNE _UART_Get_Char_1
SUBQ.L #1,D2
BNE _UART_Get_Char_Loop
MOVE.L #1,D0
JMP UART_RETURN
_UART_Get_Char_1:
; /* Put char into buffer */
; receive = READ_URB();
; return 0;
MOVE.B (MBAR_ADDR+$18C),D1
MOVEQ.L #0,D0
UART_RETURN:
RTS
;-------------------------------------------------------------------
;函数test_dram()用来检测DRAM地址空间数据的正确性。
;Note : 改以line为单位检测,防止由于数据线上的数据维持影响检测的正确性。
; 同时可以检测RAM的burst性能。
ALIGN 4
XDEF _test_dram
_test_dram:
MOVE.L #$0, A0 ; start_addr
MOVE.L #$400000, D5 ; length
TEST_DRAM_LOOP:
; Save A0
MOVE.L A0,A1
; Burst read a line
MOVEM.L (A0),A2-A5
; Test RAM read/write
MOVE.L #$55555555,D0
MOVE.L #$AAAAAAAA,D1
MOVE.L #$33333333,D2
MOVE.L #$CCCCCCCC,D3
; Burst write a line
MOVEM.L D0-D3,(A0)
; Single read lwords ,check Burst write
MOVE.L (A1)+,D4
CMP.L D4,D0
BNE TEST_DRAM_ERR
MOVE.L (A1)+,D4
CMP.L D4,D1
BNE TEST_DRAM_ERR
MOVE.L (A1)+,D4
CMP.L D4,D2
BNE TEST_DRAM_ERR
MOVE.L (A1)+,D4
CMP.L D4,D3
BNE TEST_DRAM_ERR
MOVE.L A0,A1
; Burst read a line
MOVEM.L (A0),D0-D3
; Not all bits
NOT.L D0
NOT.L D1
NOT.L D2
NOT.L D3
; Write again
MOVEM.L D0-D3,(A0)
; Check again
MOVE.L (A1)+,D4
CMP.L D4,D0
BNE TEST_DRAM_ERR
MOVE.L (A1)+,D4
CMP.L D4,D1
BNE TEST_DRAM_ERR
MOVE.L (A1)+,D4
CMP.L D4,D2
BNE TEST_DRAM_ERR
MOVE.L (A1)+,D4
CMP.L D4,D3
BNE TEST_DRAM_ERR
; Restore D0-D3
MOVEM.L A2-A5,(A0)
; Pointer to next line
MOVE.L A1,A0
SUB.L #16,D5
BNE TEST_DRAM_LOOP
;TEST_DRAM_OK:
move.l #0, D0 ;return 0
RTS
TEST_DRAM_ERR:
move.l #-1, D0 ;return -1
RTS
;函数test_isram()用来检测ISRAM地址空间数据的正确性。
ALIGN 4
XDEF _test_isram
_test_isram:
MOVE.L #ISRAM_ADDR, A0 ; start_addr
MOVE.L #ISRAM_LEN, D5 ; length
TEST_ISRAM_LOOP:
; Save A0
MOVE.L A0,A1
; Burst read a line
MOVEM.L (A0),A2-A5
; Test RAM read/write
MOVE.L #$55555555,D0
MOVE.L #$AAAAAAAA,D1
MOVE.L #$33333333,D2
MOVE.L #$CCCCCCCC,D3
; Burst write a line
MOVEM.L D0-D3,(A0)
; Single read lwords ,check Burst write
MOVE.L (A1)+,D4
CMP.L D4,D0
BNE TEST_ISRAM_ERR
MOVE.L (A1)+,D4
CMP.L D4,D1
BNE TEST_ISRAM_ERR
MOVE.L (A1)+,D4
CMP.L D4,D2
BNE TEST_ISRAM_ERR
MOVE.L (A1)+,D4
CMP.L D4,D3
BNE TEST_ISRAM_ERR
MOVE.L A0,A1
; Burst read a line
MOVEM.L (A0),D0-D3
; Not all bits
NOT.L D0
NOT.L D1
NOT.L D2
NOT.L D3
; Write again
MOVEM.L D0-D3,(A0)
; Check again
MOVE.L (A1)+,D4
CMP.L D4,D0
BNE TEST_ISRAM_ERR
MOVE.L (A1)+,D4
CMP.L D4,D1
BNE TEST_ISRAM_ERR
MOVE.L (A1)+,D4
CMP.L D4,D2
BNE TEST_ISRAM_ERR
MOVE.L (A1)+,D4
CMP.L D4,D3
BNE TEST_ISRAM_ERR
; Restore D0-D3
MOVEM.L A2-A5,(A0)
; Pointer to next line
MOVE.L A1,A0
SUB.L #16,D5
BNE TEST_ISRAM_LOOP
;TEST_ISRAM_OK:
move.l #0, D0 ;return 0
RTS
TEST_ISRAM_ERR:
move.l #-1, D0 ;return -1
RTS
;Init_Uart()初始化UART2
ALIGN 4
XDEF _Init_UART
_Init_UART:
MOVE.L #$20,D0
MOVE.b D0,(MBAR_ADDR+$188) ;Reset the receiver
MOVE.L #$30,D0
MOVE.b D0,(MBAR_ADDR+$188) ;Reset the transmitter
MOVE.L #$10,D0
MOVE.b D0,(MBAR_ADDR+$188) ;Point to UMR1 register
MOVE.L #$13,D0
MOVE.b D0,(MBAR_ADDR+$180) ;No parity, 8 bits/char
MOVE.L #$7,D0
MOVE.b D0,(MBAR_ADDR+$180) ;1 stop bit
MOVE.L #$DD,D0
MOVE.b D0,(MBAR_ADDR+$184) ;Setup system clock as time source
MOVE.L #$0,D0
MOVE.b D0,(MBAR_ADDR+$198)
;MOVE.L #$1B,D0 ; 0X15 - 40M ,0X1B - 50M
MOVE.L #$15,D0
MOVE.b D0,(MBAR_ADDR+$19C) ;set baud-rate --> 57600(40M)
MOVE.L #$0,D0
MOVE.b D0,(MBAR_ADDR+$194) ;Disable all interrupts.
MOVE.L #$04,D0
MOVE.b D0,(MBAR_ADDR+$188) ;Enable Tx
;------------------------------------------------------------
MOVE.L #$01,D0
MOVE.b D0,(MBAR_ADDR+$188) ;Enable Rx
;------------------------------------------------------------
RTS
; VOID UART_Put_Char(UNSIGNED_CHAR ch)发送数据
; D1: Send Data
ALIGN 4
XDEF _UART_Put_Char2
_UART_Put_Char2:
; {
;
; /* Wait until the transmitter buffer is empty */
; while (!(READ_USR() & USR_TXRDY));
MOVE.B (MBAR_ADDR+$184),D0
AND.L #4,D0
TST.L D0
JEQ _UART_Put_Char2
;
; /* Transmit the character */
; SET_UTB(ch);
MOVE.B D1,(MBAR_ADDR+$18C)
;
; }
RTS
; }
_DELAY:
SUBQ.L #1,D0
BNE _DELAY
rts
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -