avr/uart_hw: basically works for a while then stops...

This commit is contained in:
Martin Preuss
2025-03-21 20:55:50 +01:00
parent 2964347e7b
commit 373a553ac8
14 changed files with 685 additions and 122 deletions

View File

@@ -54,6 +54,7 @@
.equ COM_ATTN_DDR = DDRA .equ COM_ATTN_DDR = DDRA
.equ COM_ATTN_INPUT = PINA .equ COM_ATTN_INPUT = PINA
.equ COM_ATTN_OUTPUT = PORTA .equ COM_ATTN_OUTPUT = PORTA
.equ COM_ATTN_PUE = PUEA
.equ COM_ATTN_PIN = PORTA0 .equ COM_ATTN_PIN = PORTA0
.equ COM_IRQ_ADDR_ATTN = PCMSK0 .equ COM_IRQ_ADDR_ATTN = PCMSK0

View File

@@ -25,8 +25,9 @@
.equ clock=8000000 ; Define the clock frequency .equ clock=8000000 ; Define the clock frequency
;.equ SEND_DEVICE_EVERY = 3000 ;.equ SEND_DEVICE_EVERY = 3000
.equ SEND_DEVICE_EVERY = 100 ; every 10s .equ SEND_DEVICE_EVERY = 520 ; every 52s
.equ SEND_STATS_EVERY = 600 ; every minute .equ SEND_STATS_EVERY = 240 ; every 24s
.equ SEND_DEBUG_EVERY = 110
.nolist .nolist
.include "include/tn841def.inc" ; Define device ATtiny841 .include "include/tn841def.inc" ; Define device ATtiny841
@@ -90,37 +91,37 @@
; --------------------------------------------------------------------------- ; ---------------------------------------------------------------------------
; Reset and interrupt vectors ; Reset and interrupt vectors
rjmp BOOTLOADER_ADDR ; 1: RESET Reset vector use this for flashed system rjmp BOOTLOADER_ADDR ; 1: RESET Reset vector use this for flashed system
reti ; 2: INT0 External Interrupt Request 0 reti ; 2: INT0 External Interrupt Request 0
reti ; 3: PCINT0 Pin Change Interrupt 0 rjmp ComOnUart0_AttnChangeIsr ; 3: PCINT0 Pin Change Interrupt 0
reti ; 4: PCINT1 Pin Change Interrupt 1 reti ; 4: PCINT1 Pin Change Interrupt 1
reti ; 5: WDT Watchdog Time-out reti ; 5: WDT Watchdog Time-out
reti ; 6: TIM1_CAPT Timer/Counter1 Capture Event reti ; 6: TIM1_CAPT Timer/Counter1 Capture Event
reti ; 7: TIM1_COMPA (OC1A) Timer/Counter1 Compare Match A reti ; 7: TIM1_COMPA (OC1A) Timer/Counter1 Compare Match A
reti ; 8: TIM1_COMPB (OC1B) Timer/Counter1 Compare Match B reti ; 8: TIM1_COMPB (OC1B) Timer/Counter1 Compare Match B
reti ; 9: TIM1_OVF (OVF1) Timer/Counter1 Overflow reti ; 9: TIM1_OVF (OVF1) Timer/Counter1 Overflow
rjmp baseTimerIrqOC0A ; 10: TIM0_COMPA (OC0A) Timer/Counter0 Compare Match A rjmp baseTimerIrqOC0A ; 10: TIM0_COMPA (OC0A) Timer/Counter0 Compare Match A
reti ; 11: TIM0_COMPB (OC0B) Timer/Counter0 Compare Match B reti ; 11: TIM0_COMPB (OC0B) Timer/Counter0 Compare Match B
reti ; 12: TIM0_OVF (OVF0) Timer/Counter0 Overflow reti ; 12: TIM0_OVF (OVF0) Timer/Counter0 Overflow
reti ; 13: ANA_COMP0 Analog Comparator 0 reti ; 13: ANA_COMP0 Analog Comparator 0
reti ; 14: ADC_READY ADC Conversion Complete reti ; 14: ADC_READY ADC Conversion Complete
reti ; 15: EE_RDY (ERDY) EEPROM Ready reti ; 15: EE_RDY (ERDY) EEPROM Ready
reti ; 16: ANA_COMP1 Analog Comparator 1 reti ; 16: ANA_COMP1 Analog Comparator 1
reti ; 17: TIM2_CAPT Timer/Counter2 Capture Event reti ; 17: TIM2_CAPT Timer/Counter2 Capture Event
reti ; 18: TIM2_COMPA (OC2A) Timer/Counter2 Compare Match A reti ; 18: TIM2_COMPA (OC2A) Timer/Counter2 Compare Match A
reti ; 19: TIM2_COMPB (OC2B) Timer/Counter2 Compare Match B reti ; 19: TIM2_COMPB (OC2B) Timer/Counter2 Compare Match B
reti ; 20: TIM2_OVF (OVF2) Timer/Counter2 Overflow reti ; 20: TIM2_OVF (OVF2) Timer/Counter2 Overflow
reti ; 21: SPI SPI Serial Transfer Complete reti ; 21: SPI SPI Serial Transfer Complete
reti ; 22: USART0_RXS USART0 Rx Start reti ; 22: USART0_RXS USART0 Rx Start
reti ; 23: USART0_RXC USART0 Rx Complete rjmp ComOnUart0_RxCharIsr ; 23: USART0_RXC USART0 Rx Complete
reti ; 24: USART0_DRE USART0 Data Register Empty rjmp ComOnUart0_TxUdreIsr ; 24: USART0_DRE USART0 Data Register Empty
reti ; 25: USART0_TXC USART0 Tx Complete rjmp ComOnUart0_TxCharIsr ; 25: USART0_TXC USART0 Tx Complete
reti ; 26: USART1_RXS USART1 Rx Start reti ; 26: USART1_RXS USART1 Rx Start
rjmp TtyOnUart1_RxCharIsr ; 27: USART1_RXC USART1 Rx Complete rjmp TtyOnUart1_RxCharIsr ; 27: USART1_RXC USART1 Rx Complete
rjmp TtyOnUart1_TxUdreIsr ; 28: USART1_DRE USART1 Data Register Empty rjmp TtyOnUart1_TxUdreIsr ; 28: USART1_DRE USART1 Data Register Empty
rjmp TtyOnUart1_TxCharIsr ; 29: USART1_TXC USART1 Tx Complete rjmp TtyOnUart1_TxCharIsr ; 29: USART1_TXC USART1 Tx Complete
reti ; 30: TWI Two-Wire-Interface reti ; 30: TWI Two-Wire-Interface
reti ; 31: RESERVED reserved reti ; 31: RESERVED reserved
@@ -203,11 +204,12 @@ onSystemTimerTick:
#ifdef MODULES_LED_SIMPLE #ifdef MODULES_LED_SIMPLE
rcall LedSimple_Every100ms rcall LedSimple_Every100ms
#endif #endif
rcall TtyOnUart1_Periodically
rcall sendDebug
rcall maybeSendDeviceMsg rcall maybeSendDeviceMsg
rcall maybeSendTStatsMsg rcall maybeSendTStatsMsg
rcall maybeSendRStatsMsg rcall maybeSendRStatsMsg
rcall maybeSendMStatsMsg rcall maybeSendMStatsMsg
rcall TtyOnUart1_Periodically
ret ret
@@ -240,6 +242,9 @@ initModules:
rcall LedSimple_Init rcall LedSimple_Init
rcall NET_Init rcall NET_Init
rcall TtyOnUart1_Init rcall TtyOnUart1_Init
ldi r16, 0xfe
sts ttyOnUart1_iface+NET_IFACE_OFFS_ADDRESS, r16
rcall ComOnUart0_Init
ldi r16, LOW(SEND_DEVICE_EVERY) ldi r16, LOW(SEND_DEVICE_EVERY)
sts deviceCounter, r16 sts deviceCounter, r16
@@ -261,6 +266,11 @@ initModules:
ldi r16, HIGH(SEND_STATS_EVERY+20) ldi r16, HIGH(SEND_STATS_EVERY+20)
sts sendMStatsCounter+1, r16 sts sendMStatsCounter+1, r16
ldi r16, LOW(SEND_DEBUG_EVERY)
sts debugMsgCounter, r16
ldi r16, HIGH(SEND_DEBUG_EVERY)
sts debugMsgCounter+1, r16
ret ret
; @end ; @end
@@ -292,12 +302,15 @@ initModules:
.include "modules/network/msg/sendstats-w.asm" .include "modules/network/msg/sendstats-w.asm"
.include "modules/network/msg/recvstats-w.asm" .include "modules/network/msg/recvstats-w.asm"
.include "modules/network/msg/memstats-w.asm" .include "modules/network/msg/memstats-w.asm"
.include "modules/network/msg/debug-w.asm"
.include "modules/uart_hw/defs.asm" .include "modules/uart_hw/defs.asm"
.include "modules/uart_hw/lowlevel.asm" .include "modules/uart_hw/lowlevel.asm"
.include "modules/uart_hw/m_lowlevel_uart.asm" .include "modules/uart_hw/m_lowlevel_uart.asm"
.include "modules/uart_hw/lowlevel_uart0.asm"
.include "modules/uart_hw/lowlevel_uart1.asm" .include "modules/uart_hw/lowlevel_uart1.asm"
.include "modules/uart_hw/ttyonuart1.asm" .include "modules/uart_hw/ttyonuart1.asm"
.include "modules/uart_hw/comonuart0.asm"
@@ -320,12 +333,8 @@ maybeSendDeviceMsg:
rcall NETMSG_Device_Write ; (R16, R17, R18, R19, R20, R21, Z) rcall NETMSG_Device_Write ; (R16, R17, R18, R19, R20, R21, Z)
sbiw xh:xl, 1 sbiw xh:xl, 1
pop r16 pop r16
push r16 rcall NET_Interface_AddOrReleaseOutMsg ; (R16, R17, R18, X)
rcall NET_Interface_AddOutgoingMsgNum ; (R17, R18, X) brcc maybeSendDeviceMsg_end
pop r16
brcs maybeSendDeviceMsg_resetCounter
rcall NET_Buffer_ReleaseByNum ; (R16, X)
rjmp maybeSendDeviceMsg_end
; reset counter ; reset counter
maybeSendDeviceMsg_resetCounter: maybeSendDeviceMsg_resetCounter:
ldi r24, LOW(SEND_DEVICE_EVERY) ldi r24, LOW(SEND_DEVICE_EVERY)
@@ -382,9 +391,15 @@ maybeSendRStatsMsg:
; brcc maybeSendTStatsMsg_resetCounter ; brcc maybeSendTStatsMsg_resetCounter
brcc maybeSendRStatsMsg_end brcc maybeSendRStatsMsg_end
push r16 push r16
adiw xh:xl, 1 push yl
rcall NETMSG_RecvStats_Write ; (R16, R17, R18, R19, R20, R21, Z) push yh
sbiw xh:xl, 1 ldi yl, LOW(comOnUart0_iface)
ldi yh, HIGH(comOnUart0_iface)
adiw xh:xl, 1
rcall NETMSG_RecvStats_Write ; (R16, R17, R18, R19, R20, R21, Z)
sbiw xh:xl, 1
pop yh
pop yl
pop r16 pop r16
rcall NET_Interface_AddOrReleaseOutMsg ; (R16, R17, R18, X) rcall NET_Interface_AddOrReleaseOutMsg ; (R16, R17, R18, X)
brcc maybeSendRStatsMsg_end brcc maybeSendRStatsMsg_end
@@ -432,10 +447,7 @@ maybeSendMStatsMsg_end:
checkRecvdMsg: checkRecvdMsg:
ldi yl, LOW(ttyOnUart1_iface) rcall NET_PeekNextIncomingMsgNum ; check read queue (bufNum->r16)
ldi yh, HIGH(ttyOnUart1_iface)
rcall NET_PeekNextIncomingMsgNum ; check read queue
brcc checkRecvdMsg_end ; no msg, jmp brcc checkRecvdMsg_end ; no msg, jmp
rcall NET_Buffer_Locate ; (R17) rcall NET_Buffer_Locate ; (R17)
adiw xh:xl, 1 adiw xh:xl, 1
@@ -443,20 +455,157 @@ checkRecvdMsg:
rcall NETMSG_CheckMessageInBuffer ; (R16, R17, R18, R19, R20, X) rcall NETMSG_CheckMessageInBuffer ; (R16, R17, R18, R19, R20, X)
pop r16 pop r16
brcs checkRecvdMsg_sendMsg brcs checkRecvdMsg_sendMsg
; release buffer
rcall NET_GetNextIncomingMsgNum ; take off the queue rcall NET_GetNextIncomingMsgNum ; take off the queue
rcall NET_Buffer_ReleaseByNum ; delete rcall NET_Buffer_ReleaseByNum ; delete
ldi r16, NET_IFACE_OFFS_ERR_CONTENT_LOW clc
rcall NET_Interface_IncCounter16 ; (R24, R25)
rjmp checkRecvdMsg_end rjmp checkRecvdMsg_end
checkRecvdMsg_sendMsg: checkRecvdMsg_sendMsg:
rcall NET_Interface_AddOutgoingMsgNum ; try to add msg to interface sbiw xh:xl, 1
ld r17, X
andi r17, (NET_IFACE_BUFFER_IFACENUM1_BIT | NET_IFACE_BUFFER_IFACENUM0_BIT)
rcall reverseInterfaceNum
rcall addMsgToInterface
brcc checkRecvdMsg_end ; could not add, jmp brcc checkRecvdMsg_end ; could not add, jmp
rcall NET_GetNextIncomingMsgNum ; take off the queue rcall NET_GetNextIncomingMsgNum ; take off the queue
sec
checkRecvdMsg_end: checkRecvdMsg_end:
ret ret
; @return r17 reversed interface number
; @param r17 buffer num
; @clobbers r17
reverseInterfaceNum:
cpi r17, COMONUART0_IFACENUM
brne reverseInterfaceNum_notUart0
ldi r17, TTYONUART1_IFACENUM
ret
reverseInterfaceNum_notUart0:
ldi r17, COMONUART0_IFACENUM
ret
; @end
; @param r16 buffer num
; @param r17 interface num
addMsgToInterface:
cpi r16, COMONUART0_IFACENUM
brne addMsgToInterface_notUart0
ldi yl, LOW(ttyOnUart1_iface)
ldi yh, HIGH(ttyOnUart1_iface)
rjmp NET_Interface_AddOutgoingMsgNum ; try to add msg to interface
addMsgToInterface_notUart0:
cpi r16, TTYONUART1_IFACENUM
brne addMsgToInterface_end
ldi yl, LOW(comOnUart0_iface)
ldi yh, HIGH(comOnUart0_iface)
rjmp NET_Interface_AddOutgoingMsgNum ; try to add msg to interface
addMsgToInterface_end:
ret
; @end
sendDebug:
ldi yl, LOW(ttyOnUart1_iface)
ldi yh, HIGH(ttyOnUart1_iface)
lds r24, debugMsgCounter
lds r25, debugMsgCounter+1
sbiw r25:r24, 1
brne sendDebug_storeCounter
; send device msg
rcall NET_Buffer_Alloc ; (R16, R17, X)
brcc sendDebug_end
push r16
adiw xh:xl, 1
rcall writeDebugMsg
sbiw xh:xl, 1
pop r16
rcall NET_Interface_AddOrReleaseOutMsg ; (R16, R17, R18, X)
brcc sendDebug_end
; reset counter
sendDebug_resetCounter:
ldi r24, LOW(SEND_DEBUG_EVERY)
ldi r25, HIGH(SEND_DEBUG_EVERY)
sendDebug_storeCounter:
sts debugMsgCounter, r24
sts debugMsgCounter+1, r25
sendDebug_end:
ret
writeDebugMsg:
push yl
push yh
ldi yl, LOW(netBuffers)
ldi yh, HIGH(netBuffers)
rcall writeBufferInfoToRegs
mov r0, r17
mov r1, r18
adiw yh:yl, NET_BUFFERS_SIZE
rcall writeBufferInfoToRegs
mov r2, r17
mov r3, r18
adiw yh:yl, NET_BUFFERS_SIZE
rcall writeBufferInfoToRegs
mov r4, r17
mov r5, r18
adiw yh:yl, NET_BUFFERS_SIZE
rcall writeBufferInfoToRegs
mov r6, r17
mov r7, r18
adiw yh:yl, NET_BUFFERS_SIZE
rcall writeBufferInfoToRegs
mov r8, r17
mov r9, r18
adiw yh:yl, NET_BUFFERS_SIZE
rcall writeBufferInfoToRegs
mov r10, r17
mov r11, r18
adiw yh:yl, NET_BUFFERS_SIZE
clr r12
clr r13
push xl
push xh
rcall NET_Buffer_CountUsed
pop xh
pop xl
mov r14, r16
pop yh
pop yl
rcall NETMSG_Debug_Write ; (R16, R17, R18, R19, R20, R21, Z)
ret
writeBufferInfoToRegs:
ldi r17, 0xff
ldi r18, 0xff
ld r16, Y
andi r16, 0x80
breq writeBufferInfoToRegs_end
ldd r17, Y+(1+2) ; cmd code
ldd r18, Y+(1+3) ; source addr
writeBufferInfoToRegs_end:
ret
DEBUG1: DEBUG1:
ldi r19, 10 ldi r19, 10
ldi r20, 2 ldi r20, 2
@@ -534,6 +683,7 @@ programRamBegin:
sendTStatsCounter: .byte 2 sendTStatsCounter: .byte 2
sendRStatsCounter: .byte 2 sendRStatsCounter: .byte 2
sendMStatsCounter: .byte 2 sendMStatsCounter: .byte 2
debugMsgCounter: .byte 2
programRamEnd: programRamEnd:

