1#![allow(dead_code)]
2
3use static_assertions::const_assert;
4use std::mem;
5use zerocopy::{FromBytes, Immutable, IntoBytes};
6
7pub const UF2_MAGIC_START0: u32 = 0x0A324655;
8pub const UF2_MAGIC_START1: u32 = 0x9E5D5157;
9pub const UF2_MAGIC_END: u32 = 0x0AB16F30;
10
11pub const UF2_FLAG_NOT_MAIN_FLASH: u32 = 0x00000001;
12pub const UF2_FLAG_FILE_CONTAINER: u32 = 0x00001000;
13pub const UF2_FLAG_FAMILY_ID_PRESENT: u32 = 0x00002000;
14pub const UF2_FLAG_MD5_PRESENT: u32 = 0x00004000;
15
16pub const RP2040_FAMILY_ID: u32 = 0xe48bff56;
17
18#[repr(packed)]
19#[derive(IntoBytes, FromBytes, Immutable)]
20pub struct Uf2BlockHeader {
21 pub magic_start0: u32,
22 pub magic_start1: u32,
23 pub flags: u32,
24 pub target_addr: u32,
25 pub payload_size: u32,
26 pub block_no: u32,
27 pub num_blocks: u32,
28 pub file_size: u32, }
30
31pub type Uf2BlockData = [u8; 476];
32
33#[repr(packed)]
34#[derive(IntoBytes, FromBytes, Immutable)]
35pub struct Uf2BlockFooter {
36 pub magic_end: u32,
37}
38
39const_assert!(mem::size_of::<Uf2BlockHeader>() == 32);
40const_assert!(mem::size_of::<Uf2BlockFooter>() == 4);
41const_assert!(
42 mem::size_of::<Uf2BlockHeader>()
43 + mem::size_of::<Uf2BlockData>()
44 + mem::size_of::<Uf2BlockFooter>()
45 == 512
46);