; *************************************************************************** ; 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. * ; *************************************************************************** ; work in progress! #ifndef AVR_MODULES_COM2W_COM2WI_H #define AVR_MODULES_COM2W_COM2WI_H .equ COM2WI_BUFFER_SIZE = NET_BUFFERS_SIZE-1 .equ COM2WI_R_MAX_WAIT_HI_TIME = 50 ; max 1ms .equ COM2WI_S_MAX_WAIT_HI_TIME = 50 ; max 1ms .equ COM2WI_S_MAX_WAIT_LO_TIME = 50 ; max 1ms .equ COM2WI_STATE_IDLE = 0 .equ COM2WI_STATE_R_WAITFORCLOCKLO = 1 .equ COM2WI_STATE_R_WAITFORCLOCKHI = 2 .equ COM2WI_STATE_R_MSGRECVD = 3 .equ COM2WI_STATE_S_WAITFORCLOCKLO = 4 .equ COM2WI_STATE_S_WAITFORCLOCKHI = 5 .equ COM2WI_STATE_W_WAITFREELINE = 6 .equ COM2WI_STATE_W_SENDCLOCKLO = 7 .equ COM2WI_STATE_W_SENDCLOCKHI = 8 .equ COM2WI_STATE_W_WAITBETWEENBITS = 9 .equ COM2WI_STATE_W_WAITBETWEENBYTES = 10 .equ COM2WI_STATE_W_MSGSENT = 11 .equ COM2WI_STATE_COUNT = 12 .equ COM2WI_IFACE_OFFS_BEGIN = NET_IFACE_SIZE .equ COM2WI_IFACE_OFFS_STATE = COM2WI_IFACE_OFFS_BEGIN+0 .equ COM2WI_IFACE_OFFS_STATETIMER = COM2WI_IFACE_OFFS_BEGIN+1 .equ COM2WI_IFACE_OFFS_STATECOUNTER = COM2WI_IFACE_OFFS_BEGIN+2 .equ COM2WI_IFACE_OFFS_PINMASK_CLK = COM2WI_IFACE_OFFS_BEGIN+3 .equ COM2WI_IFACE_OFFS_PINMASK_DATA = COM2WI_IFACE_OFFS_BEGIN+4 .equ COM2WI_IFACE_OFFS_BITCOUNTER = COM2WI_IFACE_OFFS_BEGIN+5 .equ COM2WI_IFACE_OFFS_CURRBYTE = COM2WI_IFACE_OFFS_BEGIN+6 .equ COM2WI_IFACE_OFFS_BUFPOS_LOW = COM2WI_IFACE_OFFS_BEGIN+7 .equ COM2WI_IFACE_OFFS_BUFPOS_HIGH = COM2WI_IFACE_OFFS_BEGIN+8 .equ COM2WI_IFACE_OFFS_BUFUSED = COM2WI_IFACE_OFFS_BEGIN+9 .equ COM2WI_IFACE_OFFS_BUFLEFT = COM2WI_IFACE_OFFS_BEGIN+10 .equ COM2WI_IFACE_OFFS_BUFFER = COM2WI_IFACE_OFFS_BEGIN+11 .equ COM2WI_IFACE_SIZE = COM2WI_IFACE_OFFS_BUFFER+COM2WI_BUFFER_SIZE ; --------------------------------------------------------------------------- ; @macro mCOM2WI_INIT ; ; @param @0 interface number (beginning with 0) .macro mCOM2WI_INIT ldi yl, LOW(com2wi@0_iface) ldi yh, HIGH(com2wi@0_iface) rcall com2wiInit ldi r16, COM_MASK_CLK@0 std Y+COM2WI_IFACE_OFFS_PINMASK_CLK, r16 ldi r16, COM_MASK_DATA@0 std Y+COM2WI_IFACE_OFFS_PINMASK_DATA, r16 ldi r16, COM_MASK_IRQ@0 std Y+COM2WI_IFACE_OFFS_PINMASK_IRQ, r16 .endmacro ; @end .dseg com2wi0_iface: .byte COM2WI_IFACE_SIZE .cseg ; --------------------------------------------------------------------------- ; @routine COM2WI_Init COM2WI_Init: mCOM2WI_INIT 0 rcall com2wiSetupTimer1 ret ; @end ; --------------------------------------------------------------------------- ; @routine com2wiInit com2wiInit: rcall com2wiSetupLines ldi r16, COM2WI_STATE_IDLE std Y+COM2WI_IFACE_OFFS_STATE, r16 ret ; @end ; --------------------------------------------------------------------------- ; @routine com2wiSetupLines com2wiSetupLines: ; setup CLK line (as input, disable internal pull-up resistor) .ifdef COM_CLK_PUE ldd r16, Y+COM2WI_IFACE_OFFS_PINMASK_CLK com r16 inr r17, COM_CLK_PUE and r17, r16 outr COM_CLK_PUE, r17 .endif rcall com2wiClkSetHigh ; setup DATA line (as input, disable internal pull-up resistor) .ifdef COM_DATA_PUE ldd r16, Y+COM2WI_IFACE_OFFS_PINMASK_DATA com r16 inr r17, COM_DATA_PUE and r17, r16 outr COM_DATA_PUE, r17 .endif rcall com2wiDataSetHigh ret ; @end ; --------------------------------------------------------------------------- ; @routine com2wiSetupTimer1 ; ; setup timer for IRQ every 20us com2wiSetupTimer1: ; CTC mode, no prescaler, OCR1A=100 (every 20us at 20MHz) ldi r16, 0 outr TCCR1A, r16 ; WGM11=0, WGM10=0 ldi r16, (0<