View File

@@ -11,10 +11,6 @@
; =========================================================================== ; ===========================================================================
; defs ; defs
.equ NET_BUFFER_INUSE_BIT = 7
.equ NET_BUFFER_IFACENUM1_BIT = 1
.equ NET_BUFFER_IFACENUM0_BIT = 0
@@ -50,7 +46,7 @@ NET_Buffer_Alloc:
ldi xh, HIGH(netBuffers) ldi xh, HIGH(netBuffers)
m_fixedbuf_reserve NET_BUFFERS_SIZE, NET_BUFFERS_NUM m_fixedbuf_reserve NET_BUFFERS_SIZE, NET_BUFFERS_NUM
brcc NET_Buffer_Alloc_end brcc NET_Buffer_Alloc_end
ldi r17, (1<<NET_BUFFER_INUSE_BIT) ldi r17, (1<<NET_IFACE_BUFFER_INUSE_BIT)
st X, r17 st X, r17
NET_Buffer_Alloc_end: NET_Buffer_Alloc_end:
ret ret
@@ -78,7 +74,7 @@ NET_Buffer_ReleaseByAddr:
; @clobbers X (R16) ; @clobbers X (R16)
NET_Buffer_ReleaseByNum: NET_Buffer_ReleaseByNum:
rcall NET_Buffer_Locate ; (R16) rcall NET_Buffer_Locate ; (R16, X)
brcc NET_Buffer_ReleaseByNum_end brcc NET_Buffer_ReleaseByNum_end
rcall NET_Buffer_ReleaseByAddr ; (R16) rcall NET_Buffer_ReleaseByAddr ; (R16)
NET_Buffer_ReleaseByNum_end: NET_Buffer_ReleaseByNum_end:

