⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 init.s

📁 一款交换机BSP开发代码
💻 S
📖 第 1 页 / 共 2 页
字号:
		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 + -