113 lines
2.8 KiB
NASM
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
|
|
|