View File

@@ -13,7 +13,7 @@
networkDataBegin: networkDataBegin:
; buffers for incoming and outgoing messages ; buffers for incoming and outgoing messages
netBuffers: .byte NET_BUFFERS_NUM*NET_BUFFERS_SIZE netBuffers: .byte NET_BUFFERS_NUM*NET_BUFFERS_SIZE
netRingBufferMsgNumIn: .byte NET_MSGNUMINBUF_SIZE netRingBufferMsgNumIn: .byte RINGBUFFERY_SIZE+NET_MSGNUMINBUF_SIZE
networkDataEnd: networkDataEnd:

View File

@@ -13,6 +13,11 @@
.equ NET_IFACE_OUTMSGBUF_SIZE = 4 ; max buffer nums in ringbuffer (per interface outbound) .equ NET_IFACE_OUTMSGBUF_SIZE = 4 ; max buffer nums in ringbuffer (per interface outbound)
.equ NET_IFACE_BUFFER_INUSE_BIT = 7
.equ NET_IFACE_BUFFER_IFACENUM1_BIT = 1
.equ NET_IFACE_BUFFER_IFACENUM0_BIT = 0
; interface generic data ; interface generic data
.equ NET_IFACE_OFFS_IFACENUM = 0 ; interface number (put into received messages) .equ NET_IFACE_OFFS_IFACENUM = 0 ; interface number (put into received messages)
.equ NET_IFACE_OFFS_ADDRESS = 1 .equ NET_IFACE_OFFS_ADDRESS = 1

