1#![no_std]
2#![feature(asm_experimental_arch)]
3#![doc = include_str!("../README.md")]
4
5mod address;
6mod buffer;
7
8use core::ops::Deref;
9use const_env__value::value_from_env;
10pub mod spm;
11pub use address::Address;
12pub use buffer::PageBuffer;
13
14pub const SPM_PAGESIZE_BYTES: usize = value_from_env!("AVR_BOOT_SPM_PAGESIZE": usize);
16
17pub const SPM_PAGESIZE_WORDS: usize = SPM_PAGESIZE_BYTES / 2;
19
20#[cfg(extended_addressing)]
21#[doc(hidden)]
22pub const RAMPZ: *mut u8 = value_from_env!("AVR_RAMPZ": u8) as *mut u8;
23#[cfg(target_arch = "avr")]
24const SPMCSR: *mut u8 = value_from_env!("AVR_BOOT_SPMCSR": u8) as *mut u8;
25#[cfg(target_arch = "avr")]
26const SPMCSR_ADDR: u16 = value_from_env!("AVR_BOOT_SPMCSR": u8) as u16;
27#[cfg(target_arch = "avr")]
28const PAGE_ERASE: u8 = value_from_env!("AVR_BOOT_PAGE_ERASE": u8);
29#[cfg(target_arch = "avr")]
30const PAGE_WRITE: u8 = value_from_env!("AVR_BOOT_PAGE_WRITE": u8);
31#[cfg(target_arch = "avr")]
32const PAGE_FILL: u8 = value_from_env!("AVR_BOOT_PAGE_FILL": u8);
33#[cfg(target_arch = "avr")]
34const LOCK_BITS_SET: u8 = value_from_env!("AVR_BOOT_LOCK_BITS_SET": u8);
35#[cfg(all(target_arch = "avr", rww_enable))]
36const RWW_ENABLE: u8 = value_from_env!("AVR_BOOT_RWW_ENABLE": u8);
37
38pub struct DataPage(pub [u16; SPM_PAGESIZE_WORDS]);
40
41impl<'a> From<&'a [u16; SPM_PAGESIZE_WORDS]> for &'a DataPage {
42 fn from(data: &'a [u16; SPM_PAGESIZE_WORDS]) -> &'a DataPage {
43 unsafe { core::mem::transmute(data) }
44 }
45}
46
47impl<'a> From<&'a [u8; SPM_PAGESIZE_BYTES]> for &'a DataPage {
48 fn from(data: &'a [u8; SPM_PAGESIZE_BYTES]) -> &'a DataPage {
49 unsafe { core::mem::transmute(data) }
50 }
51}
52
53impl From<[u16; SPM_PAGESIZE_WORDS]> for DataPage {
54 fn from(data: [u16; SPM_PAGESIZE_WORDS]) -> DataPage {
55 DataPage(data)
56 }
57}
58
59impl From<[u8; SPM_PAGESIZE_BYTES]> for DataPage {
60 fn from(data: [u8; SPM_PAGESIZE_BYTES]) -> DataPage {
61 unsafe { core::mem::transmute(data) }
62 }
63}
64
65impl Deref for DataPage {
66 type Target = [u16; SPM_PAGESIZE_WORDS];
67 fn deref(&self) -> &Self::Target {
68 &self.0
69 }
70}