From 81669a5442a3d5099de407ad5340e3100f14ca5c Mon Sep 17 00:00:00 2001 From: Martin Preuss Date: Mon, 1 Sep 2025 23:24:15 +0200 Subject: [PATCH] avr: first try irq driven com2w interface. probably doesn't work like that but that's for later. --- avr/modules/com2w/com2wi.asm | 579 +++++++++++++++++++++++++++++++++++ 1 file changed, 579 insertions(+) create mode 100644 avr/modules/com2w/com2wi.asm diff --git a/avr/modules/com2w/com2wi.asm b/avr/modules/com2w/com2wi.asm new file mode 100644 index 0000000..aa66cfc --- /dev/null +++ b/avr/modules/com2w/com2wi.asm @@ -0,0 +1,579 @@ +; *************************************************************************** +; 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<