; *************************************************************************** ; 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! ; writing works ; reading works on 1st device ; reading on 2nd device doesn't work #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 = 100 ; max 1ms .equ COM2WI_S_MAX_WAIT_HI_TIME = 100 ; max 1ms .equ COM2WI_S_MAX_WAIT_LO_TIME = 100 ; max 1ms .equ COM2WI_W_MAX_WAIT_BUSFREE = 100 ; max 1ms .equ COM2WI_STATETIMER_W_BYTEHOLDCLOCKLOW = 2 ; 20 us .equ COM2WI_STATETIMER_W_BITHOLDCLOCKLOW = 2 ; 20 us .equ COM2WI_STATETIMER_W_BITSETDATA = 2 ; 20 us .equ COM2WI_STATETIMER_W_BITHOLDCLOCKHIGH = 2 ; 20 us .equ COM2WI_STATETIMER_R_WAITFORCLOCKHIGH = 100 ; 1 ms .equ COM2WI_STATETIMER_R_WAITFORCLOCKLOW = 100 ; 1 ms .equ COM2WI_STATETIMER_S_WAITFORCLOCKLOW = 100 ; 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, @0 +1 std Y+NET_IFACE_OFFS_IFACENUM, r16 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 .if COM_PORTS >0 com2wi0_iface: .byte COM2WI_IFACE_SIZE .endif .if COM_PORTS >1 com2wi1_iface: .byte COM2WI_IFACE_SIZE .endif .if COM_PORTS >2 com2wi2_iface: .byte COM2WI_IFACE_SIZE .endif .if COM_PORTS >3 com2wi3_iface: .byte COM2WI_IFACE_SIZE .endif .if COM_PORTS >4 com2wi4_iface: .byte COM2WI_IFACE_SIZE .endif .if COM_PORTS >5 com2wi5_iface: .byte COM2WI_IFACE_SIZE .endif .if COM_PORTS >6 com2wi6_iface: .byte COM2WI_IFACE_SIZE .endif .if COM_PORTS >7 com2wi7_iface: .byte COM2WI_IFACE_SIZE .endif .cseg ; --------------------------------------------------------------------------- ; @routine COM2WI_Init COM2WI_Init: .if COM_PORTS >0 mCOM2WI_INIT 0 .endif .if COM_PORTS >1 mCOM2WI_INIT 1 .endif .if COM_PORTS >2 mCOM2WI_INIT 2 .endif .if COM_PORTS >3 mCOM2WI_INIT 3 .endif .if COM_PORTS >4 mCOM2WI_INIT 4 .endif .if COM_PORTS >5 mCOM2WI_INIT 5 .endif .if COM_PORTS >6 mCOM2WI_INIT 6 .endif .if COM_PORTS >7 mCOM2WI_INIT 7 .endif rcall com2wiSetupTimer1 ret ; @end ; --------------------------------------------------------------------------- ; @routine COM2WI_Timer1Isr @global @isr ; ; ISR for timer1 ; ; @clobbers: none COM2WI_Timer1Isr: push r15 in r15, SREG push r1 push r2 inr r1, COM_CLK_INPUT inr r2, COM_DATA_INPUT push r16 push r17 push r18 push yl push yh push zl push zh rcall COM2WI_HandleTimerIrq ; (r16, r17, r18, Y, Z) pop zh pop zl pop yh pop yl pop r18 pop r17 pop r16 pop r2 pop r1 out SREG, r15 pop r15 reti ; @end ; --------------------------------------------------------------------------- ; @routine COM2WI_Run COM2WI_Run: ldi yl, LOW(com2wi0_iface) ldi yh, HIGH(com2wi0_iface) ldi r18, COM_PORTS clr r19 COM2WI_Run_loop: push r18 push r19 rcall com2wiRun pop r19 pop r18 sbci r19, 0 ldi r16, COM2WI_IFACE_SIZE add yl, r16 adc yh, r16 sub yh, r16 dec r18 brne COM2WI_Run_loop ; check for repeat request tst r19 clc breq COM2WI_Run_end sec COM2WI_Run_end: ret ; @end ; --------------------------------------------------------------------------- ; @routine COM2WI_HandleTimerIrq ; ; @param Y pointer to interface data in SRAM ; @clobbers R16, R17, R18, Y, Z COM2WI_HandleTimerIrq: ldi yl, LOW(com2wi0_iface) ldi yh, HIGH(com2wi0_iface) ldi r18, COM_PORTS COM2WI_HandleTimerIrq_loop: push r18 rcall com2wiHandleIrq ; R16, R17, R18, Z pop r18 ldi r16, COM2WI_IFACE_SIZE add yl, r16 adc yh, r16 sub yh, r16 dec r18 brne COM2WI_HandleTimerIrq_loop 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<