# mayankpatel97/stm32-dualslot-bootloader architecture

> Architecture diagram of the GitHub repository mayankpatel97/stm32-dualslot-bootloader, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-29). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/mayankpatel97/stm32-dualslot-bootloader
- Repository: https://github.com/mayankpatel97/stm32-dualslot-bootloader

## Overview

This repository describes an STM32 firmware-update system: firmware is encrypted and packaged on the host, transferred over USB/UART, staged in external SPI flash, checked, and installed or rolled back. The README documents dual slots, CRC validation, encryption, and version reporting; the tree identifies corresponding bootloader, flash, crypto, loader, and USB-device areas. The sampled bootloader main currently shows SPI-flash read/write testing, not the update flow itself, so detailed implementation wiring is based on README claims and is not verified in the excerpts.

Main entry points: [`Bootloader/Core/Src/boot.c`](https://github.com/mayankpatel97/stm32-dualslot-bootloader/blob/main/Bootloader/Core/Src/boot.c) (Bootloader control), [`LOADER/loader.py`](https://github.com/mayankpatel97/stm32-dualslot-bootloader/blob/main/LOADER/loader.py) (Host loader), [`LOCK_BIN/lock_bin.py`](https://github.com/mayankpatel97/stm32-dualslot-bootloader/blob/main/LOCK_BIN/lock_bin.py) (Package encryption), [`LedBlinkApp/USB_DEVICE/App/usbd_cdc_if.c`](https://github.com/mayankpatel97/stm32-dualslot-bootloader/blob/main/LedBlinkApp/USB_DEVICE/App/usbd_cdc_if.c) (USB device interface)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_host["Host Tools"]
  node_lockbin["Package encryption<br/>[lock_bin.py]"]
  node_package["Encrypted package"]
  node_loader["Host loader<br/>[loader.py]"]
end

subgraph group_device["Device Update"]
  node_boot["Bootloader control<br/>[boot.c]"]
  node_entry["Bootloader startup<br/>[main.c]"]
  node_usb["USB device interface<br/>[usbd_cdc_if.c]"]
  node_crypto["AES-128<br/>[aes128.c]"]
  node_validation["Integrity and version checks<br/>[boot.c]"]
  node_install["Firmware installation<br/>[boot.c]"]
  node_rollback["Rollback selection<br/>[boot.c]"]
  node_version["Version reporting<br/>[boot.c]"]
end

subgraph group_storage["Firmware Storage"]
  node_spi["SPI flash driver<br/>[exflash.c]"]
  node_extflash[("External SPI flash")]
  node_slots[("Dual firmware slots<br/>[boot.c]")]
end

subgraph group_app["Target Application"]
  node_application["LED blink application<br/>[main.c]"]
end

node_operator(("Firmware operator"))
node_firmware["Firmware input"]
node_transport{{"USB / UART"}}
node_mcu[("STM32 internal flash")]

node_operator -->|"provides"| node_firmware
node_firmware -->|"packages"| node_lockbin
node_lockbin -->|"encrypts"| node_package
node_operator -->|"runs"| node_loader
node_package -->|"loads"| node_loader
node_loader -->|"transmits"| node_transport
node_transport -->|"delivers"| node_boot
node_transport -.->|"USB link"| node_usb
node_usb -.->|"forwards data"| node_boot
node_entry -->|"starts"| node_boot
node_boot -->|"decrypts with"| node_crypto
node_boot -->|"checks integrity"| node_validation
node_boot -->|"uses"| node_spi
node_spi -->|"reads / writes"| node_extflash
node_boot -->|"manages"| node_slots
node_boot -->|"installs"| node_install
node_install -->|"writes firmware"| node_mcu
node_boot -->|"selects fallback"| node_rollback
node_rollback -->|"chooses prior image"| node_slots
node_loader -->|"requests version"| node_version
node_version -->|"reports version"| node_transport
node_mcu -->|"runs"| node_application

click node_lockbin "https://github.com/mayankpatel97/stm32-dualslot-bootloader/blob/main/LOCK_BIN/lock_bin.py"
click node_loader "https://github.com/mayankpatel97/stm32-dualslot-bootloader/blob/main/LOADER/loader.py"
click node_boot "https://github.com/mayankpatel97/stm32-dualslot-bootloader/blob/main/Bootloader/Core/Src/boot.c"
click node_entry "https://github.com/mayankpatel97/stm32-dualslot-bootloader/blob/main/Bootloader/Core/Src/main.c"
click node_usb "https://github.com/mayankpatel97/stm32-dualslot-bootloader/blob/main/LedBlinkApp/USB_DEVICE/App/usbd_cdc_if.c"
click node_crypto "https://github.com/mayankpatel97/stm32-dualslot-bootloader/blob/main/Bootloader/aes128/aes128.c"
click node_validation "https://github.com/mayankpatel97/stm32-dualslot-bootloader/blob/main/Bootloader/Core/Src/boot.c"
click node_spi "https://github.com/mayankpatel97/stm32-dualslot-bootloader/blob/main/Bootloader/Core/Src/exflash.c"
click node_slots "https://github.com/mayankpatel97/stm32-dualslot-bootloader/blob/main/Bootloader/Core/Src/boot.c"
click node_install "https://github.com/mayankpatel97/stm32-dualslot-bootloader/blob/main/Bootloader/Core/Src/boot.c"
click node_rollback "https://github.com/mayankpatel97/stm32-dualslot-bootloader/blob/main/Bootloader/Core/Src/boot.c"
click node_version "https://github.com/mayankpatel97/stm32-dualslot-bootloader/blob/main/Bootloader/Core/Src/boot.c"
click node_application "https://github.com/mayankpatel97/stm32-dualslot-bootloader/blob/main/LedBlinkApp/Core/Src/main.c"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_lockbin,node_package,node_loader toneBlue
class node_boot,node_entry,node_usb,node_crypto,node_validation,node_install,node_rollback,node_version,node_mcu toneAmber
class node_spi,node_extflash,node_slots toneMint
class node_application toneRose
class node_operator,node_firmware,node_transport toneIndigo
```

## Components

### Host Tools

- [Package encryption](https://github.com/mayankpatel97/stm32-dualslot-bootloader/blob/main/LOCK_BIN/lock_bin.py): `LOCK_BIN/lock_bin.py`
- **Encrypted package**
- [Host loader](https://github.com/mayankpatel97/stm32-dualslot-bootloader/blob/main/LOADER/loader.py): `LOADER/loader.py`

### Device Update

- [Bootloader control](https://github.com/mayankpatel97/stm32-dualslot-bootloader/blob/main/Bootloader/Core/Src/boot.c): `Bootloader/Core/Src/boot.c`
- [Bootloader startup](https://github.com/mayankpatel97/stm32-dualslot-bootloader/blob/main/Bootloader/Core/Src/main.c): `Bootloader/Core/Src/main.c`
- [USB device interface](https://github.com/mayankpatel97/stm32-dualslot-bootloader/blob/main/LedBlinkApp/USB_DEVICE/App/usbd_cdc_if.c): `LedBlinkApp/USB_DEVICE/App/usbd_cdc_if.c`
- [AES-128](https://github.com/mayankpatel97/stm32-dualslot-bootloader/blob/main/Bootloader/aes128/aes128.c): `Bootloader/aes128/aes128.c`
- [Integrity and version checks](https://github.com/mayankpatel97/stm32-dualslot-bootloader/blob/main/Bootloader/Core/Src/boot.c): `Bootloader/Core/Src/boot.c`
- [Firmware installation](https://github.com/mayankpatel97/stm32-dualslot-bootloader/blob/main/Bootloader/Core/Src/boot.c): `Bootloader/Core/Src/boot.c`
- [Rollback selection](https://github.com/mayankpatel97/stm32-dualslot-bootloader/blob/main/Bootloader/Core/Src/boot.c): `Bootloader/Core/Src/boot.c`
- [Version reporting](https://github.com/mayankpatel97/stm32-dualslot-bootloader/blob/main/Bootloader/Core/Src/boot.c): `Bootloader/Core/Src/boot.c`

### Firmware Storage

- [SPI flash driver](https://github.com/mayankpatel97/stm32-dualslot-bootloader/blob/main/Bootloader/Core/Src/exflash.c): `Bootloader/Core/Src/exflash.c`
- **External SPI flash**
- [Dual firmware slots](https://github.com/mayankpatel97/stm32-dualslot-bootloader/blob/main/Bootloader/Core/Src/boot.c): `Bootloader/Core/Src/boot.c`

### Target Application

- [LED blink application](https://github.com/mayankpatel97/stm32-dualslot-bootloader/blob/main/LedBlinkApp/Core/Src/main.c): `LedBlinkApp/Core/Src/main.c`

### Other components

- **Firmware operator**
- **Firmware input**
- **USB / UART**
- **STM32 internal flash**

## Connections

- Firmware operator → Firmware input: provides
- Firmware input → Package encryption: packages
- Package encryption → Encrypted package: encrypts
- Firmware operator → Host loader: runs
- Encrypted package → Host loader: loads
- Host loader → USB / UART: transmits
- USB / UART → Bootloader control: delivers
- USB / UART → USB device interface: USB link
- USB device interface → Bootloader control: forwards data
- Bootloader startup → Bootloader control: starts
- Bootloader control → AES-128: decrypts with
- Bootloader control → Integrity and version checks: checks integrity
- Bootloader control → SPI flash driver: uses
- SPI flash driver → External SPI flash: reads / writes
- Bootloader control → Dual firmware slots: manages
- Bootloader control → Firmware installation: installs
- Firmware installation → STM32 internal flash: writes firmware
- Bootloader control → Rollback selection: selects fallback
- Rollback selection → Dual firmware slots: chooses prior image
- Host loader → Version reporting: requests version
- Version reporting → USB / UART: reports version
- STM32 internal flash → LED blink application: runs
