; *************************************************************************** ; 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. * ; *************************************************************************** .equ TTYONUART1_SKIPTIME = 2 .equ TTYONUART1_MSG_INTERVAL = 2 .equ TTYONUART1_IFACENUM = 2 .dseg ttyOnUart1_iface: .byte UART_HW_IFACE_SIZE .cseg ; --------------------------------------------------------------------------- ; @routine TtyOnUart1_Init @global ; ; @clobbers Y (R16, R17, X) TtyOnUart1_Init: ldi yl, LOW(ttyOnUart1_iface) ldi yh, HIGH(ttyOnUart1_iface) rcall UART_HW_Interface_Init ; (R16, R17, X) rcall UART_HW_Uart1_Init ; (R16, R17, X) ldi r16, TTYONUART1_IFACENUM std Y+NET_IFACE_OFFS_IFACENUM, r16 ret ; @end ; --------------------------------------------------------------------------- ; @routine TtyOnUart1_Periodically @global ; ; @clobbers R16, Y TtyOnUart1_Periodically: ldi yl, LOW(ttyOnUart1_iface) ldi yh, HIGH(ttyOnUart1_iface) ldd r16, Y+NET_IFACE_OFFS_READTIMER inc r16 breq TtyOnUart1_Periodically_l1 std Y+NET_IFACE_OFFS_READTIMER, r16 TtyOnUart1_Periodically_l1: ldd r16, Y+NET_IFACE_OFFS_WRITETIMER inc r16 breq TtyOnUart1_Periodically_l2 std Y+NET_IFACE_OFFS_WRITETIMER, r16 TtyOnUart1_Periodically_l2: ret ; @end ; --------------------------------------------------------------------------- ; @routine TtyOnUart1_RxCharIsr @global @isr ; ; @clobbers none TtyOnUart1_RxCharIsr: push r15 in r15, SREG push r16 push r17 push r18 push r24 push r25 push xl push xh push yl push yh ldi yl, LOW(ttyOnUart1_iface) ldi yh, HIGH(ttyOnUart1_iface) rcall UART_HW_Uart1_RxCharIsr ; (R16, R17, R18, R24, R25, X) pop yh pop yl pop xh pop xl pop r25 pop r24 pop r18 pop r17 pop r16 out SREG, r15 pop r15 reti ; @end ; --------------------------------------------------------------------------- ; @routine TtyOnUart1_TxUdreIsr @global @isr ; ; @clobbers none TtyOnUart1_TxUdreIsr: push r15 in r15, SREG push r16 push r17 push xl push xh push yl push yh ldi yl, LOW(ttyOnUart1_iface) ldi yh, HIGH(ttyOnUart1_iface) rcall UART_HW_Uart1_TxUdreIsr ; (R16, R17, X) pop yh pop yl pop xh pop xl pop r17 pop r16 out SREG, r15 pop r15 reti ; @end ; --------------------------------------------------------------------------- ; @routine TtyOnUart1_TxCharIsr @global @isr ; ; @clobbers none TtyOnUart1_TxCharIsr: push r15 in r15, SREG push r16 push r17 push r18 push xl push xh push yl push yh ldi yl, LOW(ttyOnUart1_iface) ldi yh, HIGH(ttyOnUart1_iface) rcall UART_HW_Uart1_TxCharIsr ; (R16, R17, R18, X) pop yh pop yl pop xh pop xl pop r18 pop r17 pop r16 out SREG, r15 pop r15 reti ; @end ; --------------------------------------------------------------------------- ; @routine TtyOnUart1_SendBuffer @global ; ; @clobbers R16, R17 TtyOnUart1_SendBuffer: push r15 in r15, SREG cli ldd r17, Y+UART_HW_IFACE_OFFS_WRITEMODE cpi r17, UART_HW_WRITEMODE_IDLE breq TtyOnUart1_SendBuffer_setBuffer out SREG, r15 pop r15 clc ret TtyOnUart1_SendBuffer_setBuffer: rcall UART_HW_Interface_SetWriteBuffer ; (R17) ldi r17, UART_HW_WRITEMODE_WRITING std Y+UART_HW_IFACE_OFFS_WRITEMODE, r17 rcall UART_HW_Uart1_StartTx ; (R16) pop r15 out SREG, r15 sec ret ; @end ; --------------------------------------------------------------------------- ; @routine TtyOnUart1_Run @global ; ; @clobbers all TtyOnUart1_Run: push r15 in r15, SREG cli ldi yl, LOW(ttyOnUart1_iface) ldi yh, HIGH(ttyOnUart1_iface) rcall ttyOnUart1RunWriteModes rcall ttyOnUart1RunReadModes pop r15 out SREG, r15 ret ; @end ; --------------------------------------------------------------------------- ; @routine ttyOnUart1RunWriteModes ; ; @clobbers all, !Y ttyOnUart1RunWriteModes: ldd r16, Y+UART_HW_IFACE_OFFS_WRITEMODE ; handle write functions cpi r16, UART_HW_WRITEMODE_IDLE breq ttyOnUart1RunWriteIdle cpi r16, UART_HW_WRITEMODE_WRITING breq ttyOnUart1RunWriting cpi r16, UART_HW_WRITEMODE_WAITBUFFEREMPTY breq ttyOnUart1RunWaitBufferEmpty cpi r16, UART_HW_WRITEMODE_WRITEBUFFEREMPTY breq ttyOnUart1RunWriteBufferEmpty ret ; @end ; --------------------------------------------------------------------------- ; @routine ttyOnUart1RunIdle ; ; @clobbers ttyOnUart1RunWriteIdle: ldd r16, Y+NET_IFACE_OFFS_WRITETIMER cpi r16, TTYONUART1_MSG_INTERVAL ; wait a bit between messages brcs ttyOnUart1RunWriteIdle_end rcall NET_Interface_GetNextOutgoingMsgNum ; (R17, R18, X) brcc ttyOnUart1RunWriteIdle_end rcall NET_Buffer_Locate ; (R17) brcc ttyOnUart1RunWriteIdle_end rcall TtyOnUart1_SendBuffer ; (R16, R17) ttyOnUart1RunWriteIdle_end: ret ; --------------------------------------------------------------------------- ; @routine ttyOnUart1RunWriting ; ; @clobbers ttyOnUart1RunWriting: ; TODO: check for timeout etc. ret ; @end ; --------------------------------------------------------------------------- ; @routine ttyOnUart1RunWaitBufferEmpty ; ; @clobbers none ttyOnUart1RunWaitBufferEmpty: ; TODO: check for timeout etc. ret ; @end ; --------------------------------------------------------------------------- ; @routine ttyOnUart1RunWriteBufferEmpty ; ; @clobbers R16, R17, X ttyOnUart1RunWriteBufferEmpty: ldd r16, Y+UART_HW_IFACE_OFFS_WRITEBUFNUM ldi r17, 0xff cp r16, r17 breq ttyOnUart1RunWriteBufferEmpty_setIdle std Y+UART_HW_IFACE_OFFS_WRITEBUFNUM, r17 rcall NET_Buffer_ReleaseByNum ; (R16, X) ttyOnUart1RunWriteBufferEmpty_setIdle: rcall UART_HW_Uart1_StopTx ; disable transceiver and interrupts (R16) ldi r16, UART_HW_WRITEMODE_IDLE std Y+UART_HW_IFACE_OFFS_WRITEMODE, r16 ldi r16, NET_IFACE_OFFS_PACKETSOUT_LOW ; increment packets counter rcall NET_Interface_IncCounter16 ; (R24, R25) ret ; @end ; --------------------------------------------------------------------------- ; @routine ttyOnUart1RunReadModes ; ; @clobbers all, !Y ttyOnUart1RunReadModes: ldd r16, Y+UART_HW_IFACE_OFFS_READMODE ; handle read functions cpi r16, UART_HW_READMODE_IDLE breq ttyOnUart1RunReadIdle ; (R16, R17, R24, R25, X) cpi r16, UART_HW_READMODE_READING breq ttyOnUart1RunReading ; (none) cpi r16, UART_HW_READMODE_SKIPPING breq ttyOnUart1RunSkipping ; (R16) cpi r16, UART_HW_READMODE_MSGRECEIVED breq ttyOnUart1RunMsgReceived ; (R16, R17, R18, R24, R25) ret ; @end ; --------------------------------------------------------------------------- ; @routine ttyOnUart1RunReadIdle ; ; @clobbers R16 (R17, R24, R25, X) ttyOnUart1RunReadIdle: ldd r16, Y+UART_HW_IFACE_OFFS_READBUFNUM cpi r16, 0xff brne ttyOnUart1RunReadIdle_enterReading rcall NET_Buffer_Alloc ; (R16, R17, X) brcc ttyOnUart1RunReadIdle_noBuf rcall UART_HW_Interface_SetReadBuffer ; (R17) ttyOnUart1RunReadIdle_enterReading: ldi r16, UART_HW_READMODE_READING std Y+UART_HW_IFACE_OFFS_READMODE, r16 rcall UART_HW_Uart1_StartRx ; R16 ret ttyOnUart1RunReadIdle_noBuf: ldi r16, NET_IFACE_OFFS_ERR_NOBUF_LOW rcall NET_Interface_IncCounter16 ; (R24, R25) ret ; @end ; --------------------------------------------------------------------------- ; @routine ttyOnUart1RunReading ; ; @clobbers none ttyOnUart1RunReading: ret ; @end ; --------------------------------------------------------------------------- ; @routine ttyOnUart1RunSkipping ; ; @clobbers R16 ttyOnUart1RunSkipping: ldd r16, Y+NET_IFACE_OFFS_READTIMER cpi r16, TTYONUART1_SKIPTIME brcs ttyOnUart1RunSkipping_end ldi r16, UART_HW_READMODE_IDLE std Y+UART_HW_IFACE_OFFS_READMODE, r16 ttyOnUart1RunSkipping_end: ret ; @end ; --------------------------------------------------------------------------- ; @routine ttyOnUart1RunMsgReceived ; ; @clobbers R16 (R17, R18, R24, R25) ttyOnUart1RunMsgReceived: ldd r16, Y+UART_HW_IFACE_OFFS_READBUFNUM cpi r16, 0xff breq ttyOnUart1RunMsgReceived_end rcall NET_AddIncomingMsgNum ; (R17, R18, X) brcs ttyOnUart1RunMsgReceived_enterIdle ttyOnUart1RunMsgReceived_overrun: ; reset/reuse current buffer rcall NET_Buffer_Locate rcall UART_HW_Interface_SetReadBuffer ; (R17) ldi r16, NET_IFACE_OFFS_ERR_NOBUF_LOW rcall NET_Interface_IncCounter16 ; (R24, R25) ttyOnUart1RunMsgReceived_enterIdle: ldi r16, 0xff std Y+UART_HW_IFACE_OFFS_READBUFNUM, r16 ldi r16, UART_HW_READMODE_IDLE std Y+UART_HW_IFACE_OFFS_READMODE, r16 ttyOnUart1RunMsgReceived_end: ret ; @end