View File

@@ -163,5 +163,22 @@ NET_Interface_IncCounter16_end:
; ---------------------------------------------------------------------------
; @routine NET_Interface_SetIfaceNumInBuffer @global
;
; @param X pointer to start of buffer
; @param Y pointer to start of interface data
; @clobbers R16, R17
NET_Interface_SetIfaceNumInBuffer:
ldd r16, Y+NET_IFACE_OFFS_IFACENUM
andi r16, (NET_IFACE_BUFFER_IFACENUM1_BIT | NET_IFACE_BUFFER_IFACENUM0_BIT)
ld r17, X
andi r17, ~(NET_IFACE_BUFFER_IFACENUM1_BIT | NET_IFACE_BUFFER_IFACENUM0_BIT)
or r17, r16
st X, r17
ret
; @end

View File

@@ -64,7 +64,6 @@ NET_AddIncomingMsgNum:
; ;
; @return CFLAG on success, cleared on error ; @return CFLAG on success, cleared on error
; @return R16 buffer number of the next incoming message ; @return R16 buffer number of the next incoming message
; @param Y pointer to start of interface data
; @clobbers R17, R18, X ; @clobbers R17, R18, X
NET_GetNextIncomingMsgNum: NET_GetNextIncomingMsgNum:

View File

@@ -5,6 +5,7 @@
<extradist> <extradist>
common.asm common.asm
defs.asm defs.asm
debug-w.asm
device-w.asm device-w.asm
memstats-w.asm memstats-w.asm
recvstats-w.asm recvstats-w.asm

View File

@@ -0,0 +1,53 @@
; ***************************************************************************
; 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. *
; ***************************************************************************
; ---------------------------------------------------------------------------
; @routine NETMSG_Debug_Write @global
;
; @param Y pointer to device to write msg for
; @param X pointer to buffer to write to
; @param r0-14 value 1-15
; @clobbers R16, R17, R18, R19, R20, R21
NETMSG_Debug_Write:
ldi r16, 0xff
st X+, r16 ; dest address
ldi r16, 17 ; msg code+src address+15 payload bytes
st X+, r16 ; msg len
ldi r16, NETMSG_CMD_DEBUG
st X+, r16 ; msg code
ldd r16, Y+NET_IFACE_OFFS_ADDRESS
st X+, r16 ; src address
st X+, r0 ; 5th byte
st X+, r1
st X+, r2
st X+, r3
st X+, r4
st X+, r5
st X+, r6
st X+, r7
st X+, r8
st X+, r9
st X+, r10
st X+, r11
st X+, r12
st X+, r13
st X+, r14
sbiw xh:xl, 19 ; go back to beginning of message (1 byte dst addr, 1 byte length, 17 bytes payload)
rcall NETMSG_CalcAndAddChecksumByte ; (R16, R17, R18, R19, R20, X)
sbiw xh:xl, 20 ; go back to beginning of message (1 byte dst addr, 1 byte length, 17 bytes payload, 1 byte crc)
ret
; @end

View File

