Skip to content

Commit e830a7a

Browse files
committed
add missing ReadFlash(optional) function
Signed-off-by: Anton Glukhov <anton.a.glukhov@gmail.com>
1 parent 007e610 commit e830a7a

File tree

2 files changed

+38
-0
lines changed

2 files changed

+38
-0
lines changed

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,5 @@ description = "A crate to write CMSIS-DAP flash algorithms for flashing embedded
1414
default = ["erase-chip", "panic-handler"]
1515
erase-chip = []
1616
panic-handler = []
17+
read-flash = []
1718
verify = []

src/lib.rs

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,15 @@ pub trait FlashAlgorithm: Sized + 'static {
7575
/// * `data` - The data to compare with.
7676
#[cfg(feature = "verify")]
7777
fn verify(&mut self, address: u32, size: u32, data: Option<&[u8]>) -> Result<(), ErrorCode>;
78+
79+
/// Read flash.
80+
///
81+
/// # Arguments
82+
///
83+
/// * `address` - The start address of the flash to read.
84+
/// * `data` - The data.
85+
#[cfg(feature = "read-flash")]
86+
fn read_flash(&mut self, address: u32, data: &mut [u8]) -> Result<(), ErrorCode>;
7887
}
7988

8089
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
@@ -167,6 +176,7 @@ macro_rules! algorithm {
167176
}
168177
}
169178
$crate::erase_chip!($type);
179+
$crate::read_flash!($type);
170180
$crate::verify!($type);
171181

172182
#[allow(non_upper_case_globals)]
@@ -270,6 +280,33 @@ macro_rules! erase_chip {
270280
};
271281
}
272282

283+
#[doc(hidden)]
284+
#[macro_export]
285+
#[cfg(not(feature = "read-flash"))]
286+
macro_rules! read_flash {
287+
($type:ty) => {};
288+
}
289+
#[doc(hidden)]
290+
#[macro_export]
291+
#[cfg(feature = "read-flash")]
292+
macro_rules! read_flash {
293+
($type:ty) => {
294+
#[no_mangle]
295+
#[link_section = ".entry"]
296+
pub unsafe extern "C" fn ReadFlash(addr: u32, size: u32, data: *mut u8) -> u32 {
297+
if !_IS_INIT {
298+
return 1;
299+
}
300+
let this = &mut *_ALGO_INSTANCE.as_mut_ptr();
301+
let data_slice: &mut [u8] = unsafe { core::slice::from_raw_parts_mut(data, size as usize) };
302+
match <$type as $crate::FlashAlgorithm>::read_flash(this, addr, data_slice) {
303+
Ok(()) => 0,
304+
Err(e) => e.get(),
305+
}
306+
}
307+
};
308+
}
309+
273310
#[doc(hidden)]
274311
#[macro_export]
275312
#[cfg(not(feature = "verify"))]

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy