diff --git a/avr/devices/all/includes.asm b/avr/devices/all/includes.asm index e765f78..76916e7 100644 --- a/avr/devices/all/includes.asm +++ b/avr/devices/all/includes.asm @@ -134,6 +134,12 @@ +#ifdef MODULES_COM2WI +.include "modules/com2w/com2wi2.asm" +#endif + + + #ifdef MODULES_UARTFD0 .include "modules/uart_fd/defs.asm" .include "modules/uart_fd/macros.asm" diff --git a/avr/devices/all/modules.asm b/avr/devices/all/modules.asm index 79fda3a..7a0e800 100644 --- a/avr/devices/all/modules.asm +++ b/avr/devices/all/modules.asm @@ -117,6 +117,10 @@ initModules: bigcall COM2WN_Init #endif +#ifdef MODULES_COM2WI + bigcall COM2WI_Init +#endif + #ifdef MODULES_MOTION bigcall Motion_Init @@ -281,6 +285,13 @@ runModules: sbci r16, 0 #endif +#ifdef MODULES_COM2WI + push r16 + bigcall COM2WI_Run + pop r16 + sbci r16, 0 +#endif + ; add more modules here ; check for repeat request diff --git a/avr/modules/com2w/com2wi2.asm b/avr/modules/com2w/com2wi2.asm new file mode 100644 index 0000000..b3a8394 --- /dev/null +++ b/avr/modules/com2w/com2wi2.asm @@ -0,0 +1,1107 @@ +; *************************************************************************** +; 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<