@@ -9,6 +9,8 @@
.equ COMONUART0_IFACENUM = 1 .equ COMONUART0_IFACENUM = 1
.equ COMONUART0_READ_TIMEOUT = 3
@@ -28,10 +30,25 @@ comOnUart0_iface: .byte UART_HW_IFACE_SIZE
ComOnUart0_Init: ComOnUart0_Init:
ldi yl, LOW(comOnUart0_iface) ldi yl, LOW(comOnUart0_iface)
ldi yh, HIGH(comOnUart0_iface) ldi yh, HIGH(comOnUart0_iface)
rcall UART_HW_Interface_Init ; (R16, R17, X) rcall UART_HW_Uart0_SetAttnInput ; (none)
rcall UART_HW_Uart0_Init ; (R16, R17, X)
rcall UART_HW_Interface_Init ; (R16, R17, X)
rcall UART_HW_Uart0_Init ; (R16, R17, X)
ldi r16, COMONUART0_IFACENUM ldi r16, COMONUART0_IFACENUM
std Y+NET_IFACE_OFFS_IFACENUM, r16 std Y+NET_IFACE_OFFS_IFACENUM, r16
ldi r16, UART_HW_READMODE_IDLE
std Y+UART_HW_IFACE_OFFS_READMODE, r16
ldi r16, UART_HW_WRITEMODE_IDLE
std Y+UART_HW_IFACE_OFFS_WRITEMODE, r16
sbi COM_IRQ_ADDR_ATTN, COM_IRQ_BIT_ATTN ; enable pin change irq for ATTN line
in r16, GIMSK ; enable pin change irq PCIE0 or PCIE1
ori r16, (1<<COM_IRQ_GIMSK_ATTN)
out GIMSK, R16
ldi r16, (1<<COM_IRQ_GIFR_ATTN) ; clear pending irq by writing 1 to ATTN bit
out GIFR, r16
ret ret
; @end ; @end
@@ -159,6 +176,194 @@ ComOnUart0_TxCharIsr:
; ---------------------------------------------------------------------------
; @routine ComOnUart0_AttnChangeIsr @global @isr
;
; @clobbers none
ComOnUart0_AttnChangeIsr:
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(comOnUart0_iface)
ldi yh, HIGH(comOnUart0_iface)
rcall comOnUart0ActOnAttn ; (R16, R17, 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 comOnUart0ActOnAttn @global
;
; @param Y pointer to interface data in SRAM
; @clobbers R16 (R17, R24, R25, X)
comOnUart0ActOnAttn:
ldd r16, Y+UART_HW_IFACE_OFFS_WRITEMODE ; test for active write mode
cpi r16, UART_HW_WRITEMODE_IDLE
brne comOnUart0ActOnAttn_end ; in write mode, don't start read mode
ldd r16, Y+UART_HW_IFACE_OFFS_READMODE ; test for active read mode
cpi r16, UART_HW_READMODE_IDLE
brne comOnUart0ActOnAttn_end ; already in read mode
sbic COM_ATTN_INPUT, COM_ATTN_PIN ; ATTN high?
rjmp comOnUart0ActOnAttn_end
rcall comOnUart0StartReading ; (R16, R17, R24, R25, X)
comOnUart0ActOnAttn_end:
ret
; @end
; ---------------------------------------------------------------------------
; @routine comOnUart0StartReading
;
; @clobbers R16 (R17, R24, R25, X)
comOnUart0StartReading:
rcall comOnUart0EnsureReadBuffer ; (R16, R17, R24, R25, X)
brcs comOnUart0EnterReading_okay
; no buffer, missed message
ldi r16, NET_IFACE_OFFS_ERR_MISSED_LOW
rcall NET_Interface_IncCounter16 ; (R24, R25)
ret
comOnUart0EnterReading_okay:
ldi r16, UART_HW_READMODE_READING
std Y+UART_HW_IFACE_OFFS_READMODE, r16
clr r16
std Y+NET_IFACE_OFFS_READTIMER, r16
rcall UART_HW_Uart0_StartRx ; R16
ret
; @end
; ---------------------------------------------------------------------------
; @routine comOnUart0EnterReadSkipping
;
; @clobbers R16
comOnUart0EnterReadSkipping:
rcall UART_HW_Uart0_StopRx ; (R16)
rcall UART_HW_Uart0_Flush ; (R16)
ldi r16, UART_HW_WRITEMODE_IDLE ; go into IDLE mode, enter reading on next neg edge of ATTN
std Y+UART_HW_IFACE_OFFS_READMODE, r16
ret
; @end
; ---------------------------------------------------------------------------
; @routine comOnUart0EnterReadIdle
;
; @clobbers R16 (R17, R24, R25, X)
comOnUart0EnterReadIdle:
rcall UART_HW_Uart0_StopRx ; (R16)
ldi r16, UART_HW_READMODE_IDLE
std Y+UART_HW_IFACE_OFFS_READMODE, r16
ret
; @end
; ---------------------------------------------------------------------------
; @routine comOnUart0EnsureReadBuffer
;
; @clobbers R16 (R17, R24, R25, X)
comOnUart0EnsureReadBuffer:
ldd r16, Y+UART_HW_IFACE_OFFS_READBUFNUM
cpi r16, 0xff
breq comOnUart0EnsureReadBuffer_alloc
comOnUart0EnsureReadBuffer_secRet:
sec
comOnUart0EnsureReadBuffer_ret:
ret
comOnUart0EnsureReadBuffer_alloc:
rcall NET_Buffer_Alloc ; (R16, R17, X)
brcc comOnUart0EnsureReadBuffer_ret
rcall UART_HW_Interface_SetReadBuffer ; (R17)
rcall NET_Interface_SetIfaceNumInBuffer ; (R16, R17)
rjmp comOnUart0EnsureReadBuffer_secRet
comOnUart0EnsureReadBuffer_noBuf:
ldi r16, NET_IFACE_OFFS_ERR_NOBUF_LOW
rcall NET_Interface_IncCounter16 ; (R24, R25)
clc
ret
; @end
; ---------------------------------------------------------------------------
; @routine ComOnUart0_SendBuffer @global
;
; @param Y pointer to interface data in SRAM
; @clobbers R16, R17
ComOnUart0_SendBuffer:
push r15
in r15, SREG
cli
ldd r17, Y+UART_HW_IFACE_OFFS_WRITEMODE
cpi r17, UART_HW_WRITEMODE_IDLE
breq ComOnUart0_SendBuffer_setBuffer
out SREG, r15
pop r15
clc
ret
ComOnUart0_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_Uart0_StartTx ; (R16)
pop r15
out SREG, r15
sec
ret
; @end
; ---------------------------------------------------------------------------
; @routine comOnUart0ResetReadBuffer
;
; @clobbers R16 (R17, X)
comOnUart0ResetReadBuffer:
ldd r16, Y+UART_HW_IFACE_OFFS_READBUFNUM
cpi r16, 0xff
breq comOnUart0ResetReadBuffer_end
rcall NET_Buffer_Locate ; (R17, X)
rcall UART_HW_Interface_SetReadBuffer ; (R17)
comOnUart0ResetReadBuffer_end:
ret
; @end
; --------------------------------------------------------------------------- ; ---------------------------------------------------------------------------
; @routine ComOnUart0_Run @global ; @routine ComOnUart0_Run @global
; ;
@@ -170,9 +375,13 @@ ComOnUart0_Run:
cli cli
ldi yl, LOW(comOnUart0_iface) ldi yl, LOW(comOnUart0_iface)
ldi yh, HIGH(comOnUart0_iface) ldi yh, HIGH(comOnUart0_iface)
rcall comOnUart0RunWriteModes
rcall comOnUart0RunReadModes rcall comOnUart0RunReadModes
ldd r16, Y+UART_HW_IFACE_OFFS_READMODE ; test for active read mode
cpi r16, UART_HW_READMODE_IDLE
brne ComOnUart0_Run_end
rcall comOnUart0RunWriteModes ; only call write routine if read idle
ComOnUart0_Run_end:
pop r15 pop r15
out SREG, r15 out SREG, r15
ret ret
@@ -218,8 +427,7 @@ comOnUart0RunWriteIdle:
rcall NET_Buffer_Locate ; (R17) rcall NET_Buffer_Locate ; (R17)
brcc comOnUart0RunWriteIdle_end brcc comOnUart0RunWriteIdle_end
sbi COM_ATTN_DDR, COM_ATTN_PIN ; set ATTN as output rcall UART_HW_Uart0_SetAttnLow
cbi COM_ATTN_OUTPUT, COM_ATTN_PIN ; set ATTN low
rcall ComOnUart0_SendBuffer ; (R16, R17) rcall ComOnUart0_SendBuffer ; (R16, R17)
comOnUart0RunWriteIdle_end: comOnUart0RunWriteIdle_end:
@@ -265,8 +473,7 @@ comOnUart0RunWriteBufferEmpty:
comOnUart0RunWriteBufferEmpty_setIdle: comOnUart0RunWriteBufferEmpty_setIdle:
rcall UART_HW_Uart0_StopTx ; disable transceiver and interrupts (R16) rcall UART_HW_Uart0_StopTx ; disable transceiver and interrupts (R16)
cbi COM_ATTN_DDR, COM_ATTN_PIN ; set ATTN as input rcall UART_HW_Uart0_SetAttnInput ; set ATTN as input
cbi COM_ATTN_OUTPUT, COM_ATTN_PIN ; disable pullup on ATTN
ldi r16, UART_HW_WRITEMODE_IDLE ldi r16, UART_HW_WRITEMODE_IDLE
std Y+UART_HW_IFACE_OFFS_WRITEMODE, r16 std Y+UART_HW_IFACE_OFFS_WRITEMODE, r16
@@ -300,23 +507,9 @@ comOnUart0RunReadModes:
; --------------------------------------------------------------------------- ; ---------------------------------------------------------------------------
; @routine comOnUart0RunReadIdle ; @routine comOnUart0RunReadIdle
; ;
; @clobbers R16 (R17, R24, R25, X) ; @clobbers none
comOnUart0RunReadIdle: comOnUart0RunReadIdle:
ldd r16, Y+UART_HW_IFACE_OFFS_READBUFNUM
cpi r16, 0xff
brne comOnUart0RunReadIdle_enterReading
rcall NET_Buffer_Alloc ; (R16, R17, X)
brcc comOnUart0RunReadIdle_noBuf
rcall UART_HW_Interface_SetReadBuffer ; (R17)
comOnUart0RunReadIdle_enterReading:
ldi r16, UART_HW_READMODE_READING
std Y+UART_HW_IFACE_OFFS_READMODE, r16
rcall UART_HW_Uart0_StartRx ; R16
ret
comOnUart0RunReadIdle_noBuf:
ldi r16, NET_IFACE_OFFS_ERR_NOBUF_LOW
rcall NET_Interface_IncCounter16 ; (R24, R25)
ret ret
; @end ; @end
@@ -328,6 +521,20 @@ comOnUart0RunReadIdle_noBuf:
; @clobbers none ; @clobbers none
comOnUart0RunReading: comOnUart0RunReading:
ldd r16, Y+NET_IFACE_OFFS_READTIMER
cpi r16, COMONUART0_READ_TIMEOUT
brcs comOnUart0RunReading_end
rcall UART_HW_Uart0_StopRx ; (R16)
ldd r16, Y+UART_HW_IFACE_OFFS_READBUFNUM
ldi r17, 0xff
std Y+UART_HW_IFACE_OFFS_READBUFNUM, r17
cp r16, r17
breq comOnUart0RunReading_enterIdle
rcall NET_Buffer_ReleaseByNum ; (R16, X)
comOnUart0RunReading_enterIdle:
ldi r16, UART_HW_READMODE_IDLE
std Y+UART_HW_IFACE_OFFS_READMODE, r16
comOnUart0RunReading_end:
ret ret
; @end ; @end
@@ -356,23 +563,20 @@ comOnUart0RunSkipping_end:
; @clobbers R16 (R17, R18, R24, R25) ; @clobbers R16 (R17, R18, R24, R25)
comOnUart0RunMsgReceived: comOnUart0RunMsgReceived:
ldd r16, Y+UART_HW_IFACE_OFFS_READBUFNUM rcall comOnUart0EnterReadIdle
cpi r16, 0xff
breq comOnUart0RunMsgReceived_end
rcall NET_AddIncomingMsgNum ; (R17, R18, X)
brcs comOnUart0RunMsgReceived_enterIdle
comOnUart0RunMsgReceived_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)
comOnUart0RunMsgReceived_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
comOnUart0RunMsgReceived_end:
ret ret
; @end ; @end
; DEBUG begin
ldi r16, NET_IFACE_OFFS_HANDLED_LOW
rcall NET_Interface_IncCounter16 ; (R24, R25)
; DEBUG end
; DEBUG begin
ldi r16, NET_IFACE_OFFS_ERR_MISSED_LOW
rcall NET_Interface_IncCounter16 ; (R24, R25)
; DEBUG end

