elf2flash_core/
uf2.rs

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, // or familyID
29}
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);