blob: a3a6b4f48b83efbf6f04684aae6c2365de09ad55 [file] [log] [blame]
David Brownde7729e2017-01-09 10:41:35 -07001/// Interface wrappers to C API entering to the bootloader
2
3use area::AreaDesc;
David Brown2cbc4702017-07-06 14:18:58 -06004use simflash::Flash;
David Brownde7729e2017-01-09 10:41:35 -07005use libc;
David Brownbdb6db72017-07-06 10:14:37 -06006use api;
David Brownde7729e2017-01-09 10:41:35 -07007
8/// Invoke the bootloader on this flash device.
9pub fn boot_go(flash: &mut Flash, areadesc: &AreaDesc) -> i32 {
David Brownbdb6db72017-07-06 10:14:37 -060010 unsafe { api::set_flash(flash) };
11 let result = unsafe { raw::invoke_boot_go(&areadesc.get_c() as *const _) as i32 };
12 unsafe { api::clear_flash(); };
13 result
David Brownde7729e2017-01-09 10:41:35 -070014}
15
16/// Setter/getter for the flash counter. This isn't thread safe.
17pub fn get_flash_counter() -> i32 {
18 unsafe { raw::flash_counter as i32 }
19}
20
21/// Set the flash counter. Zero indicates the flash should not be interrupted. The counter will
22/// then go negative for each flash operation.
23pub fn set_flash_counter(counter: i32) {
24 unsafe { raw::flash_counter = counter as libc::c_int };
25}
26
27pub fn boot_trailer_sz() -> u32 {
Fabio Utzig7ebb7c22017-04-26 10:59:31 -030028 unsafe { raw::boot_slots_trailer_sz(raw::sim_flash_align) }
David Brownde7729e2017-01-09 10:41:35 -070029}
30
31pub fn get_sim_flash_align() -> u8 {
32 unsafe { raw::sim_flash_align }
33}
34
35pub fn set_sim_flash_align(align: u8) {
36 unsafe { raw::sim_flash_align = align };
37}
38
Fabio Utziga0bc9b52017-06-28 09:19:55 -030039pub fn boot_magic_sz() -> usize {
40 unsafe { raw::BOOT_MAGIC_SZ as usize }
41}
42
43pub fn boot_max_align() -> usize {
44 unsafe { raw::BOOT_MAX_ALIGN as usize }
45}
46
David Brownde7729e2017-01-09 10:41:35 -070047mod raw {
48 use area::CAreaDesc;
49 use libc;
50
51 extern "C" {
52 // This generates a warning about `CAreaDesc` not being foreign safe. There doesn't appear to
53 // be any way to get rid of this warning. See https://github.com/rust-lang/rust/issues/34798
54 // for information and tracking.
David Brownbdb6db72017-07-06 10:14:37 -060055 pub fn invoke_boot_go(areadesc: *const CAreaDesc) -> libc::c_int;
David Brownde7729e2017-01-09 10:41:35 -070056 pub static mut flash_counter: libc::c_int;
57
58 pub static mut sim_flash_align: u8;
Fabio Utzig7ebb7c22017-04-26 10:59:31 -030059 pub fn boot_slots_trailer_sz(min_write_sz: u8) -> u32;
Fabio Utziga0bc9b52017-06-28 09:19:55 -030060
61 pub static BOOT_MAGIC_SZ: u32;
62 pub static BOOT_MAX_ALIGN: u32;
David Brownde7729e2017-01-09 10:41:35 -070063 }
64}