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