common: Implement Storage::write() in Mx25l.
authorTilman Sauerbeck <tilman@code-monkey.de>
Wed, 8 Jan 2020 09:48:31 +0000 (10:48 +0100)
committerTilman Sauerbeck <tilman@code-monkey.de>
Thu, 9 Jan 2020 14:19:36 +0000 (15:19 +0100)
src/common/mx25l.rs
src/common/storage.rs

index 2cc79f08f526b853c3a21a9c77965c09d8c57ff5..a6ad39550e9cbb9d9df7b1c0236e2e7228fabb51 100644 (file)
@@ -23,7 +23,7 @@
 
 use gpio;
 use spi;
-use storage::Storage;
+use storage::{Storage, Error};
 
 const SECTOR_SIZE: usize = 4096;
 const PAGE_SIZE:   usize = 256;
@@ -42,10 +42,6 @@ enum Command {
     RDID = 0x9f,
 }
 
-pub enum Error {
-    UnalignedAddress = 1,
-}
-
 const SR_WIP: u8 = 1 << 0;
 
 impl Mx25l {
@@ -162,4 +158,25 @@ impl Storage for Mx25l {
             }
         })
     }
+
+    fn write(&mut self, address: usize, buffer: &[u8; SECTOR_SIZE])
+             -> Result<(), Error> {
+        if let Err(e) = self.erase_sector(address) {
+            return Err(e);
+        }
+
+        for (i, page_bytes) in buffer.chunks(PAGE_SIZE).enumerate() {
+            let page_address = address + (i * PAGE_SIZE);
+
+            // XXX: Inefficient.
+            let mut ba = [0xff; PAGE_SIZE];
+            ba.copy_from_slice(&page_bytes);
+
+            if let Err(e) = self.program_page(page_address, &ba) {
+                return Err(e);
+            }
+        }
+
+        Ok(())
+    }
 }
index 7f0944620bca915ea6839ffc25bde0e7e0478ded..784a1f669a52df95fdc24a160d5dfe424d3a6d14 100644 (file)
  * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  */
 
+pub enum Error {
+    UnalignedAddress = 1,
+}
+
 pub trait Storage {
     fn read(&self, address: usize, buffer: &mut [u8]);
+
+    fn write(&mut self, address: usize, buffer: &[u8; 4096]) -> Result<(), Error>;
 }