avr: more work on uart_hw module.
This commit is contained in:
@@ -12,11 +12,17 @@
|
|||||||
.equ UART_HW_IFACE_WRITEBUF_SIZE = 8
|
.equ UART_HW_IFACE_WRITEBUF_SIZE = 8
|
||||||
|
|
||||||
|
|
||||||
|
.equ UART_HW_BUFFER_INUSE_BIT = 7
|
||||||
|
.equ UART_HW_BUFFER_IFACENUM1_BIT = 1
|
||||||
|
.equ UART_HW_BUFFER_IFACENUM0_BIT = 0
|
||||||
|
|
||||||
|
|
||||||
.equ UART_HW_MODE_OFF = 0
|
.equ UART_HW_MODE_OFF = 0
|
||||||
.equ UART_HW_MODE_IDLE = 1
|
.equ UART_HW_MODE_IDLE = 1
|
||||||
.equ UART_HW_MODE_READING = 2
|
.equ UART_HW_MODE_READING = 2
|
||||||
.equ UART_HW_MODE_WRITING = 4
|
.equ UART_HW_MODE_WRITING = 4
|
||||||
.equ UART_HW_MODE_SKIPPING = 8
|
.equ UART_HW_MODE_SKIPPING = 8
|
||||||
|
.equ UART_HW_MODE_WAITATTNLOW = 16 ; waiting after setting ATTN low
|
||||||
|
|
||||||
|
|
||||||
.equ UART_HW_STATUS_UNDERRUN = 0x01
|
.equ UART_HW_STATUS_UNDERRUN = 0x01
|
||||||
@@ -26,14 +32,16 @@
|
|||||||
.equ UART_HW_STATUS_ATTN = 0x80
|
.equ UART_HW_STATUS_ATTN = 0x80
|
||||||
|
|
||||||
|
|
||||||
.equ UART_HW_IFACE_OFFS_MODE = 0
|
.equ UART_HW_IFACE_OFFS_IFACENUM = 0 ; interface number (put into received messages)
|
||||||
.equ UART_HW_IFACE_OFFS_STATUS = 1
|
.equ UART_HW_IFACE_OFFS_MODE = 1
|
||||||
.equ UART_HW_IFACE_OFFS_READTIMER = 2
|
.equ UART_HW_IFACE_OFFS_STATUS = 2
|
||||||
.equ UART_HW_IFACE_OFFS_WRITETIMER = 3
|
.equ UART_HW_IFACE_OFFS_READTIMER = 3
|
||||||
.equ UART_HW_IFACE_OFFS_ERR_OVR = 4
|
.equ UART_HW_IFACE_OFFS_WRITETIMER = 4
|
||||||
|
.equ UART_HW_IFACE_OFFS_ERR_OVR = 5
|
||||||
|
.equ UART_HW_IFACE_OFFS_ERR_CONTENT = 6
|
||||||
|
|
||||||
; ringbuffer for incoming chars
|
; ringbuffer for incoming chars
|
||||||
.equ UART_HW_IFACE_OFFS_READBUF = 5
|
.equ UART_HW_IFACE_OFFS_READBUF = 7
|
||||||
.equ UART_HW_IFACE_OFFS_READBUF_MAX = UART_HW_IFACE_OFFS_READBUF
|
.equ UART_HW_IFACE_OFFS_READBUF_MAX = UART_HW_IFACE_OFFS_READBUF
|
||||||
.equ UART_HW_IFACE_OFFS_READBUF_USED = UART_HW_IFACE_OFFS_READBUF+1
|
.equ UART_HW_IFACE_OFFS_READBUF_USED = UART_HW_IFACE_OFFS_READBUF+1
|
||||||
.equ UART_HW_IFACE_OFFS_READBUF_RDPOS = UART_HW_IFACE_OFFS_READBUF+2
|
.equ UART_HW_IFACE_OFFS_READBUF_RDPOS = UART_HW_IFACE_OFFS_READBUF+2
|
||||||
|
|||||||
@@ -1,46 +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_Uart1_Init @global
|
|
||||||
;
|
|
||||||
; @param Y pointer to interface data in SRAM (see @ref UART_HW_IFACE_OFFS_STATE)
|
|
||||||
; @clobbers R16, R17, X
|
|
||||||
|
|
||||||
UART_HW_Uart1_Init:
|
|
||||||
rcall UART_HW_InitInterface
|
|
||||||
|
|
||||||
; set baudrate
|
|
||||||
.if clock == 8000000
|
|
||||||
ldi r16, 25 ; (19.2Kb/s at 8MHz)
|
|
||||||
ldi r17, 0
|
|
||||||
.endif
|
|
||||||
|
|
||||||
.if clock == 1000000
|
|
||||||
ldi r16, 2 ; (19.2Kb/s at 1MHz)
|
|
||||||
ldi r17, 0
|
|
||||||
.endif
|
|
||||||
|
|
||||||
out UBRR1H, r17
|
|
||||||
out UBRR1L, r16
|
|
||||||
|
|
||||||
; set character format
|
|
||||||
ldi r16, (1<<USBS1)|(3<<UCSZ10)
|
|
||||||
out UCSR1C, r16
|
|
||||||
|
|
||||||
ret
|
|
||||||
; @end
|
|
||||||
|
|
||||||
@@ -13,6 +13,38 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @routine UART_HW_Uart1_Init @global
|
||||||
|
;
|
||||||
|
; @param Y pointer to interface data in SRAM (see @ref UART_HW_IFACE_OFFS_STATE)
|
||||||
|
; @clobbers R16, R17, X
|
||||||
|
|
||||||
|
UART_HW_Uart1_Init:
|
||||||
|
rcall UART_HW_InterfaceInit
|
||||||
|
|
||||||
|
; set baudrate
|
||||||
|
.if clock == 8000000
|
||||||
|
ldi r16, 25 ; (19.2Kb/s at 8MHz)
|
||||||
|
ldi r17, 0
|
||||||
|
.endif
|
||||||
|
|
||||||
|
.if clock == 1000000
|
||||||
|
ldi r16, 2 ; (19.2Kb/s at 1MHz)
|
||||||
|
ldi r17, 0
|
||||||
|
.endif
|
||||||
|
|
||||||
|
sts UBRR1H, r17
|
||||||
|
sts UBRR1L, r16
|
||||||
|
|
||||||
|
; set character format
|
||||||
|
ldi r16, (1<<USBS1)|(3<<UCSZ10)
|
||||||
|
sts UCSR1C, r16
|
||||||
|
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
; ---------------------------------------------------------------------------
|
; ---------------------------------------------------------------------------
|
||||||
; @routine UART_HW_Uart1_StartRx @global
|
; @routine UART_HW_Uart1_StartRx @global
|
||||||
;
|
;
|
||||||
@@ -112,7 +144,13 @@ UART_HW_Uart1_TxCharIsr:
|
|||||||
sbrs r16,UDRE1
|
sbrs r16,UDRE1
|
||||||
rjmp UART_HW_Uart1_TxCharIsr_end ; not ready
|
rjmp UART_HW_Uart1_TxCharIsr_end ; not ready
|
||||||
rcall UART_HW_InterfaceReadFromWriteBuffer ; (R17, R18, X)
|
rcall UART_HW_InterfaceReadFromWriteBuffer ; (R17, R18, X)
|
||||||
brcs UART_HW_Uart1_TxCharIsr_send ; no data in buffer
|
brcs UART_HW_Uart1_TxCharIsr_send ; got a byte, go send
|
||||||
|
|
||||||
|
; disable further DRE1 interrupts
|
||||||
|
lds r16, UCSR1B
|
||||||
|
cbr r16, (1<<UDRIE1) ; disable TX data register empty interrupt
|
||||||
|
sts UCSR1B, r16
|
||||||
|
; set underrun status (TODO: maybe change this later)
|
||||||
ldd r16, Y+UART_HW_IFACE_OFFS_STATUS ; set underrun error
|
ldd r16, Y+UART_HW_IFACE_OFFS_STATUS ; set underrun error
|
||||||
ori r16, UART_HW_STATUS_UNDERRUN
|
ori r16, UART_HW_STATUS_UNDERRUN
|
||||||
std Y+UART_HW_IFACE_OFFS_STATUS, r16
|
std Y+UART_HW_IFACE_OFFS_STATUS, r16
|
||||||
|
|||||||
@@ -10,75 +10,79 @@
|
|||||||
|
|
||||||
.cseg
|
.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
|
||||||
|
; @param X pointer to start of buffer
|
||||||
|
; @param r16 buffer number
|
||||||
|
; @clobbers R16, R17, R18, R19, R20, R21, X
|
||||||
|
|
||||||
UART_HW_Interface_RunRead:
|
UART_HW_Interface_RunRead:
|
||||||
rcall uartHwReadEnsureBuffer ; (r16, R17, X)
|
ldd r16, Y+UART_HW_IFACE_OFFS_READMSG_BUFNUM
|
||||||
brcc UART_HW_Interface_RunRead_end
|
cpi r16, 0xff
|
||||||
rcall uartHwReadEnsureHeader ; (r16, r17, r20, r21, X)
|
brne UART_HW_Interface_RunRead_HaveBuffer
|
||||||
brcc UART_HW_Interface_RunRead_end
|
rcall uartHwAllocateReadBuffer ; (r16, R17, X)
|
||||||
rcall uartHwReadEnsureBody ; (r16, r17, r20, r21, x)
|
brcc UART_HW_Interface_RunRead_ovrError
|
||||||
brcc UART_HW_Interface_RunRead_end
|
rcall uartHwReadSetBuffer ; (r16)
|
||||||
UART_HW_Interface_RunRead_HaveMsg:
|
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
|
ldd r16, Y+UART_HW_IFACE_OFFS_READMSG_USED
|
||||||
cpi r16, 3
|
ldi r20, 2
|
||||||
brcs UART_HW_Interface_RunRead_badMsg
|
sub r20, r16
|
||||||
; check and store msg
|
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
|
ldd r16, Y+UART_HW_IFACE_OFFS_READMSG_BUFNUM
|
||||||
rcall UART_HW_AddIncomingMsgNum ; (R17, R18, X)
|
rcall UART_HW_AddIncomingMsgNum ; (R17, R18, X)
|
||||||
brcs UART_HW_Interface_RunRead_clearBuf
|
brcc UART_HW_Interface_RunRead_ovrError
|
||||||
ldd r16, Y+UART_HW_IFACE_OFFS_READMSG_BUFNUM
|
|
||||||
rcall UART_HW_FixedBuffers_ReleaseByNum ; (R16, X)
|
|
||||||
UART_HW_Interface_RunRead_clearBuf:
|
|
||||||
ldi r16, 0xff
|
ldi r16, 0xff
|
||||||
std Y+UART_HW_IFACE_OFFS_READMSG_BUFNUM, r16
|
std Y+UART_HW_IFACE_OFFS_READMSG_BUFNUM, r16
|
||||||
rjmp UART_HW_Interface_RunRead_end
|
rjmp UART_HW_Interface_RunRead_end
|
||||||
UART_HW_Interface_RunRead_badMsg:
|
UART_HW_Interface_RunRead_ovrError:
|
||||||
; reset READ buffer settings, enter skip mode
|
rcall uartHwIncOvrCounter
|
||||||
rcall uartHwResetBufferStartSkipping ; (r16, X)
|
rcall uartHwReadResetBuffer
|
||||||
|
rjmp UART_HW_Interface_RunRead_end
|
||||||
|
UART_HW_Interface_RunRead_dataError:
|
||||||
|
rcall uartHwIncContentCounter
|
||||||
|
rcall uartHwResetBufferStartSkipping
|
||||||
UART_HW_Interface_RunRead_end:
|
UART_HW_Interface_RunRead_end:
|
||||||
ret
|
ret
|
||||||
; @end
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
; ---------------------------------------------------------------------------
|
|
||||||
; @routine uartHwEnsureReadBuffer
|
|
||||||
;
|
|
||||||
; @param Y pointer to start of interface data
|
|
||||||
; @clobbers r16 (R17, X)
|
|
||||||
|
|
||||||
uartHwReadEnsureBuffer:
|
|
||||||
ldd r16, Y+UART_HW_IFACE_OFFS_READMSG_BUFNUM
|
|
||||||
cpi r16, 0xff
|
|
||||||
breq uartHwReadEnsureBuffer_alloc
|
|
||||||
uartHwReadEnsureBuffer_SecRet:
|
|
||||||
sec
|
|
||||||
ret
|
|
||||||
uartHwReadEnsureBuffer_alloc:
|
|
||||||
rcall uartHwAllocateReadBuffer ; (r16, R17, X)
|
|
||||||
brcc uartHwReadEnsureBuffer_error
|
|
||||||
rcall uartHwReadSetBuffer ; (r16)
|
|
||||||
rjmp uartHwReadEnsureBuffer_SecRet
|
|
||||||
uartHwReadEnsureBuffer_error:
|
|
||||||
; no buffer, set error status, skip msg
|
|
||||||
ldd r16, Y+UART_HW_IFACE_OFFS_READMSG_BUFNUM
|
|
||||||
rcall UART_HW_FixedBuffers_Locate ; (r16)
|
|
||||||
ldd r16, Y+UART_HW_IFACE_OFFS_READMSG_BUFNUM
|
|
||||||
rcall uartHwReadResetBuffer ; (r16)
|
|
||||||
ldd r16, Y+UART_HW_IFACE_OFFS_MODE
|
|
||||||
ori r16, UART_HW_MODE_SKIPPING
|
|
||||||
std Y+UART_HW_IFACE_OFFS_MODE, r16
|
|
||||||
ldd r16, Y+UART_HW_IFACE_OFFS_ERR_OVR
|
|
||||||
inc r16
|
|
||||||
breq UART_HW_Interface_RunRead_end
|
|
||||||
std Y+UART_HW_IFACE_OFFS_ERR_OVR, r16
|
|
||||||
clc
|
|
||||||
uartHwReadEnsureBuffer_end:
|
|
||||||
ret
|
|
||||||
; @end
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
; ---------------------------------------------------------------------------
|
; ---------------------------------------------------------------------------
|
||||||
; @routine uartHwReadSetBuffer
|
; @routine uartHwReadSetBuffer
|
||||||
;
|
;
|
||||||
@@ -108,8 +112,12 @@ uartHwReadSetBuffer:
|
|||||||
; @clobbers r16, X
|
; @clobbers r16, X
|
||||||
|
|
||||||
uartHwReadResetBuffer:
|
uartHwReadResetBuffer:
|
||||||
; reset READ buffer settings, enter skip mode
|
; reset READ buffer settings
|
||||||
ldd r16, Y+UART_HW_IFACE_OFFS_READMSG_BUFNUM
|
ldd r16, Y+UART_HW_IFACE_OFFS_READMSG_BUFNUM
|
||||||
|
cpi r16, 0xff
|
||||||
|
brne uartHwReadResetBuffer_haveBuffer
|
||||||
|
ret
|
||||||
|
uartHwReadResetBuffer_haveBuffer:
|
||||||
rcall UART_HW_FixedBuffers_Locate ; (X)
|
rcall UART_HW_FixedBuffers_Locate ; (X)
|
||||||
ldd r16, Y+UART_HW_IFACE_OFFS_READMSG_BUFNUM
|
ldd r16, Y+UART_HW_IFACE_OFFS_READMSG_BUFNUM
|
||||||
rjmp uartHwReadSetBuffer ; (r16)
|
rjmp uartHwReadSetBuffer ; (r16)
|
||||||
@@ -134,64 +142,20 @@ uartHwResetBufferStartSkipping:
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
; ---------------------------------------------------------------------------
|
|
||||||
; @routine uartHwReadEnsureHeader
|
|
||||||
;
|
|
||||||
; @param Y pointer to start of interface data
|
|
||||||
; @clobbers r16 (r17, r20, r21, X)
|
|
||||||
|
|
||||||
uartHwReadEnsureHeader:
|
|
||||||
ldd r16, Y+UART_HW_IFACE_OFFS_READMSG_LEFT
|
|
||||||
tst r16
|
|
||||||
breq uartHwReadEnsureHeader_readHeader
|
|
||||||
sec
|
|
||||||
ret
|
|
||||||
uartHwReadEnsureHeader_readHeader:
|
|
||||||
; read and validate header (2 bytes)
|
|
||||||
rcall uartHwReadAndValidateHeader ; (r16, r17, r20, r21, X)
|
|
||||||
brcc UART_HW_Interface_RunRead_badMsg
|
|
||||||
ldd r16, Y+UART_HW_IFACE_OFFS_READMSG_USED
|
|
||||||
cpi r16, 2 ; full header in buffer (2 bytes)?
|
|
||||||
brcs UART_HW_Interface_RunRead_end ; nope, done for this round
|
|
||||||
uartHwReadEnsureHeader_end:
|
|
||||||
ret
|
|
||||||
; @end
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
; ---------------------------------------------------------------------------
|
|
||||||
; @routine uartHwReadEnsureBody
|
|
||||||
;
|
|
||||||
; @param Y pointer to start of interface data
|
|
||||||
; @clobbers r20 (r16, r17, r21, x)
|
|
||||||
|
|
||||||
uartHwReadEnsureBody:
|
|
||||||
ldd r20, Y+UART_HW_IFACE_OFFS_READMSG_LEFT
|
|
||||||
tst r20
|
|
||||||
sec
|
|
||||||
breq uartHwReadEnsureBody_end ; no bytes left, message done
|
|
||||||
rcall uartHwReadUptoNumBytes ; (r16, r17, r20, r21, X)
|
|
||||||
ldd r20, Y+UART_HW_IFACE_OFFS_READMSG_LEFT
|
|
||||||
tst r20
|
|
||||||
sec
|
|
||||||
breq uartHwReadEnsureBody_end ; no bytes left, message done
|
|
||||||
clc
|
|
||||||
uartHwReadEnsureBody_end:
|
|
||||||
ret
|
|
||||||
; @end
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
; ---------------------------------------------------------------------------
|
; ---------------------------------------------------------------------------
|
||||||
; @routine uartHwAllocateReadBuffer
|
; @routine uartHwAllocateReadBuffer
|
||||||
;
|
;
|
||||||
|
; @return CFLAG set if buffer set, cleared otherwise
|
||||||
; @param Y pointer to start of interface data
|
; @param Y pointer to start of interface data
|
||||||
; @clobbers r16 (R17, X)
|
; @clobbers r16, R17 (X)
|
||||||
|
|
||||||
uartHwAllocateReadBuffer:
|
uartHwAllocateReadBuffer:
|
||||||
rcall UART_HW_FixedBuffers_Alloc ; (R16, R17, X)
|
rcall UART_HW_FixedBuffers_Alloc ; (R16, R17, X)
|
||||||
brcc uartHwAllocateReadBuffer_end
|
brcc uartHwAllocateReadBuffer_end
|
||||||
std Y+UART_HW_IFACE_OFFS_READMSG_BUFNUM, r16
|
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
|
adiw xh:xl, 1
|
||||||
std Y+UART_HW_IFACE_OFFS_READMSG_PTR, xl
|
std Y+UART_HW_IFACE_OFFS_READMSG_PTR, xl
|
||||||
std Y+UART_HW_IFACE_OFFS_READMSG_PTR+1, xh
|
std Y+UART_HW_IFACE_OFFS_READMSG_PTR+1, xh
|
||||||
@@ -205,47 +169,10 @@ uartHwAllocateReadBuffer_end:
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
; ---------------------------------------------------------------------------
|
|
||||||
; @routine uartHwReadAndValidateHeader
|
|
||||||
;
|
|
||||||
; @param Y pointer to start of interface data
|
|
||||||
; @clobbers r16, r20, X (r17, r21)
|
|
||||||
|
|
||||||
uartHwReadAndValidateHeader:
|
|
||||||
; read until we have 2 bytes
|
|
||||||
ldi r20, 2
|
|
||||||
ldd r16, Y+UART_HW_IFACE_OFFS_READMSG_USED
|
|
||||||
sub r20, r16
|
|
||||||
rcall uartHwReadUptoNumBytes ; (r16, r17, r20, r21, X)
|
|
||||||
; check whether we have 2 bytes
|
|
||||||
ldd r16, Y+UART_HW_IFACE_OFFS_READMSG_USED
|
|
||||||
cpi r16, 2
|
|
||||||
brcs uartHwReadAndValidateHeader_ok ; < 2 bytes in buffer, nothing to do
|
|
||||||
; read and check msg len
|
|
||||||
ldd xl, Y+UART_HW_IFACE_OFFS_READMSG_PTR
|
|
||||||
ldd xh, Y+UART_HW_IFACE_OFFS_READMSG_PTR+1
|
|
||||||
sbiw xh:xl, 1 ; go back one byte, pointing to MSG_LEN
|
|
||||||
ld r16, X
|
|
||||||
cpi r16, UART_HW_FIXEDBUFFERS_SIZE-4 ; minus buffer status byte, dest addr, msglen, crc
|
|
||||||
brcc uartHwReadAndValidateHeader_error ; bad msg length
|
|
||||||
; set number of bytes left to read
|
|
||||||
inc r16 ; account for crc byte
|
|
||||||
std Y+UART_HW_IFACE_OFFS_READMSG_LEFT, r16
|
|
||||||
uartHwReadAndValidateHeader_ok:
|
|
||||||
sec
|
|
||||||
ret
|
|
||||||
uartHwReadAndValidateHeader_error:
|
|
||||||
clc
|
|
||||||
ret
|
|
||||||
; @end
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
; ---------------------------------------------------------------------------
|
; ---------------------------------------------------------------------------
|
||||||
; @routine uartHwReadUptoNumBytes
|
; @routine uartHwReadUptoNumBytes
|
||||||
;
|
;
|
||||||
|
; @return r20 remaining bytes (bytes not yet read)
|
||||||
; @param Y pointer to start of interface data
|
; @param Y pointer to start of interface data
|
||||||
; @param R20 number of bytes to read
|
; @param R20 number of bytes to read
|
||||||
; @clobbers r16, r20, r21, X (R17)
|
; @clobbers r16, r20, r21, X (R17)
|
||||||
@@ -278,3 +205,39 @@ uartHwReadUptoNumBytes_done:
|
|||||||
; @end
|
; @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
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -14,33 +14,23 @@
|
|||||||
; ---------------------------------------------------------------------------
|
; ---------------------------------------------------------------------------
|
||||||
; @routine UART_HW_Interface_RunWrite @global
|
; @routine UART_HW_Interface_RunWrite @global
|
||||||
;
|
;
|
||||||
|
; Get messages via @ref UART_HW_GetNextOutgoingMsgNum and fill them into
|
||||||
|
; the outbound ringbuffer of this interface.
|
||||||
|
;
|
||||||
; @param Y pointer to start of interface data
|
; @param Y pointer to start of interface data
|
||||||
; @clobbers r16, r19, X (R17, R18, R20, R21)
|
; @clobbers r16, r19, X (R17, R18, R20, R21)
|
||||||
|
|
||||||
UART_HW_Interface_RunWrite:
|
UART_HW_Interface_RunWrite:
|
||||||
ldd r19, Y+UART_HW_IFACE_OFFS_WRITEMSG_BUFNUM
|
ldd r19, Y+UART_HW_IFACE_OFFS_WRITEMSG_BUFNUM
|
||||||
cpi r19, 0xff
|
cpi r19, 0xff
|
||||||
brne UART_HW_Interface_RunWrite_haveMsg
|
breq UART_HW_Interface_RunWrite_end ; nothing to do
|
||||||
rcall UART_HW_GetNextOutgoingMsgNum ; (R17, R18, X)
|
|
||||||
rcall UART_HW_FixedBuffers_Locate ; (R16)
|
|
||||||
brcc UART_HW_Interface_RunWrite_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
|
|
||||||
inc r16
|
|
||||||
inc r16
|
|
||||||
std Y+UART_HW_IFACE_OFFS_WRITEMSG_LEFT, r16
|
|
||||||
std Y+UART_HW_IFACE_OFFS_WRITEMSG_USED, r16
|
|
||||||
UART_HW_Interface_RunWrite_haveMsg:
|
UART_HW_Interface_RunWrite_haveMsg:
|
||||||
ldd r20, Y+UART_HW_IFACE_OFFS_WRITEMSG_LEFT
|
ldd r20, Y+UART_HW_IFACE_OFFS_WRITEMSG_LEFT
|
||||||
rcall uartHwWriteUptoNumBytes ; (r16, r17, r18, r20, r21, X)
|
rcall uartHwWriteUptoNumBytes ; (r16, r17, r18, r20, r21, X)
|
||||||
ldd r16, Y+UART_HW_IFACE_OFFS_WRITEMSG_LEFT
|
ldd r16, Y+UART_HW_IFACE_OFFS_WRITEMSG_LEFT
|
||||||
tst r16
|
tst r16
|
||||||
brne UART_HW_Interface_RunWrite_end ; still bytes left to write
|
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
|
ldd r16, Y+UART_HW_IFACE_OFFS_WRITEMSG_BUFNUM
|
||||||
rcall UART_HW_FixedBuffers_ReleaseByNum
|
rcall UART_HW_FixedBuffers_ReleaseByNum
|
||||||
ldi r16, 0xff ; reset buffer number
|
ldi r16, 0xff ; reset buffer number
|
||||||
@@ -51,6 +41,35 @@ UART_HW_Interface_RunWrite_end:
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @routine UART_HW_Interface_WriteSetBuffer
|
||||||
|
;
|
||||||
|
; Set given fixed buffer as source for @ref UART_HW_Interface_RunWrite.
|
||||||
|
;
|
||||||
|
; @param r16 buffer num
|
||||||
|
; @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
|
; @routine uartHwWriteUptoNumBytes
|
||||||
;
|
;
|
||||||
@@ -84,3 +103,4 @@ uartHwWriteUptoNumBytes_done:
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user