View File

@@ -8,11 +8,6 @@
; *************************************************************************** ; ***************************************************************************
.equ UART_HW_BUFFER_INUSE_BIT = 7
.equ UART_HW_BUFFER_IFACENUM1_BIT = 1
.equ UART_HW_BUFFER_IFACENUM0_BIT = 0
.equ UART_HW_READMODE_OFF = 0 .equ UART_HW_READMODE_OFF = 0
.equ UART_HW_READMODE_IDLE = 1 .equ UART_HW_READMODE_IDLE = 1
.equ UART_HW_READMODE_READING = 2 .equ UART_HW_READMODE_READING = 2

View File

@@ -97,7 +97,97 @@ UART_HW_Uart0_Flush:
; @clobbers R16 (R17, R18, R24, R25, X) ; @clobbers R16 (R17, R18, R24, R25, X)
UART_HW_Uart0_RxCharIsr: UART_HW_Uart0_RxCharIsr:
M_UART_HW_Uart_RxCharIsr 0 ; check for errors
lds r16, UCSR0A ; check for errors
andi r16, (1<<FE0) | (1<<DOR0) | (1<<UPE0)
brne l_hwerr
; read char
lds r16, UCSR0A
sbrs r16, RXC0
rjmp l_end ; no data
lds r16, UDR0 ; r16=received char
; check read mode
ldd r17, Y+UART_HW_IFACE_OFFS_READMODE
cpi r17, UART_HW_READMODE_READING
breq l_storeChar
cpi r17, UART_HW_READMODE_SKIPPING
breq l_skipChar
rjmp l_overrun ; neither read nor skip mode
l_skipChar:
clr r16
std Y+NET_IFACE_OFFS_READTIMER, r16 ; reset read timer
rjmp l_end
l_storeChar:
mov r18, r16 ; r18=received char
; check buffer
ldd r16, Y+UART_HW_IFACE_OFFS_READBUFNUM
cpi r16, 0xff
breq l_overrun
; check for buffer overrun
ldd r17, Y+UART_HW_IFACE_OFFS_READBUFLEFT ; r17=bytes left
tst r17
breq l_econtent ; msg too long
; actually store byte, increment/decrement counters and pos
ldd xl, Y+UART_HW_IFACE_OFFS_READBUFPOS_LOW
ldd xh, Y+UART_HW_IFACE_OFFS_READBUFPOS_HIGH
st X+, r18 ; r18=byte to store
clr r16
std Y+NET_IFACE_OFFS_READTIMER, r16 ; reset read timer
std Y+UART_HW_IFACE_OFFS_READBUFPOS_LOW, xl
std Y+UART_HW_IFACE_OFFS_READBUFPOS_HIGH, xh
ldd r18, Y+UART_HW_IFACE_OFFS_READBUFUSED ; r18=bytes in buffer
inc r18
std Y+UART_HW_IFACE_OFFS_READBUFUSED, r18
dec r17
std Y+UART_HW_IFACE_OFFS_READBUFLEFT, r17
breq l_msgFinished
; check msg size
cpi r18, 2 ; bytes in buffer, exactly 2?
brne l_end ; nope, done
sbiw xh:xl, 1 ; yes, determine message length (msgLen at previous pos)
ld r16, X+ ; read payload length byte
subi r16, -3 ; add 3 (dest addr, length, crc byte)
cpi r16, (NET_BUFFERS_SIZE-1) ; total msg length ok?
brcc l_econtent ; content error (msg too long)
subi r16, 2 ; subtract bytes already received
std Y+UART_HW_IFACE_OFFS_READBUFLEFT, r16 ; set new number of bytes left
brne l_end ; jmp if still bytes left to receive
l_msgFinished:
rcall UART_HW_Uart0_StopRx ; (R16)
ldd r16, Y+UART_HW_IFACE_OFFS_READBUFNUM
rcall NET_AddIncomingMsgNum ; (R17, R18, X)
brcs l_msgAdded
; could not add msg
rcall NET_Buffer_ReleaseByNum ; (R16, X)
ldi r16, 0xff
std Y+UART_HW_IFACE_OFFS_READBUFNUM, r16
ldi r16, NET_IFACE_OFFS_ERR_MISSED_LOW
ldi r17, UART_HW_READMODE_IDLE
rjmp l_incCounterAndEnterMode
l_msgAdded:
ldi r16, 0xff
std Y+UART_HW_IFACE_OFFS_READBUFNUM, r16
ldi r16, NET_IFACE_OFFS_PACKETSIN_LOW
ldi r17, UART_HW_READMODE_IDLE
rjmp l_incCounterAndEnterMode
l_hwerr:
ldi r16, NET_IFACE_OFFS_ERR_IO_LOW
rjmp l_incCounterAndEnterSkipping
l_econtent:
ldi r16, NET_IFACE_OFFS_ERR_CONTENT_LOW
rjmp l_incCounterAndEnterSkipping
l_overrun:
ldi r16, NET_IFACE_OFFS_ERR_NOBUF_LOW
l_incCounterAndEnterSkipping:
ldi r17, UART_HW_READMODE_SKIPPING
l_incCounterAndEnterMode:
rcall NET_Interface_IncCounter16 ; (R24, R25)
std Y+UART_HW_IFACE_OFFS_READMODE, r17 ; set read mode
l_end:
ret ret
; @end ; @end
@@ -134,3 +224,32 @@ UART_HW_Uart0_TxCharIsr:
; ---------------------------------------------------------------------------
; @routine UART_HW_Uart0_SetAttnInput @global
;
; Set ATTN line as input (making it effectively HIGH due to pull-up resistor on
; the line)
;
; @clobbers none
UART_HW_Uart0_SetAttnInput:
M_UART_HW_Uart_SetAttnInput
ret
; @end
; ---------------------------------------------------------------------------
; @routine UART_HW_Uart0_SetAttnLow @global
;
; Set ATTN line low.
;
; @clobbers none
UART_HW_Uart0_SetAttnLow:
M_UART_HW_Uart_SetAttnLow
ret
; @end

