ATtiny_Garden-Lamp/code/random_avr.c

34 lines
680 B
C
Raw Permalink Normal View History

2021-03-28 13:48:30 +00:00
/**
Copyright (c) 2017, Łukasz Marcin Podkalicki <lpodkalicki@gmail.com>
Lightweight library of 16 bit random number generator based on LFSR.
*/
#include <avr/eeprom.h>
#include "random_avr.h"
static uint16_t random_number = 0;
static uint16_t
lfsr16_next(uint16_t n)
{
return (n >> 0x01U) ^ (-(n & 0x01U) & 0xB400U);
}
void random_init(uint16_t seed)
{
#ifdef USE_RANDOM_SEED
random_number = lfsr16_next(eeprom_read_word((uint16_t *)RANDOM_SEED_ADDRESS) ^ seed);
eeprom_write_word((uint16_t *)0, random_number);
#else
random_number = seed;
#endif /* !USE_RANDOM_SEED */
}
uint16_t
random_avr(void)
{
return (random_number = lfsr16_next(random_number));
}