use storage::Storage;
const SECTOR_SIZE: usize = 4096;
+const PAGE_SIZE: usize = 256;
pub struct Mx25l {
cs_gpio: u32,
}
enum Command {
+ PP = 0x02,
READ = 0x03,
RDSR = 0x05,
WREN = 0x06,
Ok(())
}
+ pub fn program_page(&self, address: usize, buffer: &[u8; PAGE_SIZE])
+ -> Result<(), Error> {
+ if (address & (PAGE_SIZE - 1)) != 0 {
+ return Err(Error::UnalignedAddress);
+ }
+
+ if buffer.iter().all(|&b| b == 0xff) {
+ return Ok(());
+ }
+
+ self.with_selected(|| {
+ spi::tx8(spi::SPI0, Command::PP as u8);
+
+ spi::tx8(spi::SPI0, (address >> 16) as u8);
+ spi::tx8(spi::SPI0, (address >> 8) as u8);
+ spi::tx8(spi::SPI0, (address >> 0) as u8);
+
+ for &b in buffer.iter() {
+ spi::tx8(spi::SPI0, b);
+ }
+ });
+
+ while self.write_in_progress() {
+ }
+
+ Ok(())
+ }
+
fn write_enable(&self) {
self.with_selected(|| {
spi::tx8(spi::SPI0, Command::WREN as u8);