avr: introduced network module
this will be the base module for network modules.
This commit is contained in:
@@ -72,8 +72,8 @@
|
|||||||
;#define MODULES_MOTION
|
;#define MODULES_MOTION
|
||||||
|
|
||||||
|
|
||||||
.equ UART_HW_FIXEDBUFFERS_NUM = 32
|
.equ NET_BUFFERS_NUM = 6
|
||||||
.equ UART_HW_FIXEDBUFFERS_SIZE = 6
|
.equ NET_BUFFERS_SIZE = 32
|
||||||
|
|
||||||
.equ UART_HW_MSGNUMINBUF_SIZE = 6
|
.equ UART_HW_MSGNUMINBUF_SIZE = 6
|
||||||
.equ UART_HW_MSGNUMOUTBUF_SIZE = 6
|
.equ UART_HW_MSGNUMOUTBUF_SIZE = 6
|
||||||
@@ -233,7 +233,7 @@ initHardware:
|
|||||||
initModules:
|
initModules:
|
||||||
rcall BaseTimer_Init
|
rcall BaseTimer_Init
|
||||||
rcall LedSimple_Init
|
rcall LedSimple_Init
|
||||||
rcall UART_HW_Init
|
rcall NET_Init
|
||||||
rcall TtyOnUart1_Init
|
rcall TtyOnUart1_Init
|
||||||
|
|
||||||
ldi r16, LOW(SEND_DEVICE_EVERY)
|
ldi r16, LOW(SEND_DEVICE_EVERY)
|
||||||
@@ -265,13 +265,16 @@ initModules:
|
|||||||
.include "modules/com2/defs.asm"
|
.include "modules/com2/defs.asm"
|
||||||
.include "modules/com2/crc.asm"
|
.include "modules/com2/crc.asm"
|
||||||
.include "modules/comproto/defs.asm"
|
.include "modules/comproto/defs.asm"
|
||||||
|
.include "modules/network/defs.asm"
|
||||||
|
.include "modules/network/buffer.asm"
|
||||||
|
.include "modules/network/data.asm"
|
||||||
|
.include "modules/network/main.asm"
|
||||||
|
.include "modules/network/iface.asm"
|
||||||
|
|
||||||
.include "modules/uart_hw/defs.asm"
|
.include "modules/uart_hw/defs.asm"
|
||||||
.include "modules/uart_hw/buffers.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_uart1.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/ttyonuart1.asm"
|
.include "modules/uart_hw/ttyonuart1.asm"
|
||||||
|
|
||||||
|
|
||||||
@@ -288,7 +291,7 @@ maybeSendDeviceMsg:
|
|||||||
sbiw r25:r24, 1
|
sbiw r25:r24, 1
|
||||||
brne maybeSendDeviceMsg_storeCounter
|
brne maybeSendDeviceMsg_storeCounter
|
||||||
; send device msg
|
; send device msg
|
||||||
rcall UART_HW_FixedBuffers_Alloc
|
rcall NET_Buffer_Alloc ; (R16, R17, X)
|
||||||
brcc maybeSendDeviceMsg_resetCounter
|
brcc maybeSendDeviceMsg_resetCounter
|
||||||
push r16
|
push r16
|
||||||
adiw xh:xl, 1
|
adiw xh:xl, 1
|
||||||
@@ -299,7 +302,7 @@ maybeSendDeviceMsg:
|
|||||||
rcall TtyOnUart1_SendBuffer
|
rcall TtyOnUart1_SendBuffer
|
||||||
pop r16
|
pop r16
|
||||||
brcs maybeSendDeviceMsg_resetCounter
|
brcs maybeSendDeviceMsg_resetCounter
|
||||||
rcall UART_HW_FixedBuffers_ReleaseByNum ; (R16, X)
|
rcall NET_Buffer_ReleaseByNum ; (R16, X)
|
||||||
rjmp maybeSendDeviceMsg_end
|
rjmp maybeSendDeviceMsg_end
|
||||||
; reset counter
|
; reset counter
|
||||||
maybeSendDeviceMsg_resetCounter:
|
maybeSendDeviceMsg_resetCounter:
|
||||||
|
|||||||
@@ -24,6 +24,7 @@
|
|||||||
tcrt1000
|
tcrt1000
|
||||||
timer
|
timer
|
||||||
twimaster
|
twimaster
|
||||||
|
network
|
||||||
uart_bitbang
|
uart_bitbang
|
||||||
uart_irq
|
uart_irq
|
||||||
bootloader
|
bootloader
|
||||||
|
|||||||
12
avr/modules/network/0BUILD
Normal file
12
avr/modules/network/0BUILD
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
<?xml?>
|
||||||
|
|
||||||
|
<gwbuild>
|
||||||
|
|
||||||
|
<extradist>
|
||||||
|
buffer.asm
|
||||||
|
defs.asm
|
||||||
|
</extradist>
|
||||||
|
|
||||||
|
</gwbuild>
|
||||||
|
|
||||||
|
|
||||||
125
avr/modules/network/buffer.asm
Normal file
125
avr/modules/network/buffer.asm
Normal file
@@ -0,0 +1,125 @@
|
|||||||
|
; ***************************************************************************
|
||||||
|
; 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. *
|
||||||
|
; ***************************************************************************
|
||||||
|
|
||||||
|
|
||||||
|
; ===========================================================================
|
||||||
|
; defs
|
||||||
|
|
||||||
|
.equ NET_BUFFER_INUSE_BIT = 7
|
||||||
|
.equ NET_BUFFER_IFACENUM1_BIT = 1
|
||||||
|
.equ NET_BUFFER_IFACENUM0_BIT = 0
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ===========================================================================
|
||||||
|
; code segment
|
||||||
|
|
||||||
|
.cseg
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @routine NET_Buffer_Init @global
|
||||||
|
;
|
||||||
|
; @clobbers R16, R17, X
|
||||||
|
|
||||||
|
NET_Buffer_Init:
|
||||||
|
ldi xl, LOW(netBuffers)
|
||||||
|
ldi xh, HIGH(netBuffers)
|
||||||
|
m_fixedbuf_init NET_BUFFERS_SIZE, NET_BUFFERS_NUM
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @routine NET_Buffer_Alloc @global
|
||||||
|
;
|
||||||
|
; @return CFLAG set if buffer available, cleared otherwise
|
||||||
|
; @return r16 buffer num
|
||||||
|
; @return X pointer to start of buffer
|
||||||
|
; @clobbers R16, R17, X
|
||||||
|
|
||||||
|
NET_Buffer_Alloc:
|
||||||
|
ldi xl, LOW(netBuffers)
|
||||||
|
ldi xh, HIGH(netBuffers)
|
||||||
|
m_fixedbuf_reserve NET_BUFFERS_SIZE, NET_BUFFERS_NUM
|
||||||
|
brcc NET_Buffer_Alloc_end
|
||||||
|
ldi r17, (1<<NET_BUFFER_INUSE_BIT)
|
||||||
|
st X, r17
|
||||||
|
NET_Buffer_Alloc_end:
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @routine NET_Buffer_ReleaseByAddr @global
|
||||||
|
;
|
||||||
|
; @param X pointer to start of buffer
|
||||||
|
; @clobbers R16
|
||||||
|
|
||||||
|
NET_Buffer_ReleaseByAddr:
|
||||||
|
m_fixedbuf_release
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @routine NET_Buffer_ReleaseByNum @global
|
||||||
|
;
|
||||||
|
; @param r16 buffer number
|
||||||
|
; @clobbers X (R16)
|
||||||
|
|
||||||
|
NET_Buffer_ReleaseByNum:
|
||||||
|
rcall NET_Buffer_Locate ; (R16)
|
||||||
|
brcc NET_Buffer_ReleaseByNum_end
|
||||||
|
rcall NET_Buffer_ReleaseByAddr ; (R16)
|
||||||
|
NET_Buffer_ReleaseByNum_end:
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @routine NET_Buffer_Locate
|
||||||
|
;
|
||||||
|
; Get position of a given buffer.
|
||||||
|
;
|
||||||
|
; CAVE: need to change this routine if UART_HW_FIXEDBUFFERS_SIZE is changed!
|
||||||
|
;
|
||||||
|
; @return CFLAG set if okay, cleared on error
|
||||||
|
; @return X points to start of buffer with the given num
|
||||||
|
; @param r16 buffer num (0-max)
|
||||||
|
; @clobbers r16
|
||||||
|
|
||||||
|
NET_Buffer_Locate:
|
||||||
|
cpi r16, NET_BUFFERS_NUM
|
||||||
|
brcc NET_Buffer_Locate_end ; out of range
|
||||||
|
mov xh, r16 ; * 256
|
||||||
|
clr xl
|
||||||
|
lsr xh ; *128
|
||||||
|
ror xl
|
||||||
|
lsr xh ; *64
|
||||||
|
ror xl
|
||||||
|
lsr xh ; *32
|
||||||
|
ror xl
|
||||||
|
ldi r16, LOW(netBuffers)
|
||||||
|
add xl, r16
|
||||||
|
ldi r16, HIGH(netBuffers)
|
||||||
|
adc xh, r16
|
||||||
|
sec
|
||||||
|
NET_Buffer_Locate_end:
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
20
avr/modules/network/data.asm
Normal file
20
avr/modules/network/data.asm
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
; ***************************************************************************
|
||||||
|
; 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
|
||||||
|
|
||||||
|
networkDataBegin:
|
||||||
|
; buffers for incoming and outgoing messages
|
||||||
|
netBuffers: .byte NET_BUFFERS_NUM*NET_BUFFERS_SIZE
|
||||||
|
netRingBufferMsgNumIn: .byte NET_MSGNUMINBUF_SIZE
|
||||||
|
|
||||||
|
networkDataEnd:
|
||||||
|
|
||||||
|
|
||||||
50
avr/modules/network/defs.asm
Normal file
50
avr/modules/network/defs.asm
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
; ***************************************************************************
|
||||||
|
; 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. *
|
||||||
|
; ***************************************************************************
|
||||||
|
|
||||||
|
; defs
|
||||||
|
.equ NET_MSGNUMINBUF_SIZE = 4 ; max buffer nums in ringbuffer (global incoming)
|
||||||
|
|
||||||
|
.equ NET_IFACE_OUTMSGBUF_SIZE = 4 ; max buffer nums in ringbuffer (per interface outbound)
|
||||||
|
|
||||||
|
|
||||||
|
; interface generic data
|
||||||
|
.equ NET_IFACE_OFFS_IFACENUM = 0 ; interface number (put into received messages)
|
||||||
|
.equ NET_IFACE_OFFS_ADDRESS = 1
|
||||||
|
.equ NET_IFACE_OFFS_STATUS = 2
|
||||||
|
.equ NET_IFACE_OFFS_READTIMER = 3
|
||||||
|
.equ NET_IFACE_OFFS_WRITETIMER = 4
|
||||||
|
|
||||||
|
; receiption stats
|
||||||
|
.equ NET_IFACE_OFFS_PACKETSIN_LOW = 8
|
||||||
|
.equ NET_IFACE_OFFS_PACKETSIN_HIGH = 9
|
||||||
|
.equ NET_IFACE_OFFS_ERR_CONTENT_LOW = 10
|
||||||
|
.equ NET_IFACE_OFFS_ERR_CONTENT_HIGH = 11
|
||||||
|
.equ NET_IFACE_OFFS_ERR_IO_LOW = 12
|
||||||
|
.equ NET_IFACE_OFFS_ERR_IO_HIGH = 13
|
||||||
|
.equ NET_IFACE_OFFS_ERR_NOBUF_LOW = 14
|
||||||
|
.equ NET_IFACE_OFFS_ERR_NOBUF_HIGH = 15
|
||||||
|
.equ NET_IFACE_OFFS_HANDLED_LOW = 16
|
||||||
|
.equ NET_IFACE_OFFS_HANDLED_HIGH = 17
|
||||||
|
.equ NET_IFACE_OFFS_ERR_MISSED_LOW = 18
|
||||||
|
.equ NET_IFACE_OFFS_ERR_MISSED_HIGH = 19
|
||||||
|
|
||||||
|
; send stats
|
||||||
|
.equ NET_IFACE_OFFS_PACKETSOUT_LOW = 20
|
||||||
|
.equ NET_IFACE_OFFS_PACKETSOUT_HIGH = 21
|
||||||
|
.equ NET_IFACE_OFFS_ERR_COLLISIONS_LOW = 22
|
||||||
|
.equ NET_IFACE_OFFS_ERR_COLLISIONS_HIGH = 23
|
||||||
|
.equ NET_IFACE_OFFS_ERR_BUSY_LOW = 24
|
||||||
|
.equ NET_IFACE_OFFS_ERR_BUSY_HIGH = 25
|
||||||
|
|
||||||
|
.equ NET_IFACE_OFFS_OUTMSGRINGBUF = 26 ; RINGBUFFERY_SIZE+UART_HW_IFACE_OUTMSGBUF_SIZE
|
||||||
|
|
||||||
|
.equ NET_IFACE_SIZE = NET_IFACE_OFFS_OUTMSGRINGBUF+RINGBUFFERY_SIZE+NET_IFACE_OUTMSGBUF_SIZE
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
130
avr/modules/network/iface.asm
Normal file
130
avr/modules/network/iface.asm
Normal file
@@ -0,0 +1,130 @@
|
|||||||
|
; ***************************************************************************
|
||||||
|
; 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. *
|
||||||
|
; ***************************************************************************
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
.cseg
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @routine NET_Interface_Init @global
|
||||||
|
;
|
||||||
|
; @param Y pointer to interface data in SRAM
|
||||||
|
; @clobbers R16, R17, X
|
||||||
|
|
||||||
|
NET_Interface_Init:
|
||||||
|
mov xl, yl
|
||||||
|
mov xh, yh
|
||||||
|
ldi r17, NET_IFACE_SIZE
|
||||||
|
clr r16
|
||||||
|
rcall Utils_FillSram ; (R17, X)
|
||||||
|
|
||||||
|
push yl
|
||||||
|
push yh
|
||||||
|
adiw yh:yl, NET_IFACE_OFFS_OUTMSGRINGBUF
|
||||||
|
ldi r16, NET_IFACE_OUTMSGBUF_SIZE
|
||||||
|
rcall RingBufferY_Init
|
||||||
|
pop yh
|
||||||
|
pop yl
|
||||||
|
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @routine NET_Interface_AddOutgoingMsgNum @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
|
||||||
|
|
||||||
|
NET_Interface_AddOutgoingMsgNum:
|
||||||
|
push yl
|
||||||
|
push yh
|
||||||
|
adiw yh:yl, NET_IFACE_OFFS_OUTMSGRINGBUF
|
||||||
|
rcall RingBufferY_WriteByteGuarded ; R17, R18, X
|
||||||
|
pop yh
|
||||||
|
pop yl
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @routine NET_Interface_GetNextOutgoingMsgNum @global
|
||||||
|
;
|
||||||
|
; @return CFLAG on success, cleared on error
|
||||||
|
; @return R16 byte read
|
||||||
|
; @param Y pointer to start of interface data
|
||||||
|
; @clobbers R17, R18, X
|
||||||
|
|
||||||
|
NET_Interface_GetNextOutgoingMsgNum:
|
||||||
|
push yl
|
||||||
|
push yh
|
||||||
|
adiw yh:yl, NET_IFACE_OFFS_OUTMSGRINGBUF
|
||||||
|
rcall RingBufferY_ReadByteGuarded ; R17, R18, X
|
||||||
|
pop yh
|
||||||
|
pop yl
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @routine NET_Interface_PeekNextOutgoingMsgNum @global
|
||||||
|
;
|
||||||
|
; @return CFLAG on success, cleared on error
|
||||||
|
; @return R16 byte read
|
||||||
|
; @param Y pointer to start of interface data
|
||||||
|
; @clobbers R17, R18, X
|
||||||
|
|
||||||
|
NET_Interface_PeekNextOutgoingMsgNum:
|
||||||
|
push yl
|
||||||
|
push yh
|
||||||
|
adiw yh:yl, NET_IFACE_OFFS_OUTMSGRINGBUF
|
||||||
|
rcall RingBufferY_PeekByteGuarded ; R17, R18, X
|
||||||
|
pop yh
|
||||||
|
pop yl
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @routine NET_Interface_IncCounter16 @global
|
||||||
|
;
|
||||||
|
; @param Y pointer to start of interface data
|
||||||
|
; @param R16 offset to Y for counter to increment
|
||||||
|
; @clobbers R24, R25
|
||||||
|
|
||||||
|
NET_Interface_IncCounter16:
|
||||||
|
add yl, r16
|
||||||
|
adc yh, r16
|
||||||
|
sub yh, r16
|
||||||
|
ld r24, Y+
|
||||||
|
ld r25, Y
|
||||||
|
sbiw yh:yl, 1
|
||||||
|
adiw r25:r24, 1
|
||||||
|
breq NET_Interface_IncCounter16_end
|
||||||
|
st Y+, r24
|
||||||
|
st Y, r25
|
||||||
|
sbiw yh:yl, 1
|
||||||
|
NET_Interface_IncCounter16_end:
|
||||||
|
sub yl, r16
|
||||||
|
sbc yh, r16
|
||||||
|
add yh, r16
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
82
avr/modules/network/main.asm
Normal file
82
avr/modules/network/main.asm
Normal file
@@ -0,0 +1,82 @@
|
|||||||
|
; ***************************************************************************
|
||||||
|
; 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. *
|
||||||
|
; ***************************************************************************
|
||||||
|
|
||||||
|
|
||||||
|
.cseg
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @routine NET_Init
|
||||||
|
;
|
||||||
|
; Initializes buffers.
|
||||||
|
;
|
||||||
|
; @clobbers R16, R17, X
|
||||||
|
|
||||||
|
NET_Init:
|
||||||
|
ldi xh, HIGH(networkDataBegin)
|
||||||
|
ldi xl, LOW(networkDataBegin)
|
||||||
|
clr r16
|
||||||
|
ldi r17, (networkDataEnd-networkDataBegin)
|
||||||
|
rcall Utils_FillSram ; (R17, X)
|
||||||
|
|
||||||
|
rcall NET_Buffer_Init ; (R16, R17, X)
|
||||||
|
|
||||||
|
ldi r16, NET_MSGNUMINBUF_SIZE
|
||||||
|
ldi yl, LOW(netRingBufferMsgNumIn)
|
||||||
|
ldi yh, HIGH(netRingBufferMsgNumIn)
|
||||||
|
rcall RingBufferY_Init ; (R17)
|
||||||
|
|
||||||
|
sec
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @routine NET_AddIncomingMsgNum @global
|
||||||
|
;
|
||||||
|
; @return CFLAG on success, cleared on error
|
||||||
|
; @param R16 buffer number of the next incoming message
|
||||||
|
; @clobbers R17, R18, X
|
||||||
|
|
||||||
|
NET_AddIncomingMsgNum:
|
||||||
|
push yl
|
||||||
|
push yh
|
||||||
|
ldi yl, LOW(netRingBufferMsgNumIn)
|
||||||
|
ldi yh, HIGH(netRingBufferMsgNumIn)
|
||||||
|
rcall RingBufferY_WriteByteGuarded ; R17, R18, X
|
||||||
|
pop yh
|
||||||
|
pop yl
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @routine NET_GetNextIncomingMsgNum @global
|
||||||
|
;
|
||||||
|
; @return CFLAG on success, cleared on error
|
||||||
|
; @return R16 buffer number of the next incoming message
|
||||||
|
; @param Y pointer to start of interface data
|
||||||
|
; @clobbers R17, R18, X
|
||||||
|
|
||||||
|
NET_GetNextIncomingMsgNum:
|
||||||
|
push yl
|
||||||
|
push yh
|
||||||
|
ldi yl, LOW(netRingBufferMsgNumIn)
|
||||||
|
ldi yh, HIGH(netRingBufferMsgNumIn)
|
||||||
|
rcall RingBufferY_ReadByteGuarded ; R17, R18, X
|
||||||
|
pop yh
|
||||||
|
pop yl
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -3,7 +3,6 @@
|
|||||||
<gwbuild>
|
<gwbuild>
|
||||||
|
|
||||||
<extradist>
|
<extradist>
|
||||||
buffers.asm
|
|
||||||
defs.asm
|
defs.asm
|
||||||
init_uart1.asm
|
init_uart1.asm
|
||||||
lowlevel.asm
|
lowlevel.asm
|
||||||
|
|||||||
@@ -1,204 +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
|
|
||||||
|
|
||||||
uartHwDataBegin:
|
|
||||||
; fixed buffers for incoming and outgoing messages
|
|
||||||
uartHw_buffers: .byte UART_HW_FIXEDBUFFERS_NUM*UART_HW_FIXEDBUFFERS_SIZE
|
|
||||||
uartHw_ringBufferMsgNumIn: .byte UART_HW_MSGNUMINBUF_SIZE
|
|
||||||
uartHw_ringBufferMsgNumOut: .byte UART_HW_MSGNUMOUTBUF_SIZE
|
|
||||||
uartHwDataEnd:
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.cseg
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
; ---------------------------------------------------------------------------
|
|
||||||
; @routine UART_HW_FixedBuffers_Init @global
|
|
||||||
;
|
|
||||||
; @clobbers R16, R17, X
|
|
||||||
|
|
||||||
UART_HW_FixedBuffers_Init:
|
|
||||||
ldi xl, LOW(uartHw_buffers)
|
|
||||||
ldi xh, HIGH(uartHw_buffers)
|
|
||||||
m_fixedbuf_init UART_HW_FIXEDBUFFERS_SIZE, UART_HW_FIXEDBUFFERS_NUM
|
|
||||||
ret
|
|
||||||
; @end
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
; ---------------------------------------------------------------------------
|
|
||||||
; @routine UART_HW_FixedBuffers_Alloc @global
|
|
||||||
;
|
|
||||||
; @return CFLAG set if buffer available, cleared otherwise
|
|
||||||
; @return r16 buffer num
|
|
||||||
; @return X pointer to start of buffer
|
|
||||||
; @clobbers R16, R17, X
|
|
||||||
|
|
||||||
UART_HW_FixedBuffers_Alloc:
|
|
||||||
ldi xl, LOW(uartHw_buffers)
|
|
||||||
ldi xh, HIGH(uartHw_buffers)
|
|
||||||
m_fixedbuf_reserve UART_HW_FIXEDBUFFERS_SIZE, UART_HW_FIXEDBUFFERS_NUM
|
|
||||||
ret
|
|
||||||
; @end
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
; ---------------------------------------------------------------------------
|
|
||||||
; @routine UART_HW_FixedBuffers_ReleaseByAddr @global
|
|
||||||
;
|
|
||||||
; @param X pointer to start of buffers
|
|
||||||
; @clobbers R16
|
|
||||||
|
|
||||||
UART_HW_FixedBuffers_ReleaseByAddr:
|
|
||||||
m_fixedbuf_release
|
|
||||||
ret
|
|
||||||
; @end
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
; ---------------------------------------------------------------------------
|
|
||||||
; @routine UART_HW_FixedBuffers_ReleaseByNum @global
|
|
||||||
;
|
|
||||||
; @param r16 buffer number
|
|
||||||
; @clobbers X (R16)
|
|
||||||
|
|
||||||
UART_HW_FixedBuffers_ReleaseByNum:
|
|
||||||
rcall UART_HW_FixedBuffers_Locate ; (R16)
|
|
||||||
brcc UART_HW_FixedBuffers_ReleaseByNum_end
|
|
||||||
rcall UART_HW_FixedBuffers_ReleaseByAddr ; (R16)
|
|
||||||
UART_HW_FixedBuffers_ReleaseByNum_end:
|
|
||||||
ret
|
|
||||||
; @end
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
; ---------------------------------------------------------------------------
|
|
||||||
; @routine UART_HW_FixedBuffers_Locate
|
|
||||||
;
|
|
||||||
; Get position of a given buffer.
|
|
||||||
;
|
|
||||||
; CAVE: need to change this routine if UART_HW_FIXEDBUFFERS_SIZE is changed!
|
|
||||||
;
|
|
||||||
; @return CFLAG set if okay, cleared on error
|
|
||||||
; @return X points to start of buffer with the given num
|
|
||||||
; @param r16 buffer num (0-max)
|
|
||||||
; @clobbers r16
|
|
||||||
|
|
||||||
UART_HW_FixedBuffers_Locate:
|
|
||||||
cpi r16, UART_HW_FIXEDBUFFERS_NUM
|
|
||||||
brcc UART_HW_FixedBuffers_Locate_end ; out of range
|
|
||||||
mov xh, r16 ; * 256
|
|
||||||
clr xl
|
|
||||||
lsr xh ; *128
|
|
||||||
ror xl
|
|
||||||
lsr xh ; *64
|
|
||||||
ror xl
|
|
||||||
lsr xh ; *32
|
|
||||||
ror xl
|
|
||||||
ldi r16, LOW(uartHw_buffers)
|
|
||||||
add xl, r16
|
|
||||||
ldi r16, HIGH(uartHw_buffers)
|
|
||||||
adc xh, r16
|
|
||||||
sec
|
|
||||||
UART_HW_FixedBuffers_Locate_end:
|
|
||||||
ret
|
|
||||||
; @end
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
; ---------------------------------------------------------------------------
|
|
||||||
; @routine UART_HW_AddIncomingMsg @global
|
|
||||||
;
|
|
||||||
; @return CFLAG on success, cleared on error
|
|
||||||
; @param R16 buffer number of the next incoming message
|
|
||||||
; @clobbers R17, R18, X
|
|
||||||
|
|
||||||
UART_HW_AddIncomingMsgNum:
|
|
||||||
push yl
|
|
||||||
push yh
|
|
||||||
ldi yl, LOW(uartHw_ringBufferMsgNumIn)
|
|
||||||
ldi yh, HIGH(uartHw_ringBufferMsgNumIn)
|
|
||||||
rcall RingBufferY_WriteByte ; R17, R18, X
|
|
||||||
pop yh
|
|
||||||
pop yl
|
|
||||||
ret
|
|
||||||
; @end
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
; ---------------------------------------------------------------------------
|
|
||||||
; @routine UART_HW_GetNextIncomingMsgNum @global
|
|
||||||
;
|
|
||||||
; @return CFLAG on success, cleared on error
|
|
||||||
; @return R16 buffer number of the next incoming message
|
|
||||||
; @param Y pointer to start of interface data
|
|
||||||
; @clobbers R17, R18, X
|
|
||||||
|
|
||||||
UART_HW_GetNextIncomingMsgNum:
|
|
||||||
push yl
|
|
||||||
push yh
|
|
||||||
ldi yl, LOW(uartHw_ringBufferMsgNumIn)
|
|
||||||
ldi yh, HIGH(uartHw_ringBufferMsgNumIn)
|
|
||||||
rcall RingBufferY_ReadByte ; R17, R18, X
|
|
||||||
pop yh
|
|
||||||
pop yl
|
|
||||||
ret
|
|
||||||
; @end
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
; ---------------------------------------------------------------------------
|
|
||||||
; @routine UART_HW_AddOutgoingMsg @global
|
|
||||||
;
|
|
||||||
; @return CFLAG on success, cleared on error
|
|
||||||
; @param R16 buffer number of the next incoming message
|
|
||||||
; @clobbers R17, R18, X
|
|
||||||
|
|
||||||
UART_HW_AddOutgoingMsgNum:
|
|
||||||
push yl
|
|
||||||
push yh
|
|
||||||
ldi yl, LOW(uartHw_ringBufferMsgNumOut)
|
|
||||||
ldi yh, HIGH(uartHw_ringBufferMsgNumOut)
|
|
||||||
rcall RingBufferY_WriteByte ; R17, R18, X
|
|
||||||
pop yh
|
|
||||||
pop yl
|
|
||||||
ret
|
|
||||||
; @end
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
; ---------------------------------------------------------------------------
|
|
||||||
; @routine UART_HW_GetNextOutgoingMsgNum @global
|
|
||||||
;
|
|
||||||
; @return CFLAG on success, cleared on error
|
|
||||||
; @return R16 buffer number of the next incoming message
|
|
||||||
; @param Y pointer to start of interface data
|
|
||||||
; @clobbers R17, R18, X
|
|
||||||
|
|
||||||
UART_HW_GetNextOutgoingMsgNum:
|
|
||||||
push yl
|
|
||||||
push yh
|
|
||||||
ldi yl, LOW(uartHw_ringBufferMsgNumOut)
|
|
||||||
ldi yh, HIGH(uartHw_ringBufferMsgNumOut)
|
|
||||||
rcall RingBufferY_ReadByte ; R17, R18, X
|
|
||||||
pop yh
|
|
||||||
pop yl
|
|
||||||
ret
|
|
||||||
; @end
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -8,58 +8,46 @@
|
|||||||
; ***************************************************************************
|
; ***************************************************************************
|
||||||
|
|
||||||
|
|
||||||
.equ UART_HW_IFACE_READBUF_SIZE = 8
|
.equ UART_HW_BUFFER_INUSE_BIT = 7
|
||||||
.equ UART_HW_IFACE_WRITEBUF_SIZE = 8
|
.equ UART_HW_BUFFER_IFACENUM1_BIT = 1
|
||||||
.equ UART_HW_IFACE_OUTMSGBUF_SIZE = 4
|
.equ UART_HW_BUFFER_IFACENUM0_BIT = 0
|
||||||
|
|
||||||
.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
|
||||||
.equ UART_HW_READMODE_SKIPPING = 3
|
.equ UART_HW_READMODE_SKIPPING = 3
|
||||||
|
|
||||||
.equ UART_HW_WRITEMODE_OFF = 0
|
.equ UART_HW_WRITEMODE_OFF = 0
|
||||||
.equ UART_HW_WRITEMODE_IDLE = 1
|
.equ UART_HW_WRITEMODE_IDLE = 1
|
||||||
.equ UART_HW_WRITEMODE_WRITING = 2
|
.equ UART_HW_WRITEMODE_WRITING = 2
|
||||||
.equ UART_HW_WRITEMODE_WAITBUFFEREMPTY = 3
|
.equ UART_HW_WRITEMODE_WAITBUFFEREMPTY = 3
|
||||||
.equ UART_HW_WRITEMODE_WRITEBUFFEREMPTY = 4
|
.equ UART_HW_WRITEMODE_WRITEBUFFEREMPTY = 4
|
||||||
|
|
||||||
|
|
||||||
.equ UART_HW_STATUS_UNDERRUN_BIT = 0
|
.equ UART_HW_STATUS_UNDERRUN_BIT = 0
|
||||||
.equ UART_HW_STATUS_OVERRUN_BIT = 1
|
.equ UART_HW_STATUS_OVERRUN_BIT = 1
|
||||||
.equ UART_HW_STATUS_HWERR_BIT = 2
|
.equ UART_HW_STATUS_HWERR_BIT = 2
|
||||||
.equ UART_HW_STATUS_SOFTERR_BIT = 3
|
.equ UART_HW_STATUS_SOFTERR_BIT = 3
|
||||||
.equ UART_HW_STATUS_ATTN_BIT = 7
|
.equ UART_HW_STATUS_ATTN_BIT = 7
|
||||||
|
|
||||||
|
|
||||||
.equ UART_HW_IFACE_OFFS_IFACENUM = 0 ; interface number (put into received messages)
|
.equ UART_HW_IFACE_OFFS_READ = NET_IFACE_SIZE
|
||||||
.equ UART_HW_IFACE_OFFS_STATUS = 1
|
.equ UART_HW_IFACE_OFFS_READMODE = UART_HW_IFACE_OFFS_READ
|
||||||
.equ UART_HW_IFACE_OFFS_READTIMER = 2
|
.equ UART_HW_IFACE_OFFS_READBUFNUM = UART_HW_IFACE_OFFS_READ+1
|
||||||
.equ UART_HW_IFACE_OFFS_WRITETIMER = 3
|
.equ UART_HW_IFACE_OFFS_READBUFPOS_LOW = UART_HW_IFACE_OFFS_READ+2
|
||||||
.equ UART_HW_IFACE_OFFS_ERR_OVRLOW = 4
|
.equ UART_HW_IFACE_OFFS_READBUFPOS_HIGH = UART_HW_IFACE_OFFS_READ+3
|
||||||
.equ UART_HW_IFACE_OFFS_ERR_OVRHIGH = 5
|
.equ UART_HW_IFACE_OFFS_READBUFUSED = UART_HW_IFACE_OFFS_READ+4
|
||||||
.equ UART_HW_IFACE_OFFS_ERR_CONTENTLOW = 6
|
.equ UART_HW_IFACE_OFFS_READBUFLEFT = UART_HW_IFACE_OFFS_READ+5
|
||||||
.equ UART_HW_IFACE_OFFS_ERR_CONTENTHIGH = 7
|
|
||||||
|
|
||||||
.equ UART_HW_IFACE_OFFS_READMODE = 8
|
.equ UART_HW_IFACE_OFFS_WRITE = UART_HW_IFACE_OFFS_READBUFLEFT+1
|
||||||
.equ UART_HW_IFACE_OFFS_READBUFNUM = 9
|
.equ UART_HW_IFACE_OFFS_WRITEMODE = UART_HW_IFACE_OFFS_WRITE
|
||||||
.equ UART_HW_IFACE_OFFS_READBUFPOSLOW = 10
|
.equ UART_HW_IFACE_OFFS_WRITEBUFNUM = UART_HW_IFACE_OFFS_WRITE+1
|
||||||
.equ UART_HW_IFACE_OFFS_READBUFPOSHIGH = 11
|
.equ UART_HW_IFACE_OFFS_WRITEBUFPOS_LOW = UART_HW_IFACE_OFFS_WRITE+2
|
||||||
.equ UART_HW_IFACE_OFFS_READBUFUSED = 12
|
.equ UART_HW_IFACE_OFFS_WRITEBUFPOS_HIGH = UART_HW_IFACE_OFFS_WRITE+3
|
||||||
.equ UART_HW_IFACE_OFFS_READBUFLEFT = 13
|
.equ UART_HW_IFACE_OFFS_WRITEBUFUSED = UART_HW_IFACE_OFFS_WRITE+4
|
||||||
|
.equ UART_HW_IFACE_OFFS_WRITEBUFLEFT = UART_HW_IFACE_OFFS_WRITE+5
|
||||||
|
|
||||||
.equ UART_HW_IFACE_OFFS_WRITEMODE = 14
|
.equ UART_HW_IFACE_SIZE = UART_HW_IFACE_OFFS_WRITEBUFLEFT+1
|
||||||
.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
|
|
||||||
.equ UART_HW_IFACE_OFFS_WRITEMSGRINGBUF = 20
|
|
||||||
|
|
||||||
.equ UART_HW_IFACE_SIZE = UART_HW_IFACE_OFFS_WRITEMSGRINGBUF+RINGBUFFERY_SIZE+UART_HW_IFACE_OUTMSGBUF_SIZE
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -13,67 +13,20 @@
|
|||||||
|
|
||||||
|
|
||||||
; ---------------------------------------------------------------------------
|
; ---------------------------------------------------------------------------
|
||||||
; @routine UART_HW_Init @global
|
; @routine UART_HW_Interface_Init @global
|
||||||
;
|
;
|
||||||
; Initializes buffers.
|
; @param Y pointer to interface data in SRAM
|
||||||
;
|
; @clobbers R16 (R17, X)
|
||||||
; @clobbers R16, R17, X, Y
|
|
||||||
|
|
||||||
UART_HW_Init:
|
|
||||||
ldi xh, HIGH(uartHwDataBegin)
|
|
||||||
ldi xl, LOW(uartHwDataBegin)
|
|
||||||
clr r16
|
|
||||||
ldi r17, (uartHwDataEnd-uartHwDataBegin)
|
|
||||||
rcall Utils_FillSram
|
|
||||||
|
|
||||||
rcall UART_HW_FixedBuffers_Init
|
|
||||||
|
|
||||||
ldi r16, UART_HW_MSGNUMINBUF_SIZE
|
|
||||||
ldi yl, LOW(uartHw_ringBufferMsgNumIn)
|
|
||||||
ldi yh, HIGH(uartHw_ringBufferMsgNumIn)
|
|
||||||
rcall RingBufferY_Init
|
|
||||||
|
|
||||||
ldi r16, UART_HW_MSGNUMOUTBUF_SIZE
|
|
||||||
ldi yl, LOW(uartHw_ringBufferMsgNumOut)
|
|
||||||
ldi yh, HIGH(uartHw_ringBufferMsgNumOut)
|
|
||||||
rcall RingBufferY_Init
|
|
||||||
sec
|
|
||||||
ret
|
|
||||||
; @end
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
; ---------------------------------------------------------------------------
|
|
||||||
; @routine UART_HW_InterfaceInit @global
|
|
||||||
;
|
|
||||||
; @param Y pointer to interface data in SRAM (see @ref UART_HW_IFACE_OFFS_STATE)
|
|
||||||
; @clobbers R16, R17, X
|
|
||||||
|
|
||||||
UART_HW_InterfaceInit:
|
|
||||||
mov xl, yl
|
|
||||||
mov xh, yh
|
|
||||||
ldi r17, UART_HW_IFACE_SIZE
|
|
||||||
clr r16
|
|
||||||
rcall Utils_FillSram ; (R17, X)
|
|
||||||
|
|
||||||
|
UART_HW_Interface_Init:
|
||||||
|
rcall NET_Interface_Init ; (R16, R17, X)
|
||||||
ldi r16, 0xff
|
ldi r16, 0xff
|
||||||
std Y+UART_HW_IFACE_OFFS_READBUFNUM, r16
|
std Y+UART_HW_IFACE_OFFS_READBUFNUM, r16
|
||||||
std Y+UART_HW_IFACE_OFFS_WRITEBUFNUM, r16
|
std Y+UART_HW_IFACE_OFFS_WRITEBUFNUM, r16
|
||||||
|
ldi r16, UART_HW_READMODE_IDLE
|
||||||
ldi r16, UART_HW_READMODE_OFF
|
|
||||||
std Y+UART_HW_IFACE_OFFS_READMODE, r16
|
std Y+UART_HW_IFACE_OFFS_READMODE, r16
|
||||||
|
|
||||||
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
|
||||||
|
|
||||||
push yl
|
|
||||||
push yh
|
|
||||||
adiw yh:yl, UART_HW_IFACE_OFFS_WRITEMSGRINGBUF
|
|
||||||
ldi r16, UART_HW_IFACE_OUTMSGBUF_SIZE
|
|
||||||
rcall RingBufferY_Init
|
|
||||||
pop yh
|
|
||||||
pop yl
|
|
||||||
|
|
||||||
ret
|
ret
|
||||||
; @end
|
; @end
|
||||||
|
|
||||||
@@ -84,14 +37,14 @@ UART_HW_InterfaceInit:
|
|||||||
;
|
;
|
||||||
; @param Y pointer to interface data in SRAM (see @ref UART_HW_IFACE_OFFS_STATE)
|
; @param Y pointer to interface data in SRAM (see @ref UART_HW_IFACE_OFFS_STATE)
|
||||||
; @param r16 read buffer number
|
; @param r16 read buffer number
|
||||||
; @param X read buffer pos
|
; @param X pointer to read buffer
|
||||||
; @clobbers R17
|
; @clobbers R17
|
||||||
|
|
||||||
UART_HW_Interface_SetReadBuffer:
|
UART_HW_Interface_SetReadBuffer:
|
||||||
std Y+UART_HW_IFACE_OFFS_READBUFNUM, r16
|
std Y+UART_HW_IFACE_OFFS_READBUFNUM, r16
|
||||||
adiw xh:xl, 1
|
adiw xh:xl, 1
|
||||||
std Y+UART_HW_IFACE_OFFS_READBUFPOSLOW, xl
|
std Y+UART_HW_IFACE_OFFS_READBUFPOS_LOW, xl
|
||||||
std Y+UART_HW_IFACE_OFFS_READBUFPOSHIGH, xh
|
std Y+UART_HW_IFACE_OFFS_READBUFPOS_HIGH, xh
|
||||||
sbiw xh:xl, 1
|
sbiw xh:xl, 1
|
||||||
clr r17
|
clr r17
|
||||||
std Y+UART_HW_IFACE_OFFS_READBUFUSED, r17
|
std Y+UART_HW_IFACE_OFFS_READBUFUSED, r17
|
||||||
@@ -106,14 +59,14 @@ UART_HW_Interface_SetReadBuffer:
|
|||||||
;
|
;
|
||||||
; @param Y pointer to interface data in SRAM (see @ref UART_HW_IFACE_OFFS_STATE)
|
; @param Y pointer to interface data in SRAM (see @ref UART_HW_IFACE_OFFS_STATE)
|
||||||
; @param r16 write buffer number
|
; @param r16 write buffer number
|
||||||
; @param X write buffer pos
|
; @param X pointer to write buffer
|
||||||
; @clobbers r17
|
; @clobbers r17
|
||||||
|
|
||||||
UART_HW_Interface_SetWriteBuffer:
|
UART_HW_Interface_SetWriteBuffer:
|
||||||
std Y+UART_HW_IFACE_OFFS_WRITEBUFNUM, r16
|
std Y+UART_HW_IFACE_OFFS_WRITEBUFNUM, r16
|
||||||
adiw xh:xl, 1
|
adiw xh:xl, 1
|
||||||
std Y+UART_HW_IFACE_OFFS_WRITEBUFPOSLOW, xl ; begin of msg (dest addr byte)
|
std Y+UART_HW_IFACE_OFFS_WRITEBUFPOS_LOW, xl ; begin of msg (dest addr byte)
|
||||||
std Y+UART_HW_IFACE_OFFS_WRITEBUFPOSHIGH, xh
|
std Y+UART_HW_IFACE_OFFS_WRITEBUFPOS_HIGH, xh
|
||||||
adiw xh:xl, 1
|
adiw xh:xl, 1
|
||||||
ld r17, X ; payload length byte
|
ld r17, X ; payload length byte
|
||||||
sbiw xh:xl, 2 ; back to start of buffer
|
sbiw xh:xl, 2 ; back to start of buffer
|
||||||
@@ -127,146 +80,3 @@ UART_HW_Interface_SetWriteBuffer:
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
; ---------------------------------------------------------------------------
|
|
||||||
; @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_WRITEMSGRINGBUF
|
|
||||||
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_WRITEMSGRINGBUF
|
|
||||||
rcall uartHwRingBufferReadGuarded ; R17, R18, X
|
|
||||||
pop yh
|
|
||||||
pop yl
|
|
||||||
ret
|
|
||||||
; @end
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
; ---------------------------------------------------------------------------
|
|
||||||
; @routine UART_HW_InterfacePeekNextOutgoingMsgNum @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_InterfacePeekNextOutgoingMsgNum:
|
|
||||||
push yl
|
|
||||||
push yh
|
|
||||||
adiw yh:yl, UART_HW_IFACE_OFFS_WRITEMSGRINGBUF
|
|
||||||
rcall uartHwRingBufferPeekGuarded ; R17, R18, X
|
|
||||||
pop yh
|
|
||||||
pop yl
|
|
||||||
ret
|
|
||||||
; @end
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
; ---------------------------------------------------------------------------
|
|
||||||
; @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 uartHwRingBufferPeekGuarded
|
|
||||||
;
|
|
||||||
; @return CFLAG on success, cleared on error
|
|
||||||
; @param r16 byte to write
|
|
||||||
; @param Y pointer to start of interface data
|
|
||||||
; @clobbers R17, R18, X
|
|
||||||
|
|
||||||
uartHwRingBufferPeekGuarded:
|
|
||||||
push r15
|
|
||||||
in r15, SREG
|
|
||||||
cli
|
|
||||||
rcall RingBufferY_PeekByte ; R17, R18, X
|
|
||||||
brcc uartHwRingBufferPeekGuarded_error
|
|
||||||
out SREG, r15
|
|
||||||
pop r15
|
|
||||||
sec
|
|
||||||
ret
|
|
||||||
uartHwRingBufferPeekGuarded_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
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -13,11 +13,11 @@
|
|||||||
; @macro M_UART_HW_Uart_Init
|
; @macro M_UART_HW_Uart_Init
|
||||||
;
|
;
|
||||||
; @param %0 UART number ("0" for UART0)
|
; @param %0 UART number ("0" for UART0)
|
||||||
; @param Y pointer to interface data in SRAM (see @ref UART_HW_IFACE_OFFS_STATE)
|
; @param Y pointer to interface data in SRAM
|
||||||
; @clobbers R16, R17, X
|
; @clobbers R16, R17, X
|
||||||
|
|
||||||
.macro M_UART_HW_Uart_Init
|
.macro M_UART_HW_Uart_Init
|
||||||
rcall UART_HW_InterfaceInit
|
rcall NET_Interface_Init
|
||||||
|
|
||||||
; set baudrate
|
; set baudrate
|
||||||
.if clock == 8000000
|
.if clock == 8000000
|
||||||
@@ -75,7 +75,7 @@
|
|||||||
; @macro M_UART_HW_Uart_StartTx
|
; @macro M_UART_HW_Uart_StartTx
|
||||||
;
|
;
|
||||||
; @param %0 UART number ("0" for UART0)
|
; @param %0 UART number ("0" for UART0)
|
||||||
; @param Y pointer to interface data in SRAM (see @ref UART_HW_IFACE_OFFS_STATE)
|
; @param Y pointer to interface data in SRAM
|
||||||
; @clobbers R16
|
; @clobbers R16
|
||||||
|
|
||||||
.macro M_UART_HW_Uart_StartTx
|
.macro M_UART_HW_Uart_StartTx
|
||||||
@@ -94,7 +94,7 @@
|
|||||||
; @macro M_UART_HW_Uart_StopTx
|
; @macro M_UART_HW_Uart_StopTx
|
||||||
;
|
;
|
||||||
; @param %0 UART number ("0" for UART0)
|
; @param %0 UART number ("0" for UART0)
|
||||||
; @param Y pointer to interface data in SRAM (see @ref UART_HW_IFACE_OFFS_STATE)
|
; @param Y pointer to interface data in SRAM
|
||||||
; @clobbers R16
|
; @clobbers R16
|
||||||
|
|
||||||
.macro M_UART_HW_Uart_StopTx
|
.macro M_UART_HW_Uart_StopTx
|
||||||
@@ -112,7 +112,7 @@
|
|||||||
; Flush receiption buffer.
|
; Flush receiption buffer.
|
||||||
;
|
;
|
||||||
; @param %0 UART number ("0" for UART0)
|
; @param %0 UART number ("0" for UART0)
|
||||||
; @param Y pointer to interface data in SRAM (see @ref UART_HW_IFACE_OFFS_MODE)
|
; @param Y pointer to interface data in SRAM
|
||||||
; @clobbers R16
|
; @clobbers R16
|
||||||
|
|
||||||
.macro M_UART_HW_Uart_Flush
|
.macro M_UART_HW_Uart_Flush
|
||||||
@@ -122,7 +122,7 @@ l_loop_%:
|
|||||||
rjmp l_end_%
|
rjmp l_end_%
|
||||||
lds r16, UDR@0
|
lds r16, UDR@0
|
||||||
clr r16
|
clr r16
|
||||||
std Y+UART_HW_IFACE_OFFS_READTIMER, r16
|
std Y+NET_IFACE_OFFS_READTIMER, r16
|
||||||
rjmp l_loop_%
|
rjmp l_loop_%
|
||||||
l_end_%:
|
l_end_%:
|
||||||
.endmacro
|
.endmacro
|
||||||
@@ -134,7 +134,7 @@ l_end_%:
|
|||||||
; @macro M_UART_HW_Uart_RxCharIsr
|
; @macro M_UART_HW_Uart_RxCharIsr
|
||||||
;
|
;
|
||||||
; @param %0 UART number ("0" for UART0)
|
; @param %0 UART number ("0" for UART0)
|
||||||
; @param Y pointer to interface data in SRAM (see @ref UART_HW_IFACE_OFFS_MODE)
|
; @param Y pointer to interface data in SRAM
|
||||||
; @clobbers R16 (R17, R18, X)
|
; @clobbers R16 (R17, R18, X)
|
||||||
|
|
||||||
.macro M_UART_HW_Uart_RxCharIsr
|
.macro M_UART_HW_Uart_RxCharIsr
|
||||||
@@ -142,7 +142,7 @@ l_end_%:
|
|||||||
lds r16, UCSR@0A ; check for errors
|
lds r16, UCSR@0A ; check for errors
|
||||||
andi r16, (1<<FE@0) | (1<<DOR@0) | (1<<UPE@0)
|
andi r16, (1<<FE@0) | (1<<DOR@0) | (1<<UPE@0)
|
||||||
breq l_recv_% ; no error, receive next char
|
breq l_recv_% ; no error, receive next char
|
||||||
ldd r16, Y+UART_HW_IFACE_OFFS_STATUS ; set error status
|
ldd r16, Y+NET_IFACE_OFFS_STATUS ; set error status
|
||||||
ori r16, (1<<UART_HW_STATUS_HWERR_BIT) ; -> HWERR
|
ori r16, (1<<UART_HW_STATUS_HWERR_BIT) ; -> HWERR
|
||||||
rjmp l_setStatusAndEnd_%
|
rjmp l_setStatusAndEnd_%
|
||||||
l_recv_%:
|
l_recv_%:
|
||||||
@@ -153,13 +153,13 @@ l_recv_%:
|
|||||||
rcall UART_HW_InterfaceWriteToReadBuffer ; (R17, R18, X)
|
rcall UART_HW_InterfaceWriteToReadBuffer ; (R17, R18, X)
|
||||||
brcc l_overrun_%
|
brcc l_overrun_%
|
||||||
clr r16
|
clr r16
|
||||||
std Y+UART_HW_IFACE_OFFS_READTIMER, r16 ; reset read timer
|
std Y+NET_IFACE_OFFS_READTIMER, r16 ; reset read timer
|
||||||
rjmp l_end_%
|
rjmp l_end_%
|
||||||
l_overrun_%:
|
l_overrun_%:
|
||||||
ldd r16, Y+UART_HW_IFACE_OFFS_STATUS ; set overrun error
|
ldd r16, Y+NET_IFACE_OFFS_STATUS ; set overrun error
|
||||||
ori r16, (1<<UART_HW_STATUS_OVERRUN_BIT) ; -> OVERRUN
|
ori r16, (1<<UART_HW_STATUS_OVERRUN_BIT) ; -> OVERRUN
|
||||||
l_setStatusAndEnd_%:
|
l_setStatusAndEnd_%:
|
||||||
std Y+UART_HW_IFACE_OFFS_STATUS, r16
|
std Y+NET_IFACE_OFFS_STATUS, r16
|
||||||
l_end_%:
|
l_end_%:
|
||||||
#endif
|
#endif
|
||||||
.endmacro
|
.endmacro
|
||||||
@@ -173,7 +173,7 @@ l_end_%:
|
|||||||
; Handler for UDREn interrupt called when TX data register is empty.
|
; Handler for UDREn interrupt called when TX data register is empty.
|
||||||
;
|
;
|
||||||
; @param %0 UART number ("0" for UART0)
|
; @param %0 UART number ("0" for UART0)
|
||||||
; @param Y pointer to interface data in SRAM (see @ref UART_HW_IFACE_OFFS_MODE)
|
; @param Y pointer to interface data in SRAM
|
||||||
; @clobbers R16, R17, X
|
; @clobbers R16, R17, X
|
||||||
|
|
||||||
.macro M_UART_HW_Uart_TxUdreIsr
|
.macro M_UART_HW_Uart_TxUdreIsr
|
||||||
@@ -197,18 +197,18 @@ l_end_%:
|
|||||||
breq l_disable_irq_% ; nothing left to write
|
breq l_disable_irq_% ; nothing left to write
|
||||||
|
|
||||||
; get read ptr, read byte, inc read ptr, store ptr and bytesLeft
|
; get read ptr, read byte, inc read ptr, store ptr and bytesLeft
|
||||||
ldd xl, Y+UART_HW_IFACE_OFFS_WRITEBUFPOSLOW
|
ldd xl, Y+UART_HW_IFACE_OFFS_WRITEBUFPOS_LOW
|
||||||
ldd xh, Y+UART_HW_IFACE_OFFS_WRITEBUFPOSHIGH
|
ldd xh, Y+UART_HW_IFACE_OFFS_WRITEBUFPOS_HIGH
|
||||||
ld r16, X+ ; r16=byte to write
|
ld r16, X+ ; r16=byte to write
|
||||||
std Y+UART_HW_IFACE_OFFS_WRITEBUFPOSLOW, xl
|
std Y+UART_HW_IFACE_OFFS_WRITEBUFPOS_LOW, xl
|
||||||
std Y+UART_HW_IFACE_OFFS_WRITEBUFPOSHIGH, xh
|
std Y+UART_HW_IFACE_OFFS_WRITEBUFPOS_HIGH, xh
|
||||||
dec r17
|
dec r17
|
||||||
std Y+UART_HW_IFACE_OFFS_WRITEBUFLEFT, r17
|
std Y+UART_HW_IFACE_OFFS_WRITEBUFLEFT, r17
|
||||||
|
|
||||||
; send byte, reset write timer
|
; send byte, reset write timer
|
||||||
sts UDR@0, r16
|
sts UDR@0, r16
|
||||||
clr r16
|
clr r16
|
||||||
std Y+UART_HW_IFACE_OFFS_WRITETIMER, r16 ; reset write timer
|
std Y+NET_IFACE_OFFS_WRITETIMER, r16 ; reset write timer
|
||||||
|
|
||||||
; still bytes left to write?
|
; still bytes left to write?
|
||||||
tst r17
|
tst r17
|
||||||
@@ -234,7 +234,7 @@ l_end_%:
|
|||||||
; the data register is empty.
|
; the data register is empty.
|
||||||
;
|
;
|
||||||
; @param %0 UART number ("0" for UART0)
|
; @param %0 UART number ("0" for UART0)
|
||||||
; @param Y pointer to interface data in SRAM (see @ref UART_HW_IFACE_OFFS_MODE)
|
; @param Y pointer to interface data in SRAM
|
||||||
; @clobbers R16
|
; @clobbers R16
|
||||||
|
|
||||||
.macro M_UART_HW_Uart_TxCharIsr
|
.macro M_UART_HW_Uart_TxCharIsr
|
||||||
|
|||||||
@@ -1,241 +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. *
|
|
||||||
; ***************************************************************************
|
|
||||||
|
|
||||||
|
|
||||||
.cseg
|
|
||||||
|
|
||||||
; ---------------------------------------------------------------------------
|
|
||||||
; @routine UART_HW_Interface_RunRead
|
|
||||||
;
|
|
||||||
; This routine reads bytes from the ringbuffer of the given
|
|
||||||
; interface and parses them into messages.
|
|
||||||
; If a valid message is received it will be added to the system's
|
|
||||||
; incoming message ringbuffer.
|
|
||||||
;
|
|
||||||
; @param Y pointer to start of interface data
|
|
||||||
; @clobbers R16, R20 (R17, R18, R18, R19, R20, R21, X)
|
|
||||||
|
|
||||||
UART_HW_Interface_RunRead:
|
|
||||||
ldd r16, Y+UART_HW_IFACE_OFFS_READMSG_BUFNUM
|
|
||||||
cpi r16, 0xff
|
|
||||||
brne UART_HW_Interface_RunRead_HaveBuffer
|
|
||||||
rcall uartHwAllocateReadBuffer ; (r16, R17, X)
|
|
||||||
brcc UART_HW_Interface_RunRead_ovrError
|
|
||||||
rcall uartHwReadSetBuffer ; (r16)
|
|
||||||
UART_HW_Interface_RunRead_HaveBuffer:
|
|
||||||
ldd r16, Y+UART_HW_IFACE_OFFS_READMSG_LEFT
|
|
||||||
tst r16
|
|
||||||
brne UART_HW_Interface_RunRead_HaveHeader
|
|
||||||
ldd r16, Y+UART_HW_IFACE_OFFS_READMSG_USED
|
|
||||||
ldi r20, 2
|
|
||||||
sub r20, r16
|
|
||||||
rcall uartHwReadUptoNumBytes ; (r16, r17, r20, r21, X)
|
|
||||||
tst r20
|
|
||||||
brne UART_HW_Interface_RunRead_end
|
|
||||||
ldd xl, Y+UART_HW_IFACE_OFFS_READMSG_PTR
|
|
||||||
ldd xh, Y+UART_HW_IFACE_OFFS_READMSG_PTR+1
|
|
||||||
sbiw xh:xl, 1
|
|
||||||
ld r16, X ; msg len
|
|
||||||
cpi r16, UART_HW_FIXEDBUFFERS_SIZE-4 ; minus buffer status byte, dest addr, msglen, crc
|
|
||||||
brcc UART_HW_Interface_RunRead_dataError ; invalid msg
|
|
||||||
inc r16
|
|
||||||
std Y+UART_HW_IFACE_OFFS_READMSG_LEFT, r16
|
|
||||||
UART_HW_Interface_RunRead_HaveHeader:
|
|
||||||
ldd r20, Y+UART_HW_IFACE_OFFS_READMSG_LEFT
|
|
||||||
tst r20
|
|
||||||
breq UART_HW_Interface_RunRead_HaveMsg
|
|
||||||
rcall uartHwReadUptoNumBytes ; (r16, r17, r20, r21, X)
|
|
||||||
tst r20
|
|
||||||
brne UART_HW_Interface_RunRead_end ; not all bytes received, done for now
|
|
||||||
UART_HW_Interface_RunRead_HaveMsg:
|
|
||||||
ldd xl, Y+UART_HW_IFACE_OFFS_READMSG_PTR
|
|
||||||
ldd xh, Y+UART_HW_IFACE_OFFS_READMSG_PTR+1
|
|
||||||
ldd r16, Y+UART_HW_IFACE_OFFS_READMSG_USED
|
|
||||||
sub xl, r16 ; X-=r16
|
|
||||||
sbc xh, r16
|
|
||||||
add xh, r16
|
|
||||||
rcall com2CheckMessageInBuffer ; (R16, R17, R18, R19, R20, X)
|
|
||||||
brcc UART_HW_Interface_RunRead_dataError
|
|
||||||
ldd r16, Y+UART_HW_IFACE_OFFS_READMSG_BUFNUM
|
|
||||||
rcall UART_HW_AddIncomingMsgNum ; (R17, R18, X)
|
|
||||||
brcc UART_HW_Interface_RunRead_ovrError
|
|
||||||
ldi r16, 0xff
|
|
||||||
std Y+UART_HW_IFACE_OFFS_READMSG_BUFNUM, r16
|
|
||||||
rjmp UART_HW_Interface_RunRead_end
|
|
||||||
UART_HW_Interface_RunRead_ovrError:
|
|
||||||
rcall uartHwIncOvrCounter ; (R16)
|
|
||||||
rcall uartHwReadResetBuffer ; (R16, X)
|
|
||||||
rjmp UART_HW_Interface_RunRead_end
|
|
||||||
UART_HW_Interface_RunRead_dataError:
|
|
||||||
rcall uartHwIncContentCounter ; (R16)
|
|
||||||
rcall uartHwResetBufferStartSkipping ; (R16, X)
|
|
||||||
UART_HW_Interface_RunRead_end:
|
|
||||||
ret
|
|
||||||
; @end
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
; ---------------------------------------------------------------------------
|
|
||||||
; @routine uartHwReadSetBuffer
|
|
||||||
;
|
|
||||||
; @param Y pointer to start of interface data
|
|
||||||
; @param X pointer to start of buffer
|
|
||||||
; @param r16 buffer number
|
|
||||||
; @clobbers r16
|
|
||||||
|
|
||||||
uartHwReadSetBuffer:
|
|
||||||
std Y+UART_HW_IFACE_OFFS_READMSG_BUFNUM, r16 ; set buffer data
|
|
||||||
adiw xh:xl, 1
|
|
||||||
std Y+UART_HW_IFACE_OFFS_READMSG_PTR, xl
|
|
||||||
std Y+UART_HW_IFACE_OFFS_READMSG_PTR+1, xh
|
|
||||||
sbiw xh:xl, 1
|
|
||||||
clr r16
|
|
||||||
std Y+UART_HW_IFACE_OFFS_READMSG_USED, r16
|
|
||||||
std Y+UART_HW_IFACE_OFFS_READMSG_LEFT, r16
|
|
||||||
ret
|
|
||||||
; @end
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
; ---------------------------------------------------------------------------
|
|
||||||
; @routine uartHwReadResetBuffer
|
|
||||||
;
|
|
||||||
; @param Y pointer to start of interface data
|
|
||||||
; @clobbers r16, X
|
|
||||||
|
|
||||||
uartHwReadResetBuffer:
|
|
||||||
; reset READ buffer settings
|
|
||||||
ldd r16, Y+UART_HW_IFACE_OFFS_READMSG_BUFNUM
|
|
||||||
cpi r16, 0xff
|
|
||||||
brne uartHwReadResetBuffer_haveBuffer
|
|
||||||
ret
|
|
||||||
uartHwReadResetBuffer_haveBuffer:
|
|
||||||
rcall UART_HW_FixedBuffers_Locate ; (X)
|
|
||||||
ldd r16, Y+UART_HW_IFACE_OFFS_READMSG_BUFNUM
|
|
||||||
rjmp uartHwReadSetBuffer ; (r16)
|
|
||||||
; @end
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
; ---------------------------------------------------------------------------
|
|
||||||
; @routine uartHwResetBufferStartSkipping
|
|
||||||
;
|
|
||||||
; @param Y pointer to start of interface data
|
|
||||||
; @clobbers r16 (X)
|
|
||||||
|
|
||||||
uartHwResetBufferStartSkipping:
|
|
||||||
; reset READ buffer settings, enter skip mode
|
|
||||||
rcall uartHwReadResetBuffer ; (R16, X)
|
|
||||||
ldd r16, Y+UART_HW_IFACE_OFFS_MODE
|
|
||||||
ori r16, UART_HW_MODE_SKIPPING
|
|
||||||
std Y+UART_HW_IFACE_OFFS_MODE, r16
|
|
||||||
ret
|
|
||||||
; @end
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
; ---------------------------------------------------------------------------
|
|
||||||
; @routine uartHwAllocateReadBuffer
|
|
||||||
;
|
|
||||||
; @return CFLAG set if buffer set, cleared otherwise
|
|
||||||
; @param Y pointer to start of interface data
|
|
||||||
; @clobbers r16, R17 (X)
|
|
||||||
|
|
||||||
uartHwAllocateReadBuffer:
|
|
||||||
rcall UART_HW_FixedBuffers_Alloc ; (R16, R17, X)
|
|
||||||
brcc uartHwAllocateReadBuffer_end
|
|
||||||
std Y+UART_HW_IFACE_OFFS_READMSG_BUFNUM, r16
|
|
||||||
ldd r17, Y+UART_HW_IFACE_OFFS_IFACENUM
|
|
||||||
ori r17, (1<<UART_HW_BUFFER_INUSE_BIT)
|
|
||||||
st X, r17
|
|
||||||
adiw xh:xl, 1
|
|
||||||
std Y+UART_HW_IFACE_OFFS_READMSG_PTR, xl
|
|
||||||
std Y+UART_HW_IFACE_OFFS_READMSG_PTR+1, xh
|
|
||||||
clr r16
|
|
||||||
std Y+UART_HW_IFACE_OFFS_READMSG_USED, r16
|
|
||||||
std Y+UART_HW_IFACE_OFFS_READMSG_LEFT, r16
|
|
||||||
sec
|
|
||||||
uartHwAllocateReadBuffer_end:
|
|
||||||
ret
|
|
||||||
; @end
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
; ---------------------------------------------------------------------------
|
|
||||||
; @routine uartHwReadUptoNumBytes
|
|
||||||
;
|
|
||||||
; @return r20 remaining bytes (bytes not yet read)
|
|
||||||
; @param Y pointer to start of interface data
|
|
||||||
; @param R20 number of bytes to read
|
|
||||||
; @clobbers r16, r20, r21, X (R17)
|
|
||||||
|
|
||||||
uartHwReadUptoNumBytes:
|
|
||||||
clr r21
|
|
||||||
ldd xl, Y+UART_HW_IFACE_OFFS_READMSG_PTR
|
|
||||||
ldd xh, Y+UART_HW_IFACE_OFFS_READMSG_PTR+1
|
|
||||||
uartHwReadUptoNumBytes_loop:
|
|
||||||
push xl
|
|
||||||
push xh
|
|
||||||
rcall UART_HW_InterfaceReadFromWriteBuffer ; (R17, R18, X)
|
|
||||||
pop xh
|
|
||||||
pop xl
|
|
||||||
brcc uartHwReadUptoNumBytes_done
|
|
||||||
st X+, r16
|
|
||||||
inc r21
|
|
||||||
dec r20
|
|
||||||
brne uartHwReadUptoNumBytes_loop
|
|
||||||
uartHwReadUptoNumBytes_done:
|
|
||||||
ldd r16, Y+UART_HW_IFACE_OFFS_READMSG_USED
|
|
||||||
add r16, r21
|
|
||||||
std Y+UART_HW_IFACE_OFFS_READMSG_USED, r16
|
|
||||||
ldd r16, Y+UART_HW_IFACE_OFFS_READMSG_LEFT
|
|
||||||
sub r16, r21
|
|
||||||
std Y+UART_HW_IFACE_OFFS_READMSG_LEFT, r16 ; might become negative when reading header
|
|
||||||
std Y+UART_HW_IFACE_OFFS_READMSG_PTR, xl
|
|
||||||
std Y+UART_HW_IFACE_OFFS_READMSG_PTR+1, xh
|
|
||||||
ret
|
|
||||||
; @end
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
; ---------------------------------------------------------------------------
|
|
||||||
; @routine uartHwIncOvrCounter
|
|
||||||
;
|
|
||||||
; @param Y pointer to start of interface data
|
|
||||||
; @clobbers r16
|
|
||||||
|
|
||||||
uartHwIncOvrCounter:
|
|
||||||
ldd r16, Y+UART_HW_IFACE_OFFS_ERR_OVR
|
|
||||||
inc r16
|
|
||||||
breq uartHwIncOvrCounter_end
|
|
||||||
std Y+UART_HW_IFACE_OFFS_ERR_OVR, r16
|
|
||||||
uartHwIncOvrCounter_end:
|
|
||||||
ret
|
|
||||||
; @end
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
; ---------------------------------------------------------------------------
|
|
||||||
; @routine uartHwIncContentCounter
|
|
||||||
;
|
|
||||||
; @param Y pointer to start of interface data
|
|
||||||
; @clobbers r16
|
|
||||||
|
|
||||||
uartHwIncContentCounter:
|
|
||||||
ldd r16, Y+UART_HW_IFACE_OFFS_ERR_CONTENT
|
|
||||||
inc r16
|
|
||||||
breq uartHwIncContentCounter_end
|
|
||||||
std Y+UART_HW_IFACE_OFFS_ERR_OVR, r16
|
|
||||||
uartHwIncContentCounter_end:
|
|
||||||
ret
|
|
||||||
; @end
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,112 +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. *
|
|
||||||
; ***************************************************************************
|
|
||||||
|
|
||||||
|
|
||||||
.cseg
|
|
||||||
|
|
||||||
|
|
||||||
; ---------------------------------------------------------------------------
|
|
||||||
; @routine UART_HW_Interface_RunWriting @global
|
|
||||||
;
|
|
||||||
; Write current message to ringbuffer.
|
|
||||||
;
|
|
||||||
; @param Y pointer to start of interface data
|
|
||||||
; @clobbers r16, r19, X (R17, R18, R20, R21)
|
|
||||||
|
|
||||||
UART_HW_Interface_RunWriting:
|
|
||||||
ldd r19, Y+UART_HW_IFACE_OFFS_WRITEMSG_BUFNUM
|
|
||||||
cpi r19, 0xff ; invalid buffer number?
|
|
||||||
breq UART_HW_Interface_RunWrite_end ; yes, invalid, nothing to do
|
|
||||||
UART_HW_Interface_RunWrite_haveMsg:
|
|
||||||
; there are still bytes left in the buffer, send them
|
|
||||||
ldd r20, Y+UART_HW_IFACE_OFFS_WRITEMSG_LEFT
|
|
||||||
rcall uartHwWriteUptoNumBytes ; (r16, r17, r18, r20, r21, X)
|
|
||||||
ldd r16, Y+UART_HW_IFACE_OFFS_WRITEMSG_LEFT
|
|
||||||
tst r16
|
|
||||||
brne UART_HW_Interface_RunWrite_end ; still bytes left to write
|
|
||||||
; message completely sent to interface, release buffer
|
|
||||||
ldd r16, Y+UART_HW_IFACE_OFFS_WRITEMSG_BUFNUM
|
|
||||||
rcall UART_HW_FixedBuffers_ReleaseByNum
|
|
||||||
ldi r16, 0xff ; set invalid buffer number
|
|
||||||
std Y+UART_HW_IFACE_OFFS_WRITEMSG_BUFNUM, r16
|
|
||||||
ldd r16, Y+UART_HW_IFACE_OFFS_MODE
|
|
||||||
cbr r16, UART_HW_MODE_WRITEMASK
|
|
||||||
ori r16, UART_HW_MODE_WAITBUFFEREMPTY
|
|
||||||
std Y+UART_HW_IFACE_OFFS_MODE, r16
|
|
||||||
UART_HW_Interface_RunWrite_end:
|
|
||||||
ret
|
|
||||||
; @end
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
; ---------------------------------------------------------------------------
|
|
||||||
; @routine UART_HW_Interface_WriteSetBuffer
|
|
||||||
;
|
|
||||||
; Set given fixed buffer as source for @ref UART_HW_Interface_RunWrite.
|
|
||||||
;
|
|
||||||
; @param r16 buffer num
|
|
||||||
; @param Y pointer to start of interface data
|
|
||||||
; @clobbers r16, r19, X
|
|
||||||
|
|
||||||
UART_HW_Interface_WriteSetBuffer:
|
|
||||||
mov r19, r16
|
|
||||||
rcall UART_HW_FixedBuffers_Locate ; (R16)
|
|
||||||
brcc UART_HW_Interface_WriteSetBuffer_end
|
|
||||||
std Y+UART_HW_IFACE_OFFS_WRITEMSG_BUFNUM, r19
|
|
||||||
adiw xh:xl, 1
|
|
||||||
std Y+UART_HW_IFACE_OFFS_WRITEMSG_PTR, xl
|
|
||||||
std Y+UART_HW_IFACE_OFFS_WRITEMSG_PTR+1, xh
|
|
||||||
adiw xh:xl, 1 ; get msg len
|
|
||||||
ld r16, X
|
|
||||||
inc r16 ; adjust for destination addr byte
|
|
||||||
inc r16 ; adjust for msg len byte
|
|
||||||
inc r16 ; adjust for crc byte
|
|
||||||
std Y+UART_HW_IFACE_OFFS_WRITEMSG_LEFT, r16
|
|
||||||
std Y+UART_HW_IFACE_OFFS_WRITEMSG_USED, r16
|
|
||||||
UART_HW_Interface_WriteSetBuffer_end:
|
|
||||||
ret
|
|
||||||
; @end
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
; ---------------------------------------------------------------------------
|
|
||||||
; @routine uartHwWriteUptoNumBytes
|
|
||||||
;
|
|
||||||
; @param Y pointer to start of interface data
|
|
||||||
; @param R20 number of bytes to read
|
|
||||||
; @clobbers r16, r20, r21, X (R17, R18)
|
|
||||||
|
|
||||||
uartHwWriteUptoNumBytes:
|
|
||||||
clr r21
|
|
||||||
ldd xl, Y+UART_HW_IFACE_OFFS_WRITEMSG_PTR
|
|
||||||
ldd xh, Y+UART_HW_IFACE_OFFS_WRITEMSG_PTR+1
|
|
||||||
uartHwWriteUptoNumBytes_loop:
|
|
||||||
ld r16, X
|
|
||||||
push xl
|
|
||||||
push xh
|
|
||||||
rcall UART_HW_InterfaceWriteToWriteBuffer ; (R17, R18, X)
|
|
||||||
pop xh
|
|
||||||
pop xl
|
|
||||||
brcc uartHwWriteUptoNumBytes_done
|
|
||||||
adiw xh:xl, 1
|
|
||||||
inc r21
|
|
||||||
dec r20
|
|
||||||
brne uartHwWriteUptoNumBytes_loop
|
|
||||||
uartHwWriteUptoNumBytes_done:
|
|
||||||
ldd r16, Y+UART_HW_IFACE_OFFS_WRITEMSG_LEFT
|
|
||||||
sub r16, r21
|
|
||||||
std Y+UART_HW_IFACE_OFFS_WRITEMSG_LEFT, r16
|
|
||||||
std Y+UART_HW_IFACE_OFFS_WRITEMSG_PTR, xl
|
|
||||||
std Y+UART_HW_IFACE_OFFS_WRITEMSG_PTR+1, xh
|
|
||||||
ret
|
|
||||||
; @end
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -29,10 +29,10 @@ ttyOnUart1_iface: .byte UART_HW_IFACE_SIZE
|
|||||||
TtyOnUart1_Init:
|
TtyOnUart1_Init:
|
||||||
ldi yl, LOW(ttyOnUart1_iface)
|
ldi yl, LOW(ttyOnUart1_iface)
|
||||||
ldi yh, HIGH(ttyOnUart1_iface)
|
ldi yh, HIGH(ttyOnUart1_iface)
|
||||||
rcall UART_HW_InterfaceInit ; (R16, R17, X)
|
rcall UART_HW_Interface_Init ; (R16, R17, X)
|
||||||
rcall UART_HW_Uart1_Init ; (R16, R17, X)
|
rcall UART_HW_Uart1_Init ; (R16, R17, X)
|
||||||
ldi r16, TTYONUART1_IFACENUM
|
ldi r16, TTYONUART1_IFACENUM
|
||||||
std Y+UART_HW_IFACE_OFFS_IFACENUM, r16
|
std Y+NET_IFACE_OFFS_IFACENUM, r16
|
||||||
ret
|
ret
|
||||||
; @end
|
; @end
|
||||||
|
|
||||||
@@ -47,15 +47,15 @@ TtyOnUart1_Periodically:
|
|||||||
ldi yl, LOW(ttyOnUart1_iface)
|
ldi yl, LOW(ttyOnUart1_iface)
|
||||||
ldi yh, HIGH(ttyOnUart1_iface)
|
ldi yh, HIGH(ttyOnUart1_iface)
|
||||||
|
|
||||||
ldd r16, Y+UART_HW_IFACE_OFFS_READTIMER
|
ldd r16, Y+NET_IFACE_OFFS_READTIMER
|
||||||
inc r16
|
inc r16
|
||||||
breq TtyOnUart1_Periodically_l1
|
breq TtyOnUart1_Periodically_l1
|
||||||
std Y+UART_HW_IFACE_OFFS_READTIMER, r16
|
std Y+NET_IFACE_OFFS_READTIMER, r16
|
||||||
TtyOnUart1_Periodically_l1:
|
TtyOnUart1_Periodically_l1:
|
||||||
ldd r16, Y+UART_HW_IFACE_OFFS_WRITETIMER
|
ldd r16, Y+NET_IFACE_OFFS_WRITETIMER
|
||||||
inc r16
|
inc r16
|
||||||
breq TtyOnUart1_Periodically_l2
|
breq TtyOnUart1_Periodically_l2
|
||||||
std Y+UART_HW_IFACE_OFFS_WRITETIMER, r16
|
std Y+NET_IFACE_OFFS_WRITETIMER, r16
|
||||||
TtyOnUart1_Periodically_l2:
|
TtyOnUart1_Periodically_l2:
|
||||||
ret
|
ret
|
||||||
; @end
|
; @end
|
||||||
@@ -259,7 +259,7 @@ ttyOnUart1RunWriteBufferEmpty:
|
|||||||
cp r16, r17
|
cp r16, r17
|
||||||
breq ttyOnUart1RunWriteBufferEmpty_setIdle
|
breq ttyOnUart1RunWriteBufferEmpty_setIdle
|
||||||
std Y+UART_HW_IFACE_OFFS_WRITEBUFNUM, r17
|
std Y+UART_HW_IFACE_OFFS_WRITEBUFNUM, r17
|
||||||
rcall UART_HW_FixedBuffers_ReleaseByNum ; (R16, X)
|
rcall NET_Buffer_ReleaseByNum ; (R16, X)
|
||||||
ttyOnUart1RunWriteBufferEmpty_setIdle:
|
ttyOnUart1RunWriteBufferEmpty_setIdle:
|
||||||
rcall UART_HW_Uart1_StopTx ; disable transceiver and interrupts (R16)
|
rcall UART_HW_Uart1_StopTx ; disable transceiver and interrupts (R16)
|
||||||
ldi r16, UART_HW_WRITEMODE_IDLE
|
ldi r16, UART_HW_WRITEMODE_IDLE
|
||||||
|
|||||||
Reference in New Issue
Block a user