avr/uart_hw: basically works for a while then stops...
This commit is contained in:
@@ -54,6 +54,7 @@
|
|||||||
.equ COM_ATTN_DDR = DDRA
|
.equ COM_ATTN_DDR = DDRA
|
||||||
.equ COM_ATTN_INPUT = PINA
|
.equ COM_ATTN_INPUT = PINA
|
||||||
.equ COM_ATTN_OUTPUT = PORTA
|
.equ COM_ATTN_OUTPUT = PORTA
|
||||||
|
.equ COM_ATTN_PUE = PUEA
|
||||||
.equ COM_ATTN_PIN = PORTA0
|
.equ COM_ATTN_PIN = PORTA0
|
||||||
|
|
||||||
.equ COM_IRQ_ADDR_ATTN = PCMSK0
|
.equ COM_IRQ_ADDR_ATTN = PCMSK0
|
||||||
|
|||||||
@@ -25,8 +25,9 @@
|
|||||||
.equ clock=8000000 ; Define the clock frequency
|
.equ clock=8000000 ; Define the clock frequency
|
||||||
|
|
||||||
;.equ SEND_DEVICE_EVERY = 3000
|
;.equ SEND_DEVICE_EVERY = 3000
|
||||||
.equ SEND_DEVICE_EVERY = 100 ; every 10s
|
.equ SEND_DEVICE_EVERY = 520 ; every 52s
|
||||||
.equ SEND_STATS_EVERY = 600 ; every minute
|
.equ SEND_STATS_EVERY = 240 ; every 24s
|
||||||
|
.equ SEND_DEBUG_EVERY = 110
|
||||||
|
|
||||||
.nolist
|
.nolist
|
||||||
.include "include/tn841def.inc" ; Define device ATtiny841
|
.include "include/tn841def.inc" ; Define device ATtiny841
|
||||||
@@ -90,37 +91,37 @@
|
|||||||
; ---------------------------------------------------------------------------
|
; ---------------------------------------------------------------------------
|
||||||
; Reset and interrupt vectors
|
; Reset and interrupt vectors
|
||||||
|
|
||||||
rjmp BOOTLOADER_ADDR ; 1: RESET Reset vector use this for flashed system
|
rjmp BOOTLOADER_ADDR ; 1: RESET Reset vector use this for flashed system
|
||||||
reti ; 2: INT0 External Interrupt Request 0
|
reti ; 2: INT0 External Interrupt Request 0
|
||||||
reti ; 3: PCINT0 Pin Change Interrupt 0
|
rjmp ComOnUart0_AttnChangeIsr ; 3: PCINT0 Pin Change Interrupt 0
|
||||||
reti ; 4: PCINT1 Pin Change Interrupt 1
|
reti ; 4: PCINT1 Pin Change Interrupt 1
|
||||||
reti ; 5: WDT Watchdog Time-out
|
reti ; 5: WDT Watchdog Time-out
|
||||||
reti ; 6: TIM1_CAPT Timer/Counter1 Capture Event
|
reti ; 6: TIM1_CAPT Timer/Counter1 Capture Event
|
||||||
reti ; 7: TIM1_COMPA (OC1A) Timer/Counter1 Compare Match A
|
reti ; 7: TIM1_COMPA (OC1A) Timer/Counter1 Compare Match A
|
||||||
reti ; 8: TIM1_COMPB (OC1B) Timer/Counter1 Compare Match B
|
reti ; 8: TIM1_COMPB (OC1B) Timer/Counter1 Compare Match B
|
||||||
reti ; 9: TIM1_OVF (OVF1) Timer/Counter1 Overflow
|
reti ; 9: TIM1_OVF (OVF1) Timer/Counter1 Overflow
|
||||||
rjmp baseTimerIrqOC0A ; 10: TIM0_COMPA (OC0A) Timer/Counter0 Compare Match A
|
rjmp baseTimerIrqOC0A ; 10: TIM0_COMPA (OC0A) Timer/Counter0 Compare Match A
|
||||||
reti ; 11: TIM0_COMPB (OC0B) Timer/Counter0 Compare Match B
|
reti ; 11: TIM0_COMPB (OC0B) Timer/Counter0 Compare Match B
|
||||||
reti ; 12: TIM0_OVF (OVF0) Timer/Counter0 Overflow
|
reti ; 12: TIM0_OVF (OVF0) Timer/Counter0 Overflow
|
||||||
reti ; 13: ANA_COMP0 Analog Comparator 0
|
reti ; 13: ANA_COMP0 Analog Comparator 0
|
||||||
reti ; 14: ADC_READY ADC Conversion Complete
|
reti ; 14: ADC_READY ADC Conversion Complete
|
||||||
reti ; 15: EE_RDY (ERDY) EEPROM Ready
|
reti ; 15: EE_RDY (ERDY) EEPROM Ready
|
||||||
reti ; 16: ANA_COMP1 Analog Comparator 1
|
reti ; 16: ANA_COMP1 Analog Comparator 1
|
||||||
reti ; 17: TIM2_CAPT Timer/Counter2 Capture Event
|
reti ; 17: TIM2_CAPT Timer/Counter2 Capture Event
|
||||||
reti ; 18: TIM2_COMPA (OC2A) Timer/Counter2 Compare Match A
|
reti ; 18: TIM2_COMPA (OC2A) Timer/Counter2 Compare Match A
|
||||||
reti ; 19: TIM2_COMPB (OC2B) Timer/Counter2 Compare Match B
|
reti ; 19: TIM2_COMPB (OC2B) Timer/Counter2 Compare Match B
|
||||||
reti ; 20: TIM2_OVF (OVF2) Timer/Counter2 Overflow
|
reti ; 20: TIM2_OVF (OVF2) Timer/Counter2 Overflow
|
||||||
reti ; 21: SPI SPI Serial Transfer Complete
|
reti ; 21: SPI SPI Serial Transfer Complete
|
||||||
reti ; 22: USART0_RXS USART0 Rx Start
|
reti ; 22: USART0_RXS USART0 Rx Start
|
||||||
reti ; 23: USART0_RXC USART0 Rx Complete
|
rjmp ComOnUart0_RxCharIsr ; 23: USART0_RXC USART0 Rx Complete
|
||||||
reti ; 24: USART0_DRE USART0 Data Register Empty
|
rjmp ComOnUart0_TxUdreIsr ; 24: USART0_DRE USART0 Data Register Empty
|
||||||
reti ; 25: USART0_TXC USART0 Tx Complete
|
rjmp ComOnUart0_TxCharIsr ; 25: USART0_TXC USART0 Tx Complete
|
||||||
reti ; 26: USART1_RXS USART1 Rx Start
|
reti ; 26: USART1_RXS USART1 Rx Start
|
||||||
rjmp TtyOnUart1_RxCharIsr ; 27: USART1_RXC USART1 Rx Complete
|
rjmp TtyOnUart1_RxCharIsr ; 27: USART1_RXC USART1 Rx Complete
|
||||||
rjmp TtyOnUart1_TxUdreIsr ; 28: USART1_DRE USART1 Data Register Empty
|
rjmp TtyOnUart1_TxUdreIsr ; 28: USART1_DRE USART1 Data Register Empty
|
||||||
rjmp TtyOnUart1_TxCharIsr ; 29: USART1_TXC USART1 Tx Complete
|
rjmp TtyOnUart1_TxCharIsr ; 29: USART1_TXC USART1 Tx Complete
|
||||||
reti ; 30: TWI Two-Wire-Interface
|
reti ; 30: TWI Two-Wire-Interface
|
||||||
reti ; 31: RESERVED reserved
|
reti ; 31: RESERVED reserved
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -203,11 +204,12 @@ onSystemTimerTick:
|
|||||||
#ifdef MODULES_LED_SIMPLE
|
#ifdef MODULES_LED_SIMPLE
|
||||||
rcall LedSimple_Every100ms
|
rcall LedSimple_Every100ms
|
||||||
#endif
|
#endif
|
||||||
|
rcall TtyOnUart1_Periodically
|
||||||
|
rcall sendDebug
|
||||||
rcall maybeSendDeviceMsg
|
rcall maybeSendDeviceMsg
|
||||||
rcall maybeSendTStatsMsg
|
rcall maybeSendTStatsMsg
|
||||||
rcall maybeSendRStatsMsg
|
rcall maybeSendRStatsMsg
|
||||||
rcall maybeSendMStatsMsg
|
rcall maybeSendMStatsMsg
|
||||||
rcall TtyOnUart1_Periodically
|
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
|
||||||
@@ -240,6 +242,9 @@ initModules:
|
|||||||
rcall LedSimple_Init
|
rcall LedSimple_Init
|
||||||
rcall NET_Init
|
rcall NET_Init
|
||||||
rcall TtyOnUart1_Init
|
rcall TtyOnUart1_Init
|
||||||
|
ldi r16, 0xfe
|
||||||
|
sts ttyOnUart1_iface+NET_IFACE_OFFS_ADDRESS, r16
|
||||||
|
rcall ComOnUart0_Init
|
||||||
|
|
||||||
ldi r16, LOW(SEND_DEVICE_EVERY)
|
ldi r16, LOW(SEND_DEVICE_EVERY)
|
||||||
sts deviceCounter, r16
|
sts deviceCounter, r16
|
||||||
@@ -261,6 +266,11 @@ initModules:
|
|||||||
ldi r16, HIGH(SEND_STATS_EVERY+20)
|
ldi r16, HIGH(SEND_STATS_EVERY+20)
|
||||||
sts sendMStatsCounter+1, r16
|
sts sendMStatsCounter+1, r16
|
||||||
|
|
||||||
|
ldi r16, LOW(SEND_DEBUG_EVERY)
|
||||||
|
sts debugMsgCounter, r16
|
||||||
|
ldi r16, HIGH(SEND_DEBUG_EVERY)
|
||||||
|
sts debugMsgCounter+1, r16
|
||||||
|
|
||||||
ret
|
ret
|
||||||
; @end
|
; @end
|
||||||
|
|
||||||
@@ -292,12 +302,15 @@ initModules:
|
|||||||
.include "modules/network/msg/sendstats-w.asm"
|
.include "modules/network/msg/sendstats-w.asm"
|
||||||
.include "modules/network/msg/recvstats-w.asm"
|
.include "modules/network/msg/recvstats-w.asm"
|
||||||
.include "modules/network/msg/memstats-w.asm"
|
.include "modules/network/msg/memstats-w.asm"
|
||||||
|
.include "modules/network/msg/debug-w.asm"
|
||||||
|
|
||||||
.include "modules/uart_hw/defs.asm"
|
.include "modules/uart_hw/defs.asm"
|
||||||
.include "modules/uart_hw/lowlevel.asm"
|
.include "modules/uart_hw/lowlevel.asm"
|
||||||
.include "modules/uart_hw/m_lowlevel_uart.asm"
|
.include "modules/uart_hw/m_lowlevel_uart.asm"
|
||||||
|
.include "modules/uart_hw/lowlevel_uart0.asm"
|
||||||
.include "modules/uart_hw/lowlevel_uart1.asm"
|
.include "modules/uart_hw/lowlevel_uart1.asm"
|
||||||
.include "modules/uart_hw/ttyonuart1.asm"
|
.include "modules/uart_hw/ttyonuart1.asm"
|
||||||
|
.include "modules/uart_hw/comonuart0.asm"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -320,12 +333,8 @@ maybeSendDeviceMsg:
|
|||||||
rcall NETMSG_Device_Write ; (R16, R17, R18, R19, R20, R21, Z)
|
rcall NETMSG_Device_Write ; (R16, R17, R18, R19, R20, R21, Z)
|
||||||
sbiw xh:xl, 1
|
sbiw xh:xl, 1
|
||||||
pop r16
|
pop r16
|
||||||
push r16
|
rcall NET_Interface_AddOrReleaseOutMsg ; (R16, R17, R18, X)
|
||||||
rcall NET_Interface_AddOutgoingMsgNum ; (R17, R18, X)
|
brcc maybeSendDeviceMsg_end
|
||||||
pop r16
|
|
||||||
brcs maybeSendDeviceMsg_resetCounter
|
|
||||||
rcall NET_Buffer_ReleaseByNum ; (R16, X)
|
|
||||||
rjmp maybeSendDeviceMsg_end
|
|
||||||
; reset counter
|
; reset counter
|
||||||
maybeSendDeviceMsg_resetCounter:
|
maybeSendDeviceMsg_resetCounter:
|
||||||
ldi r24, LOW(SEND_DEVICE_EVERY)
|
ldi r24, LOW(SEND_DEVICE_EVERY)
|
||||||
@@ -382,9 +391,15 @@ maybeSendRStatsMsg:
|
|||||||
; brcc maybeSendTStatsMsg_resetCounter
|
; brcc maybeSendTStatsMsg_resetCounter
|
||||||
brcc maybeSendRStatsMsg_end
|
brcc maybeSendRStatsMsg_end
|
||||||
push r16
|
push r16
|
||||||
adiw xh:xl, 1
|
push yl
|
||||||
rcall NETMSG_RecvStats_Write ; (R16, R17, R18, R19, R20, R21, Z)
|
push yh
|
||||||
sbiw xh:xl, 1
|
ldi yl, LOW(comOnUart0_iface)
|
||||||
|
ldi yh, HIGH(comOnUart0_iface)
|
||||||
|
adiw xh:xl, 1
|
||||||
|
rcall NETMSG_RecvStats_Write ; (R16, R17, R18, R19, R20, R21, Z)
|
||||||
|
sbiw xh:xl, 1
|
||||||
|
pop yh
|
||||||
|
pop yl
|
||||||
pop r16
|
pop r16
|
||||||
rcall NET_Interface_AddOrReleaseOutMsg ; (R16, R17, R18, X)
|
rcall NET_Interface_AddOrReleaseOutMsg ; (R16, R17, R18, X)
|
||||||
brcc maybeSendRStatsMsg_end
|
brcc maybeSendRStatsMsg_end
|
||||||
@@ -432,10 +447,7 @@ maybeSendMStatsMsg_end:
|
|||||||
|
|
||||||
|
|
||||||
checkRecvdMsg:
|
checkRecvdMsg:
|
||||||
ldi yl, LOW(ttyOnUart1_iface)
|
rcall NET_PeekNextIncomingMsgNum ; check read queue (bufNum->r16)
|
||||||
ldi yh, HIGH(ttyOnUart1_iface)
|
|
||||||
|
|
||||||
rcall NET_PeekNextIncomingMsgNum ; check read queue
|
|
||||||
brcc checkRecvdMsg_end ; no msg, jmp
|
brcc checkRecvdMsg_end ; no msg, jmp
|
||||||
rcall NET_Buffer_Locate ; (R17)
|
rcall NET_Buffer_Locate ; (R17)
|
||||||
adiw xh:xl, 1
|
adiw xh:xl, 1
|
||||||
@@ -443,20 +455,157 @@ checkRecvdMsg:
|
|||||||
rcall NETMSG_CheckMessageInBuffer ; (R16, R17, R18, R19, R20, X)
|
rcall NETMSG_CheckMessageInBuffer ; (R16, R17, R18, R19, R20, X)
|
||||||
pop r16
|
pop r16
|
||||||
brcs checkRecvdMsg_sendMsg
|
brcs checkRecvdMsg_sendMsg
|
||||||
|
; release buffer
|
||||||
rcall NET_GetNextIncomingMsgNum ; take off the queue
|
rcall NET_GetNextIncomingMsgNum ; take off the queue
|
||||||
rcall NET_Buffer_ReleaseByNum ; delete
|
rcall NET_Buffer_ReleaseByNum ; delete
|
||||||
ldi r16, NET_IFACE_OFFS_ERR_CONTENT_LOW
|
clc
|
||||||
rcall NET_Interface_IncCounter16 ; (R24, R25)
|
|
||||||
rjmp checkRecvdMsg_end
|
rjmp checkRecvdMsg_end
|
||||||
checkRecvdMsg_sendMsg:
|
checkRecvdMsg_sendMsg:
|
||||||
rcall NET_Interface_AddOutgoingMsgNum ; try to add msg to interface
|
sbiw xh:xl, 1
|
||||||
|
ld r17, X
|
||||||
|
andi r17, (NET_IFACE_BUFFER_IFACENUM1_BIT | NET_IFACE_BUFFER_IFACENUM0_BIT)
|
||||||
|
rcall reverseInterfaceNum
|
||||||
|
rcall addMsgToInterface
|
||||||
brcc checkRecvdMsg_end ; could not add, jmp
|
brcc checkRecvdMsg_end ; could not add, jmp
|
||||||
rcall NET_GetNextIncomingMsgNum ; take off the queue
|
rcall NET_GetNextIncomingMsgNum ; take off the queue
|
||||||
|
sec
|
||||||
checkRecvdMsg_end:
|
checkRecvdMsg_end:
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; @return r17 reversed interface number
|
||||||
|
; @param r17 buffer num
|
||||||
|
; @clobbers r17
|
||||||
|
|
||||||
|
reverseInterfaceNum:
|
||||||
|
cpi r17, COMONUART0_IFACENUM
|
||||||
|
brne reverseInterfaceNum_notUart0
|
||||||
|
ldi r17, TTYONUART1_IFACENUM
|
||||||
|
ret
|
||||||
|
reverseInterfaceNum_notUart0:
|
||||||
|
ldi r17, COMONUART0_IFACENUM
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; @param r16 buffer num
|
||||||
|
; @param r17 interface num
|
||||||
|
|
||||||
|
addMsgToInterface:
|
||||||
|
cpi r16, COMONUART0_IFACENUM
|
||||||
|
brne addMsgToInterface_notUart0
|
||||||
|
ldi yl, LOW(ttyOnUart1_iface)
|
||||||
|
ldi yh, HIGH(ttyOnUart1_iface)
|
||||||
|
rjmp NET_Interface_AddOutgoingMsgNum ; try to add msg to interface
|
||||||
|
addMsgToInterface_notUart0:
|
||||||
|
cpi r16, TTYONUART1_IFACENUM
|
||||||
|
brne addMsgToInterface_end
|
||||||
|
ldi yl, LOW(comOnUart0_iface)
|
||||||
|
ldi yh, HIGH(comOnUart0_iface)
|
||||||
|
rjmp NET_Interface_AddOutgoingMsgNum ; try to add msg to interface
|
||||||
|
addMsgToInterface_end:
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
sendDebug:
|
||||||
|
ldi yl, LOW(ttyOnUart1_iface)
|
||||||
|
ldi yh, HIGH(ttyOnUart1_iface)
|
||||||
|
|
||||||
|
lds r24, debugMsgCounter
|
||||||
|
lds r25, debugMsgCounter+1
|
||||||
|
sbiw r25:r24, 1
|
||||||
|
brne sendDebug_storeCounter
|
||||||
|
; send device msg
|
||||||
|
rcall NET_Buffer_Alloc ; (R16, R17, X)
|
||||||
|
brcc sendDebug_end
|
||||||
|
push r16
|
||||||
|
adiw xh:xl, 1
|
||||||
|
rcall writeDebugMsg
|
||||||
|
sbiw xh:xl, 1
|
||||||
|
pop r16
|
||||||
|
rcall NET_Interface_AddOrReleaseOutMsg ; (R16, R17, R18, X)
|
||||||
|
brcc sendDebug_end
|
||||||
|
; reset counter
|
||||||
|
sendDebug_resetCounter:
|
||||||
|
ldi r24, LOW(SEND_DEBUG_EVERY)
|
||||||
|
ldi r25, HIGH(SEND_DEBUG_EVERY)
|
||||||
|
sendDebug_storeCounter:
|
||||||
|
sts debugMsgCounter, r24
|
||||||
|
sts debugMsgCounter+1, r25
|
||||||
|
sendDebug_end:
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
writeDebugMsg:
|
||||||
|
push yl
|
||||||
|
push yh
|
||||||
|
ldi yl, LOW(netBuffers)
|
||||||
|
ldi yh, HIGH(netBuffers)
|
||||||
|
|
||||||
|
rcall writeBufferInfoToRegs
|
||||||
|
mov r0, r17
|
||||||
|
mov r1, r18
|
||||||
|
adiw yh:yl, NET_BUFFERS_SIZE
|
||||||
|
|
||||||
|
rcall writeBufferInfoToRegs
|
||||||
|
mov r2, r17
|
||||||
|
mov r3, r18
|
||||||
|
adiw yh:yl, NET_BUFFERS_SIZE
|
||||||
|
|
||||||
|
rcall writeBufferInfoToRegs
|
||||||
|
mov r4, r17
|
||||||
|
mov r5, r18
|
||||||
|
adiw yh:yl, NET_BUFFERS_SIZE
|
||||||
|
|
||||||
|
rcall writeBufferInfoToRegs
|
||||||
|
mov r6, r17
|
||||||
|
mov r7, r18
|
||||||
|
adiw yh:yl, NET_BUFFERS_SIZE
|
||||||
|
|
||||||
|
rcall writeBufferInfoToRegs
|
||||||
|
mov r8, r17
|
||||||
|
mov r9, r18
|
||||||
|
adiw yh:yl, NET_BUFFERS_SIZE
|
||||||
|
|
||||||
|
rcall writeBufferInfoToRegs
|
||||||
|
mov r10, r17
|
||||||
|
mov r11, r18
|
||||||
|
adiw yh:yl, NET_BUFFERS_SIZE
|
||||||
|
|
||||||
|
clr r12
|
||||||
|
clr r13
|
||||||
|
|
||||||
|
push xl
|
||||||
|
push xh
|
||||||
|
rcall NET_Buffer_CountUsed
|
||||||
|
pop xh
|
||||||
|
pop xl
|
||||||
|
mov r14, r16
|
||||||
|
pop yh
|
||||||
|
pop yl
|
||||||
|
|
||||||
|
rcall NETMSG_Debug_Write ; (R16, R17, R18, R19, R20, R21, Z)
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
writeBufferInfoToRegs:
|
||||||
|
ldi r17, 0xff
|
||||||
|
ldi r18, 0xff
|
||||||
|
ld r16, Y
|
||||||
|
andi r16, 0x80
|
||||||
|
breq writeBufferInfoToRegs_end
|
||||||
|
ldd r17, Y+(1+2) ; cmd code
|
||||||
|
ldd r18, Y+(1+3) ; source addr
|
||||||
|
writeBufferInfoToRegs_end:
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
DEBUG1:
|
DEBUG1:
|
||||||
ldi r19, 10
|
ldi r19, 10
|
||||||
ldi r20, 2
|
ldi r20, 2
|
||||||
@@ -534,6 +683,7 @@ programRamBegin:
|
|||||||
sendTStatsCounter: .byte 2
|
sendTStatsCounter: .byte 2
|
||||||
sendRStatsCounter: .byte 2
|
sendRStatsCounter: .byte 2
|
||||||
sendMStatsCounter: .byte 2
|
sendMStatsCounter: .byte 2
|
||||||
|
debugMsgCounter: .byte 2
|
||||||
programRamEnd:
|
programRamEnd:
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -11,10 +11,6 @@
|
|||||||
; ===========================================================================
|
; ===========================================================================
|
||||||
; defs
|
; defs
|
||||||
|
|
||||||
.equ NET_BUFFER_INUSE_BIT = 7
|
|
||||||
.equ NET_BUFFER_IFACENUM1_BIT = 1
|
|
||||||
.equ NET_BUFFER_IFACENUM0_BIT = 0
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -50,7 +46,7 @@ NET_Buffer_Alloc:
|
|||||||
ldi xh, HIGH(netBuffers)
|
ldi xh, HIGH(netBuffers)
|
||||||
m_fixedbuf_reserve NET_BUFFERS_SIZE, NET_BUFFERS_NUM
|
m_fixedbuf_reserve NET_BUFFERS_SIZE, NET_BUFFERS_NUM
|
||||||
brcc NET_Buffer_Alloc_end
|
brcc NET_Buffer_Alloc_end
|
||||||
ldi r17, (1<<NET_BUFFER_INUSE_BIT)
|
ldi r17, (1<<NET_IFACE_BUFFER_INUSE_BIT)
|
||||||
st X, r17
|
st X, r17
|
||||||
NET_Buffer_Alloc_end:
|
NET_Buffer_Alloc_end:
|
||||||
ret
|
ret
|
||||||
@@ -78,7 +74,7 @@ NET_Buffer_ReleaseByAddr:
|
|||||||
; @clobbers X (R16)
|
; @clobbers X (R16)
|
||||||
|
|
||||||
NET_Buffer_ReleaseByNum:
|
NET_Buffer_ReleaseByNum:
|
||||||
rcall NET_Buffer_Locate ; (R16)
|
rcall NET_Buffer_Locate ; (R16, X)
|
||||||
brcc NET_Buffer_ReleaseByNum_end
|
brcc NET_Buffer_ReleaseByNum_end
|
||||||
rcall NET_Buffer_ReleaseByAddr ; (R16)
|
rcall NET_Buffer_ReleaseByAddr ; (R16)
|
||||||
NET_Buffer_ReleaseByNum_end:
|
NET_Buffer_ReleaseByNum_end:
|
||||||
|
|||||||
@@ -13,7 +13,7 @@
|
|||||||
networkDataBegin:
|
networkDataBegin:
|
||||||
; buffers for incoming and outgoing messages
|
; buffers for incoming and outgoing messages
|
||||||
netBuffers: .byte NET_BUFFERS_NUM*NET_BUFFERS_SIZE
|
netBuffers: .byte NET_BUFFERS_NUM*NET_BUFFERS_SIZE
|
||||||
netRingBufferMsgNumIn: .byte NET_MSGNUMINBUF_SIZE
|
netRingBufferMsgNumIn: .byte RINGBUFFERY_SIZE+NET_MSGNUMINBUF_SIZE
|
||||||
|
|
||||||
networkDataEnd:
|
networkDataEnd:
|
||||||
|
|
||||||
|
|||||||
@@ -13,6 +13,11 @@
|
|||||||
.equ NET_IFACE_OUTMSGBUF_SIZE = 4 ; max buffer nums in ringbuffer (per interface outbound)
|
.equ NET_IFACE_OUTMSGBUF_SIZE = 4 ; max buffer nums in ringbuffer (per interface outbound)
|
||||||
|
|
||||||
|
|
||||||
|
.equ NET_IFACE_BUFFER_INUSE_BIT = 7
|
||||||
|
.equ NET_IFACE_BUFFER_IFACENUM1_BIT = 1
|
||||||
|
.equ NET_IFACE_BUFFER_IFACENUM0_BIT = 0
|
||||||
|
|
||||||
|
|
||||||
; interface generic data
|
; interface generic data
|
||||||
.equ NET_IFACE_OFFS_IFACENUM = 0 ; interface number (put into received messages)
|
.equ NET_IFACE_OFFS_IFACENUM = 0 ; interface number (put into received messages)
|
||||||
.equ NET_IFACE_OFFS_ADDRESS = 1
|
.equ NET_IFACE_OFFS_ADDRESS = 1
|
||||||
|
|||||||
@@ -163,5 +163,22 @@ NET_Interface_IncCounter16_end:
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @routine NET_Interface_SetIfaceNumInBuffer @global
|
||||||
|
;
|
||||||
|
; @param X pointer to start of buffer
|
||||||
|
; @param Y pointer to start of interface data
|
||||||
|
; @clobbers R16, R17
|
||||||
|
|
||||||
|
NET_Interface_SetIfaceNumInBuffer:
|
||||||
|
ldd r16, Y+NET_IFACE_OFFS_IFACENUM
|
||||||
|
andi r16, (NET_IFACE_BUFFER_IFACENUM1_BIT | NET_IFACE_BUFFER_IFACENUM0_BIT)
|
||||||
|
ld r17, X
|
||||||
|
andi r17, ~(NET_IFACE_BUFFER_IFACENUM1_BIT | NET_IFACE_BUFFER_IFACENUM0_BIT)
|
||||||
|
or r17, r16
|
||||||
|
st X, r17
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -64,7 +64,6 @@ NET_AddIncomingMsgNum:
|
|||||||
;
|
;
|
||||||
; @return CFLAG on success, cleared on error
|
; @return CFLAG on success, cleared on error
|
||||||
; @return R16 buffer number of the next incoming message
|
; @return R16 buffer number of the next incoming message
|
||||||
; @param Y pointer to start of interface data
|
|
||||||
; @clobbers R17, R18, X
|
; @clobbers R17, R18, X
|
||||||
|
|
||||||
NET_GetNextIncomingMsgNum:
|
NET_GetNextIncomingMsgNum:
|
||||||
|
|||||||
@@ -5,6 +5,7 @@
|
|||||||
<extradist>
|
<extradist>
|
||||||
common.asm
|
common.asm
|
||||||
defs.asm
|
defs.asm
|
||||||
|
debug-w.asm
|
||||||
device-w.asm
|
device-w.asm
|
||||||
memstats-w.asm
|
memstats-w.asm
|
||||||
recvstats-w.asm
|
recvstats-w.asm
|
||||||
|
|||||||
53
avr/modules/network/msg/debug-w.asm
Normal file
53
avr/modules/network/msg/debug-w.asm
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
; ***************************************************************************
|
||||||
|
; copyright : (C) 2025 by Martin Preuss
|
||||||
|
; email : martin@libchipcard.de
|
||||||
|
;
|
||||||
|
; ***************************************************************************
|
||||||
|
; * This file is part of the project "AqHome". *
|
||||||
|
; * Please see toplevel file COPYING of that project for license details. *
|
||||||
|
; ***************************************************************************
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @routine NETMSG_Debug_Write @global
|
||||||
|
;
|
||||||
|
; @param Y pointer to device to write msg for
|
||||||
|
; @param X pointer to buffer to write to
|
||||||
|
; @param r0-14 value 1-15
|
||||||
|
; @clobbers R16, R17, R18, R19, R20, R21
|
||||||
|
|
||||||
|
NETMSG_Debug_Write:
|
||||||
|
ldi r16, 0xff
|
||||||
|
st X+, r16 ; dest address
|
||||||
|
ldi r16, 17 ; msg code+src address+15 payload bytes
|
||||||
|
st X+, r16 ; msg len
|
||||||
|
ldi r16, NETMSG_CMD_DEBUG
|
||||||
|
st X+, r16 ; msg code
|
||||||
|
ldd r16, Y+NET_IFACE_OFFS_ADDRESS
|
||||||
|
st X+, r16 ; src address
|
||||||
|
|
||||||
|
st X+, r0 ; 5th byte
|
||||||
|
st X+, r1
|
||||||
|
st X+, r2
|
||||||
|
st X+, r3
|
||||||
|
st X+, r4
|
||||||
|
st X+, r5
|
||||||
|
st X+, r6
|
||||||
|
st X+, r7
|
||||||
|
st X+, r8
|
||||||
|
st X+, r9
|
||||||
|
st X+, r10
|
||||||
|
st X+, r11
|
||||||
|
st X+, r12
|
||||||
|
st X+, r13
|
||||||
|
st X+, r14
|
||||||
|
|
||||||
|
sbiw xh:xl, 19 ; go back to beginning of message (1 byte dst addr, 1 byte length, 17 bytes payload)
|
||||||
|
rcall NETMSG_CalcAndAddChecksumByte ; (R16, R17, R18, R19, R20, X)
|
||||||
|
sbiw xh:xl, 20 ; go back to beginning of message (1 byte dst addr, 1 byte length, 17 bytes payload, 1 byte crc)
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -9,6 +9,8 @@
|
|||||||
|
|
||||||
|
|
||||||
.equ COMONUART0_IFACENUM = 1
|
.equ COMONUART0_IFACENUM = 1
|
||||||
|
.equ COMONUART0_READ_TIMEOUT = 3
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -28,10 +30,25 @@ comOnUart0_iface: .byte UART_HW_IFACE_SIZE
|
|||||||
ComOnUart0_Init:
|
ComOnUart0_Init:
|
||||||
ldi yl, LOW(comOnUart0_iface)
|
ldi yl, LOW(comOnUart0_iface)
|
||||||
ldi yh, HIGH(comOnUart0_iface)
|
ldi yh, HIGH(comOnUart0_iface)
|
||||||
rcall UART_HW_Interface_Init ; (R16, R17, X)
|
rcall UART_HW_Uart0_SetAttnInput ; (none)
|
||||||
rcall UART_HW_Uart0_Init ; (R16, R17, X)
|
|
||||||
|
rcall UART_HW_Interface_Init ; (R16, R17, X)
|
||||||
|
rcall UART_HW_Uart0_Init ; (R16, R17, X)
|
||||||
ldi r16, COMONUART0_IFACENUM
|
ldi r16, COMONUART0_IFACENUM
|
||||||
std Y+NET_IFACE_OFFS_IFACENUM, r16
|
std Y+NET_IFACE_OFFS_IFACENUM, r16
|
||||||
|
|
||||||
|
ldi r16, UART_HW_READMODE_IDLE
|
||||||
|
std Y+UART_HW_IFACE_OFFS_READMODE, r16
|
||||||
|
ldi r16, UART_HW_WRITEMODE_IDLE
|
||||||
|
std Y+UART_HW_IFACE_OFFS_WRITEMODE, r16
|
||||||
|
|
||||||
|
sbi COM_IRQ_ADDR_ATTN, COM_IRQ_BIT_ATTN ; enable pin change irq for ATTN line
|
||||||
|
in r16, GIMSK ; enable pin change irq PCIE0 or PCIE1
|
||||||
|
ori r16, (1<<COM_IRQ_GIMSK_ATTN)
|
||||||
|
out GIMSK, R16
|
||||||
|
ldi r16, (1<<COM_IRQ_GIFR_ATTN) ; clear pending irq by writing 1 to ATTN bit
|
||||||
|
out GIFR, r16
|
||||||
|
|
||||||
ret
|
ret
|
||||||
; @end
|
; @end
|
||||||
|
|
||||||
@@ -159,6 +176,194 @@ ComOnUart0_TxCharIsr:
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @routine ComOnUart0_AttnChangeIsr @global @isr
|
||||||
|
;
|
||||||
|
; @clobbers none
|
||||||
|
|
||||||
|
ComOnUart0_AttnChangeIsr:
|
||||||
|
push r15
|
||||||
|
in r15, SREG
|
||||||
|
push r16
|
||||||
|
push r17
|
||||||
|
push r18
|
||||||
|
push r24
|
||||||
|
push r25
|
||||||
|
push xl
|
||||||
|
push xh
|
||||||
|
push yl
|
||||||
|
push yh
|
||||||
|
ldi yl, LOW(comOnUart0_iface)
|
||||||
|
ldi yh, HIGH(comOnUart0_iface)
|
||||||
|
rcall comOnUart0ActOnAttn ; (R16, R17, R24, R25, X)
|
||||||
|
pop yh
|
||||||
|
pop yl
|
||||||
|
pop xh
|
||||||
|
pop xl
|
||||||
|
pop r25
|
||||||
|
pop r24
|
||||||
|
pop r18
|
||||||
|
pop r17
|
||||||
|
pop r16
|
||||||
|
out SREG, r15
|
||||||
|
pop r15
|
||||||
|
reti
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @routine comOnUart0ActOnAttn @global
|
||||||
|
;
|
||||||
|
; @param Y pointer to interface data in SRAM
|
||||||
|
; @clobbers R16 (R17, R24, R25, X)
|
||||||
|
|
||||||
|
comOnUart0ActOnAttn:
|
||||||
|
ldd r16, Y+UART_HW_IFACE_OFFS_WRITEMODE ; test for active write mode
|
||||||
|
cpi r16, UART_HW_WRITEMODE_IDLE
|
||||||
|
brne comOnUart0ActOnAttn_end ; in write mode, don't start read mode
|
||||||
|
|
||||||
|
ldd r16, Y+UART_HW_IFACE_OFFS_READMODE ; test for active read mode
|
||||||
|
cpi r16, UART_HW_READMODE_IDLE
|
||||||
|
brne comOnUart0ActOnAttn_end ; already in read mode
|
||||||
|
|
||||||
|
sbic COM_ATTN_INPUT, COM_ATTN_PIN ; ATTN high?
|
||||||
|
rjmp comOnUart0ActOnAttn_end
|
||||||
|
rcall comOnUart0StartReading ; (R16, R17, R24, R25, X)
|
||||||
|
|
||||||
|
comOnUart0ActOnAttn_end:
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @routine comOnUart0StartReading
|
||||||
|
;
|
||||||
|
; @clobbers R16 (R17, R24, R25, X)
|
||||||
|
|
||||||
|
comOnUart0StartReading:
|
||||||
|
rcall comOnUart0EnsureReadBuffer ; (R16, R17, R24, R25, X)
|
||||||
|
brcs comOnUart0EnterReading_okay
|
||||||
|
; no buffer, missed message
|
||||||
|
ldi r16, NET_IFACE_OFFS_ERR_MISSED_LOW
|
||||||
|
rcall NET_Interface_IncCounter16 ; (R24, R25)
|
||||||
|
ret
|
||||||
|
comOnUart0EnterReading_okay:
|
||||||
|
ldi r16, UART_HW_READMODE_READING
|
||||||
|
std Y+UART_HW_IFACE_OFFS_READMODE, r16
|
||||||
|
clr r16
|
||||||
|
std Y+NET_IFACE_OFFS_READTIMER, r16
|
||||||
|
rcall UART_HW_Uart0_StartRx ; R16
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @routine comOnUart0EnterReadSkipping
|
||||||
|
;
|
||||||
|
; @clobbers R16
|
||||||
|
|
||||||
|
comOnUart0EnterReadSkipping:
|
||||||
|
rcall UART_HW_Uart0_StopRx ; (R16)
|
||||||
|
rcall UART_HW_Uart0_Flush ; (R16)
|
||||||
|
ldi r16, UART_HW_WRITEMODE_IDLE ; go into IDLE mode, enter reading on next neg edge of ATTN
|
||||||
|
std Y+UART_HW_IFACE_OFFS_READMODE, r16
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @routine comOnUart0EnterReadIdle
|
||||||
|
;
|
||||||
|
; @clobbers R16 (R17, R24, R25, X)
|
||||||
|
|
||||||
|
comOnUart0EnterReadIdle:
|
||||||
|
rcall UART_HW_Uart0_StopRx ; (R16)
|
||||||
|
ldi r16, UART_HW_READMODE_IDLE
|
||||||
|
std Y+UART_HW_IFACE_OFFS_READMODE, r16
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @routine comOnUart0EnsureReadBuffer
|
||||||
|
;
|
||||||
|
; @clobbers R16 (R17, R24, R25, X)
|
||||||
|
|
||||||
|
comOnUart0EnsureReadBuffer:
|
||||||
|
ldd r16, Y+UART_HW_IFACE_OFFS_READBUFNUM
|
||||||
|
cpi r16, 0xff
|
||||||
|
breq comOnUart0EnsureReadBuffer_alloc
|
||||||
|
comOnUart0EnsureReadBuffer_secRet:
|
||||||
|
sec
|
||||||
|
comOnUart0EnsureReadBuffer_ret:
|
||||||
|
ret
|
||||||
|
comOnUart0EnsureReadBuffer_alloc:
|
||||||
|
rcall NET_Buffer_Alloc ; (R16, R17, X)
|
||||||
|
brcc comOnUart0EnsureReadBuffer_ret
|
||||||
|
rcall UART_HW_Interface_SetReadBuffer ; (R17)
|
||||||
|
rcall NET_Interface_SetIfaceNumInBuffer ; (R16, R17)
|
||||||
|
rjmp comOnUart0EnsureReadBuffer_secRet
|
||||||
|
comOnUart0EnsureReadBuffer_noBuf:
|
||||||
|
ldi r16, NET_IFACE_OFFS_ERR_NOBUF_LOW
|
||||||
|
rcall NET_Interface_IncCounter16 ; (R24, R25)
|
||||||
|
clc
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @routine ComOnUart0_SendBuffer @global
|
||||||
|
;
|
||||||
|
; @param Y pointer to interface data in SRAM
|
||||||
|
; @clobbers R16, R17
|
||||||
|
|
||||||
|
ComOnUart0_SendBuffer:
|
||||||
|
push r15
|
||||||
|
in r15, SREG
|
||||||
|
cli
|
||||||
|
ldd r17, Y+UART_HW_IFACE_OFFS_WRITEMODE
|
||||||
|
cpi r17, UART_HW_WRITEMODE_IDLE
|
||||||
|
breq ComOnUart0_SendBuffer_setBuffer
|
||||||
|
out SREG, r15
|
||||||
|
pop r15
|
||||||
|
clc
|
||||||
|
ret
|
||||||
|
ComOnUart0_SendBuffer_setBuffer:
|
||||||
|
rcall UART_HW_Interface_SetWriteBuffer ; (R17)
|
||||||
|
ldi r17, UART_HW_WRITEMODE_WRITING
|
||||||
|
std Y+UART_HW_IFACE_OFFS_WRITEMODE, r17
|
||||||
|
rcall UART_HW_Uart0_StartTx ; (R16)
|
||||||
|
pop r15
|
||||||
|
out SREG, r15
|
||||||
|
sec
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @routine comOnUart0ResetReadBuffer
|
||||||
|
;
|
||||||
|
; @clobbers R16 (R17, X)
|
||||||
|
|
||||||
|
comOnUart0ResetReadBuffer:
|
||||||
|
ldd r16, Y+UART_HW_IFACE_OFFS_READBUFNUM
|
||||||
|
cpi r16, 0xff
|
||||||
|
breq comOnUart0ResetReadBuffer_end
|
||||||
|
rcall NET_Buffer_Locate ; (R17, X)
|
||||||
|
rcall UART_HW_Interface_SetReadBuffer ; (R17)
|
||||||
|
comOnUart0ResetReadBuffer_end:
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
; ---------------------------------------------------------------------------
|
; ---------------------------------------------------------------------------
|
||||||
; @routine ComOnUart0_Run @global
|
; @routine ComOnUart0_Run @global
|
||||||
;
|
;
|
||||||
@@ -171,8 +376,12 @@ ComOnUart0_Run:
|
|||||||
ldi yl, LOW(comOnUart0_iface)
|
ldi yl, LOW(comOnUart0_iface)
|
||||||
ldi yh, HIGH(comOnUart0_iface)
|
ldi yh, HIGH(comOnUart0_iface)
|
||||||
|
|
||||||
rcall comOnUart0RunWriteModes
|
|
||||||
rcall comOnUart0RunReadModes
|
rcall comOnUart0RunReadModes
|
||||||
|
ldd r16, Y+UART_HW_IFACE_OFFS_READMODE ; test for active read mode
|
||||||
|
cpi r16, UART_HW_READMODE_IDLE
|
||||||
|
brne ComOnUart0_Run_end
|
||||||
|
rcall comOnUart0RunWriteModes ; only call write routine if read idle
|
||||||
|
ComOnUart0_Run_end:
|
||||||
pop r15
|
pop r15
|
||||||
out SREG, r15
|
out SREG, r15
|
||||||
ret
|
ret
|
||||||
@@ -218,8 +427,7 @@ comOnUart0RunWriteIdle:
|
|||||||
rcall NET_Buffer_Locate ; (R17)
|
rcall NET_Buffer_Locate ; (R17)
|
||||||
brcc comOnUart0RunWriteIdle_end
|
brcc comOnUart0RunWriteIdle_end
|
||||||
|
|
||||||
sbi COM_ATTN_DDR, COM_ATTN_PIN ; set ATTN as output
|
rcall UART_HW_Uart0_SetAttnLow
|
||||||
cbi COM_ATTN_OUTPUT, COM_ATTN_PIN ; set ATTN low
|
|
||||||
|
|
||||||
rcall ComOnUart0_SendBuffer ; (R16, R17)
|
rcall ComOnUart0_SendBuffer ; (R16, R17)
|
||||||
comOnUart0RunWriteIdle_end:
|
comOnUart0RunWriteIdle_end:
|
||||||
@@ -265,8 +473,7 @@ comOnUart0RunWriteBufferEmpty:
|
|||||||
comOnUart0RunWriteBufferEmpty_setIdle:
|
comOnUart0RunWriteBufferEmpty_setIdle:
|
||||||
rcall UART_HW_Uart0_StopTx ; disable transceiver and interrupts (R16)
|
rcall UART_HW_Uart0_StopTx ; disable transceiver and interrupts (R16)
|
||||||
|
|
||||||
cbi COM_ATTN_DDR, COM_ATTN_PIN ; set ATTN as input
|
rcall UART_HW_Uart0_SetAttnInput ; set ATTN as input
|
||||||
cbi COM_ATTN_OUTPUT, COM_ATTN_PIN ; disable pullup on ATTN
|
|
||||||
|
|
||||||
ldi r16, UART_HW_WRITEMODE_IDLE
|
ldi r16, UART_HW_WRITEMODE_IDLE
|
||||||
std Y+UART_HW_IFACE_OFFS_WRITEMODE, r16
|
std Y+UART_HW_IFACE_OFFS_WRITEMODE, r16
|
||||||
@@ -300,23 +507,9 @@ comOnUart0RunReadModes:
|
|||||||
; ---------------------------------------------------------------------------
|
; ---------------------------------------------------------------------------
|
||||||
; @routine comOnUart0RunReadIdle
|
; @routine comOnUart0RunReadIdle
|
||||||
;
|
;
|
||||||
; @clobbers R16 (R17, R24, R25, X)
|
; @clobbers none
|
||||||
|
|
||||||
comOnUart0RunReadIdle:
|
comOnUart0RunReadIdle:
|
||||||
ldd r16, Y+UART_HW_IFACE_OFFS_READBUFNUM
|
|
||||||
cpi r16, 0xff
|
|
||||||
brne comOnUart0RunReadIdle_enterReading
|
|
||||||
rcall NET_Buffer_Alloc ; (R16, R17, X)
|
|
||||||
brcc comOnUart0RunReadIdle_noBuf
|
|
||||||
rcall UART_HW_Interface_SetReadBuffer ; (R17)
|
|
||||||
comOnUart0RunReadIdle_enterReading:
|
|
||||||
ldi r16, UART_HW_READMODE_READING
|
|
||||||
std Y+UART_HW_IFACE_OFFS_READMODE, r16
|
|
||||||
rcall UART_HW_Uart0_StartRx ; R16
|
|
||||||
ret
|
|
||||||
comOnUart0RunReadIdle_noBuf:
|
|
||||||
ldi r16, NET_IFACE_OFFS_ERR_NOBUF_LOW
|
|
||||||
rcall NET_Interface_IncCounter16 ; (R24, R25)
|
|
||||||
ret
|
ret
|
||||||
; @end
|
; @end
|
||||||
|
|
||||||
@@ -328,6 +521,20 @@ comOnUart0RunReadIdle_noBuf:
|
|||||||
; @clobbers none
|
; @clobbers none
|
||||||
|
|
||||||
comOnUart0RunReading:
|
comOnUart0RunReading:
|
||||||
|
ldd r16, Y+NET_IFACE_OFFS_READTIMER
|
||||||
|
cpi r16, COMONUART0_READ_TIMEOUT
|
||||||
|
brcs comOnUart0RunReading_end
|
||||||
|
rcall UART_HW_Uart0_StopRx ; (R16)
|
||||||
|
ldd r16, Y+UART_HW_IFACE_OFFS_READBUFNUM
|
||||||
|
ldi r17, 0xff
|
||||||
|
std Y+UART_HW_IFACE_OFFS_READBUFNUM, r17
|
||||||
|
cp r16, r17
|
||||||
|
breq comOnUart0RunReading_enterIdle
|
||||||
|
rcall NET_Buffer_ReleaseByNum ; (R16, X)
|
||||||
|
comOnUart0RunReading_enterIdle:
|
||||||
|
ldi r16, UART_HW_READMODE_IDLE
|
||||||
|
std Y+UART_HW_IFACE_OFFS_READMODE, r16
|
||||||
|
comOnUart0RunReading_end:
|
||||||
ret
|
ret
|
||||||
; @end
|
; @end
|
||||||
|
|
||||||
@@ -356,23 +563,20 @@ comOnUart0RunSkipping_end:
|
|||||||
; @clobbers R16 (R17, R18, R24, R25)
|
; @clobbers R16 (R17, R18, R24, R25)
|
||||||
|
|
||||||
comOnUart0RunMsgReceived:
|
comOnUart0RunMsgReceived:
|
||||||
ldd r16, Y+UART_HW_IFACE_OFFS_READBUFNUM
|
rcall comOnUart0EnterReadIdle
|
||||||
cpi r16, 0xff
|
|
||||||
breq comOnUart0RunMsgReceived_end
|
|
||||||
rcall NET_AddIncomingMsgNum ; (R17, R18, X)
|
|
||||||
brcs comOnUart0RunMsgReceived_enterIdle
|
|
||||||
comOnUart0RunMsgReceived_overrun: ; reset/reuse current buffer
|
|
||||||
rcall NET_Buffer_Locate
|
|
||||||
rcall UART_HW_Interface_SetReadBuffer ; (R17)
|
|
||||||
ldi r16, NET_IFACE_OFFS_ERR_NOBUF_LOW
|
|
||||||
rcall NET_Interface_IncCounter16 ; (R24, R25)
|
|
||||||
comOnUart0RunMsgReceived_enterIdle:
|
|
||||||
ldi r16, 0xff
|
|
||||||
std Y+UART_HW_IFACE_OFFS_READBUFNUM, r16
|
|
||||||
ldi r16, UART_HW_READMODE_IDLE
|
|
||||||
std Y+UART_HW_IFACE_OFFS_READMODE, r16
|
|
||||||
comOnUart0RunMsgReceived_end:
|
|
||||||
ret
|
ret
|
||||||
; @end
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; DEBUG begin
|
||||||
|
ldi r16, NET_IFACE_OFFS_HANDLED_LOW
|
||||||
|
rcall NET_Interface_IncCounter16 ; (R24, R25)
|
||||||
|
; DEBUG end
|
||||||
|
|
||||||
|
; DEBUG begin
|
||||||
|
ldi r16, NET_IFACE_OFFS_ERR_MISSED_LOW
|
||||||
|
rcall NET_Interface_IncCounter16 ; (R24, R25)
|
||||||
|
; DEBUG end
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -8,11 +8,6 @@
|
|||||||
; ***************************************************************************
|
; ***************************************************************************
|
||||||
|
|
||||||
|
|
||||||
.equ UART_HW_BUFFER_INUSE_BIT = 7
|
|
||||||
.equ UART_HW_BUFFER_IFACENUM1_BIT = 1
|
|
||||||
.equ UART_HW_BUFFER_IFACENUM0_BIT = 0
|
|
||||||
|
|
||||||
|
|
||||||
.equ UART_HW_READMODE_OFF = 0
|
.equ UART_HW_READMODE_OFF = 0
|
||||||
.equ UART_HW_READMODE_IDLE = 1
|
.equ UART_HW_READMODE_IDLE = 1
|
||||||
.equ UART_HW_READMODE_READING = 2
|
.equ UART_HW_READMODE_READING = 2
|
||||||
|
|||||||
@@ -97,7 +97,97 @@ UART_HW_Uart0_Flush:
|
|||||||
; @clobbers R16 (R17, R18, R24, R25, X)
|
; @clobbers R16 (R17, R18, R24, R25, X)
|
||||||
|
|
||||||
UART_HW_Uart0_RxCharIsr:
|
UART_HW_Uart0_RxCharIsr:
|
||||||
M_UART_HW_Uart_RxCharIsr 0
|
; check for errors
|
||||||
|
lds r16, UCSR0A ; check for errors
|
||||||
|
andi r16, (1<<FE0) | (1<<DOR0) | (1<<UPE0)
|
||||||
|
brne l_hwerr
|
||||||
|
; read char
|
||||||
|
lds r16, UCSR0A
|
||||||
|
sbrs r16, RXC0
|
||||||
|
rjmp l_end ; no data
|
||||||
|
lds r16, UDR0 ; r16=received char
|
||||||
|
; check read mode
|
||||||
|
ldd r17, Y+UART_HW_IFACE_OFFS_READMODE
|
||||||
|
cpi r17, UART_HW_READMODE_READING
|
||||||
|
breq l_storeChar
|
||||||
|
cpi r17, UART_HW_READMODE_SKIPPING
|
||||||
|
breq l_skipChar
|
||||||
|
rjmp l_overrun ; neither read nor skip mode
|
||||||
|
l_skipChar:
|
||||||
|
clr r16
|
||||||
|
std Y+NET_IFACE_OFFS_READTIMER, r16 ; reset read timer
|
||||||
|
rjmp l_end
|
||||||
|
l_storeChar:
|
||||||
|
mov r18, r16 ; r18=received char
|
||||||
|
; check buffer
|
||||||
|
ldd r16, Y+UART_HW_IFACE_OFFS_READBUFNUM
|
||||||
|
cpi r16, 0xff
|
||||||
|
breq l_overrun
|
||||||
|
|
||||||
|
; check for buffer overrun
|
||||||
|
ldd r17, Y+UART_HW_IFACE_OFFS_READBUFLEFT ; r17=bytes left
|
||||||
|
tst r17
|
||||||
|
breq l_econtent ; msg too long
|
||||||
|
|
||||||
|
; actually store byte, increment/decrement counters and pos
|
||||||
|
ldd xl, Y+UART_HW_IFACE_OFFS_READBUFPOS_LOW
|
||||||
|
ldd xh, Y+UART_HW_IFACE_OFFS_READBUFPOS_HIGH
|
||||||
|
st X+, r18 ; r18=byte to store
|
||||||
|
clr r16
|
||||||
|
std Y+NET_IFACE_OFFS_READTIMER, r16 ; reset read timer
|
||||||
|
std Y+UART_HW_IFACE_OFFS_READBUFPOS_LOW, xl
|
||||||
|
std Y+UART_HW_IFACE_OFFS_READBUFPOS_HIGH, xh
|
||||||
|
ldd r18, Y+UART_HW_IFACE_OFFS_READBUFUSED ; r18=bytes in buffer
|
||||||
|
inc r18
|
||||||
|
std Y+UART_HW_IFACE_OFFS_READBUFUSED, r18
|
||||||
|
dec r17
|
||||||
|
std Y+UART_HW_IFACE_OFFS_READBUFLEFT, r17
|
||||||
|
breq l_msgFinished
|
||||||
|
|
||||||
|
; check msg size
|
||||||
|
cpi r18, 2 ; bytes in buffer, exactly 2?
|
||||||
|
brne l_end ; nope, done
|
||||||
|
sbiw xh:xl, 1 ; yes, determine message length (msgLen at previous pos)
|
||||||
|
ld r16, X+ ; read payload length byte
|
||||||
|
subi r16, -3 ; add 3 (dest addr, length, crc byte)
|
||||||
|
cpi r16, (NET_BUFFERS_SIZE-1) ; total msg length ok?
|
||||||
|
brcc l_econtent ; content error (msg too long)
|
||||||
|
subi r16, 2 ; subtract bytes already received
|
||||||
|
std Y+UART_HW_IFACE_OFFS_READBUFLEFT, r16 ; set new number of bytes left
|
||||||
|
brne l_end ; jmp if still bytes left to receive
|
||||||
|
|
||||||
|
l_msgFinished:
|
||||||
|
rcall UART_HW_Uart0_StopRx ; (R16)
|
||||||
|
ldd r16, Y+UART_HW_IFACE_OFFS_READBUFNUM
|
||||||
|
rcall NET_AddIncomingMsgNum ; (R17, R18, X)
|
||||||
|
brcs l_msgAdded
|
||||||
|
; could not add msg
|
||||||
|
rcall NET_Buffer_ReleaseByNum ; (R16, X)
|
||||||
|
ldi r16, 0xff
|
||||||
|
std Y+UART_HW_IFACE_OFFS_READBUFNUM, r16
|
||||||
|
ldi r16, NET_IFACE_OFFS_ERR_MISSED_LOW
|
||||||
|
ldi r17, UART_HW_READMODE_IDLE
|
||||||
|
rjmp l_incCounterAndEnterMode
|
||||||
|
l_msgAdded:
|
||||||
|
ldi r16, 0xff
|
||||||
|
std Y+UART_HW_IFACE_OFFS_READBUFNUM, r16
|
||||||
|
ldi r16, NET_IFACE_OFFS_PACKETSIN_LOW
|
||||||
|
ldi r17, UART_HW_READMODE_IDLE
|
||||||
|
rjmp l_incCounterAndEnterMode
|
||||||
|
l_hwerr:
|
||||||
|
ldi r16, NET_IFACE_OFFS_ERR_IO_LOW
|
||||||
|
rjmp l_incCounterAndEnterSkipping
|
||||||
|
l_econtent:
|
||||||
|
ldi r16, NET_IFACE_OFFS_ERR_CONTENT_LOW
|
||||||
|
rjmp l_incCounterAndEnterSkipping
|
||||||
|
l_overrun:
|
||||||
|
ldi r16, NET_IFACE_OFFS_ERR_NOBUF_LOW
|
||||||
|
l_incCounterAndEnterSkipping:
|
||||||
|
ldi r17, UART_HW_READMODE_SKIPPING
|
||||||
|
l_incCounterAndEnterMode:
|
||||||
|
rcall NET_Interface_IncCounter16 ; (R24, R25)
|
||||||
|
std Y+UART_HW_IFACE_OFFS_READMODE, r17 ; set read mode
|
||||||
|
l_end:
|
||||||
ret
|
ret
|
||||||
; @end
|
; @end
|
||||||
|
|
||||||
@@ -134,3 +224,32 @@ UART_HW_Uart0_TxCharIsr:
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @routine UART_HW_Uart0_SetAttnInput @global
|
||||||
|
;
|
||||||
|
; Set ATTN line as input (making it effectively HIGH due to pull-up resistor on
|
||||||
|
; the line)
|
||||||
|
;
|
||||||
|
; @clobbers none
|
||||||
|
|
||||||
|
UART_HW_Uart0_SetAttnInput:
|
||||||
|
M_UART_HW_Uart_SetAttnInput
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @routine UART_HW_Uart0_SetAttnLow @global
|
||||||
|
;
|
||||||
|
; Set ATTN line low.
|
||||||
|
;
|
||||||
|
; @clobbers none
|
||||||
|
|
||||||
|
UART_HW_Uart0_SetAttnLow:
|
||||||
|
M_UART_HW_Uart_SetAttnLow
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -188,27 +188,14 @@ l_storeChar_%:
|
|||||||
brcc l_econtent_% ; content error (msg too long)
|
brcc l_econtent_% ; content error (msg too long)
|
||||||
subi r16, 2 ; subtract bytes already received
|
subi r16, 2 ; subtract bytes already received
|
||||||
std Y+UART_HW_IFACE_OFFS_READBUFLEFT, r16 ; set new number of bytes left
|
std Y+UART_HW_IFACE_OFFS_READBUFLEFT, r16 ; set new number of bytes left
|
||||||
brne l_end_% ; jmp if still bytes left to received
|
brne l_end_% ; jmp if still bytes left to receive
|
||||||
l_msgFinished_%:
|
l_msgFinished_%:
|
||||||
ldd r16, Y+UART_HW_IFACE_OFFS_READBUFNUM
|
|
||||||
rcall NET_AddIncomingMsgNum ; (R17, R18, X)
|
|
||||||
brcs l_msgStored_%
|
|
||||||
; msg complete but could not store
|
|
||||||
rcall NET_Buffer_Locate
|
|
||||||
rcall UART_HW_Interface_SetReadBuffer ; reset/reuse current buffer
|
|
||||||
ldi r16, NET_IFACE_OFFS_ERR_NOBUF_LOW
|
|
||||||
ldi r17, UART_HW_READMODE_READING
|
|
||||||
rjmp l_incCounterAndEnterMode_%
|
|
||||||
l_msgStored_%:
|
|
||||||
ldi r16, NET_IFACE_OFFS_PACKETSIN_LOW
|
ldi r16, NET_IFACE_OFFS_PACKETSIN_LOW
|
||||||
ldi r17, UART_HW_READMODE_MSGRECEIVED
|
ldi r17, UART_HW_READMODE_MSGRECEIVED
|
||||||
rjmp l_incCounterAndEnterMode_%
|
rjmp l_incCounterAndEnterMode_%
|
||||||
l_hwerr_%:
|
l_hwerr_%:
|
||||||
ldi r16, NET_IFACE_OFFS_ERR_IO_LOW
|
ldi r16, NET_IFACE_OFFS_ERR_IO_LOW
|
||||||
rcall NET_Interface_IncCounter16
|
rjmp l_incCounterAndEnterSkipping_%
|
||||||
ldi r16, UART_HW_READMODE_SKIPPING
|
|
||||||
std Y+UART_HW_IFACE_OFFS_READMODE, r16 ; set read mode
|
|
||||||
rjmp l_end_%
|
|
||||||
l_econtent_%:
|
l_econtent_%:
|
||||||
ldi r16, NET_IFACE_OFFS_ERR_CONTENT_LOW
|
ldi r16, NET_IFACE_OFFS_ERR_CONTENT_LOW
|
||||||
rjmp l_incCounterAndEnterSkipping_%
|
rjmp l_incCounterAndEnterSkipping_%
|
||||||
@@ -315,3 +302,38 @@ l_end_%:
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @macro M_UART_HW_Uart_SetAttnInput
|
||||||
|
;
|
||||||
|
; Set ATTN line as input (making it effectively HIGH due to pull-up resistor on
|
||||||
|
; the line)
|
||||||
|
;
|
||||||
|
; @clobbers none
|
||||||
|
|
||||||
|
.macro M_UART_HW_Uart_SetAttnInput
|
||||||
|
cbi COM_ATTN_DDR, COM_ATTN_PIN ; set ATTN as input
|
||||||
|
.ifdef COM_ATTN_PUE
|
||||||
|
.else
|
||||||
|
cbi COM_ATTN_PUE, COM_ATTN_PIN ; disable pullup on ATTN
|
||||||
|
.endif
|
||||||
|
cbi COM_ATTN_OUTPUT, COM_ATTN_PIN ; disable pullup on ATTN
|
||||||
|
.endmacro
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @macro M_UART_HW_Uart_SetAttnLow
|
||||||
|
;
|
||||||
|
; Set ATTN line low.
|
||||||
|
;
|
||||||
|
; @clobbers none
|
||||||
|
|
||||||
|
.macro M_UART_HW_Uart_SetAttnLow
|
||||||
|
sbi COM_ATTN_DDR, COM_ATTN_PIN ; set ATTN as output
|
||||||
|
cbi COM_ATTN_OUTPUT, COM_ATTN_PIN ; set ATTN low
|
||||||
|
.endmacro
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -276,7 +276,7 @@ ttyOnUart1RunWaitBufferEmpty:
|
|||||||
; ---------------------------------------------------------------------------
|
; ---------------------------------------------------------------------------
|
||||||
; @routine ttyOnUart1RunWriteBufferEmpty
|
; @routine ttyOnUart1RunWriteBufferEmpty
|
||||||
;
|
;
|
||||||
; @clobbers R16, R17, X
|
; @clobbers R16, R17, X (R24, R25)
|
||||||
|
|
||||||
ttyOnUart1RunWriteBufferEmpty:
|
ttyOnUart1RunWriteBufferEmpty:
|
||||||
ldd r16, Y+UART_HW_IFACE_OFFS_WRITEBUFNUM
|
ldd r16, Y+UART_HW_IFACE_OFFS_WRITEBUFNUM
|
||||||
@@ -328,6 +328,7 @@ ttyOnUart1RunReadIdle:
|
|||||||
rcall NET_Buffer_Alloc ; (R16, R17, X)
|
rcall NET_Buffer_Alloc ; (R16, R17, X)
|
||||||
brcc ttyOnUart1RunReadIdle_noBuf
|
brcc ttyOnUart1RunReadIdle_noBuf
|
||||||
rcall UART_HW_Interface_SetReadBuffer ; (R17)
|
rcall UART_HW_Interface_SetReadBuffer ; (R17)
|
||||||
|
rcall NET_Interface_SetIfaceNumInBuffer ; (R16, R17)
|
||||||
ttyOnUart1RunReadIdle_enterReading:
|
ttyOnUart1RunReadIdle_enterReading:
|
||||||
ldi r16, UART_HW_READMODE_READING
|
ldi r16, UART_HW_READMODE_READING
|
||||||
std Y+UART_HW_IFACE_OFFS_READMODE, r16
|
std Y+UART_HW_IFACE_OFFS_READMODE, r16
|
||||||
@@ -380,14 +381,14 @@ ttyOnUart1RunMsgReceived:
|
|||||||
breq ttyOnUart1RunMsgReceived_end
|
breq ttyOnUart1RunMsgReceived_end
|
||||||
rcall NET_AddIncomingMsgNum ; (R17, R18, X)
|
rcall NET_AddIncomingMsgNum ; (R17, R18, X)
|
||||||
brcs ttyOnUart1RunMsgReceived_enterIdle
|
brcs ttyOnUart1RunMsgReceived_enterIdle
|
||||||
ttyOnUart1RunMsgReceived_overrun: ; reset/reuse current buffer
|
ttyOnUart1RunMsgReceived_overrun:
|
||||||
rcall NET_Buffer_Locate
|
rcall NET_Buffer_ReleaseByNum ; (R16, X)
|
||||||
rcall UART_HW_Interface_SetReadBuffer ; (R17)
|
|
||||||
ldi r16, NET_IFACE_OFFS_ERR_NOBUF_LOW
|
ldi r16, NET_IFACE_OFFS_ERR_NOBUF_LOW
|
||||||
rcall NET_Interface_IncCounter16 ; (R24, R25)
|
rcall NET_Interface_IncCounter16 ; (R24, R25)
|
||||||
ttyOnUart1RunMsgReceived_enterIdle:
|
ttyOnUart1RunMsgReceived_enterIdle:
|
||||||
ldi r16, 0xff
|
ldi r16, 0xff
|
||||||
std Y+UART_HW_IFACE_OFFS_READBUFNUM, r16
|
std Y+UART_HW_IFACE_OFFS_READBUFNUM, r16
|
||||||
|
|
||||||
ldi r16, UART_HW_READMODE_IDLE
|
ldi r16, UART_HW_READMODE_IDLE
|
||||||
std Y+UART_HW_IFACE_OFFS_READMODE, r16
|
std Y+UART_HW_IFACE_OFFS_READMODE, r16
|
||||||
ttyOnUart1RunMsgReceived_end:
|
ttyOnUart1RunMsgReceived_end:
|
||||||
|
|||||||
Reference in New Issue
Block a user