avr: t03 now at least writes tty message once!

This commit is contained in:
Martin Preuss
2025-02-11 01:13:00 +01:00
parent 0790ac0dea
commit 351ab57d62
7 changed files with 202 additions and 563 deletions

View File

@@ -37,8 +37,6 @@ UART_HW_Init:
ldi yl, LOW(uartHw_ringBufferMsgNumOut)
ldi yh, HIGH(uartHw_ringBufferMsgNumOut)
rcall RingBufferY_Init
sec
ret
; @end
@@ -57,156 +55,65 @@ UART_HW_InterfaceInit:
ldi r17, UART_HW_IFACE_SIZE
clr r16
rcall Utils_FillSram ; (R17, X)
; reset ringbuffer for recvd chars
m_ringbuffer_y_reset UART_HW_IFACE_OFFS_READBUF_MAX, \
UART_HW_IFACE_OFFS_READBUF_USED, \
UART_HW_IFACE_OFFS_READBUF_RDPOS, \
UART_HW_IFACE_OFFS_READBUF_WRPOS, \
UART_HW_IFACE_OFFS_READBUF_DATA
ldi r16, UART_HW_IFACE_READBUF_SIZE
std Y+UART_HW_IFACE_OFFS_READBUF_MAX, r16
; reset ringbuffer for chars to transmit
m_ringbuffer_y_reset UART_HW_IFACE_OFFS_WRITEBUF_MAX, \
UART_HW_IFACE_OFFS_WRITEBUF_USED, \
UART_HW_IFACE_OFFS_WRITEBUF_RDPOS, \
UART_HW_IFACE_OFFS_WRITEBUF_WRPOS, \
UART_HW_IFACE_OFFS_WRITEBUF_DATA
ldi r16, UART_HW_IFACE_WRITEBUF_SIZE
std Y+UART_HW_IFACE_OFFS_WRITEBUF_MAX, r16
; reset ringbuffer for messages to be sent
m_ringbuffer_y_reset UART_HW_IFACE_OFFS_OUTMSGBUF_MAX, \
UART_HW_IFACE_OFFS_OUTMSGBUF_USED, \
UART_HW_IFACE_OFFS_OUTMSGBUF_RDPOS, \
UART_HW_IFACE_OFFS_OUTMSGBUF_WRPOS, \
UART_HW_IFACE_OFFS_OUTMSGBUF_DATA
ldi r16, UART_HW_IFACE_OUTMSGBUF_SIZE
std Y+UART_HW_IFACE_OFFS_OUTMSGBUF_MAX, r16
ldi r16, 0xff
std Y+UART_HW_IFACE_OFFS_READMSG_BUFNUM, r16
std Y+UART_HW_IFACE_OFFS_WRITEMSG_BUFNUM, r16
std Y+UART_HW_IFACE_OFFS_READBUFNUM, r16
std Y+UART_HW_IFACE_OFFS_WRITEBUFNUM, r16
ldi r16, UART_HW_READMODE_OFF
std Y+UART_HW_IFACE_OFFS_READMODE, r16
ldi r16, UART_HW_WRITEMODE_IDLE
std Y+UART_HW_IFACE_OFFS_WRITEMODE, r16
ret
; @end
; ---------------------------------------------------------------------------
; @routine UART_HW_InterfaceWriteToReadBuffer @global
; @routine UART_HW_Interface_SetReadBuffer @global
;
; @return CFLAG on success, cleared on error
; @param r16 byte to write
; @param Y pointer to start of interface data
; @clobbers R17, R18, X
; @param Y pointer to interface data in SRAM (see @ref UART_HW_IFACE_OFFS_STATE)
; @param r16 read buffer number
; @param X read buffer pos
; @clobbers R17
UART_HW_InterfaceWriteToReadBuffer:
push yl
push yh
adiw yh:yl, UART_HW_IFACE_OFFS_READBUF
rcall uartHwRingBufferWriteGuarded ; R17, R18, X
pop yh
pop yl
UART_HW_Interface_SetReadBuffer:
std Y+UART_HW_IFACE_OFFS_READBUFNUM, r16
adiw xh:xl, 1
std Y+UART_HW_IFACE_OFFS_READBUFPOSLOW, xl
std Y+UART_HW_IFACE_OFFS_READBUFPOSHIGH, xh
sbiw xh:xl, 1
clr r17
std Y+UART_HW_IFACE_OFFS_READBUFUSED, r17
std Y+UART_HW_IFACE_OFFS_READBUFLEFT, r17
ret
; @end
; ---------------------------------------------------------------------------
; @routine UART_HW_InterfaceReadFromReadBuffer @global
; @routine UART_HW_Interface_SetWriteBuffer @global
;
; @return CFLAG on success, cleared on error
; @return R16 byte read
; @param Y pointer to start of interface data
; @clobbers R17, R18, X
; @param Y pointer to interface data in SRAM (see @ref UART_HW_IFACE_OFFS_STATE)
; @param r16 write buffer number
; @param X write buffer pos
; @clobbers r17
UART_HW_InterfaceReadFromReadBuffer:
push yl
push yh
adiw yh:yl, UART_HW_IFACE_OFFS_READBUF
rcall uartHwRingBufferReadGuarded ; R17, R18, X
pop yh
pop yl
ret
; @end
; ---------------------------------------------------------------------------
; @routine UART_HW_InterfaceWriteToWriteBuffer @global
;
; @return CFLAG on success, cleared on error
; @param r16 byte to write
; @param Y pointer to start of interface data
; @clobbers R17, R18, X
UART_HW_InterfaceWriteToWriteBuffer:
push yl
push yh
adiw yh:yl, UART_HW_IFACE_OFFS_WRITEBUF
rcall uartHwRingBufferWriteGuarded ; R17, R18, X
pop yh
pop yl
ret
; @end
; ---------------------------------------------------------------------------
; @routine UART_HW_InterfaceReadFromWriteBuffer @global
;
; @return CFLAG on success, cleared on error
; @return R16 byte read
; @param Y pointer to start of interface data
; @clobbers R17, R18, X
UART_HW_InterfaceReadFromWriteBuffer:
push yl
push yh
adiw yh:yl, UART_HW_IFACE_OFFS_WRITEBUF
rcall uartHwRingBufferReadGuarded ; R17, R18, X
pop yh
pop yl
ret
; @end
; ---------------------------------------------------------------------------
; @routine UART_HW_InterfaceAddOutgoingMsgNum @global
;
; @return CFLAG on success, cleared on error
; @param r16 byte to write
; @param Y pointer to start of interface data
; @clobbers R17, R18, X
UART_HW_InterfaceAddOutgoingMsgNum:
push yl
push yh
adiw yh:yl, UART_HW_IFACE_OFFS_OUTMSGBUF
rcall uartHwRingBufferWriteGuarded ; R17, R18, X
pop yh
pop yl
ret
; @end
; ---------------------------------------------------------------------------
; @routine UART_HW_InterfaceGetNextOutgoingMsgNum @global
;
; @return CFLAG on success, cleared on error
; @return R16 byte read
; @param Y pointer to start of interface data
; @clobbers R17, R18, X
UART_HW_InterfaceGetNextOutgoingMsgNum:
push yl
push yh
adiw yh:yl, UART_HW_IFACE_OFFS_OUTMSGBUF
rcall uartHwRingBufferReadGuarded ; R17, R18, X
pop yh
pop yl
UART_HW_Interface_SetWriteBuffer:
std Y+UART_HW_IFACE_OFFS_WRITEBUFNUM, r16
adiw xh:xl, 1
std Y+UART_HW_IFACE_OFFS_WRITEBUFPOSLOW, xl ; begin of msg (dest addr byte)
std Y+UART_HW_IFACE_OFFS_WRITEBUFPOSHIGH, xh
adiw xh:xl, 1
ld r17, X ; payload length byte
sbiw xh:xl, 2 ; back to start of buffer
inc r17
inc r17
inc r17
std Y+UART_HW_IFACE_OFFS_WRITEBUFUSED, r17
std Y+UART_HW_IFACE_OFFS_WRITEBUFLEFT, r17
ret
; @end
@@ -214,64 +121,3 @@ UART_HW_InterfaceGetNextOutgoingMsgNum:
; ---------------------------------------------------------------------------
; @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