avr: fully implemented router functionality in network and router app.
This commit is contained in:
@@ -30,6 +30,8 @@
|
||||
list_t.asm
|
||||
tree.asm
|
||||
tree_t.asm
|
||||
eeprom-r.asm
|
||||
eeprom-w.asm
|
||||
</extradist>
|
||||
|
||||
</gwbuild>
|
||||
|
||||
86
avr/common/eeprom-r.asm
Normal file
86
avr/common/eeprom-r.asm
Normal file
@@ -0,0 +1,86 @@
|
||||
; ***************************************************************************
|
||||
; 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. *
|
||||
; ***************************************************************************
|
||||
|
||||
#ifndef AQH_AVR_COMMON_EEPROM_R_H
|
||||
#define AQH_AVR_COMMON_EEPROM_R_H
|
||||
|
||||
|
||||
|
||||
; ---------------------------------------------------------------------------
|
||||
; @routine Eeprom_ReadByte
|
||||
;
|
||||
; Read a byte from EEPROM (see example in ATtiny24/44/84 manual p.19).
|
||||
;
|
||||
; @param X EEPROM Address to read from
|
||||
; @return CFLAG set if address okay, cleared if out of range
|
||||
; @return R16 byte read
|
||||
; @return X EEPROM Address incremented
|
||||
; @clobbers none
|
||||
|
||||
Eeprom_ReadByte:
|
||||
rcall Eeprom_CheckAddr
|
||||
brcs Eeprom_ReadByte_addrOk
|
||||
ret
|
||||
Eeprom_ReadByte_addrOk:
|
||||
; call routine with IRQs disabled
|
||||
push r15
|
||||
inr r15, SREG
|
||||
cli
|
||||
rcall Eeprom_ReadByte_noirq
|
||||
outr SREG, r15
|
||||
pop r15
|
||||
sec
|
||||
ret
|
||||
Eeprom_ReadByte_noirq:
|
||||
; wait until EEPROM ready
|
||||
Eeprom_ReadByte_waitLoop:
|
||||
.ifdef EEPE
|
||||
sbic EECR, EEPE ; wait for previous write to complete (if any)
|
||||
.else
|
||||
sbic EECR, EEWE ; wait for previous write to complete (if any)
|
||||
.endif
|
||||
rjmp Eeprom_ReadByte_waitLoop
|
||||
; read from EEPROM
|
||||
out EEARH, xh ; set EEPROM address
|
||||
out EEARL, xl
|
||||
sbi EECR, EERE ; start EEPROM read by writing EERE
|
||||
in r16, EEDR ; read data from data register
|
||||
ret
|
||||
; @end
|
||||
|
||||
|
||||
|
||||
; ---------------------------------------------------------------------------
|
||||
; @routine Eeprom_CheckAddr
|
||||
;
|
||||
;
|
||||
; @param X EEPROM Address to validate
|
||||
; @return CFLAG set if address okay, cleared if out of range
|
||||
; @clobbers r16
|
||||
|
||||
Eeprom_CheckAddr:
|
||||
mov r16, xl
|
||||
subi r16, LOW(EEPROMEND)
|
||||
mov r16, xh
|
||||
sbci r16, HIGH(EEPROMEND)
|
||||
brcc Eeprom_CheckAddr_ok
|
||||
clc
|
||||
rjmp Eeprom_CheckAddr_end
|
||||
Eeprom_CheckAddr_ok:
|
||||
sec
|
||||
Eeprom_CheckAddr_end:
|
||||
ret
|
||||
; @end
|
||||
|
||||
|
||||
|
||||
|
||||
#endif ; AQH_AVR_COMMON_EEPROM_R_H
|
||||
|
||||
|
||||
100
avr/common/eeprom-w.asm
Normal file
100
avr/common/eeprom-w.asm
Normal file
@@ -0,0 +1,100 @@
|
||||
; ***************************************************************************
|
||||
; 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. *
|
||||
; ***************************************************************************
|
||||
|
||||
#ifndef AQH_AVR_COMMON_EEPROM_W_H
|
||||
#define AQH_AVR_COMMON_EEPROM_W_H
|
||||
|
||||
|
||||
; ---------------------------------------------------------------------------
|
||||
; Utils_WriteEepromIncr
|
||||
;
|
||||
; Write a byte to EEPROM (see example in ATtiny24/44/84 manual p.18).
|
||||
;
|
||||
; @param R16 byte to write
|
||||
; @param X EEPROM Address to write to
|
||||
; @return CFLAG set if data written, cleared on error
|
||||
; @clobbers R17
|
||||
|
||||
Eeprom_WriteByte:
|
||||
mov r17, r16
|
||||
rcall Eeprom_CheckAddr ; (r16)
|
||||
mov r16, r17
|
||||
brcs Eeprom_WriteByte_addrOk
|
||||
ret
|
||||
Eeprom_WriteByte_addrOk:
|
||||
; call routine with IRQs disabled
|
||||
push r15
|
||||
inr r15, SREG
|
||||
cli
|
||||
rcall Eeprom_WriteByte_noirq
|
||||
outr SREG, r15
|
||||
pop r15
|
||||
sec
|
||||
ret
|
||||
Eeprom_WriteByte_noirq:
|
||||
; wait for EEPROM to be ready
|
||||
Eeprom_WriteByte_waitLoop:
|
||||
.ifdef EEPE
|
||||
sbic EECR, EEPE ; wait for previous write to complete (if any)
|
||||
.else
|
||||
sbic EECR, EEWE ; wait for previous write to complete (if any)
|
||||
.endif
|
||||
rjmp Eeprom_WriteByte_waitLoop
|
||||
; write data
|
||||
.ifdef EEPM1
|
||||
ldi r17, (0<<EEPM1) | (0<<EEPM0) ; set programming mode
|
||||
.endif
|
||||
out EECR, r17
|
||||
out EEARH, xh ; set EEPROM address
|
||||
out EEARL, xl
|
||||
out EEDR, r16 ; write data to data register
|
||||
.ifdef EEMPE
|
||||
sbi EECR, EEMPE ; write logical one to EEMPE
|
||||
.else
|
||||
sbi EECR, EEMWE ; write logical one to EEMWE
|
||||
.endif
|
||||
.ifdef EEPE
|
||||
sbi EECR, EEPE ; start EEPROM write by setting EEPE
|
||||
.else
|
||||
sbi EECR, EEWE ; start EEPROM write by setting EEWE
|
||||
.endif
|
||||
ret
|
||||
; @end
|
||||
|
||||
|
||||
|
||||
; ---------------------------------------------------------------------------
|
||||
; @routine Eeprom_WriteByteIfChanged @global
|
||||
;
|
||||
; Only write EEPROM byte if changed from current value (save on write cycles)
|
||||
;
|
||||
; @param r16 byte to write
|
||||
; @param X eeprom address to write to
|
||||
; @clobbers r17
|
||||
|
||||
Eeprom_WriteByteIfChanged:
|
||||
mov r17, r16
|
||||
rcall Eeprom_ReadByte
|
||||
brcc Eeprom_WriteByteIfChanged_end
|
||||
cp r16, r17
|
||||
sec
|
||||
breq Eeprom_WriteByteIfChanged_end
|
||||
mov r16, r17
|
||||
rcall Eeprom_WriteByte ; (R17)
|
||||
Eeprom_WriteByteIfChanged_end:
|
||||
ret
|
||||
; @end
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#endif ; AQH_AVR_COMMON_EEPROM_W_H
|
||||
|
||||
|
||||
Reference in New Issue
Block a user