; *************************************************************************** ; 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_W_MAX_WAIT_BUSFREE = 50 ; max 1ms .equ COM2WI_STATETIMER_W_BYTEHOLDCLOCKLOW = 1 ; 20 us .equ COM2WI_STATETIMER_W_BITHOLDCLOCKLOW = 1 ; 20 us .equ COM2WI_STATETIMER_W_BITSETDATA = 1 ; 20 us .equ COM2WI_STATETIMER_W_BITHOLDCLOCKHIGH = 1 ; 20 us .equ COM2WI_STATETIMER_R_WAITFORCLOCKHIGH = 50 ; 1 ms .equ COM2WI_STATETIMER_R_WAITFORCLOCKLOW = 50 ; 1 ms .equ COM2WI_STATETIMER_S_WAITFORCLOCKLOW = 50 ; 1 ms .equ COM2WI_STATE_IDLE = 0 .equ COM2WI_STATE_W_MSGWAITBUSFREE = 1 .equ COM2WI_STATE_W_BYTEHOLDCLOCKLOW = 2 .equ COM2WI_STATE_W_BITHOLDCLOCKLOW = 3 .equ COM2WI_STATE_W_BITSETDATA = 4 .equ COM2WI_STATE_W_BITHOLDCLOCKHIGH = 5 .equ COM2WI_STATE_W_MSGSENT = 6 .equ COM2WI_STATE_R_WAITFORCLOCKHIGH = 7 .equ COM2WI_STATE_R_WAITFORCLOCKLOW = 8 .equ COM2WI_STATE_R_MSGRECVD = 9 .equ COM2WI_STATE_S_WAITFORCLOCKLOW = 10 .equ COM2WI_STATE_S_WAITFORCLOCKHIGH = 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) mov xl, yl mov xh, yh ldi r17, COM2WI_IFACE_SIZE clr r16 rcall Utils_FillSram ; (R17, X) rcall NET_Interface_Init ; (R16, R17, X) 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 rcall com2wiInit .endmacro ; @end .dseg com2wi0_iface: .byte COM2WI_IFACE_SIZE .cseg ; --------------------------------------------------------------------------- ; @routine COM2WI_Init COM2WI_Init: mCOM2WI_INIT 0 rcall com2wiSetupTimer1 ret ; @end ; --------------------------------------------------------------------------- ; @routine COM2WI_Timer1Isr @global @isr ; ; ISR for timer1 ; ; @clobbers: none COM2WI_Timer1Isr: push r15 in r15, SREG push r16 push r17 push r18 push yl push yh push zl push zh ldi yl, LOW(com2wi0_iface) ldi yh, HIGH(com2wi0_iface) rcall com2wiHandleIrq ; (r16, r17, Z) pop zh pop zl pop yh pop yl pop r18 pop r17 pop r16 out SREG, r15 pop r15 reti ; @end ; --------------------------------------------------------------------------- ; @routine COM2WI_Run COM2WI_Run: ldi yl, LOW(com2wi0_iface) ldi yh, HIGH(com2wi0_iface) rcall com2wiRun 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) ; WGM13=0, WGM12=1, WGM11=0, WGM10=0 ldi r16, 0 outr TCCR1A, r16 ; WGM11=0, WGM10=0 ldi r16, (0<