View File

@@ -188,27 +188,14 @@ l_storeChar_%:
brcc l_econtent_% ; content error (msg too long) brcc l_econtent_% ; content error (msg too long)
subi r16, 2 ; subtract bytes already received subi r16, 2 ; subtract bytes already received
std Y+UART_HW_IFACE_OFFS_READBUFLEFT, r16 ; set new number of bytes left std Y+UART_HW_IFACE_OFFS_READBUFLEFT, r16 ; set new number of bytes left
brne l_end_% ; jmp if still bytes left to received brne l_end_% ; jmp if still bytes left to receive
l_msgFinished_%: l_msgFinished_%:
ldd r16, Y+UART_HW_IFACE_OFFS_READBUFNUM
rcall NET_AddIncomingMsgNum ; (R17, R18, X)
brcs l_msgStored_%
; msg complete but could not store
rcall NET_Buffer_Locate
rcall UART_HW_Interface_SetReadBuffer ; reset/reuse current buffer
ldi r16, NET_IFACE_OFFS_ERR_NOBUF_LOW
ldi r17, UART_HW_READMODE_READING
rjmp l_incCounterAndEnterMode_%
l_msgStored_%:
ldi r16, NET_IFACE_OFFS_PACKETSIN_LOW ldi r16, NET_IFACE_OFFS_PACKETSIN_LOW
ldi r17, UART_HW_READMODE_MSGRECEIVED ldi r17, UART_HW_READMODE_MSGRECEIVED
rjmp l_incCounterAndEnterMode_% rjmp l_incCounterAndEnterMode_%
l_hwerr_%: l_hwerr_%:
ldi r16, NET_IFACE_OFFS_ERR_IO_LOW ldi r16, NET_IFACE_OFFS_ERR_IO_LOW
rcall NET_Interface_IncCounter16 rjmp l_incCounterAndEnterSkipping_%
ldi r16, UART_HW_READMODE_SKIPPING
std Y+UART_HW_IFACE_OFFS_READMODE, r16 ; set read mode
rjmp l_end_%
l_econtent_%: l_econtent_%:
ldi r16, NET_IFACE_OFFS_ERR_CONTENT_LOW ldi r16, NET_IFACE_OFFS_ERR_CONTENT_LOW
rjmp l_incCounterAndEnterSkipping_% rjmp l_incCounterAndEnterSkipping_%
@@ -315,3 +302,38 @@ l_end_%:
; ---------------------------------------------------------------------------
; @macro M_UART_HW_Uart_SetAttnInput
;
; Set ATTN line as input (making it effectively HIGH due to pull-up resistor on
; the line)
;
; @clobbers none
.macro M_UART_HW_Uart_SetAttnInput
cbi COM_ATTN_DDR, COM_ATTN_PIN ; set ATTN as input
.ifdef COM_ATTN_PUE
.else
cbi COM_ATTN_PUE, COM_ATTN_PIN ; disable pullup on ATTN
.endif
cbi COM_ATTN_OUTPUT, COM_ATTN_PIN ; disable pullup on ATTN
.endmacro
; @end
; ---------------------------------------------------------------------------
; @macro M_UART_HW_Uart_SetAttnLow
;
; Set ATTN line low.
;
; @clobbers none
.macro M_UART_HW_Uart_SetAttnLow
sbi COM_ATTN_DDR, COM_ATTN_PIN ; set ATTN as output
cbi COM_ATTN_OUTPUT, COM_ATTN_PIN ; set ATTN low
.endmacro

