avr: more work on hardware based uart module.

This commit is contained in:
Martin Preuss
2025-01-27 00:20:45 +01:00
parent a96bd7fc07
commit 52bbfcfb15
11 changed files with 650 additions and 71 deletions

View File

@@ -27,7 +27,7 @@ UART_HW_Init:
rcall Utils_FillSram
rcall UART_HW_FixedBuffers_Init
ldi r16, UART_HW_MSGNUMINBUF_SIZE
ldi yl, LOW(uartHw_ringBufferMsgNumIn)
ldi yh, HIGH(uartHw_ringBufferMsgNumIn)
@@ -37,7 +37,8 @@ UART_HW_Init:
ldi yl, LOW(uartHw_ringBufferMsgNumOut)
ldi yh, HIGH(uartHw_ringBufferMsgNumOut)
rcall RingBufferY_Init
sec
ret
; @end
@@ -67,6 +68,9 @@ UART_HW_InterfaceInit:
UART_HW_IFACE_OFFS_WRITEBUF_RDPOS, \
UART_HW_IFACE_OFFS_WRITEBUF_WRPOS, \
UART_HW_IFACE_OFFS_WRITEBUF_DATA
ldi r16, 0xff
std Y+UART_HW_IFACE_OFFS_READMSG_BUFNUM, r16
std Y+UART_HW_IFACE_OFFS_WRITEMSG_BUFNUM, r16
ret
; @end
@@ -84,7 +88,7 @@ UART_HW_InterfaceWriteToReadBuffer:
push yl
push yh
adiw yh:yl, UART_HW_IFACE_OFFS_READBUF
rcall RingBufferY_WriteByte ; R17, R18, X
rcall uartHwRingBufferWriteGuarded ; R17, R18, X
pop yh
pop yl
ret
@@ -104,7 +108,7 @@ UART_HW_InterfaceReadFromReadBuffer:
push yl
push yh
adiw yh:yl, UART_HW_IFACE_OFFS_READBUF
rcall RingBufferY_ReadByte ; R17, R18, X
rcall uartHwRingBufferReadGuarded ; R17, R18, X
pop yh
pop yl
ret
@@ -124,7 +128,7 @@ UART_HW_InterfaceWriteToWriteBuffer:
push yl
push yh
adiw yh:yl, UART_HW_IFACE_OFFS_WRITEBUF
rcall RingBufferY_WriteByte ; R17, R18, X
rcall uartHwRingBufferWriteGuarded ; R17, R18, X
pop yh
pop yl
ret
@@ -144,7 +148,7 @@ UART_HW_InterfaceReadFromWriteBuffer:
push yl
push yh
adiw yh:yl, UART_HW_IFACE_OFFS_WRITEBUF
rcall RingBufferY_ReadByte ; R17, R18, X
rcall uartHwRingBufferReadGuarded ; R17, R18, X
pop yh
pop yl
ret
@@ -152,6 +156,67 @@ UART_HW_InterfaceReadFromWriteBuffer:
UART_HW_Interface_Run:
; ---------------------------------------------------------------------------
; @routine uartHwRingBufferReadGuarded
;
; @return CFLAG on success, cleared on error
; @param r16 byte to write
; @param Y pointer to start of interface data
; @clobbers R17, R18, X
uartHwRingBufferReadGuarded:
push r15
in r15, SREG
cli
rcall RingBufferY_ReadByte ; R17, R18, X
brcc uartHwRingBufferReadGuarded_error
out SREG, r15
pop r15
sec
ret
uartHwRingBufferReadGuarded_error:
out SREG, r15
pop r15
clc
ret
; @end
; ---------------------------------------------------------------------------
; @routine uartHwRingBufferWriteGuarded
;
; @return CFLAG on success, cleared on error
; @param r16 byte to write
; @param Y pointer to start of interface data
; @clobbers R17, R18, X
uartHwRingBufferWriteGuarded:
push r15
in r15, SREG
cli
rcall RingBufferY_WriteByte ; R17, R18, X
brcc uartHwRingBufferWriteGuarded_error
out SREG, r15
pop r15
sec
ret
uartHwRingBufferWriteGuarded_error:
out SREG, r15
pop r15
clc
ret
; @end