diff --git a/avr/devices/t03/main.asm b/avr/devices/t03/main.asm index 6504964..4069ce4 100644 --- a/avr/devices/t03/main.asm +++ b/avr/devices/t03/main.asm @@ -270,8 +270,8 @@ initModules: .include "modules/uart_hw/lowlevel.asm" .include "modules/uart_hw/m_lowlevel_uart.asm" .include "modules/uart_hw/lowlevel_uart1.asm" -.include "modules/uart_hw/msglevel_recv.asm" -.include "modules/uart_hw/msglevel_send.asm" +;.include "modules/uart_hw/msglevel_recv.asm" +;.include "modules/uart_hw/msglevel_send.asm" .include "modules/uart_hw/ttyonuart1.asm" @@ -293,8 +293,14 @@ maybeSendDeviceMsg: push r16 adiw xh:xl, 1 rcall writeDeviceMsg + sbiw xh:xl, 1 pop r16 - rcall UART_HW_InterfaceAddOutgoingMsgNum + push r16 + rcall TtyOnUart1_SendBuffer + pop r16 + brcs maybeSendDeviceMsg_resetCounter + rcall UART_HW_FixedBuffers_ReleaseByNum ; (R16, X) + rjmp maybeSendDeviceMsg_end ; reset counter maybeSendDeviceMsg_resetCounter: ldi r24, LOW(SEND_DEVICE_EVERY) @@ -302,6 +308,7 @@ maybeSendDeviceMsg_resetCounter: maybeSendDeviceMsg_storeCounter: sts deviceCounter, r24 sts deviceCounter+1, r25 +maybeSendDeviceMsg_end: ret diff --git a/avr/modules/uart_hw/defs.asm b/avr/modules/uart_hw/defs.asm index bad499e..e752620 100644 --- a/avr/modules/uart_hw/defs.asm +++ b/avr/modules/uart_hw/defs.asm @@ -17,18 +17,16 @@ .equ UART_HW_BUFFER_IFACENUM0_BIT = 0 -.equ UART_HW_MODE_READMASK = 0x0f -.equ UART_HW_MODE_WRITEMASK = 0xf0 +.equ UART_HW_READMODE_OFF = 0 +.equ UART_HW_READMODE_IDLE = 1 +.equ UART_HW_READMODE_READING = 2 +.equ UART_HW_READMODE_SKIPPING = 3 -.equ UART_HW_MODE_OFF = 0 -.equ UART_HW_MODE_IDLE = 1 -.equ UART_HW_MODE_READING = 2 -.equ UART_HW_MODE_SKIPPING = 3 - -.equ UART_HW_MODE_W_IDLE = 0 -.equ UART_HW_MODE_WRITING = 16 -.equ UART_HW_MODE_WAITBUFFEREMPTY = 17 -.equ UART_HW_MODE_WRITEBUFFEREMPTY = 18 +.equ UART_HW_WRITEMODE_OFF = 0 +.equ UART_HW_WRITEMODE_IDLE = 1 +.equ UART_HW_WRITEMODE_WRITING = 2 +.equ UART_HW_WRITEMODE_WAITBUFFEREMPTY = 3 +.equ UART_HW_WRITEMODE_WRITEBUFFEREMPTY = 4 .equ UART_HW_STATUS_UNDERRUN_BIT = 0 @@ -39,51 +37,28 @@ .equ UART_HW_IFACE_OFFS_IFACENUM = 0 ; interface number (put into received messages) -.equ UART_HW_IFACE_OFFS_MODE = 1 -.equ UART_HW_IFACE_OFFS_STATUS = 2 -.equ UART_HW_IFACE_OFFS_READTIMER = 3 -.equ UART_HW_IFACE_OFFS_WRITETIMER = 4 -.equ UART_HW_IFACE_OFFS_ERR_OVR = 5 -.equ UART_HW_IFACE_OFFS_ERR_CONTENT = 6 +.equ UART_HW_IFACE_OFFS_STATUS = 1 +.equ UART_HW_IFACE_OFFS_READTIMER = 2 +.equ UART_HW_IFACE_OFFS_WRITETIMER = 3 +.equ UART_HW_IFACE_OFFS_ERR_OVRLOW = 4 +.equ UART_HW_IFACE_OFFS_ERR_OVRHIGH = 5 +.equ UART_HW_IFACE_OFFS_ERR_CONTENTLOW = 6 +.equ UART_HW_IFACE_OFFS_ERR_CONTENTHIGH = 7 - ; ringbuffer for incoming chars -.equ UART_HW_IFACE_OFFS_READBUF = 7 -.equ UART_HW_IFACE_OFFS_READBUF_MAX = UART_HW_IFACE_OFFS_READBUF -.equ UART_HW_IFACE_OFFS_READBUF_USED = UART_HW_IFACE_OFFS_READBUF+1 -.equ UART_HW_IFACE_OFFS_READBUF_RDPOS = UART_HW_IFACE_OFFS_READBUF+2 -.equ UART_HW_IFACE_OFFS_READBUF_WRPOS = UART_HW_IFACE_OFFS_READBUF+3 -.equ UART_HW_IFACE_OFFS_READBUF_DATA = UART_HW_IFACE_OFFS_READBUF+4 ; UART_HW_IFACE_READBUF_SIZE bytes +.equ UART_HW_IFACE_OFFS_READMODE = 8 +.equ UART_HW_IFACE_OFFS_READBUFNUM = 9 +.equ UART_HW_IFACE_OFFS_READBUFPOSLOW = 10 +.equ UART_HW_IFACE_OFFS_READBUFPOSHIGH = 11 +.equ UART_HW_IFACE_OFFS_READBUFUSED = 12 +.equ UART_HW_IFACE_OFFS_READBUFLEFT = 13 - ; ringbuffer for outgoing chars -.equ UART_HW_IFACE_OFFS_WRITEBUF = UART_HW_IFACE_OFFS_READBUF_DATA+UART_HW_IFACE_READBUF_SIZE -.equ UART_HW_IFACE_OFFS_WRITEBUF_MAX = UART_HW_IFACE_OFFS_WRITEBUF -.equ UART_HW_IFACE_OFFS_WRITEBUF_USED = UART_HW_IFACE_OFFS_WRITEBUF+1 -.equ UART_HW_IFACE_OFFS_WRITEBUF_RDPOS = UART_HW_IFACE_OFFS_WRITEBUF+2 -.equ UART_HW_IFACE_OFFS_WRITEBUF_WRPOS = UART_HW_IFACE_OFFS_WRITEBUF+3 -.equ UART_HW_IFACE_OFFS_WRITEBUF_DATA = UART_HW_IFACE_OFFS_WRITEBUF+4 +.equ UART_HW_IFACE_OFFS_WRITEMODE = 14 +.equ UART_HW_IFACE_OFFS_WRITEBUFNUM = 15 +.equ UART_HW_IFACE_OFFS_WRITEBUFPOSLOW = 16 +.equ UART_HW_IFACE_OFFS_WRITEBUFPOSHIGH = 17 +.equ UART_HW_IFACE_OFFS_WRITEBUFUSED = 18 +.equ UART_HW_IFACE_OFFS_WRITEBUFLEFT = 19 - ; ringbuffer for outgoing messages -.equ UART_HW_IFACE_OFFS_OUTMSGBUF = UART_HW_IFACE_OFFS_WRITEBUF_DATA+UART_HW_IFACE_WRITEBUF_SIZE -.equ UART_HW_IFACE_OFFS_OUTMSGBUF_MAX = UART_HW_IFACE_OFFS_OUTMSGBUF -.equ UART_HW_IFACE_OFFS_OUTMSGBUF_USED = UART_HW_IFACE_OFFS_OUTMSGBUF+1 -.equ UART_HW_IFACE_OFFS_OUTMSGBUF_RDPOS = UART_HW_IFACE_OFFS_OUTMSGBUF+2 -.equ UART_HW_IFACE_OFFS_OUTMSGBUF_WRPOS = UART_HW_IFACE_OFFS_OUTMSGBUF+3 -.equ UART_HW_IFACE_OFFS_OUTMSGBUF_DATA = UART_HW_IFACE_OFFS_OUTMSGBUF+4 - -; ref to recv buffer -.equ UART_HW_IFACE_OFFS_READMSG = UART_HW_IFACE_OFFS_OUTMSGBUF_DATA+UART_HW_IFACE_OUTMSGBUF_SIZE -.equ UART_HW_IFACE_OFFS_READMSG_BUFNUM = UART_HW_IFACE_OFFS_READMSG ; 1 byte -.equ UART_HW_IFACE_OFFS_READMSG_PTR = UART_HW_IFACE_OFFS_READMSG+1 ; 2 bytes -.equ UART_HW_IFACE_OFFS_READMSG_USED = UART_HW_IFACE_OFFS_READMSG+3 ; 1 byte -.equ UART_HW_IFACE_OFFS_READMSG_LEFT = UART_HW_IFACE_OFFS_READMSG+4 ; 1 byte - -; ref to transmit buffer -.equ UART_HW_IFACE_OFFS_WRITEMSG = UART_HW_IFACE_OFFS_READMSG_LEFT+1 -.equ UART_HW_IFACE_OFFS_WRITEMSG_BUFNUM = UART_HW_IFACE_OFFS_WRITEMSG ; 1 byte -.equ UART_HW_IFACE_OFFS_WRITEMSG_PTR = UART_HW_IFACE_OFFS_WRITEMSG+1 ; 2 bytes -.equ UART_HW_IFACE_OFFS_WRITEMSG_USED = UART_HW_IFACE_OFFS_WRITEMSG+3 ; 1 byte -.equ UART_HW_IFACE_OFFS_WRITEMSG_LEFT = UART_HW_IFACE_OFFS_WRITEMSG+4 ; 1 byte - -.equ UART_HW_IFACE_SIZE = UART_HW_IFACE_OFFS_WRITEMSG_LEFT+1 +.equ UART_HW_IFACE_SIZE = UART_HW_IFACE_OFFS_WRITEBUFLEFT+1 diff --git a/avr/modules/uart_hw/lowlevel.asm b/avr/modules/uart_hw/lowlevel.asm index 22e0289..5159819 100644 --- a/avr/modules/uart_hw/lowlevel.asm +++ b/avr/modules/uart_hw/lowlevel.asm @@ -37,8 +37,6 @@ UART_HW_Init: ldi yl, LOW(uartHw_ringBufferMsgNumOut) ldi yh, HIGH(uartHw_ringBufferMsgNumOut) rcall RingBufferY_Init - - sec ret ; @end @@ -57,156 +55,65 @@ UART_HW_InterfaceInit: ldi r17, UART_HW_IFACE_SIZE clr r16 rcall Utils_FillSram ; (R17, X) - ; reset ringbuffer for recvd chars - m_ringbuffer_y_reset UART_HW_IFACE_OFFS_READBUF_MAX, \ - UART_HW_IFACE_OFFS_READBUF_USED, \ - UART_HW_IFACE_OFFS_READBUF_RDPOS, \ - UART_HW_IFACE_OFFS_READBUF_WRPOS, \ - UART_HW_IFACE_OFFS_READBUF_DATA - ldi r16, UART_HW_IFACE_READBUF_SIZE - std Y+UART_HW_IFACE_OFFS_READBUF_MAX, r16 - - ; reset ringbuffer for chars to transmit - m_ringbuffer_y_reset UART_HW_IFACE_OFFS_WRITEBUF_MAX, \ - UART_HW_IFACE_OFFS_WRITEBUF_USED, \ - UART_HW_IFACE_OFFS_WRITEBUF_RDPOS, \ - UART_HW_IFACE_OFFS_WRITEBUF_WRPOS, \ - UART_HW_IFACE_OFFS_WRITEBUF_DATA - ldi r16, UART_HW_IFACE_WRITEBUF_SIZE - std Y+UART_HW_IFACE_OFFS_WRITEBUF_MAX, r16 - - ; reset ringbuffer for messages to be sent - m_ringbuffer_y_reset UART_HW_IFACE_OFFS_OUTMSGBUF_MAX, \ - UART_HW_IFACE_OFFS_OUTMSGBUF_USED, \ - UART_HW_IFACE_OFFS_OUTMSGBUF_RDPOS, \ - UART_HW_IFACE_OFFS_OUTMSGBUF_WRPOS, \ - UART_HW_IFACE_OFFS_OUTMSGBUF_DATA - ldi r16, UART_HW_IFACE_OUTMSGBUF_SIZE - std Y+UART_HW_IFACE_OFFS_OUTMSGBUF_MAX, r16 ldi r16, 0xff - std Y+UART_HW_IFACE_OFFS_READMSG_BUFNUM, r16 - std Y+UART_HW_IFACE_OFFS_WRITEMSG_BUFNUM, r16 + std Y+UART_HW_IFACE_OFFS_READBUFNUM, r16 + std Y+UART_HW_IFACE_OFFS_WRITEBUFNUM, r16 + + ldi r16, UART_HW_READMODE_OFF + std Y+UART_HW_IFACE_OFFS_READMODE, r16 + + ldi r16, UART_HW_WRITEMODE_IDLE + std Y+UART_HW_IFACE_OFFS_WRITEMODE, r16 + ret ; @end ; --------------------------------------------------------------------------- -; @routine UART_HW_InterfaceWriteToReadBuffer @global +; @routine UART_HW_Interface_SetReadBuffer @global ; -; @return CFLAG on success, cleared on error -; @param r16 byte to write -; @param Y pointer to start of interface data -; @clobbers R17, R18, X +; @param Y pointer to interface data in SRAM (see @ref UART_HW_IFACE_OFFS_STATE) +; @param r16 read buffer number +; @param X read buffer pos +; @clobbers R17 -UART_HW_InterfaceWriteToReadBuffer: - push yl - push yh - adiw yh:yl, UART_HW_IFACE_OFFS_READBUF - rcall uartHwRingBufferWriteGuarded ; R17, R18, X - pop yh - pop yl +UART_HW_Interface_SetReadBuffer: + std Y+UART_HW_IFACE_OFFS_READBUFNUM, r16 + adiw xh:xl, 1 + std Y+UART_HW_IFACE_OFFS_READBUFPOSLOW, xl + std Y+UART_HW_IFACE_OFFS_READBUFPOSHIGH, xh + sbiw xh:xl, 1 + clr r17 + std Y+UART_HW_IFACE_OFFS_READBUFUSED, r17 + std Y+UART_HW_IFACE_OFFS_READBUFLEFT, r17 ret ; @end ; --------------------------------------------------------------------------- -; @routine UART_HW_InterfaceReadFromReadBuffer @global +; @routine UART_HW_Interface_SetWriteBuffer @global ; -; @return CFLAG on success, cleared on error -; @return R16 byte read -; @param Y pointer to start of interface data -; @clobbers R17, R18, X +; @param Y pointer to interface data in SRAM (see @ref UART_HW_IFACE_OFFS_STATE) +; @param r16 write buffer number +; @param X write buffer pos +; @clobbers r17 -UART_HW_InterfaceReadFromReadBuffer: - push yl - push yh - adiw yh:yl, UART_HW_IFACE_OFFS_READBUF - rcall uartHwRingBufferReadGuarded ; R17, R18, X - pop yh - pop yl - ret -; @end - - - -; --------------------------------------------------------------------------- -; @routine UART_HW_InterfaceWriteToWriteBuffer @global -; -; @return CFLAG on success, cleared on error -; @param r16 byte to write -; @param Y pointer to start of interface data -; @clobbers R17, R18, X - -UART_HW_InterfaceWriteToWriteBuffer: - push yl - push yh - adiw yh:yl, UART_HW_IFACE_OFFS_WRITEBUF - rcall uartHwRingBufferWriteGuarded ; R17, R18, X - pop yh - pop yl - ret -; @end - - - -; --------------------------------------------------------------------------- -; @routine UART_HW_InterfaceReadFromWriteBuffer @global -; -; @return CFLAG on success, cleared on error -; @return R16 byte read -; @param Y pointer to start of interface data -; @clobbers R17, R18, X - -UART_HW_InterfaceReadFromWriteBuffer: - push yl - push yh - adiw yh:yl, UART_HW_IFACE_OFFS_WRITEBUF - rcall uartHwRingBufferReadGuarded ; R17, R18, X - pop yh - pop yl - ret -; @end - - - -; --------------------------------------------------------------------------- -; @routine UART_HW_InterfaceAddOutgoingMsgNum @global -; -; @return CFLAG on success, cleared on error -; @param r16 byte to write -; @param Y pointer to start of interface data -; @clobbers R17, R18, X - -UART_HW_InterfaceAddOutgoingMsgNum: - push yl - push yh - adiw yh:yl, UART_HW_IFACE_OFFS_OUTMSGBUF - rcall uartHwRingBufferWriteGuarded ; R17, R18, X - pop yh - pop yl - ret -; @end - - - -; --------------------------------------------------------------------------- -; @routine UART_HW_InterfaceGetNextOutgoingMsgNum @global -; -; @return CFLAG on success, cleared on error -; @return R16 byte read -; @param Y pointer to start of interface data -; @clobbers R17, R18, X - -UART_HW_InterfaceGetNextOutgoingMsgNum: - push yl - push yh - adiw yh:yl, UART_HW_IFACE_OFFS_OUTMSGBUF - rcall uartHwRingBufferReadGuarded ; R17, R18, X - pop yh - pop yl +UART_HW_Interface_SetWriteBuffer: + std Y+UART_HW_IFACE_OFFS_WRITEBUFNUM, r16 + adiw xh:xl, 1 + std Y+UART_HW_IFACE_OFFS_WRITEBUFPOSLOW, xl ; begin of msg (dest addr byte) + std Y+UART_HW_IFACE_OFFS_WRITEBUFPOSHIGH, xh + adiw xh:xl, 1 + ld r17, X ; payload length byte + sbiw xh:xl, 2 ; back to start of buffer + inc r17 + inc r17 + inc r17 + std Y+UART_HW_IFACE_OFFS_WRITEBUFUSED, r17 + std Y+UART_HW_IFACE_OFFS_WRITEBUFLEFT, r17 ret ; @end @@ -214,64 +121,3 @@ UART_HW_InterfaceGetNextOutgoingMsgNum: - - -; --------------------------------------------------------------------------- -; @routine uartHwRingBufferReadGuarded -; -; @return CFLAG on success, cleared on error -; @param r16 byte to write -; @param Y pointer to start of interface data -; @clobbers R17, R18, X - -uartHwRingBufferReadGuarded: - push r15 - in r15, SREG - cli - rcall RingBufferY_ReadByte ; R17, R18, X - brcc uartHwRingBufferReadGuarded_error - out SREG, r15 - pop r15 - sec - ret -uartHwRingBufferReadGuarded_error: - out SREG, r15 - pop r15 - clc - ret -; @end - - - -; --------------------------------------------------------------------------- -; @routine uartHwRingBufferWriteGuarded -; -; @return CFLAG on success, cleared on error -; @param r16 byte to write -; @param Y pointer to start of interface data -; @clobbers R17, R18, X - -uartHwRingBufferWriteGuarded: - push r15 - in r15, SREG - cli - rcall RingBufferY_WriteByte ; R17, R18, X - brcc uartHwRingBufferWriteGuarded_error - out SREG, r15 - pop r15 - sec - ret -uartHwRingBufferWriteGuarded_error: - out SREG, r15 - pop r15 - clc - ret -; @end - - - - - - - - diff --git a/avr/modules/uart_hw/lowlevel_tty.asm b/avr/modules/uart_hw/lowlevel_tty.asm deleted file mode 100644 index 3a96f1c..0000000 --- a/avr/modules/uart_hw/lowlevel_tty.asm +++ /dev/null @@ -1,168 +0,0 @@ -; *************************************************************************** -; 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. * -; *************************************************************************** - - -.dseg -; uartHw_TtyOn1Interface: .byte UART_HW_IFACE_SIZE - - - -.cseg - - - -; --------------------------------------------------------------------------- -; @routine UART_HW_TtyOn1_Init @global -; -; @param Y pointer to interface data in SRAM (see @ref UART_HW_IFACE_OFFS_STATE) -; @clobbers R16, R17, X - -UART_HW_TtyOn1_Init: - rcall UART_HW_InitInterface - - ; set baudrate -.if clock == 8000000 - ldi r16, 25 ; (19.2Kb/s at 8MHz) - ldi r17, 0 -.endif - -.if clock == 1000000 - ldi r16, 3 ; (19.2Kb/s at 1MHz) - ldi r17, 0 -.endif - - out UBRR1H, r17 - out UBRR1L, r16 - - ; set character format - ldi r16, (1<