avr: new uart_hw2 module comonuart1 works now.

This commit is contained in:
Martin Preuss
2025-07-01 00:52:44 +02:00
parent 9206341032
commit 20b7c3f50d

View File

@@ -31,13 +31,20 @@ ComOnUart1_Init:
ldi yh, HIGH(comOnUart1_iface)
rcall NET_Interface_Init ; (R16, R17, X)
ldi r16, 0xff
std Y+UART_HW_IFACE_OFFS_WRITEBUFNUM, r16
std Y+UART_HW2_IFACE_OFFS_WRITEBUFNUM, r16
ldi r16, UART_HW2_MODE_IDLE
std Y+UART_HW2_IFACE_OFFS_MODE, r16
clr r16
std Y+NET_IFACE_OFFS_IFACENUM, r16
rcall comOnUart1SetAttnInput
sbi COM_IRQ_ADDR_ATTN1, COM_IRQ_BIT_ATTN1 ; enable pin change irq for ATTN line
inr r16, GIMSK ; enable pin change irq PCIE0 or PCIE1
sbr r16, (1<<COM_IRQ_GIMSK_ATTN1)
outr GIMSK, r16
ldi r16, (1<<COM_IRQ_GIFR_ATTN1) ; clear pending irq by writing 1 to ATTN bit
outr GIFR, r16
; set baudrate
.if clock == 8000000
ldi r16, 25 ; (19.2Kb/s at 8MHz)
@@ -49,12 +56,12 @@ ComOnUart1_Init:
ldi r17, 0
.endif
sts UBRR1H, r17
sts UBRR1L, r16
outr UBRR1H, r17
outr UBRR1L, r16
; set character format
ldi r16, (1<<USBS1)|(3<<UCSZ10)
sts UCSR1C, r16
outr UCSR1C, r16
sec
ret
; @end
@@ -138,15 +145,11 @@ comOnUart1StartReading:
; @param Y pointer to interface data in SRAM
; @param R16 buffer number
; @return CFLAG set if writing started, cleared otherwise
; @clobbers R16, R17, X, Z (R24, R25)
; @clobbers R16, R17, X, Z (R22, R24, R25)
comOnUart1StartWriting:
rcall comOnUart1IsAttnLow ; (none)
brcs comOnUart1StartWriting_ebusy
; set ATTN low
rcall comOnUart1SetAttnLow ; (none)
Utils_WaitNanoSecs COM_BIT_LENGTH, 0, r22 ; wait for one bit duration
Utils_WaitNanoSecs COM_BIT_LENGTH, 0, r22 ; wait for one bit duration
rcall comOnUart1AcquireAttn ; (R22)
brcc comOnUart1StartWriting_ebusy
; copy buffer
rcall NET_Buffer_Locate ; (R17)
std Y+UART_HW2_IFACE_OFFS_WRITEBUFNUM, r16
@@ -256,7 +259,7 @@ comOnUart1RunIdle:
; look for outbound message
rcall NET_Interface_PeekNextOutgoingMsgNum ; r16=msgNum
brcc comOnUart1RunIdle_end ; no outmsg in queue
rcall comOnUart1StartWriting ; (R16, R17, R24, R25, X, Z)
rcall comOnUart1StartWriting ; (R16, R17, R22, R24, R25, X, Z)
brcc comOnUart1RunIdle_end
rcall NET_Interface_GetNextOutgoingMsgNum ; take current msg off the queue
comOnUart1RunIdle_end:
@@ -298,52 +301,48 @@ comOnUart1RunSkipping_end:
; @routine comOnUart1RunMsgReceived
;
; @param Y pointer to interface data in SRAM
; @clobbers R16, R17, R18, X (R19, R20, R24, R25)
; @clobbers R16, R17, R18, X, Z (R19, R20, R24, R25)
comOnUart1RunMsgReceived:
push zl
push zh
mov xl, yl
mov xh, yh
adiw xh:xl, UART_HW2_IFACE_OFFS_BUFFER
mov zl, xl ; Z=buffer in IFACE
mov zh, xh
rcall NETMSG_CheckMessageInBuffer ; (R16, R17, R18, R19, R20, X)
brne comOnUart1RunMsgReceived_econtent
; msg valid, alloc buffer
rcall NET_Buffer_Alloc ; X=buffer, R16=bufnum (R16, R17, X)
brcc comOnUart1RunMsgReceived_enobuf
mov r18, r16 ; buffer num
rcall NET_Interface_SetIfaceNumInBuffer ; (R16, R17)
adiw xh:xl, 1
ldd r17, Y+UART_HW2_IFACE_OFFS_BUFUSED ; always is at least 2 here
mov xl, yl
mov xh, yh
adiw xh:xl, UART_HW2_IFACE_OFFS_BUFFER
mov zl, xl ; Z=buffer in IFACE
mov zh, xh
rcall NETMSG_CheckMessageInBuffer ; (R16, R17, R18, R19, R20, X)
brcc comOnUart1RunMsgReceived_econtent
; msg valid, alloc buffer
rcall NET_Buffer_Alloc ; X=buffer, R16=bufnum (R16, R17, X)
brcc comOnUart1RunMsgReceived_enobuf
mov r18, r16 ; buffer num
rcall NET_Interface_SetIfaceNumInBuffer ; (R16, R17)
adiw xh:xl, 1
ldd r17, Y+UART_HW2_IFACE_OFFS_BUFUSED ; always is at least 2 here
comOnUart1RunMsgReceived_copyLoop:
ld r16, Z+
st X+, r16
dec r17
brne comOnUart1RunMsgReceived_copyLoop
mov r16, r18 ; buffer num
rcall NET_AddIncomingMsgNum ; (R17, R18, X)
brcc comOnUart1RunMsgReceived_enoadd
ldi r16, NET_IFACE_OFFS_PACKETSIN_LOW
rcall NET_Interface_IncCounter16 ; (R24, R25)
rjmp comOnUart1RunMsgReceived_setIdleAndEnd
ld r16, Z+
st X+, r16
dec r17
brne comOnUart1RunMsgReceived_copyLoop
mov r16, r18 ; buffer num
rcall NET_AddIncomingMsgNum ; (R17, R18, X)
brcc comOnUart1RunMsgReceived_enoadd
ldi r16, NET_IFACE_OFFS_PACKETSIN_LOW
rcall NET_Interface_IncCounter16 ; (R24, R25)
rjmp comOnUart1RunMsgReceived_setIdleAndEnd
comOnUart1RunMsgReceived_enoadd:
rcall NET_Buffer_ReleaseByNum
rjmp comOnUart1RunMsgReceived_enobuf
rcall NET_Buffer_ReleaseByNum
rjmp comOnUart1RunMsgReceived_enobuf
comOnUart1RunMsgReceived_enobuf:
ldi r16, NET_IFACE_OFFS_ERR_NOBUF_LOW
rjmp comOnUart1RunMsgReceived_err
ldi r16, NET_IFACE_OFFS_ERR_NOBUF_LOW
rjmp comOnUart1RunMsgReceived_err
comOnUart1RunMsgReceived_econtent:
ldi r16, NET_IFACE_OFFS_ERR_CONTENT_LOW
ldi r16, NET_IFACE_OFFS_ERR_CONTENT_LOW
comOnUart1RunMsgReceived_err:
rcall NET_Interface_IncCounter16 ; (R24, R25)
rcall NET_Interface_IncCounter16 ; (R24, R25)
comOnUart1RunMsgReceived_setIdleAndEnd:
ldi r16, UART_HW2_MODE_IDLE
rcall comOnUart1SetMode ; (R17)
ldi r16, UART_HW2_MODE_IDLE
rcall comOnUart1SetMode ; (R17)
comOnUart1RunMsgReceived_end:
pop zl
pop zh
ret
; @end
@@ -398,6 +397,30 @@ comOnUart1RunMsgSent:
; ---------------------------------------------------------------------------
; @routine comOnUart1AcquireAttn
;
; Set ATTN low only if it is high.
; @return CFLAG set if ATTN acquired (including waiting time), cleared otherwise
;
; @clobbers R22
comOnUart1AcquireAttn:
rcall comOnUart1IsAttnLow ; (none)
brcc comOnUart1AcquireAttn_isHigh
clc
rjmp comOnUart1AcquireAttn_end
comOnUart1AcquireAttn_isHigh:
; set ATTN low
rcall comOnUart1SetAttnLow ; (none)
Utils_WaitNanoSecs COM_BIT_LENGTH, 0, r22 ; wait for one bit duration
Utils_WaitNanoSecs COM_BIT_LENGTH, 0, r22 ; wait for one bit duration
sec
comOnUart1AcquireAttn_end:
ret
; @end
; ---------------------------------------------------------------------------
; @routine comOnUart1StartRx
@@ -435,10 +458,10 @@ comOnUart1StopRx:
comOnUart1StartTx:
lds r16, UCSR1A
cbr r16, (1<<TXC1) ; clear TXCn interrupt
sts UCSR1A, r16
lds r16, UCSR1B
outr UCSR1A, r16
inr r16, UCSR1B
sbr r16, (1<<UDRIE1) | (1<<TXC1) | (1<<TXEN1) ; enable TX UDRE and TXC1 interrupt, enable transceive
sts UCSR1B, r16
outr UCSR1B, r16
ret
; @end
@@ -708,13 +731,11 @@ comOnUart1RxCharIsr:
cpi r18, 2
brne comOnUart1RxCharIsr_end
; determine msg size
sbiw xh:xl, 1 ; determine message length (msgLen at previous pos)
ld r16, X+ ; read payload length byte
subi r16, -4 ; add 4 (buffer header, dest addr, length, crc byte)
cpi r16, UART_HW2_BUFFER_SIZE ; total msg length ok?
inc r16 ; last byte was payload length, add byte for crc
cp r16, r17 ; compare remaining length against remaining space
brcc comOnUart1RxCharIsr_emsgsize ; msg too long
subi r16, 2 ; subtract bytes already received
std Y+UART_HW2_IFACE_OFFS_BUFLEFT, r16 ; set new number of bytes left
tst r16
brne comOnUart1RxCharIsr_end ; jmp if still bytes left to receive
comOnUart1RxCharIsr_complete:
rcall comOnUart1StopRx
@@ -750,7 +771,7 @@ comOnUart1RxCharIsr_end:
comOnUart1TxUdreIsr:
inr r16, UCSR1A
sbrs r16,UDRE1
sbrs r16, UDRE1
rjmp comOnUart1TxUdreIsr_disable_irq ; not ready
; check bytes left
ldd r17, Y+UART_HW2_IFACE_OFFS_BUFLEFT
@@ -763,7 +784,7 @@ comOnUart1TxUdreIsr:
std Y+UART_HW2_IFACE_OFFS_BUFPOS_LOW, xl
std Y+UART_HW2_IFACE_OFFS_BUFPOS_HIGH, xh
; send byte
sts UDR1, r16 ; send byte
outr UDR1, r16 ; send byte
; decreased counter
dec r17
std Y+UART_HW2_IFACE_OFFS_BUFLEFT, r17