View File

@@ -276,7 +276,7 @@ ttyOnUart1RunWaitBufferEmpty:
; --------------------------------------------------------------------------- ; ---------------------------------------------------------------------------
; @routine ttyOnUart1RunWriteBufferEmpty ; @routine ttyOnUart1RunWriteBufferEmpty
; ;
; @clobbers R16, R17, X ; @clobbers R16, R17, X (R24, R25)
ttyOnUart1RunWriteBufferEmpty: ttyOnUart1RunWriteBufferEmpty:
ldd r16, Y+UART_HW_IFACE_OFFS_WRITEBUFNUM ldd r16, Y+UART_HW_IFACE_OFFS_WRITEBUFNUM
@@ -328,6 +328,7 @@ ttyOnUart1RunReadIdle:
rcall NET_Buffer_Alloc ; (R16, R17, X) rcall NET_Buffer_Alloc ; (R16, R17, X)
brcc ttyOnUart1RunReadIdle_noBuf brcc ttyOnUart1RunReadIdle_noBuf
rcall UART_HW_Interface_SetReadBuffer ; (R17) rcall UART_HW_Interface_SetReadBuffer ; (R17)
rcall NET_Interface_SetIfaceNumInBuffer ; (R16, R17)
ttyOnUart1RunReadIdle_enterReading: ttyOnUart1RunReadIdle_enterReading:
ldi r16, UART_HW_READMODE_READING ldi r16, UART_HW_READMODE_READING
std Y+UART_HW_IFACE_OFFS_READMODE, r16 std Y+UART_HW_IFACE_OFFS_READMODE, r16
@@ -380,14 +381,14 @@ ttyOnUart1RunMsgReceived:
breq ttyOnUart1RunMsgReceived_end breq ttyOnUart1RunMsgReceived_end
rcall NET_AddIncomingMsgNum ; (R17, R18, X) rcall NET_AddIncomingMsgNum ; (R17, R18, X)
brcs ttyOnUart1RunMsgReceived_enterIdle brcs ttyOnUart1RunMsgReceived_enterIdle
ttyOnUart1RunMsgReceived_overrun: ; reset/reuse current buffer ttyOnUart1RunMsgReceived_overrun:
rcall NET_Buffer_Locate rcall NET_Buffer_ReleaseByNum ; (R16, X)
rcall UART_HW_Interface_SetReadBuffer ; (R17)
ldi r16, NET_IFACE_OFFS_ERR_NOBUF_LOW ldi r16, NET_IFACE_OFFS_ERR_NOBUF_LOW
rcall NET_Interface_IncCounter16 ; (R24, R25) rcall NET_Interface_IncCounter16 ; (R24, R25)
ttyOnUart1RunMsgReceived_enterIdle: ttyOnUart1RunMsgReceived_enterIdle:
ldi r16, 0xff ldi r16, 0xff
std Y+UART_HW_IFACE_OFFS_READBUFNUM, r16 std Y+UART_HW_IFACE_OFFS_READBUFNUM, r16
ldi r16, UART_HW_READMODE_IDLE ldi r16, UART_HW_READMODE_IDLE
std Y+UART_HW_IFACE_OFFS_READMODE, r16 std Y+UART_HW_IFACE_OFFS_READMODE, r16
ttyOnUart1RunMsgReceived_end: ttyOnUart1RunMsgReceived_end: