avr: only write COM address if changed to reduce EEPROM wear.
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user