📄 init.s
字号:
MOVE.L D0, -(A7)
MOVE.L A0, -(A7)
JSR _crc32
ADDQ.L #8,A7
MOVE.L #CTRL_CODE_ADDR,A0 ;CRC stored in
MOVE.L (A0),D1
CMP.L D0,D1
BNE _CTRL_Error
TST.L D7
BEQ .L6
MOVE.L #_Check_Ctrl_Passed_Msg,A0
JSR _BOOT_Send_Msg
; // copy CTRL rom code to DRAM addr: 0x340000
MOVE.L #_Load_Ctrl_Msg,A0
JSR _BOOT_Send_Msg
.L6:
MOVE.L #CTRL_CODE_ADDR+4,A0
MOVE.L (A0)+,A2 ;TEXT IN RAM
MOVE.L (A0),D5 ;TSIZE
MOVE.L #CTRL_CODE_ADDR+$20, A1 ; CTRL code range: 0x100E0000-0x100fffff0
_Copy_Code:
;MOVEM.L (A1),D0-D3
MOVE.L (A1)+, D0
MOVE.L (A1)+, D1
MOVE.L (A1)+, D2
MOVE.L (A1)+, D3
MOVEM.L D0-D3,(A2)
MOVEM.L (A2),D0-D3
SUB.L #16,A1
MOVE.L (A1)+, D4
CMP.L D4,D0
BNE _LOAD_CTRL_Error
MOVE.L (A1)+, D4
CMP.L D4,D1
BNE _LOAD_CTRL_Error
MOVE.L (A1)+, D4
CMP.L D4,D2
BNE _LOAD_CTRL_Error
MOVE.L (A1)+, D4
CMP.L D4,D3
BNE _LOAD_CTRL_Error
ADD.L #16,A2
SUB.L #16, D5 ; LINE (CTRL code length)
CMP.L #0,D5
BGT _Copy_Code
;BNE _Copy_Code
TST.L D7
BEQ .L7
MOVE.L #_Load_Ctrl_Passed_Msg,A0
JSR _BOOT_Send_Msg
MOVE.L #_BOOT_Passed_Msg,A0
JSR _BOOT_Send_Msg
.L7:
_Jmp_To_DRAM:
; // jmp to DRAM
MOVE.W #$2700,SR ;close all interrupt
MOVE.L #CTRL_CODE_ADDR2, A0 ; --> CTRL program 从 0x340434 开始执行
JMP (A0)
; error, such as DRAM_error/ CRC_error
_CTRL_Error:
; // COPY MAIN CODE TO DRAM
MOVE.L #_Check_Ctrl_Failed_Msg,A0
JSR _BOOT_Send_Msg
MOVE.L #___RTEXT_ROM,A1
;MOVE.L #___RTEXT_ROM,D0
;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
ALIGN 4
XDEF _Get_CPU_Type
_Get_CPU_Type:
RTS
;函数test_isram()用来检测ISRAM地址空间数据的正确性。
ALIGN 4
XDEF _test_isram
_test_isram:
MOVE.L #ISRAM_ADDR, A0 ; start_addr
MOVE.L _CPU_FLAG,D0
;move.l #0,d0;add jcb ls
CMP.L #0,D0
BNE _INIT_5307_2
MOVE.L #ISRAM_LEN_1, D5 ; length
JMP TEST_ISRAM_LOOP
_INIT_5307_2:
MOVE.L #ISRAM_LEN_2, 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_1
_Init_UART_1:
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
;Init_Uart()初始化UART2
ALIGN 4
XDEF _Init_UART_2
_Init_UART_2:
MOVE.L #$20,D0
MOVE.b D0,(MBAR_ADDR+$208) ;Reset the receiver
MOVE.L #$30,D0
MOVE.b D0,(MBAR_ADDR+$208) ;Reset the transmitter
MOVE.L #$10,D0
MOVE.b D0,(MBAR_ADDR+$208) ;Point to UMR1 register
MOVE.L #$13,D0
MOVE.b D0,(MBAR_ADDR+$200) ;No parity, 8 bits/char
MOVE.L #$7,D0
MOVE.b D0,(MBAR_ADDR+$200) ;1 stop bit
MOVE.L #$DD,D0
MOVE.b D0,(MBAR_ADDR+$204) ;Setup system clock as time source
MOVE.L #$60,D0
MOVE.b D0,(MBAR_ADDR+$210) ;Set baud by timers
MOVE.L #$0,D0
MOVE.b D0,(MBAR_ADDR+$218)
MOVE.L #$12,D0 ; 0X15 - 40M ,0X1B - 50M, 0X12 - 33M
MOVE.b D0,(MBAR_ADDR+$21C) ;set baud-rate --> 57600(40M)
MOVE.L #$0,D0
MOVE.b D0,(MBAR_ADDR+$214) ;Disable all interrupts.
MOVE.L #$04,D0
MOVE.b D0,(MBAR_ADDR+$208) ;Enable Tx
;------------------------------------------------------------
MOVE.L #$01,D0
MOVE.b D0,(MBAR_ADDR+$208) ;Enable Rx
;------------------------------------------------------------
RTS
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -