Skip to main content

mcumgr_toolkit/
bootloader.rs

1/// Information about the bootloader
2#[derive(Debug, Clone, PartialEq, Eq)]
3pub enum BootloaderInfo {
4    /// MCUboot bootloader
5    MCUboot {
6        /// Bootloader mode
7        ///
8        /// See [`MCUbootMode`] for more information.
9        mode: i32,
10        /// Bootloader has downgrade prevention enabled
11        no_downgrade: bool,
12    },
13    /// Unknown bootloader
14    Unknown {
15        /// Name of the bootloader
16        name: String,
17    },
18}
19
20impl serde::Serialize for BootloaderInfo {
21    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
22    where
23        S: serde::Serializer,
24    {
25        use serde::ser::SerializeStruct;
26
27        let struct_name = "BootloaderInfo";
28
29        match self {
30            BootloaderInfo::MCUboot { mode, no_downgrade } => {
31                let mut s = serializer.serialize_struct(struct_name, 3)?;
32                s.serialize_field("name", &BootloaderType::MCUboot.to_string())?;
33                s.serialize_field("mode", mode)?;
34                s.serialize_field("no_downgrade", no_downgrade)?;
35                s.end()
36            }
37
38            BootloaderInfo::Unknown { name } => {
39                let mut s = serializer.serialize_struct(struct_name, 1)?;
40                s.serialize_field("name", name)?;
41                s.end()
42            }
43        }
44    }
45}
46
47/// Supported bootloader/image types
48#[derive(
49    Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, strum::Display, strum::EnumString,
50)]
51pub enum BootloaderType {
52    /// MCUboot Bootloader
53    MCUboot,
54}
55
56impl BootloaderInfo {
57    /// Extract the bootloader type
58    ///
59    /// If the type is unknown, returns the name of the bootloader `Err` value.
60    pub fn get_bootloader_type(&self) -> Result<BootloaderType, String> {
61        match self {
62            BootloaderInfo::MCUboot { .. } => Ok(BootloaderType::MCUboot),
63            BootloaderInfo::Unknown { name } => Err(name.clone()),
64        }
65    }
66}
67
68/// MCUboot modes
69///
70/// See [`enum mcuboot_mode`](https://github.com/mcu-tools/mcuboot/blob/main/boot/bootutil/include/bootutil/boot_status.h).
71#[derive(
72    strum::FromRepr, strum::IntoStaticStr, strum::Display, Debug, Copy, Clone, PartialEq, Eq,
73)]
74#[repr(i32)]
75#[allow(non_camel_case_types)]
76#[allow(missing_docs)]
77pub enum MCUbootMode {
78    MCUBOOT_MODE_SINGLE_SLOT = 0,
79    MCUBOOT_MODE_SWAP_USING_SCRATCH,
80    MCUBOOT_MODE_UPGRADE_ONLY,
81    MCUBOOT_MODE_SWAP_USING_MOVE,
82    MCUBOOT_MODE_DIRECT_XIP,
83    MCUBOOT_MODE_DIRECT_XIP_WITH_REVERT,
84    MCUBOOT_MODE_RAM_LOAD,
85    MCUBOOT_MODE_FIRMWARE_LOADER,
86    MCUBOOT_MODE_SINGLE_SLOT_RAM_LOAD,
87    MCUBOOT_MODE_SWAP_USING_OFFSET,
88}