📄 uartlisr.s
字号:
SECTION .bss
MBAR EQU $30000000 ; Base address of all internal regs
SRAM_ADDR EQU $40000000 ; isram base address
SRAM_LEN EQU $2000 ; 8K
XREF _uart_buf
XREF _VER_FLAG
SECTION .rtext
; void UART2_Int(INT vector_num)
; {
ALIGN 4
XDEF _UART2_Int
_UART2_Int:
;
; CHAR receive;
;
; /* Process every character in the receive FIFO */
; while (READ2_USR() & USR_RXRDY)
MOVE.L D0,-(A7)
move.l _VER_FLAG,D0
cmp.l #0,d0
BNE _UART2_5307_1
MOVE.B (MBAR+$184),D0
JMP _UART_CON1
_UART2_5307_1:
MOVE.B (MBAR+$204),D0
_UART_CON1:
BTST #0,D0
JEQ _UART2_int_end
; lea -24(a7),a7
; movem.l d5/d6/d7/a3/a4/a5,(a7)
MOVE.L D1,-(A7)
MOVE.L D2,-(A7)
MOVE.L A0,-(A7)
MOVE.L A1,-(A7)
MOVE.L #_uart_buf,A1
_UART2_int_loop:
; {
;
; /* Put char into buffer */
; receive = READ_URB();
move.l d0,-(A7)
move.l _VER_FLAG,D0
cmp.l #0,d0
BNE _UART2_5307_2
MOVE.B (MBAR+$18C),D2
JMP _UART_CON2
_UART2_5307_2:
MOVE.B (MBAR+$20C),D2
_UART_CON2:
;
; /* Check for a damaged or incorrectly received character */
; if ((READ_USR() & (USR_FRAME_ERR | USR_PARITY_ERR )) == 0)
move.l (A7)+,d0
EXTB.L D0
MOVEQ #$60,D1
AND.L D0,D1
JNE _UART2_int_Error
; {
; if (uart_buf.status != UART_BUFFER_FULL)
MOVE.L 16(A1),D0
ADDQ.L #1,D0
JEQ _UART2_int_Error
; {
; /* Put the character into the buffer */
; *(uart_buf.write++) = receive;
MOVE.L 12(A1),A0
MOVE.B D2,(A0)+
MOVE.L A0,12(A1)
;
; /* If write pointer is at end, wrap it around */
; if (uart_buf.write > uart_buf.tail)
CMP.L 4(A1),A0
JLS _UART2_int_No_Change
; uart_buf.write = uart_buf.head;
MOVE.L (A1),12(A1)
_UART2_int_No_Change:
;
; /* Set status field based on latest character */
; if (uart_buf.write == uart_buf.read)
MOVE.L 12(A1),A0
CMP.L 8(A1),A0
JNE _UART2_int_Recv
; uart_buf.status = UART_BUFFER_FULL;
MOVEQ #-1,D0
MOVE.L D0,16(A1)
_UART2_int_Error:
move.l _VER_FLAG,D0
cmp.l #0,d0
BNE _UART2_5307_3
MOVE.B (MBAR+$184),D0
JMP _UART_CON3
_UART2_5307_3:
MOVE.B (MBAR+$204),D0
_UART_CON3:
BTST #0,D0
JNE _UART2_int_loop
MOVE.L (A7)+,A1
MOVE.L (A7)+,A0
MOVE.L (A7)+,D2
MOVE.L (A7)+,D1
JRA _UART2_int_end
_UART2_int_Recv:
; else
; uart_buf.status = UART_BUFFER_DATA;
MOVE.L #-2,D0
MOVE.L D0,16(A1)
JRA _UART2_int_Error
_UART2_int_end:
; movem.l (a7),d5/d6/d7/a3/a4/a5
; lea 24(a7),a7
MOVE.L (A7)+,D0
RTE
; }
; }
; }
; }
; rts
;函数test_ram(void * addr,long len)用来检测RAM地址空间数据的正确性。
;addr - RAM base_addr , len - RAM range .
;Note : 改以line为单位检测,防止由于数据线上的数据维持影响检测的正确性。
; 同时可以检测RAM的burst性能。
ALIGN 4
XDEF _test_ram
_test_ram:
LEA -48(A7),A7
MOVEM.L D0-D5/A0-A5,(A7)
MOVE.L 52(A7),A0 ; A0 = ADDR
MOVE.L 56(A7),D5 ; D5 = len
TEST_RAM_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_RAM_ERR
MOVE.L (A1)+,D4
CMP.L D4,D1
BNE TEST_RAM_ERR
MOVE.L (A1)+,D4
CMP.L D4,D2
BNE TEST_RAM_ERR
MOVE.L (A1)+,D4
CMP.L D4,D3
BNE TEST_RAM_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_RAM_ERR
MOVE.L (A1)+,D4
CMP.L D4,D1
BNE TEST_RAM_ERR
MOVE.L (A1)+,D4
CMP.L D4,D2
BNE TEST_RAM_ERR
MOVE.L (A1)+,D4
CMP.L D4,D3
BNE TEST_RAM_ERR
; Restore D0-D3
MOVEM.L A2-A5,(A0)
; Pointer to next line
MOVE.L A1,A0
SUB.L #16,D5
BNE TEST_RAM_LOOP
;TEST_RAM_OK:
MOVEM.L (A7),D0-D5/A0-A5
LEA 48(A7),A7
MOVE.L #0, D0 ;return 0
RTS
TEST_RAM_ERR:
MOVEM.L (A7),D0-D5/A0-A5
LEA 48(A7),A7
MOVE.L #-1, D0 ;return -1
RTS
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -