; *************************************************************************** ; 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 NET_Interface_Init @global ; ; @param Y pointer to interface data in SRAM ; @clobbers R16, R17, X NET_Interface_Init: mov xl, yl mov xh, yh ldi r17, NET_IFACE_SIZE clr r16 rcall Utils_FillSram ; (R17, X) push yl push yh adiw yh:yl, NET_IFACE_OFFS_OUTMSGRINGBUF ldi r16, NET_IFACE_OUTMSGBUF_SIZE rcall RingBufferY_Init pop yh pop yl ret ; @end ; --------------------------------------------------------------------------- ; @routine NET_Interface_GetNextMsgId @global ; ; @param Y pointer to interface data in SRAM ; @clobbers none NET_Interface_GetNextMsgId: ldd r24, Y+NET_IFACE_OFFS_LASTMSGID_LOW ldd r25, Y+NET_IFACE_OFFS_LASTMSGID_HIGH adiw r25:r24, 1 std Y+NET_IFACE_OFFS_LASTMSGID_LOW, r24 std Y+NET_IFACE_OFFS_LASTMSGID_HIGH, r25 ret ; @end ; --------------------------------------------------------------------------- ; @routine NET_Interface_AddOutgoingMsgNum @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 NET_Interface_AddOutgoingMsgNum: push yl push yh adiw yh:yl, NET_IFACE_OFFS_OUTMSGRINGBUF rcall RingBufferY_WriteByteGuarded ; R17, R18, X pop yh pop yl ret ; @end ; --------------------------------------------------------------------------- ; @routine NET_Interface_AddOrReleaseOutMsg @global ; ; Try to add given msg to the given interface's list of outbound messages, ; if that fails release the given message (@ref NET_Buffer_ReleaseByNum) ; ; @return CFLAG on success, cleared on error ; @param r16 byte to write ; @param Y pointer to start of interface data ; @clobbers R16, R17, R18, X NET_Interface_AddOrReleaseOutMsg: rcall NET_Interface_AddOutgoingMsgNum ; (R17, R18, X) brcs NET_Interface_AddOrReleaseOutMsg_ret rcall NET_Buffer_ReleaseByNum ; (R16, X) clc NET_Interface_AddOrReleaseOutMsg_ret: ret ; @end ; --------------------------------------------------------------------------- ; @routine NET_Interface_GetNextOutgoingMsgNum @global ; ; @return CFLAG on success, cleared on error ; @return R16 byte read ; @param Y pointer to start of interface data ; @clobbers R17, R18, X NET_Interface_GetNextOutgoingMsgNum: push yl push yh adiw yh:yl, NET_IFACE_OFFS_OUTMSGRINGBUF rcall RingBufferY_ReadByteGuarded ; R17, R18, X pop yh pop yl ret ; @end ; --------------------------------------------------------------------------- ; @routine NET_Interface_PeekNextOutgoingMsgNum @global ; ; @return CFLAG on success, cleared on error ; @return R16 byte read ; @param Y pointer to start of interface data ; @clobbers R17, R18, X NET_Interface_PeekNextOutgoingMsgNum: push yl push yh adiw yh:yl, NET_IFACE_OFFS_OUTMSGRINGBUF rcall RingBufferY_PeekByteGuarded ; R17, R18, X pop yh pop yl ret ; @end ; --------------------------------------------------------------------------- ; @routine NET_Interface_GetNumOfOutgoingMsgNums @global ; ; @return CFLAG on success, cleared on error ; @return R16 byte read ; @param Y pointer to start of interface data ; @clobbers none NET_Interface_GetNumOfOutgoingMsgNums: ldd r16, Y+(NET_IFACE_OFFS_OUTMSGRINGBUF+RINGBUFFERY_OFFS_USED) ret ; @end ; --------------------------------------------------------------------------- ; @routine NET_Interface_IncCounter16 @global ; ; @param Y pointer to start of interface data ; @param R16 offset to Y for counter to increment ; @clobbers R24, R25 NET_Interface_IncCounter16: add yl, r16 adc yh, r16 sub yh, r16 ld r24, Y+ ld r25, Y sbiw yh:yl, 1 adiw r25:r24, 1 breq NET_Interface_IncCounter16_end st Y+, r24 st Y, r25 sbiw yh:yl, 1 NET_Interface_IncCounter16_end: sub yl, r16 sbc yh, r16 add yh, r16 ret ; @end ; --------------------------------------------------------------------------- ; @routine NET_Interface_SetIfaceNumInBuffer @global ; ; @param X pointer to start of buffer ; @param Y pointer to start of interface data ; @clobbers R16, R17 NET_Interface_SetIfaceNumInBuffer: ldd r16, Y+NET_IFACE_OFFS_IFACENUM andi r16, (NET_IFACE_BUFFER_IFACENUM1_BIT | NET_IFACE_BUFFER_IFACENUM0_BIT) ld r17, X andi r17, ~(NET_IFACE_BUFFER_IFACENUM1_BIT | NET_IFACE_BUFFER_IFACENUM0_BIT) or r17, r16 st X, r17 ret ; @end ; --------------------------------------------------------------------------- ; @routine NET_Interface_Periodically @global ; ; @param Y pointer to start of interface data ; @clobbers R16 NET_Interface_Periodically: ldd r16, Y+NET_IFACE_OFFS_READTIMER inc r16 breq NET_Interface_Periodically_l1 std Y+NET_IFACE_OFFS_READTIMER, r16 NET_Interface_Periodically_l1: ldd r16, Y+NET_IFACE_OFFS_WRITETIMER inc r16 breq NET_Interface_Periodically_l2 std Y+NET_IFACE_OFFS_WRITETIMER, r16 NET_Interface_Periodically_l2: ret ; @end