153 lines
4.7 KiB
NASM
153 lines
4.7 KiB
NASM
; ***************************************************************************
|
|
; 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_Interface_Init @global
|
|
;
|
|
; @param Y pointer to interface data in SRAM
|
|
; @clobbers R16 (R17, X)
|
|
|
|
UART_HW_Interface_Init:
|
|
rcall NET_Interface_Init ; (R16, 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_IDLE
|
|
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_Interface_SetReadBuffer @global
|
|
;
|
|
; @param Y pointer to interface data in SRAM
|
|
; @param r16 read buffer number
|
|
; @param X pointer to read buffer
|
|
; @clobbers R17
|
|
|
|
UART_HW_Interface_SetReadBuffer:
|
|
std Y+UART_HW_IFACE_OFFS_READBUFNUM, r16
|
|
adiw xh:xl, 1
|
|
std Y+UART_HW_IFACE_OFFS_READBUFPOS_LOW, xl
|
|
std Y+UART_HW_IFACE_OFFS_READBUFPOS_HIGH, xh
|
|
sbiw xh:xl, 1
|
|
clr r17
|
|
std Y+UART_HW_IFACE_OFFS_READBUFUSED, r17
|
|
ldi r17, NET_BUFFERS_SIZE-1
|
|
std Y+UART_HW_IFACE_OFFS_READBUFLEFT, r17
|
|
ret
|
|
; @end
|
|
|
|
|
|
|
|
; ---------------------------------------------------------------------------
|
|
; @routine UART_HW_Interface_SetWriteBuffer @global
|
|
;
|
|
; @param Y pointer to interface data in SRAM
|
|
; @param r16 write buffer number
|
|
; @param X pointer to write buffer
|
|
; @clobbers r17
|
|
|
|
UART_HW_Interface_SetWriteBuffer:
|
|
std Y+UART_HW_IFACE_OFFS_WRITEBUFNUM, r16
|
|
adiw xh:xl, 1
|
|
std Y+UART_HW_IFACE_OFFS_WRITEBUFPOS_LOW, xl ; begin of msg (dest addr byte)
|
|
std Y+UART_HW_IFACE_OFFS_WRITEBUFPOS_HIGH, 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_Interface_EnsureReadBuffer
|
|
;
|
|
; @clobbers R16 (R17, R24, R25, X)
|
|
|
|
UART_HW_Interface_EnsureReadBuffer:
|
|
ldd r16, Y+UART_HW_IFACE_OFFS_READBUFNUM
|
|
cpi r16, 0xff
|
|
breq UART_HW_Interface_EnsureReadBuffer_alloc
|
|
UART_HW_Interface_EnsureReadBuffer_secRet:
|
|
sec
|
|
UART_HW_Interface_EnsureReadBuffer_ret:
|
|
ret
|
|
UART_HW_Interface_EnsureReadBuffer_alloc:
|
|
rcall NET_Buffer_Alloc ; (R16, R17, X)
|
|
brcc UART_HW_Interface_EnsureReadBuffer_ret
|
|
rcall UART_HW_Interface_SetReadBuffer ; (R17)
|
|
rcall NET_Interface_SetIfaceNumInBuffer ; (R16, R17)
|
|
rjmp UART_HW_Interface_EnsureReadBuffer_secRet
|
|
UART_HW_Interface_EnsureReadBuffer_noBuf:
|
|
ldi r16, NET_IFACE_OFFS_ERR_MISSED_LOW
|
|
rcall NET_Interface_IncCounter16 ; (R24, R25)
|
|
clc
|
|
ret
|
|
; @end
|
|
|
|
|
|
|
|
; ---------------------------------------------------------------------------
|
|
; @routine UART_HW_Interface_HandleMsgReceived
|
|
;
|
|
; @param Y pointer to interface data in SRAM
|
|
; @clobbers R16, X (R17, R18, R24, R25)
|
|
|
|
UART_HW_Interface_HandleMsgReceived:
|
|
; unset buffer
|
|
ldi r17, 0xff
|
|
ldd r16, Y+UART_HW_IFACE_OFFS_READBUFNUM
|
|
std Y+UART_HW_IFACE_OFFS_READBUFNUM, r17
|
|
cp r16, r17
|
|
breq UART_HW_Interface_HandleMsgReceived_enterIdle ; SNH!
|
|
; check checksum
|
|
rcall NET_Buffer_Locate ; (R17)
|
|
push r16
|
|
adiw xh:xl, 1
|
|
rcall NETMSG_CheckMessageInBuffer ; (R16, R17, R18, R19, R20, X)
|
|
pop r16
|
|
brcs UART_HW_Interface_HandleMsgReceived_addMsg
|
|
; invalid msg
|
|
rcall NET_Buffer_ReleaseByNum ; (R16, X)
|
|
ldi r16, NET_IFACE_OFFS_ERR_CONTENT_LOW
|
|
rjmp UART_HW_Interface_HandleMsgReceived_incCounterGoIdle
|
|
UART_HW_Interface_HandleMsgReceived_addMsg:
|
|
rcall NET_AddIncomingMsgNum ; (R17, R18, X)
|
|
brcs UART_HW_Interface_HandleMsgReceived_enterIdle
|
|
; could not add msg
|
|
rcall NET_Buffer_ReleaseByNum ; (R16, X)
|
|
ldi r16, NET_IFACE_OFFS_ERR_MISSED_LOW
|
|
UART_HW_Interface_HandleMsgReceived_incCounterGoIdle:
|
|
rcall NET_Interface_IncCounter16 ; (R24, R25)
|
|
UART_HW_Interface_HandleMsgReceived_enterIdle:
|
|
ldi r17, UART_HW_READMODE_IDLE
|
|
std Y+UART_HW_IFACE_OFFS_READMODE, r17 ; set read mode
|
|
ret
|
|
; @end
|
|
|
|
|
|
|