; *************************************************************************** ; copyright : (C) 2025 by Martin Preuss ; email : martin@libchipcard.de ; ; *************************************************************************** ; * This file is part of the project "AqHome". * ; * Please see toplevel file COPYING of that project for license details. * ; *************************************************************************** .cseg ; --------------------------------------------------------------------------- ; @routine UART_HW_Init @global ; ; Initializes buffers. ; ; @clobbers R16, R17, X, Y UART_HW_Init: ldi xh, HIGH(uartHwDataBegin) ldi xl, LOW(uartHwDataBegin) clr r16 ldi r17, (uartHwDataEnd-uartHwDataBegin) rcall Utils_FillSram rcall UART_HW_FixedBuffers_Init ldi r16, UART_HW_MSGNUMINBUF_SIZE ldi yl, LOW(uartHw_ringBufferMsgNumIn) ldi yh, HIGH(uartHw_ringBufferMsgNumIn) rcall RingBufferY_Init ldi r16, UART_HW_MSGNUMOUTBUF_SIZE ldi yl, LOW(uartHw_ringBufferMsgNumOut) ldi yh, HIGH(uartHw_ringBufferMsgNumOut) rcall RingBufferY_Init sec ret ; @end ; --------------------------------------------------------------------------- ; @routine UART_HW_InterfaceInit @global ; ; @param Y pointer to interface data in SRAM (see @ref UART_HW_IFACE_OFFS_STATE) ; @clobbers R16, R17, X UART_HW_InterfaceInit: mov xl, yl mov xh, yh ldi r17, UART_HW_IFACE_SIZE clr r16 rcall Utils_FillSram ; (R17, X) ldi r16, 0xff 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 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 ; --------------------------------------------------------------------------- ; @routine UART_HW_Interface_SetReadBuffer @global ; ; @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_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_Interface_SetWriteBuffer @global ; ; @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_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 ; --------------------------------------------------------------------------- ; @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