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