Files
aqhomecontrol/avr/common/devuid.asm
2026-04-20 23:56:52 +02:00

113 lines
2.8 KiB
NASM

; ***************************************************************************
; copyright : (C) 2026 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_DEVUID_ASM
#define AQH_AVR_COMMON_DEVUID_ASM
; ***************************************************************************
; code
.cseg
; ---------------------------------------------------------------------------
; @routine DevUid_Read
; Read UID from EEPROM.
;
; @return r21:r20:r19:r18 UID
; @clobbers R16, X
DevUid_ReadFromEeprom:
ldi xl, LOW(EEPROM_OFFS_UUID)
ldi xh, HIGH(EEPROM_OFFS_UUID)
rcall Eeprom_ReadByte ; r16=byte read (none)
brcc DevUid_ReadFromEeprom_ret
mov r18, r16
adiw xh:xl, 1
rcall Eeprom_ReadByte ; r16=byte read (none)
brcc DevUid_ReadFromEeprom_ret
mov r19, r16
adiw xh:xl, 1
rcall Eeprom_ReadByte ; r16=byte read (none)
brcc DevUid_ReadFromEeprom_ret
mov r20, r16
adiw xh:xl, 1
rcall Eeprom_ReadByte ; r16=byte read (none)
brcc DevUid_ReadFromEeprom_ret
mov r21, r16
DevUid_ReadFromEeprom_ret:
ret
; @end
; ---------------------------------------------------------------------------
; @routine DevUid_Setup @global
;
; Reads UID from EEPROM. If not set generate a new one and store it in EEPROM.
;
; @return CFLAG set if new generated, cleared if there already was one.
; @clobbers R16, R18, R19, R20, R21, X (R17)
DevUid_Setup:
rcall DevUid_ReadFromEeprom ; (R16, X)
cp r18, r19 ; all the same?
brne DevUid_Setup_uidOkay ; different, jmp
cp r18, r20
brne DevUid_Setup_uidOkay ; different, jmp
cp r18, r21
brne DevUid_Setup_uidOkay ; different, jmp
ldi xl, LOW(EEPROM_OFFS_UUID) ; all the same, generate new uid
ldi xh, HIGH(EEPROM_OFFS_UUID)
rcall RAND_PseudoRandom ; byte 0 (R16, R17, R18, R19)
inc r16
rcall Eeprom_WriteByteIfChanged ; (r17)
brcc DevUid_Setup_ret
adiw xh:xl, 1
rcall RAND_PseudoRandom ; byte 1
rcall Eeprom_WriteByteIfChanged ; (r17)
brcc DevUid_Setup_ret
adiw xh:xl, 1
rcall RAND_PseudoRandom ; byte 2
rcall Eeprom_WriteByteIfChanged ; (r17)
brcc DevUid_Setup_ret
adiw xh:xl, 1
rcall RAND_PseudoRandom ; byte 3
rcall Eeprom_WriteByteIfChanged ; (r17)
brcc DevUid_Setup_ret
rcall RAND_UpdateSeedInEeprom ; (R16, R17, R18, R19, X)
DevUid_Setup_uidOkay:
sec
DevUid_Setup_ret:
ret
; @end
#endif