# prusa3d/prusa-firmware architecture

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

- Interactive diagram: https://gitdiagram.com/prusa3d/prusa-firmware
- Repository: https://github.com/prusa3d/prusa-firmware

## Overview

Prusa Firmware is the embedded control software for Original Prusa i3 printer variants. Its principal workflow accepts commands from a host or SD card, queues and interprets them, then coordinates motion and thermal control while reporting status through the display or host. Other product capabilities include configuration persistence, bed calibration, filament sensing, power-panic recovery, and optional MMU2 control. The graph reflects the repository tree and README plus sampled excerpts; unsampled implementations are represented only where their module names establish a subsystem, and uncertain links are omitted.

Main entry points: [`Firmware/Marlin_main.cpp`](https://github.com/prusa3d/prusa-firmware/blob/MK3/Firmware/Marlin_main.cpp) (Firmware loop), [`Firmware/ultralcd.cpp`](https://github.com/prusa3d/prusa-firmware/blob/MK3/Firmware/ultralcd.cpp) (LCD interface), [`Firmware/cmdqueue.cpp`](https://github.com/prusa3d/prusa-firmware/blob/MK3/Firmware/cmdqueue.cpp) (Command queue), [`Firmware/host.cpp`](https://github.com/prusa3d/prusa-firmware/blob/MK3/Firmware/host.cpp) (Host interface)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_command["Command handling"]
  node_hostio["Host interface<br/>[host.cpp]"]
  node_sdreader["SD print reader<br/>[cardreader.cpp]"]
  node_queue["Command queue<br/>[cmdqueue.cpp]"]
  node_main["Firmware loop<br/>[Marlin_main.cpp]"]
  node_dcodes["D-code handlers<br/>[Dcodes.cpp]"]
  node_tcodes["T-code handlers<br/>[Tcodes.cpp]"]
end

subgraph group_control["Printer control"]
  node_planner["Motion planner<br/>[planner.cpp]"]
  node_stepper["Stepper execution<br/>[stepper.cpp]"]
  node_temperature["Thermal control<br/>[temperature.cpp]"]
end

subgraph group_interface["User interfaces"]
  node_lcd["LCD interface<br/>[ultralcd.cpp]"]
  node_menu["Printer menus<br/>[menu.cpp]"]
  node_messages["Localized messages<br/>[messages.cpp]"]
end

subgraph group_state["State and recovery"]
  node_config["Configuration store"]
  node_eeprom[("EEPROM<br/>[eeprom.cpp]")]
  node_calibration["Bed calibration"]
  node_powerpanic["Power-panic recovery<br/>[power_panic.cpp]"]
end

subgraph group_extensions["Printer extensions"]
  node_filament["Filament sensing"]
  node_mmu["MMU2 controller<br/>[mmu2.cpp]"]
  node_mmuproto["MMU2 protocol<br/>[mmu2_protocol.cpp]"]
end

node_host(("Host computer"))
node_sd[("SD card")]
node_motors(("Printer motors"))
node_thermalhw(("Heaters and sensors"))
node_mmuunit(("MMU2 unit"))

node_host -->|"sends commands"| node_hostio
node_hostio -->|"enqueues"| node_queue
node_sd -->|"provides print"| node_sdreader
node_sdreader -->|"enqueues"| node_queue
node_queue -->|"supplies commands"| node_main
node_main -->|"dispatches"| node_dcodes
node_main -->|"dispatches"| node_tcodes
node_main -->|"plans moves"| node_planner
node_planner -->|"sets steps"| node_stepper
node_stepper -->|"drives"| node_motors
node_main -->|"manages heating"| node_temperature
node_temperature -->|"controls and reads"| node_thermalhw
node_main -->|"updates interface"| node_lcd
node_lcd -->|"shows menus"| node_menu
node_lcd -->|"displays text"| node_messages
node_config -->|"persists settings"| node_eeprom
node_main -->|"runs calibration"| node_calibration
node_main -->|"handles recovery"| node_powerpanic
node_main -->|"checks filament"| node_filament
node_main -.->|"coordinates"| node_mmu
node_mmu -.->|"uses protocol"| node_mmuproto
node_mmuproto -.->|"communicates"| node_mmuunit

click node_hostio "https://github.com/prusa3d/prusa-firmware/blob/MK3/Firmware/host.cpp"
click node_sdreader "https://github.com/prusa3d/prusa-firmware/blob/MK3/Firmware/cardreader.cpp"
click node_queue "https://github.com/prusa3d/prusa-firmware/blob/MK3/Firmware/cmdqueue.cpp"
click node_main "https://github.com/prusa3d/prusa-firmware/blob/MK3/Firmware/Marlin_main.cpp"
click node_dcodes "https://github.com/prusa3d/prusa-firmware/blob/MK3/Firmware/Dcodes.cpp"
click node_tcodes "https://github.com/prusa3d/prusa-firmware/blob/MK3/Firmware/Tcodes.cpp"
click node_planner "https://github.com/prusa3d/prusa-firmware/blob/MK3/Firmware/planner.cpp"
click node_stepper "https://github.com/prusa3d/prusa-firmware/blob/MK3/Firmware/stepper.cpp"
click node_temperature "https://github.com/prusa3d/prusa-firmware/blob/MK3/Firmware/temperature.cpp"
click node_lcd "https://github.com/prusa3d/prusa-firmware/blob/MK3/Firmware/ultralcd.cpp"
click node_menu "https://github.com/prusa3d/prusa-firmware/blob/MK3/Firmware/menu.cpp"
click node_messages "https://github.com/prusa3d/prusa-firmware/blob/MK3/Firmware/messages.cpp"
click node_config "https://github.com/prusa3d/prusa-firmware/blob/MK3/Firmware/ConfigurationStore.cpp"
click node_eeprom "https://github.com/prusa3d/prusa-firmware/blob/MK3/Firmware/eeprom.cpp"
click node_calibration "https://github.com/prusa3d/prusa-firmware/blob/MK3/Firmware/mesh_bed_calibration.cpp"
click node_powerpanic "https://github.com/prusa3d/prusa-firmware/blob/MK3/Firmware/power_panic.cpp"
click node_filament "https://github.com/prusa3d/prusa-firmware/blob/MK3/Firmware/Filament_sensor.cpp"
click node_mmu "https://github.com/prusa3d/prusa-firmware/blob/MK3/Firmware/mmu2.cpp"
click node_mmuproto "https://github.com/prusa3d/prusa-firmware/blob/MK3/Firmware/mmu2_protocol.cpp"

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_hostio,node_sdreader,node_queue,node_main,node_dcodes,node_tcodes toneBlue
class node_planner,node_stepper,node_temperature,node_sd toneAmber
class node_lcd,node_menu,node_messages toneMint
class node_config,node_eeprom,node_calibration,node_powerpanic toneRose
class node_filament,node_mmu,node_mmuproto,node_host,node_motors,node_thermalhw,node_mmuunit toneIndigo
```

## Components

### Command handling

- [Host interface](https://github.com/prusa3d/prusa-firmware/blob/MK3/Firmware/host.cpp): `Firmware/host.cpp`
- [SD print reader](https://github.com/prusa3d/prusa-firmware/blob/MK3/Firmware/cardreader.cpp): `Firmware/cardreader.cpp`
- [Command queue](https://github.com/prusa3d/prusa-firmware/blob/MK3/Firmware/cmdqueue.cpp): `Firmware/cmdqueue.cpp`
- [Firmware loop](https://github.com/prusa3d/prusa-firmware/blob/MK3/Firmware/Marlin_main.cpp): `Firmware/Marlin_main.cpp`
- [D-code handlers](https://github.com/prusa3d/prusa-firmware/blob/MK3/Firmware/Dcodes.cpp): `Firmware/Dcodes.cpp`
- [T-code handlers](https://github.com/prusa3d/prusa-firmware/blob/MK3/Firmware/Tcodes.cpp): `Firmware/Tcodes.cpp`

### Printer control

- [Motion planner](https://github.com/prusa3d/prusa-firmware/blob/MK3/Firmware/planner.cpp): `Firmware/planner.cpp`
- [Stepper execution](https://github.com/prusa3d/prusa-firmware/blob/MK3/Firmware/stepper.cpp): `Firmware/stepper.cpp`
- [Thermal control](https://github.com/prusa3d/prusa-firmware/blob/MK3/Firmware/temperature.cpp): `Firmware/temperature.cpp`

### User interfaces

- [LCD interface](https://github.com/prusa3d/prusa-firmware/blob/MK3/Firmware/ultralcd.cpp): `Firmware/ultralcd.cpp`
- [Printer menus](https://github.com/prusa3d/prusa-firmware/blob/MK3/Firmware/menu.cpp): `Firmware/menu.cpp`
- [Localized messages](https://github.com/prusa3d/prusa-firmware/blob/MK3/Firmware/messages.cpp): `Firmware/messages.cpp`

### State and recovery

- [Configuration store](https://github.com/prusa3d/prusa-firmware/blob/MK3/Firmware/ConfigurationStore.cpp): `Firmware/ConfigurationStore.cpp`
- [EEPROM](https://github.com/prusa3d/prusa-firmware/blob/MK3/Firmware/eeprom.cpp): `Firmware/eeprom.cpp`
- [Bed calibration](https://github.com/prusa3d/prusa-firmware/blob/MK3/Firmware/mesh_bed_calibration.cpp): `Firmware/mesh_bed_calibration.cpp`
- [Power-panic recovery](https://github.com/prusa3d/prusa-firmware/blob/MK3/Firmware/power_panic.cpp): `Firmware/power_panic.cpp`

### Printer extensions

- [Filament sensing](https://github.com/prusa3d/prusa-firmware/blob/MK3/Firmware/Filament_sensor.cpp): `Firmware/Filament_sensor.cpp`
- [MMU2 controller](https://github.com/prusa3d/prusa-firmware/blob/MK3/Firmware/mmu2.cpp): `Firmware/mmu2.cpp`
- [MMU2 protocol](https://github.com/prusa3d/prusa-firmware/blob/MK3/Firmware/mmu2_protocol.cpp): `Firmware/mmu2_protocol.cpp`

### Other components

- **Host computer**
- **SD card**
- **Printer motors**
- **Heaters and sensors**
- **MMU2 unit**

## Connections

- Host computer → Host interface: sends commands
- Host interface → Command queue: enqueues
- SD card → SD print reader: provides print
- SD print reader → Command queue: enqueues
- Command queue → Firmware loop: supplies commands
- Firmware loop → D-code handlers: dispatches
- Firmware loop → T-code handlers: dispatches
- Firmware loop → Motion planner: plans moves
- Motion planner → Stepper execution: sets steps
- Stepper execution → Printer motors: drives
- Firmware loop → Thermal control: manages heating
- Thermal control → Heaters and sensors: controls and reads
- Firmware loop → LCD interface: updates interface
- LCD interface → Printer menus: shows menus
- LCD interface → Localized messages: displays text
- Configuration store → EEPROM: persists settings
- Firmware loop → Bed calibration: runs calibration
- Firmware loop → Power-panic recovery: handles recovery
- Firmware loop → Filament sensing: checks filament
- Firmware loop → MMU2 controller: coordinates
- MMU2 controller → MMU2 protocol: uses protocol
- MMU2 protocol → MMU2 unit: communicates
