From 2a776ca895ce40159c6e942ebbcdff2b04eeebc8 Mon Sep 17 00:00:00 2001 From: Martin Preuss Date: Wed, 12 Feb 2025 00:37:24 +0100 Subject: [PATCH] avr: added UART_HW_IFACE_OFFS_WRITEMSGRINGBUF --- avr/modules/uart_hw/defs.asm | 3 +- avr/modules/uart_hw/lowlevel.asm | 149 +++++++++++++++++++++++++++++++ 2 files changed, 151 insertions(+), 1 deletion(-) diff --git a/avr/modules/uart_hw/defs.asm b/avr/modules/uart_hw/defs.asm index e752620..c7154b9 100644 --- a/avr/modules/uart_hw/defs.asm +++ b/avr/modules/uart_hw/defs.asm @@ -58,7 +58,8 @@ .equ UART_HW_IFACE_OFFS_WRITEBUFPOSHIGH = 17 .equ UART_HW_IFACE_OFFS_WRITEBUFUSED = 18 .equ UART_HW_IFACE_OFFS_WRITEBUFLEFT = 19 +.equ UART_HW_IFACE_OFFS_WRITEMSGRINGBUF = 20 -.equ UART_HW_IFACE_SIZE = UART_HW_IFACE_OFFS_WRITEBUFLEFT+1 +.equ UART_HW_IFACE_SIZE = UART_HW_IFACE_OFFS_WRITEMSGRINGBUF+RINGBUFFERY_SIZE+UART_HW_IFACE_OUTMSGBUF_SIZE diff --git a/avr/modules/uart_hw/lowlevel.asm b/avr/modules/uart_hw/lowlevel.asm index 5159819..adacd50 100644 --- a/avr/modules/uart_hw/lowlevel.asm +++ b/avr/modules/uart_hw/lowlevel.asm @@ -66,6 +66,14 @@ UART_HW_InterfaceInit: ldi r16, UART_HW_WRITEMODE_IDLE std Y+UART_HW_IFACE_OFFS_WRITEMODE, r16 + push yl + push yh + adiw yh:yl, UART_HW_IFACE_OFFS_WRITEMSGRINGBUF + ldi r16, UART_HW_IFACE_OUTMSGBUF_SIZE + rcall RingBufferY_Init + pop yh + pop yl + ret ; @end @@ -119,5 +127,146 @@ UART_HW_Interface_SetWriteBuffer: +; --------------------------------------------------------------------------- +; @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_WRITEMSGRINGBUF + 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_WRITEMSGRINGBUF + rcall uartHwRingBufferReadGuarded ; R17, R18, X + pop yh + pop yl + ret +; @end + + + +; --------------------------------------------------------------------------- +; @routine UART_HW_InterfacePeekNextOutgoingMsgNum @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_InterfacePeekNextOutgoingMsgNum: + push yl + push yh + adiw yh:yl, UART_HW_IFACE_OFFS_WRITEMSGRINGBUF + rcall uartHwRingBufferPeekGuarded ; R17, R18, X + pop yh + pop yl + ret +; @end + + + + + + +; --------------------------------------------------------------------------- +; @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 uartHwRingBufferPeekGuarded +; +; @return CFLAG on success, cleared on error +; @param r16 byte to write +; @param Y pointer to start of interface data +; @clobbers R17, R18, X + +uartHwRingBufferPeekGuarded: + push r15 + in r15, SREG + cli + rcall RingBufferY_PeekByte ; R17, R18, X + brcc uartHwRingBufferPeekGuarded_error + out SREG, r15 + pop r15 + sec + ret +uartHwRingBufferPeekGuarded_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