more eeprom cleanups, use u8 for buffer

This commit is contained in:
Sebastien Bourdeauducq 2017-08-07 23:56:51 +08:00
parent bd9082561c
commit 5955c0f97d
1 changed files with 20 additions and 43 deletions

View File

@ -3,10 +3,8 @@ use tm4c129x;
use board; use board;
pub const BLK_COUNT: u16 = 96; // Number of blocks pub const BLOCK_COUNT: u16 = 96;
pub const BLK_U32_LEN: usize = 16; // Number of words in a block pub const BLOCK_LEN: usize = 64;
const PRETRY: u32 = 0x00000004; // Programming Must Be Retried
const ERETRY: u32 = 0x00000008; // Erase Must Be Retried
fn wait_done() { fn wait_done() {
while cortex_m::interrupt::free(|cs| { while cortex_m::interrupt::free(|cs| {
@ -31,56 +29,35 @@ pub fn init() {
wait_done(); wait_done();
} }
pub fn mass_erase() -> bool { pub fn read_block(buffer: &mut [u8; BLOCK_LEN], block: u16) {
wait_done(); assert!(block < BLOCK_COUNT);
cortex_m::interrupt::free(|cs| { cortex_m::interrupt::free(|cs| {
let eeprom = tm4c129x::EEPROM.borrow(cs); let eeprom = tm4c129x::EEPROM.borrow(cs);
eeprom.eedbgme.write(|w| unsafe { w.key().bits(0xE37B).me().bit(true) }); eeprom.eeblock.write(|w| unsafe { w.block().bits(block) });
});
wait_done();
cortex_m::interrupt::free(|cs| {
let sysctl = tm4c129x::SYSCTL.borrow(cs);
sysctl.sreeprom.modify(|_, w| w.r0().bit(true)); // Activate EEPROM reset
board::delay(16);
sysctl.sreeprom.modify(|_, w| w.r0().bit(false)); // Dectivate EEPROM reset
board::delay(16);
while !sysctl.preeprom.read().r0().bit() {} // Wait for the EEPROM to come out of reset
board::delay(16);
});
wait_done();
cortex_m::interrupt::free(|cs| {
let eeprom = tm4c129x::EEPROM.borrow(cs);
let eesupp2 = eeprom.eesupp.read().bits();
eesupp2 & (PRETRY | ERETRY) == 0
})
}
pub fn read_blk(buf: &mut [u32; BLK_U32_LEN], blk: u16) {
assert!(blk < BLK_COUNT);
cortex_m::interrupt::free(|cs| {
let eeprom = tm4c129x::EEPROM.borrow(cs);
eeprom.eeblock.write(|w| unsafe { w.block().bits(blk) });
eeprom.eeoffset.write(|w| unsafe { w.offset().bits(0) }); eeprom.eeoffset.write(|w| unsafe { w.offset().bits(0) });
}); for i in 0..BLOCK_LEN/4 {
for i in 0..BLK_U32_LEN { let word = eeprom.eerdwrinc.read().bits();
cortex_m::interrupt::free(|cs| { buffer[4*i] = word as u8;
let eeprom = tm4c129x::EEPROM.borrow(cs); buffer[4*i+1] = (word >> 8) as u8;
buf[i] = eeprom.eerdwrinc.read().bits(); buffer[4*i+2] = (word >> 16) as u8;
}); buffer[4*i+3] = (word >> 24) as u8;
} }
});
} }
pub fn write_blk(buf: &[u32; BLK_U32_LEN], blk: u16) { pub fn write_block(buffer: &[u8; BLOCK_LEN], block: u16) {
assert!(blk < BLK_COUNT); assert!(block < BLOCK_COUNT);
cortex_m::interrupt::free(|cs| { cortex_m::interrupt::free(|cs| {
let eeprom = tm4c129x::EEPROM.borrow(cs); let eeprom = tm4c129x::EEPROM.borrow(cs);
eeprom.eeblock.write(|w| unsafe { w.block().bits(blk) }); eeprom.eeblock.write(|w| unsafe { w.block().bits(block) });
eeprom.eeoffset.write(|w| unsafe { w.offset().bits(0) }); eeprom.eeoffset.write(|w| unsafe { w.offset().bits(0) });
}); });
for i in 0..BLK_U32_LEN { for i in 0..BLOCK_LEN/4 {
let word = buffer[4*i] as u32 | (buffer[4*i+1] as u32) << 8 |
(buffer[4*i+2] as u32) << 16 | (buffer[4*i+3] as u32) << 24;
cortex_m::interrupt::free(|cs| { cortex_m::interrupt::free(|cs| {
let eeprom = tm4c129x::EEPROM.borrow(cs); let eeprom = tm4c129x::EEPROM.borrow(cs);
eeprom.eerdwrinc.write(|w| unsafe { w.bits(buf[i]) }); eeprom.eerdwrinc.write(|w| unsafe { w.bits(word) });
}); });
board::delay(16); board::delay(16);
wait_done(); wait_done();