avr: only write COM address if changed to reduce EEPROM wear.

This commit is contained in:
Martin Preuss
2025-05-01 00:54:48 +02:00
parent 8008819989
commit 5981ec44e4

View File

@@ -26,7 +26,7 @@
.equ APP_NETWORK_ADDRESS_RANGE_BEGIN = 1
.equ APP_NETWORK_ADDRESS_RANGE_END = 192
.equ APP_NETWORK_ADDRESS_RANGE_END = 191
.equ APP_NETWORK_REBOOT_TIME_100MS = 20
@@ -207,18 +207,23 @@ appNetworkHandleStateHaveAddress1:
appNetworkHandleStateHaveAddress2:
ldi r16, APP_NETWORK_STATE_UP
std Y+NET_IFACE_OFFS_STATUS, r16
ldi r16, APP_NETWORK_TIMER_100MS
std Y+NET_IFACE_OFFS_STATETIMER, r16
ldd r16, Y+NET_IFACE_OFFS_RANGE_BEGIN ; set interface address
ldd r17, Y+NET_IFACE_OFFS_ADDRESS
cp r16, r17
breq appNetworkHandleStateHaveAddress2_end
; store new address in IFACE and in EEPROM
std Y+NET_IFACE_OFFS_ADDRESS, r16
in r15, SREG
push r15
in r15, SREG
cli
ldi xl, LOW(EEPROM_OFFS_COMADDR)
ldi xh, HIGH(EEPROM_OFFS_COMADDR)
rcall Utils_WriteEepromIncr ; write address to EEPROM
out SREG, r15
pop r15
out SREG, r15
appNetworkHandleStateHaveAddress2_end:
ret
@@ -323,16 +328,16 @@ appNetworkHandleMsgDenyAddr:
; check state
ldd r16, Y+NET_IFACE_OFFS_STATUS
cpi r16, APP_NETWORK_STATE_UP
breq appNetworkHandleMsgDenyAddr_end ; ignore (our network stack is up)
breq appNetworkHandleMsgDenyAddr_end ; ignore (our network stack is up)
; still setting up address, check whether the last one is denied now
ldd r16, Y+NET_IFACE_OFFS_RANGE_BEGIN
cp r19, r16 ; our claimed address?
brne appNetworkHandleMsgDenyAddr_end ; nope, jump
cp r19, r16 ; our claimed address?
brne appNetworkHandleMsgDenyAddr_end ; nope, jump
; try next address (if any left)
ldd r17, Y+NET_IFACE_OFFS_RANGE_END
inc r16
cp r16, r17
brcs appNetworkHandleMsgDenyAddr_claimNext
inc r16 ; RANGE_BEGIN+1
cp r17, r16 ; smaller than or equal to RANGE_END?
brcc appNetworkHandleMsgDenyAddr_claimNext
; out of addresses, start completely new after some waiting time
rcall appNetworkResetState
ldi r16, 200 ; wait for 20s before trying whole process again
@@ -397,6 +402,7 @@ appNetworkResetState:
cpi r16, 0xff
breq appNetworkResetState_setRangeEnd
std Y+NET_IFACE_OFFS_RANGE_BEGIN, r16
std Y+NET_IFACE_OFFS_ADDRESS, r16 ; preset address from EEPROM
appNetworkResetState_setRangeEnd:
ldi r16, APP_NETWORK_ADDRESS_RANGE_END ; last possible address+1
std Y+NET_IFACE_OFFS_RANGE_END, r16
@@ -409,17 +415,17 @@ appNetworkResetState_setRangeEnd:
; @routine appNetworkGetAddressFromEeprom
;
; @return R16 address from EEPROM
; @clobbers R15, X
; @clobbers X
appNetworkGetAddressFromEeprom:
ldi xl, LOW(EEPROM_OFFS_COMADDR)
ldi xh, HIGH(EEPROM_OFFS_COMADDR)
in r15, SREG
push r15
in r15, SREG
cli
ldi xl, LOW(EEPROM_OFFS_COMADDR)
ldi xh, HIGH(EEPROM_OFFS_COMADDR)
rcall Utils_ReadEepromIncr ; (R16)
out SREG, r15
pop r15
out SREG, r15
ret
; @end