avr: more code sharing.
This commit is contained in:
@@ -488,14 +488,9 @@ appNetworkResetState_setRangeEnd:
|
||||
; @clobbers X
|
||||
|
||||
appNetworkGetAddressFromEeprom:
|
||||
push r15
|
||||
in r15, SREG
|
||||
cli
|
||||
ldi xl, LOW(EEPROM_OFFS_COMADDR)
|
||||
ldi xh, HIGH(EEPROM_OFFS_COMADDR)
|
||||
bigcall Utils_ReadEepromIncr ; (R16)
|
||||
out SREG, r15
|
||||
pop r15
|
||||
ldi xl, LOW(EEPROM_OFFS_COMADDR)
|
||||
ldi xh, HIGH(EEPROM_OFFS_COMADDR)
|
||||
rcall Eeprom_ReadByte ; r16=addr (none)
|
||||
ret
|
||||
; @end
|
||||
|
||||
|
||||
226
avr/common/random.asm
Normal file
226
avr/common/random.asm
Normal file
@@ -0,0 +1,226 @@
|
||||
; ***************************************************************************
|
||||
; 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_DEVICES_COMMON_RANDOM_ASM
|
||||
#define AQH_AVR_DEVICES_COMMON_RANDOM_ASM
|
||||
|
||||
|
||||
; ***************************************************************************
|
||||
; data
|
||||
|
||||
|
||||
.dseg
|
||||
|
||||
randSeed: .byte 2
|
||||
|
||||
|
||||
|
||||
|
||||
; ***************************************************************************
|
||||
; code
|
||||
|
||||
|
||||
.cseg
|
||||
|
||||
|
||||
; ---------------------------------------------------------------------------
|
||||
; @routine RAND_PseudoRandom
|
||||
;
|
||||
; Generate a pseudo random number.
|
||||
; (see https://www.avrfreaks.net/s/topic/a5C3l000000URNfEAO/t119045?comment=P-1021038)
|
||||
;
|
||||
; @return R16 8 bit pseudo random number
|
||||
; @clobbers R16, R17, R18, R19
|
||||
|
||||
RAND_PseudoRandom:
|
||||
lds r16, randSeed
|
||||
lds r17, randSeed+1
|
||||
ldi r18, 0x9c
|
||||
ldi r19, 8
|
||||
RAND_PseudoRandom_step:
|
||||
lsr r17
|
||||
ror r16
|
||||
brcc RAND_PseudoRandom_nomask
|
||||
eor r17, r18
|
||||
RAND_PseudoRandom_nomask:
|
||||
dec r19
|
||||
brne RAND_PseudoRandom_step
|
||||
sts randSeed, r16
|
||||
sts randSeed+1, r17
|
||||
ret ; result in r16
|
||||
; @end
|
||||
|
||||
|
||||
|
||||
; ---------------------------------------------------------------------------
|
||||
; @routine RAND_SetupSeed @global
|
||||
;
|
||||
; @clobbers R16, R18, R19, R20, R21, R24, R25, X, Z
|
||||
|
||||
RAND_SetupSeed:
|
||||
rcall RAND_ReadSeed ; R18:R19=seed (r16, X)
|
||||
mov r20, r18
|
||||
mov r21, r19
|
||||
|
||||
; default initial seed
|
||||
ldi r18, 0xe1
|
||||
ldi r19, 0xac
|
||||
|
||||
; work stored seed into it
|
||||
mov r16, r20
|
||||
rcall randWorkByteIntoSeed ; (none)
|
||||
mov r16, r21
|
||||
rcall randWorkByteIntoSeed ; (none)
|
||||
|
||||
; work date string into seed
|
||||
ldi zl, LOW(utilsDateString*2)
|
||||
ldi zh, HIGH(utilsDateString*2)
|
||||
rcall randWorkProgStringIntoSeed ; (R16, Z)
|
||||
|
||||
; work sram content into seed
|
||||
rcall randWorkSramContentIntoSeed ; (R16, R24, R25, X)
|
||||
|
||||
; store seed in EEPROM
|
||||
rcall RAND_WriteSeed ; (R16, R17, X)
|
||||
ret
|
||||
; @end
|
||||
|
||||
|
||||
|
||||
; ---------------------------------------------------------------------------
|
||||
; @routine RAND_ReadSeed
|
||||
;
|
||||
; Read seed from EEPROM.
|
||||
;
|
||||
; @return R18:R19 seed read
|
||||
; @clobbers R16, X
|
||||
|
||||
RAND_ReadSeed:
|
||||
ldi xl, LOW(EEPROM_OFFS_SEED)
|
||||
ldi xh, HIGH(EEPROM_OFFS_SEED)
|
||||
rcall Eeprom_ReadByte ; (none)
|
||||
brcc RAND_ReadSeed_ret
|
||||
mov r18, r16
|
||||
adiw xh:xl, 1
|
||||
rcall Eeprom_ReadByte ; (none)
|
||||
mov r19, r16
|
||||
RAND_ReadSeed_ret:
|
||||
ret
|
||||
; @end
|
||||
|
||||
|
||||
|
||||
; ---------------------------------------------------------------------------
|
||||
; @routine RAND_WriteSeed
|
||||
;
|
||||
; Write seed from EEPROM.
|
||||
;
|
||||
; @param R18:R19 seed
|
||||
; @clobbers R16, R17, X
|
||||
|
||||
RAND_WriteSeed:
|
||||
ldi xl, LOW(EEPROM_OFFS_SEED)
|
||||
ldi xh, HIGH(EEPROM_OFFS_SEED)
|
||||
mov r16, r18
|
||||
rcall Eeprom_WriteByteIfChanged ; (r17)
|
||||
brcc RAND_WriteSeed_ret
|
||||
adiw xh:xl, 1
|
||||
mov r16, r19
|
||||
rcall Eeprom_WriteByteIfChanged ; (r17)
|
||||
RAND_WriteSeed_ret:
|
||||
ret
|
||||
; @end
|
||||
|
||||
|
||||
|
||||
; ---------------------------------------------------------------------------
|
||||
; @routine RAND_UpdateSeedInEeprom
|
||||
;
|
||||
; @clobbers R18, R19, (R16, R17, X)
|
||||
|
||||
RAND_UpdateSeedInEeprom:
|
||||
lds r18, randSeed
|
||||
lds r19, randSeed+1
|
||||
rcall RAND_WriteSeed ; (R16, R17, X)
|
||||
ret
|
||||
; @end
|
||||
|
||||
|
||||
|
||||
; ---------------------------------------------------------------------------
|
||||
; @routine randWorkProgStringIntoSeed
|
||||
;
|
||||
; @param Z pointer to string to work into seed
|
||||
; @param R18 low byte of current seed
|
||||
; @param R19 high byte of current seed
|
||||
; @return R18 low byte of updated seed
|
||||
; @return R19 high byte of updated seed
|
||||
; @clobbers R16, Z
|
||||
|
||||
randWorkProgStringIntoSeed:
|
||||
lpm r16, Z+
|
||||
tst r16
|
||||
breq randWorkProgStringIntoSeed_done
|
||||
rcall randWorkByteIntoSeed
|
||||
rjmp randWorkProgStringIntoSeed
|
||||
randWorkProgStringIntoSeed_done:
|
||||
ret
|
||||
; @end
|
||||
|
||||
|
||||
|
||||
; ---------------------------------------------------------------------------
|
||||
; @routine randWorkSramContentIntoSeed
|
||||
; IN:
|
||||
; @param Z pointer to string to work into seed
|
||||
; @param R18 low byte of current seed
|
||||
; @param R19 high byte of current seed
|
||||
; @return R18 low byte of updated seed
|
||||
; @return R19 high byte of updated seed
|
||||
; @clobbers R16, R24, R25, X
|
||||
|
||||
randWorkSramContentIntoSeed:
|
||||
ldi xl, LOW(SRAM_START)
|
||||
ldi xh, HIGH(SRAM_START)
|
||||
ldi r24, LOW(RAMEND-SRAM_START)
|
||||
ldi r25, HIGH(RAMEND-SRAM_START)
|
||||
randWorkSramContentIntoSeed_loop:
|
||||
ld r16, X+
|
||||
rcall randWorkByteIntoSeed
|
||||
sbiw r25:r24, 1
|
||||
brne randWorkSramContentIntoSeed_loop
|
||||
ret
|
||||
; @end
|
||||
|
||||
|
||||
|
||||
; ---------------------------------------------------------------------------
|
||||
; @routine randWorkByteIntoSeed
|
||||
;
|
||||
; @param R16 byte to work into the seed
|
||||
; @param R18 low byte of current seed
|
||||
; @param R19 high byte of current seed
|
||||
; @return R18 low byte of updated seed
|
||||
; @return R19 high byte of updated seed
|
||||
|
||||
randWorkByteIntoSeed:
|
||||
eor r18, r16
|
||||
clc
|
||||
sbrc r19, 7
|
||||
sec ; only executed if bit 7 is set in r19
|
||||
rol r18
|
||||
rol r19
|
||||
ret
|
||||
; @end
|
||||
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
; ***************************************************************************
|
||||
; copyright : (C) 2023 by Martin Preuss
|
||||
; copyright : (C) 2026 by Martin Preuss
|
||||
; email : martin@libchipcard.de
|
||||
;
|
||||
; ***************************************************************************
|
||||
@@ -7,19 +7,8 @@
|
||||
; * Please see toplevel file COPYING of that project for license details. *
|
||||
; ***************************************************************************
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
; ***************************************************************************
|
||||
; data
|
||||
|
||||
|
||||
.dseg
|
||||
|
||||
utilsDataBegin:
|
||||
utilsSeed: .byte 2
|
||||
utilsDataEnd:
|
||||
#ifndef AQH_AVR_COMMON_UTILS_ASM
|
||||
#define AQH_AVR_COMMON_UTILS_ASM
|
||||
|
||||
|
||||
|
||||
@@ -37,153 +26,6 @@ utilsDateString: .db "%YEAR%-%MONTH%-%DAY%-%HOUR%:%MINUTE%", 0, 0
|
||||
|
||||
|
||||
|
||||
; ---------------------------------------------------------------------------
|
||||
; Utils_Init
|
||||
;
|
||||
; IN:
|
||||
; OUT:
|
||||
; - CFLAG: set if okay, clear on error
|
||||
; USED: R16, R17, R18, R19, X, (R20, R21, R24, R25, X, Z)
|
||||
|
||||
Utils_Init:
|
||||
rcall utilsSetupSeed ; (R16, R18, R19, R20, R21, R24, R25, X, Z)
|
||||
|
||||
; preset SRAM data area
|
||||
ldi xh, HIGH(utilsDataBegin)
|
||||
ldi xl, LOW(utilsDataBegin)
|
||||
clr r16
|
||||
ldi r17, (utilsDataEnd-utilsDataBegin)
|
||||
rcall Utils_FillSram ; (r17, x)
|
||||
|
||||
sts utilsSeed, r18
|
||||
sts utilsSeed+1, r19
|
||||
|
||||
sec
|
||||
ret
|
||||
|
||||
|
||||
|
||||
; ---------------------------------------------------------------------------
|
||||
; setup seed
|
||||
;
|
||||
; IN:
|
||||
; OUT:
|
||||
; REGS: R16, R18, R19, R20, R21, R24, R25, X, Z
|
||||
|
||||
utilsSetupSeed:
|
||||
rcall Utils_ReadSeed
|
||||
mov r20, r18
|
||||
mov r21, r19
|
||||
|
||||
; default initial seed
|
||||
ldi r18, 0xe1
|
||||
ldi r19, 0xac
|
||||
|
||||
; work stored seed into it
|
||||
mov r16, r20
|
||||
rcall utilsWorkByteIntoSeed
|
||||
mov r16, r21
|
||||
rcall utilsWorkByteIntoSeed
|
||||
|
||||
; work date string into seed
|
||||
ldi zl, LOW(utilsDateString*2)
|
||||
ldi zh, HIGH(utilsDateString*2)
|
||||
rcall utilsWorkProgStringIntoSeed ; (R16, Z)
|
||||
|
||||
; work sram content into seed
|
||||
rcall utilsWorkSramContentIntoSeed ; (R16, R24, R25, X)
|
||||
|
||||
; store seed in EEPROM
|
||||
rcall Utils_WriteSeed ; (R16, R17, X)
|
||||
ret
|
||||
|
||||
|
||||
|
||||
; ---------------------------------------------------------------------------
|
||||
; utilsWorkProgStringIntoSeed
|
||||
;
|
||||
; IN:
|
||||
; - Z : pointer to string to work into seed
|
||||
; - R18: low byte of current seed
|
||||
; - R19: high byte of current seed
|
||||
; OUT:
|
||||
; - R18: low byte of updated seed
|
||||
; - R19: high byte of updated seed
|
||||
; USED: R16, Z
|
||||
|
||||
utilsWorkProgStringIntoSeed:
|
||||
lpm r16, Z+
|
||||
tst r16
|
||||
breq utilsWorkProgStringIntoSeed_done
|
||||
rcall utilsWorkByteIntoSeed
|
||||
rjmp utilsWorkProgStringIntoSeed
|
||||
utilsWorkProgStringIntoSeed_done:
|
||||
ret
|
||||
|
||||
|
||||
|
||||
; ---------------------------------------------------------------------------
|
||||
; utilsWorkSramContentIntoSeed
|
||||
; IN:
|
||||
; - Z : pointer to string to work into seed
|
||||
; - R18: low byte of current seed
|
||||
; - R19: high byte of current seed
|
||||
; OUT:
|
||||
; - R18: low byte of updated seed
|
||||
; - R19: high byte of updated seed
|
||||
; USED: R16, R24, R25, X
|
||||
|
||||
utilsWorkSramContentIntoSeed:
|
||||
ldi xl, LOW(SRAM_START)
|
||||
ldi xh, HIGH(SRAM_START)
|
||||
ldi r24, LOW(RAMEND-SRAM_START)
|
||||
ldi r25, HIGH(RAMEND-SRAM_START)
|
||||
utilsWorkSramContentIntoSeed_loop:
|
||||
ld r16, X+
|
||||
rcall utilsWorkByteIntoSeed
|
||||
sbiw r25:r24, 1
|
||||
brne utilsWorkSramContentIntoSeed_loop
|
||||
ret
|
||||
|
||||
|
||||
|
||||
; ---------------------------------------------------------------------------
|
||||
; utilsWorkByteIntoSeed
|
||||
;
|
||||
; IN:
|
||||
; - R16: byte to work into the seed
|
||||
; - R18: low byte of current seed
|
||||
; - R19: high byte of current seed
|
||||
; OUT:
|
||||
; - R18: low byte of updated seed
|
||||
; - R19: high byte of updated seed
|
||||
; USED:
|
||||
|
||||
utilsWorkByteIntoSeed:
|
||||
eor r18, r16
|
||||
clc
|
||||
sbrc r19, 7
|
||||
sec ; only executed if bit 7 is set in r19
|
||||
rol r18
|
||||
rol r19
|
||||
ret
|
||||
|
||||
|
||||
; ---------------------------------------------------------------------------
|
||||
; Utils_Fini
|
||||
;
|
||||
; IN:
|
||||
; OUT:
|
||||
; - CFLAG: set if okay, clear on error
|
||||
; USED: R16, R17, R18, X, Y
|
||||
|
||||
|
||||
Utils_Fini:
|
||||
sec
|
||||
ret
|
||||
|
||||
|
||||
|
||||
; ---------------------------------------------------------------------------
|
||||
; @routine Utils_FillSram @global
|
||||
;
|
||||
@@ -252,310 +94,92 @@ Utils_IncrementCounter16:
|
||||
st x, r19
|
||||
st -x, r18
|
||||
ret
|
||||
|
||||
|
||||
|
||||
|
||||
; ---------------------------------------------------------------------------
|
||||
; Utils_ReadEepromIncr
|
||||
;
|
||||
; Read a byte from EEPROM (see example in ATtiny24/44/84 manual p.19).
|
||||
;
|
||||
; IN:
|
||||
; - X: EEPROM Address to read from
|
||||
; OUT:
|
||||
; - R16: byte read
|
||||
; - X: EEPROM Address incremented
|
||||
; MODIFIED REGISTERS: R16
|
||||
|
||||
Utils_ReadEepromIncr:
|
||||
.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 Utils_ReadEepromIncr
|
||||
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
|
||||
adiw xh:xl, 1
|
||||
ret
|
||||
; @end
|
||||
|
||||
|
||||
|
||||
; ---------------------------------------------------------------------------
|
||||
; Utils_WriteEepromIncr
|
||||
;
|
||||
; Write a byte to EEPROM (see example in ATtiny24/44/84 manual p.18).
|
||||
;
|
||||
; IN:
|
||||
; - R16: byte to write
|
||||
; - X: EEPROM Address to write to
|
||||
; OUT:
|
||||
; - X: EEPROM Address incremented
|
||||
; MODIFIED REGISTERS: R17
|
||||
; @routine Utils_ReadUid
|
||||
|
||||
Utils_WriteEepromIncr:
|
||||
.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 Utils_WriteEepromIncr
|
||||
.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
|
||||
adiw xh:xl, 1
|
||||
ret
|
||||
|
||||
|
||||
|
||||
; ---------------------------------------------------------------------------
|
||||
; Utils_PseudoRandom
|
||||
;
|
||||
; Generate a pseudo random number.
|
||||
; (see https://www.avrfreaks.net/s/topic/a5C3l000000URNfEAO/t119045?comment=P-1021038)
|
||||
;
|
||||
; IN:
|
||||
; OUT:
|
||||
; - R16: 8 bit pseudo random number
|
||||
; REGS: R16, R17, R18, R19
|
||||
|
||||
Utils_PseudoRandom:
|
||||
lds r16, utilsSeed
|
||||
lds r17, utilsSeed+1
|
||||
ldi r18, 0x9c
|
||||
ldi r19, 8
|
||||
Utils_PseudoRandom_step:
|
||||
lsr r17
|
||||
ror r16
|
||||
brcc Utils_PseudoRandom_nomask
|
||||
eor r17, r18
|
||||
Utils_PseudoRandom_nomask:
|
||||
dec r19
|
||||
brne Utils_PseudoRandom_step
|
||||
sts utilsSeed, r16
|
||||
sts utilsSeed+1, r17
|
||||
ret ; result in r16
|
||||
|
||||
|
||||
|
||||
; ---------------------------------------------------------------------------
|
||||
; Update seed in EEPROM.
|
||||
;
|
||||
; IN:
|
||||
; OUT:
|
||||
; REGS: R18, R19, (R16, R17, X)
|
||||
|
||||
Utils_UpdateSeedInEeprom:
|
||||
lds r18, utilsSeed
|
||||
lds r19, utilsSeed+1
|
||||
rcall Utils_WriteSeed ; (R16, R17, X)
|
||||
ret
|
||||
|
||||
|
||||
|
||||
; ---------------------------------------------------------------------------
|
||||
; Utils_ReadUid
|
||||
;
|
||||
; Read UID from EEPROM.
|
||||
;
|
||||
; IN:
|
||||
; - nothing
|
||||
; OUT:
|
||||
; - R18:R19:R20:R21: UID
|
||||
; REGS: R16, X
|
||||
; @return r21:r20:r19:r18 UID
|
||||
; @clobbers R16, X
|
||||
|
||||
Utils_ReadUid:
|
||||
push r15
|
||||
in r15, SREG
|
||||
cli
|
||||
ldi xl, LOW(EEPROM_OFFS_UUID)
|
||||
ldi xh, HIGH(EEPROM_OFFS_UUID)
|
||||
rcall Utils_ReadEepromIncr ; (R16)
|
||||
mov r18, r16
|
||||
rcall Utils_ReadEepromIncr ; (R16)
|
||||
mov r19, r16
|
||||
rcall Utils_ReadEepromIncr ; (R16)
|
||||
mov r20, r16
|
||||
rcall Utils_ReadEepromIncr ; (R16)
|
||||
mov r21, r16
|
||||
out SREG, r15
|
||||
pop r15
|
||||
ldi xl, LOW(EEPROM_OFFS_UUID)
|
||||
ldi xh, HIGH(EEPROM_OFFS_UUID)
|
||||
rcall Eeprom_ReadByte ; r16=byte read (none)
|
||||
brcc Utils_ReadUid_ret
|
||||
mov r18, r16
|
||||
adiw xh:xl, 1
|
||||
|
||||
rcall Eeprom_ReadByte ; r16=byte read (none)
|
||||
brcc Utils_ReadUid_ret
|
||||
mov r19, r16
|
||||
adiw xh:xl, 1
|
||||
|
||||
rcall Eeprom_ReadByte ; r16=byte read (none)
|
||||
brcc Utils_ReadUid_ret
|
||||
mov r20, r16
|
||||
adiw xh:xl, 1
|
||||
|
||||
rcall Eeprom_ReadByte ; r16=byte read (none)
|
||||
brcc Utils_ReadUid_ret
|
||||
mov r21, r16
|
||||
|
||||
Utils_ReadUid_ret:
|
||||
ret
|
||||
; @end
|
||||
|
||||
|
||||
|
||||
; ---------------------------------------------------------------------------
|
||||
; Utils_SetupUid
|
||||
; @routine Utils_SetupUid @global
|
||||
;
|
||||
; Reads UID from EEPROM. If not set generate a new one and store it in EEPROM.
|
||||
;
|
||||
; IN:
|
||||
; OUT:
|
||||
; - CFLAG set if new generated, cleared if there already was one.
|
||||
; REGS: R15, R16, R18, R19, R20, R21, X (R17)
|
||||
; @return CFLAG set if new generated, cleared if there already was one.
|
||||
; @clobbers R16, R18, R19, R20, R21, X (R17)
|
||||
|
||||
Utils_SetupUid:
|
||||
in r15, SREG
|
||||
cli
|
||||
rcall Utils_ReadUid ; (R16, X)
|
||||
cp r18, r19 ; all the same?
|
||||
brne Utils_SetupUid_uidOkay ; different, jmp
|
||||
rcall Utils_ReadUid ; (R16, X)
|
||||
cp r18, r19 ; all the same?
|
||||
brne Utils_SetupUid_uidOkay ; different, jmp
|
||||
cp r18, r20
|
||||
brne Utils_SetupUid_uidOkay ; different, jmp
|
||||
brne Utils_SetupUid_uidOkay ; different, jmp
|
||||
cp r18, r21
|
||||
brne Utils_SetupUid_uidOkay ; different, jmp
|
||||
ldi xl, LOW(EEPROM_OFFS_UUID) ; all the same, generate new uid
|
||||
brne Utils_SetupUid_uidOkay ; different, jmp
|
||||
|
||||
ldi xl, LOW(EEPROM_OFFS_UUID) ; all the same, generate new uid
|
||||
ldi xh, HIGH(EEPROM_OFFS_UUID)
|
||||
rcall Utils_PseudoRandom ; byte 0 (R16, R17, R18, R19)
|
||||
rcall RAND_PseudoRandom ; byte 0 (R16, R17, R18, R19)
|
||||
inc r16
|
||||
rcall Utils_WriteEepromIncr ; (R17)
|
||||
rcall Utils_PseudoRandom ; byte 1
|
||||
rcall Utils_WriteEepromIncr ; (R17)
|
||||
rcall Utils_PseudoRandom ; byte 2
|
||||
rcall Utils_WriteEepromIncr ; (R17)
|
||||
rcall Utils_PseudoRandom ; byte 3
|
||||
rcall Utils_WriteEepromIncr ; (R17)
|
||||
rcall Eeprom_WriteByteIfChanged ; (r17)
|
||||
brcc Utils_SetupUid_ret
|
||||
adiw xh:xl, 1
|
||||
|
||||
rcall RAND_PseudoRandom ; byte 1
|
||||
rcall Eeprom_WriteByteIfChanged ; (r17)
|
||||
brcc Utils_SetupUid_ret
|
||||
adiw xh:xl, 1
|
||||
|
||||
rcall RAND_PseudoRandom ; byte 2
|
||||
rcall Eeprom_WriteByteIfChanged ; (r17)
|
||||
brcc Utils_SetupUid_ret
|
||||
adiw xh:xl, 1
|
||||
|
||||
rcall RAND_PseudoRandom ; byte 3
|
||||
rcall Eeprom_WriteByteIfChanged ; (r17)
|
||||
brcc Utils_SetupUid_ret
|
||||
|
||||
rcall Utils_UpdateSeedInEeprom ; (R16, R17, R18, R19, X)
|
||||
rcall RAND_UpdateSeedInEeprom ; (R16, R17, R18, R19, X)
|
||||
|
||||
Utils_SetupUid_uidOkay:
|
||||
out SREG, r15
|
||||
sec
|
||||
ret
|
||||
|
||||
|
||||
|
||||
; ---------------------------------------------------------------------------
|
||||
; Utils_ReadSeed
|
||||
;
|
||||
; Read seed from EEPROM.
|
||||
;
|
||||
; IN:
|
||||
; OUT:
|
||||
; - R18:R19: seed read
|
||||
; REGS: R16, X
|
||||
|
||||
Utils_ReadSeed:
|
||||
in r15, SREG
|
||||
push r15
|
||||
cli
|
||||
ldi xl, LOW(EEPROM_OFFS_SEED)
|
||||
ldi xh, HIGH(EEPROM_OFFS_SEED)
|
||||
rcall Utils_ReadEepromIncr ; (R16)
|
||||
mov r18, r16
|
||||
rcall Utils_ReadEepromIncr ; (R16)
|
||||
mov r19, r16
|
||||
pop r15
|
||||
out SREG, r15
|
||||
ret
|
||||
|
||||
|
||||
|
||||
; ---------------------------------------------------------------------------
|
||||
; Utils_WriteSeed
|
||||
;
|
||||
; Read seed from EEPROM.
|
||||
;
|
||||
; IN:
|
||||
; - R18:R19: seed to write
|
||||
; OUT:
|
||||
; REGS: R16, X, (R17)
|
||||
Utils_WriteSeed:
|
||||
in r15, SREG
|
||||
push r15
|
||||
cli
|
||||
ldi xl, LOW(EEPROM_OFFS_SEED)
|
||||
ldi xh, HIGH(EEPROM_OFFS_SEED)
|
||||
mov r16, r18
|
||||
rcall Utils_WriteEepromIncr ; (R17)
|
||||
mov r16, r19
|
||||
rcall Utils_WriteEepromIncr ; (R17)
|
||||
pop r15
|
||||
out SREG, r15
|
||||
ret
|
||||
|
||||
|
||||
|
||||
; ---------------------------------------------------------------------------
|
||||
; Utils_TableJump
|
||||
;
|
||||
; Jump to a routine using a jump table.
|
||||
; IN:
|
||||
; - r16: position to jump to
|
||||
; - r17: number of entries in table
|
||||
; - Z : pointer to table
|
||||
; OUT:
|
||||
; - depends on called function
|
||||
; REGS: depends on called function
|
||||
|
||||
Utils_TableJump:
|
||||
cp r16, r17
|
||||
brcc Utils_TableJump_ret
|
||||
clr r17
|
||||
add zl, r16
|
||||
adc zh, r17
|
||||
lsl zl ; shift z left for LPM instruction
|
||||
rol zh
|
||||
lpm r16, z+ ; read pointer from table
|
||||
lpm r17, z
|
||||
tst r16
|
||||
brne Utils_TableJump_jmp
|
||||
tst r17
|
||||
brne Utils_TableJump_jmp
|
||||
Utils_TableJump_ret:
|
||||
ret
|
||||
Utils_TableJump_jmp:
|
||||
push r16 ; jump via stack
|
||||
push r17
|
||||
ret
|
||||
|
||||
|
||||
|
||||
; ---------------------------------------------------------------------------
|
||||
; Find position of a given code in a table.
|
||||
;
|
||||
; IN:
|
||||
; - r16: value to translate
|
||||
; - r17: number of entries
|
||||
; - Z : pointer to table
|
||||
; OUT:
|
||||
; - CFLAG: set if translation found, cleared otherwise
|
||||
; - r16: translated value
|
||||
|
||||
Utils_FindBytePositionInTable:
|
||||
lsl zl ; shift z left for LPM instruction
|
||||
rol zh
|
||||
clr r19
|
||||
Utils_TranslateByTable_loop:
|
||||
lpm r18, z+
|
||||
cp r18, r16
|
||||
breq Utils_TranslateByTable_found
|
||||
inc r19
|
||||
dec r17
|
||||
brne Utils_TranslateByTable_loop
|
||||
clc
|
||||
ret
|
||||
Utils_TranslateByTable_found:
|
||||
mov r16, r19
|
||||
sec
|
||||
Utils_SetupUid_ret:
|
||||
ret
|
||||
; @end
|
||||
|
||||
|
||||
|
||||
@@ -564,3 +188,8 @@ Utils_TranslateByTable_found:
|
||||
UTILS_END:
|
||||
.equ MODULE_SIZE_UTILS = UTILS_END-UTILS_BEGIN
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
@@ -20,6 +20,9 @@
|
||||
.include "devices/all/data.asm"
|
||||
|
||||
.include "common/utils.asm"
|
||||
.include "common/random.asm"
|
||||
.include "common/eeprom-r.asm"
|
||||
.include "common/eeprom-w.asm"
|
||||
.include "common/utils_initial_wait.asm"
|
||||
.include "common/utils_wait_fixed.asm"
|
||||
.include "common/utils_copy_from_flash.asm"
|
||||
|
||||
@@ -34,7 +34,7 @@ main:
|
||||
|
||||
bigcall systemSetSpeed
|
||||
bigcall systemInitHardware
|
||||
bigcall Utils_Init
|
||||
bigcall RAND_SetupSeed
|
||||
bigcall Utils_SetupUid
|
||||
bigcall modulesInit
|
||||
bigcall appsInit
|
||||
@@ -43,16 +43,6 @@ main:
|
||||
|
||||
bigcall onSystemStart
|
||||
|
||||
#ifdef MODULES_LED
|
||||
ldi xl, LOW(blinkPattern) ; debug: set blink pattern
|
||||
ldi xh, HIGH(blinkPattern)
|
||||
ldi zl, LOW(ledA3Flash)
|
||||
ldi zh, HIGH(ledA3Flash)
|
||||
ldi yl, LOW(ledA3Sram)
|
||||
ldi yh, HIGH(ledA3Sram)
|
||||
rcall Led_SetPattern
|
||||
#endif
|
||||
|
||||
main_loop:
|
||||
bigcall systemSleep ; system-dependant
|
||||
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
#endif
|
||||
|
||||
#ifdef MODULES_NETWORK
|
||||
MODULE_BEGIN_NETWORK:
|
||||
.include "common/crc8.asm"
|
||||
.include "common/m_fixedbuffers.asm"
|
||||
.include "common/m_ringbuffer_y.asm"
|
||||
@@ -44,6 +45,9 @@
|
||||
.include "modules/network/msg/value-r.asm"
|
||||
.include "modules/network/msg/addr-r.asm"
|
||||
.include "modules/network/msg/addr-w.asm"
|
||||
MODULE_END_NETWORK:
|
||||
.equ MODULE_SIZE_NETWORK = MODULE_END_NETWORK-MODULE_BEGIN_NETWORK
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef MODULES_UART_BITBANG
|
||||
@@ -89,8 +93,11 @@
|
||||
#endif
|
||||
|
||||
#ifdef MODULES_COM2W
|
||||
MODULE_BEGIN_COM2W:
|
||||
.include "modules/com2w/defs.asm"
|
||||
.include "modules/com2w/com2w.asm"
|
||||
MODULE_END_COM2W:
|
||||
.equ MODULE_SIZE_COM2W = MODULE_END_COM2W-MODULE_BEGIN_COM2W
|
||||
#endif
|
||||
|
||||
#ifdef MODULES_COM2W0
|
||||
@@ -139,9 +146,6 @@
|
||||
|
||||
#ifdef MODULES_LED_SIMPLE
|
||||
.include "modules/led_simple/main.asm"
|
||||
#ifdef MODULES_NETWORK
|
||||
.include "modules/led_simple/recv.asm"
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef MODULES_LED_SIGNAL
|
||||
|
||||
Reference in New Issue
Block a user