From bf678fca8282e7ba2e2062933ab96a99181f4a40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franti=C5=A1ek=20Boh=C3=A1=C4=8Dek?= Date: Tue, 20 Dec 2022 23:16:33 +0100 Subject: [PATCH] feat: add eeprom support --- src/eeprom.rs | 61 +++++++++++++++++++++++++++++++++++++++++++++++ src/entrypoint.rs | 23 +++++++++++++++++- 2 files changed, 83 insertions(+), 1 deletion(-) create mode 100644 src/eeprom.rs diff --git a/src/eeprom.rs b/src/eeprom.rs new file mode 100644 index 0000000..9dfa1ef --- /dev/null +++ b/src/eeprom.rs @@ -0,0 +1,61 @@ +pub struct Eeprom { + eeprom: avr_device::atmega8::EEPROM, +} + +impl Eeprom { + pub fn new(ep: avr_device::atmega8::EEPROM) -> Eeprom { + Eeprom { + eeprom: ep + } + } + + fn wait_until_write(&self) { + while self.eeprom.eecr.read().eewe().bit_is_set() {} + } + + pub fn read(&self, address: u16, data: &mut [u8]) { + let mut address = address; + for i in 0..data.len() { + let byte = self.read_byte(address); + data[i] = byte; + address += 1; + } + } + + pub fn write(&self, address: u16, data: &[u8]) { + let mut address = address; + for byte in data.iter() { + self.write_byte(address, *byte); + address += 1; + } + } + + pub fn read_byte(&self, address: u16) -> u8 { + self.wait_until_write(); + + self.eeprom.eear.write(|w| unsafe { + w.bits(address) + }); + + self.eeprom.eecr.write(|w| w.eere().set_bit()); + self.eeprom.eedr.read().bits() + } + + pub fn write_byte(&self, address: u16, data: u8) { + self.wait_until_write(); + + self.eeprom.eear.write(|w| unsafe { + w.bits(address) + }); + self.eeprom.eedr.write(|w| unsafe { + w.bits(data) + }); + + self.eeprom.eecr.write(|w| + w + .eemwe().set_bit() + .eewe().clear_bit()); + + self.eeprom.eecr.write(|w| w.eewe().set_bit()); + } +} diff --git a/src/entrypoint.rs b/src/entrypoint.rs index 5d05633..c4f0520 100644 --- a/src/entrypoint.rs +++ b/src/entrypoint.rs @@ -1,6 +1,12 @@ #![no_std] #![no_main] +// TODO: seeds to eeprom +// + +extern crate avr_device; + +mod eeprom; mod animation; mod button; mod filled_seven_segment; @@ -78,8 +84,23 @@ fn main() -> ! { let btn_confirm = button::Button::create(in_confirm, false); // PERIPHERALS END + + // load seeds from eeprom + let ep = eeprom::Eeprom::new(dp.EEPROM); + let mut seeds = [0u8; 3]; + ep.read(0, &mut seeds); + if seeds[0] == 0 && seeds[1] == 0 && seeds[2] == 0 { + seeds[0] = 125; + seeds[1] = 139; + seeds[2] = 45; + } + // RNG - let rng = rng::Rng::init(123, 111, 45); + let mut rng = rng::Rng::init(seeds[0], seeds[1], seeds[2]); + + // write new seeds + let next_seeds = [rng.take_u8(), rng.take_u8(), rng.take_u8()]; + ep.write(0, &next_seeds); // GAME let mut game = Game { -- 2.48.1