Compare commits
2 Commits
d20456a39c
..
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 7513695d8d | |||
| 293cfbd35f |
@@ -1,8 +1,15 @@
|
|||||||
# UTAT Firmware Development Environment
|
# MCUBoot Implementation Guide
|
||||||
|
|
||||||
My firmware development environment for the University of Toronto Aerospace Team
|
Documentation of the steps taken to implement MCUBoot on a Nucleo G431RB development board.
|
||||||
|
|
||||||
https://docs.zephyrproject.org/latest/develop/getting_started/index.html
|
## Environnment config
|
||||||
|
Use the environment written in flake.nix by running `nix develop`
|
||||||
|
|
||||||
|
|
||||||
|
## Set up Zephyr
|
||||||
|
Zephyr is the RTOS that uses the MCUboot bootloader being set up.
|
||||||
|
|
||||||
|
[Getting started with Zephyr](https://docs.zephyrproject.org/latest/develop/getting_started/index.html)
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
west init zephyrproject
|
west init zephyrproject
|
||||||
@@ -13,25 +20,85 @@ west zephyr-export
|
|||||||
|
|
||||||
cd zepyhr
|
cd zepyhr
|
||||||
west sdk install
|
west sdk install
|
||||||
|
```
|
||||||
|
|
||||||
|
## MCUBoot POC Implementation
|
||||||
|
|
||||||
|
MCUBoot is a bootloader for Zephyr, which allows multiple firmwares to exist on a board. MCUBoot can dynamically switch which firmware is active. This is useful in the event of one firmware failing.
|
||||||
|
|
||||||
|
[Abstract MCUBoot Guide](https://docs.mcuboot.com/readme-zephyr.html)
|
||||||
|
|
||||||
|
```sh
|
||||||
west build -p always -b nucleo_g431rb samples/basic/blinky
|
west build -p always -b nucleo_g431rb samples/basic/blinky
|
||||||
west flash --runner pyocd # had to su root first to run this (after running nix develop)
|
west flash --runner pyocd # had to su root first to run this (after running nix develop)
|
||||||
|
```
|
||||||
|
|
||||||
# MCUBoot
|
|
||||||
cd ~/utat-dev/zephyrproject
|
|
||||||
# Configure the DTS for partition sizes: https://docs.zephyrproject.org/latest/build/dts/intro-scope-purpose.html
|
|
||||||
# https://docs.zephyrproject.org/latest/build/dts/api/bindings/mtd/fixed-partitions.html
|
|
||||||
nvim "zephyr/boards/st/nucleo_g431rb/nucleo_g431rb.dts"
|
|
||||||
|
|
||||||
|
## Configure partition sizes
|
||||||
|
|
||||||
|
The devicetree specification file declares the hardware configuration. The flash storage needs three partitions, one for boot, and two for the two firmwares it will hold.
|
||||||
|
|
||||||
|
[DeviceTree Specification documentation](https://docs.zephyrproject.org/latest/build/dts/intro-scope-purpose.html)
|
||||||
|
|
||||||
|
[Partitioning examples](https://docs.zephyrproject.org/latest/build/dts/api/bindings/mtd/fixed-partitions.html)
|
||||||
|
|
||||||
|
The board I'm using has its DeviceTree Specification in `zephyr/boards/st/nucleo_g431rb/nucleo_g431rb.dts`
|
||||||
|
|
||||||
|
I created a partition for MCUBoot, two firmware slots, and additional storage in the flash storage.
|
||||||
|
|
||||||
|
```c
|
||||||
|
&flash0 {
|
||||||
|
partitions {
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <1>;
|
||||||
|
ranges;
|
||||||
|
|
||||||
|
boot_partition: partition@0 {
|
||||||
|
compatible = "zephyr,mapped-partition";
|
||||||
|
label = "mcuboot";
|
||||||
|
reg = <0x00000000 0x00008000>;
|
||||||
|
};
|
||||||
|
|
||||||
|
slot0_partition: partition@8000 {
|
||||||
|
compatible = "zephyr,mapped-partition";
|
||||||
|
label = "image-0";
|
||||||
|
reg = <0x00008000 0x00010000>;
|
||||||
|
};
|
||||||
|
|
||||||
|
slot1_partition: partition@10000 {
|
||||||
|
compatible = "zephyr,mapped-partition";
|
||||||
|
label = "image-1";
|
||||||
|
reg = <0x00010000 0x0018000>;
|
||||||
|
};
|
||||||
|
|
||||||
|
storage_partition: partition@18000 {
|
||||||
|
compatible = "zephyr,mapped-partition";
|
||||||
|
label = "storage";
|
||||||
|
reg = <0x00018000 0x00020000>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
## Try to build MCUBoot
|
||||||
|
```sh
|
||||||
|
west build -p always -b nucleo_g431rb bootloader/mcuboot/boot/zephyr
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
old below
|
||||||
|
```
|
||||||
# Create a private key: https://docs.mcuboot.com/readme-zephyr.html
|
# Create a private key: https://docs.mcuboot.com/readme-zephyr.html
|
||||||
./scripts/imgtool.py keygen -k mykey.pem -t rsa-2048
|
python ./bootloader/mcuboot/scripts/imgtool.py keygen -k private.pem -t rsa-2048
|
||||||
|
|
||||||
# Create its public key
|
# Create its public key
|
||||||
openssl rsa -in mykey.pem -pubout > pubkey.pem
|
openssl rsa -in private.pem -pubout > public.pem
|
||||||
|
|
||||||
# Set up signing: https://docs.mcuboot.com/readme-zephyr.html
|
# Set up signing: https://docs.mcuboot.com/readme-zephyr.html
|
||||||
# ./bootloader/mcuboot/samples/zephyr/Makefile
|
# ./bootloader/mcuboot/samples/zephyr/Makefile
|
||||||
python scripts/imgtool.py sign \
|
python bootloader/mcuboot/scripts/imgtool.py sign \
|
||||||
--key mykey.pem \
|
--key mykey.pem \
|
||||||
--header-size 0x200 \
|
--header-size 0x200 \
|
||||||
--align 8 \
|
--align 8 \
|
||||||
@@ -44,7 +111,7 @@ python scripts/imgtool.py sign \
|
|||||||
echo "
|
echo "
|
||||||
|
|
||||||
# Set the key file
|
# Set the key file
|
||||||
CONFIG_BOOT_SIGNATURE_KEY_FILE=pubkey.pem" >> "./zephyr/boards/st/nucleo_g431rb/nucleo_g431rb_defconfig"
|
CONFIG_BOOT_SIGNATURE_KEY_FILE=public.pem" >> "./zephyr/boards/st/nucleo_g431rb/nucleo_g431rb_defconfig"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -34,6 +34,7 @@
|
|||||||
pkgs.python3Packages.click
|
pkgs.python3Packages.click
|
||||||
pkgs.pyocd
|
pkgs.pyocd
|
||||||
pkgs.mcuboot-imgtool
|
pkgs.mcuboot-imgtool
|
||||||
|
pkgs.openssl
|
||||||
];
|
];
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,28 +0,0 @@
|
|||||||
-----BEGIN PRIVATE KEY-----
|
|
||||||
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDfwKJjEhk0GRa8
|
|
||||||
GzfzgqXt6S54wK37jpwS3mQDReII49cnXogOCxyVWh25nOisvSEp0Ke7syt7YF6j
|
|
||||||
hfKaNlTLpZQ0hJ4G7DrPTkA3BIUqsmu5EY7/Uq880QUr327PrN4xbIQti0ZvR7gk
|
|
||||||
Nb6q43xuP86WSAHseWzaz4Dlw8d+E89T0gSfOj7yCWPah9NuJOCQFWbdwi3T8B+e
|
|
||||||
X6csT4O8nsF1YPmU2VBG8L6vsdcIMtZ3puoD2t7pmMHOqnEjN7lfgpOIfyU/rxiH
|
|
||||||
jxp3s6ejrvFs6jI0ibHlhyb+owXnXtM9eoZym27RKV2F+oP6t00fK+rfNynh0a75
|
|
||||||
j9JkvDWDAgMBAAECggEAGR8JnFHl3oGKmef8aiya8JEjlI8deYbTYxLw66Um8ZST
|
|
||||||
DWqBoAIDXYlWmQZS4UICvS0eB+bf1ORG+9kIGeRLtOmMMDFLhL91At1oPEUXpmmN
|
|
||||||
yqN8CJKB9jQJfpmBWXOxJp9mX66pY8kLlZUrKQiNadtkGF9RR/mCDTcK48ENXswo
|
|
||||||
v5tqJ9KTme/BaTj0/j6SurSqISpedOdXPafFY2vZhPA4Odue4ahZuDxkzorzF/a1
|
|
||||||
TZRHlsqAalUz11clpOGKIxOA9iQvtPri7VKb+siONMF9pp8jP4OCHZfsnP0t4MzF
|
|
||||||
87jsa6U7CcszpDsdGIAnnw/sqh1W1uvJsBJG42Mb4QKBgQD9rsOGZNj2RYNiAXLN
|
|
||||||
N05tDCf7Toj/hUkwsT5dWKu6aNfhrmrrNoceExHkASlwVMojwTWdVsIoByjMVRh5
|
|
||||||
ORQKq7seP4SdT5o2Qx9bP6dWFkly61UFD/OI415p8n2oEmKhaA97VjBjppxg6jNp
|
|
||||||
WqvF/rBBVSkHdC3jzM5cII8maQKBgQDhy+D+ShSfSc5T7FgYiukQ3sF7x0pzbfjU
|
|
||||||
K9wV4B8yKcHS1PPxYIFBsxD89EO7+quGPQhlRY1dcJxqxltPhSGy2xtOQr7nFpxM
|
|
||||||
PJbydDhC5N/PFKf39T44ABH6Lhw4iR2jcoI1vwxiqtsCnMuUsGxie7lA8/ZNs1de
|
|
||||||
fUQJug03CwKBgDH/4Q+7DrwzZTrK2Eq0TOPXUoYIq53ZMlzDgmw5jtdV1L7pdq9X
|
|
||||||
dvgpgAw1Ymp+e7ziVuPk9q2XA6aKWyGBa37S7DWBBW1QBDAPuL1uZVflWqKo2X/+
|
|
||||||
7dwcHD67iaK3xPLVJMAFc9IgQ5AiePGZ6mNC2JB37XdHocfVVRL5Y92JAoGAbMMY
|
|
||||||
DWUBqfiTOjmN9cRzn3ytFkJYymEeipTV3nOmkzMp+bQ6DPq/SDZI6I+AUPvdwzuC
|
|
||||||
38Uw4uFrdsM1GIi4Qr7n2DquWgG6J77HtuHkd9RnOghpIDcxUSg3gJrVXSYu8Jwn
|
|
||||||
vFvaS2yhMhD0vxp8GrQd9/uLmMHaQ9ly/HxyASECgYEA8VO/rA7KMDo/RU1w2hAS
|
|
||||||
UUAYz+bZSHqvlP1IhmfKEhJOj1pBFZz0SHiT8xrSrXIOj0oO3gxbM3hlVVP5+1TS
|
|
||||||
toob+H2LI9LjFN9dA8R9OYFLII+eSKUXRMtFdk4r8Vbsca1cIxjBLvKOvEP3rDaZ
|
|
||||||
mQXQa0mysxjGQSyDFV/w37Q=
|
|
||||||
-----END PRIVATE KEY-----
|
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
-----BEGIN PRIVATE KEY-----
|
||||||
|
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCvcSzTn4slqBf+
|
||||||
|
U6lZV6VsW1j6W+dfOWf04bZnSviD/naVWoSoVwfZM1KB+UZMsQAKqqxVhrMrwgi2
|
||||||
|
rZLOTIbumqjmO00oBH5jqqI8JrRX27Qg8u5XbgYnzbvgHmyVEj68/l6Kiv8Epnrh
|
||||||
|
hh/6JqReDdJdfUmL1MO5LmU8Yu9IeBRq0yDx3JfNn8QaNIxh6/xr50QWzNeqJgB/
|
||||||
|
oVwZ3/9M4I1HGgeA8hTrTCtEDtpK50bSvwKk6X8mWQ/ZLVNXbamyi+UK6Uqnr7rJ
|
||||||
|
7IrYMys7diAGp+xIIy0CdidwlFFu/uigzjEqSX/ciC9sBVOKPoT0vm4OMVDTYvOY
|
||||||
|
Phmj1C9BAgMBAAECggEACocUji87xtQOn2KH9OreItiAI7nYzdHy1M5e2XoRAFD2
|
||||||
|
E2r9wU7V7s12P16JdXfzlnlqYz8rf2BZkRQkDSU7dG+Gtzql5R5ZoKgnGV4463ma
|
||||||
|
8bnJApcTg+mD59IN1mdSO3Tsa9YAsWoaCEu55sn103Yp3cy8WW4T0gf7555jWQW+
|
||||||
|
McOIby/zQQPFxsJ+67BqKCByfZ/r7YeYR8AOBPwPoltQPQUstCpaTFfZinomzRFT
|
||||||
|
N3aDfAbcm7vapZB1BP7vrVlHdTe99gg2c2MpTeU2SvHhjqABYswXuGxR/w+xIsSl
|
||||||
|
CWphOntash0JeOWK4Wojfgly/ZlGfTIHQtr2CTCVJwKBgQDU+D311EJZytU4qYk6
|
||||||
|
elnJGg1kAm7QShZR0g7KlrQtxNjuo7mUy/j/wrs30PjHfi6hPNf5czwYg+3LNeWS
|
||||||
|
YPFr0PjEREHze0t/tAgeRahZnk0HRwJ147m89ao36z95gYSraMeGdHxtLbW4QimY
|
||||||
|
PDOMJ6VMxaPdp1M116sTBpF5qwKBgQDS49XRu8oA3okZdGFtvpELHZFDHmN1/tMf
|
||||||
|
aoP/SQQ1gq+c3kCqo7zHLwnODvSt+YXBclJdRI0h32qkvmGltF1Lu5R60EGciLzc
|
||||||
|
QKJzW3qodoFd8Nh+FO97x7x500pZo5bKtyVMleAULEQSQmv/0RSIevD5InHVh5l6
|
||||||
|
boi15P+GwwKBgQCUc7IlEN9rXfMBO1RX+f9qKgnZg8Sg1nP2dtkuqJxSJxwcRO5Q
|
||||||
|
5VndVm1QfA9eZ/uzEwltbcEfSZ9RfnFXdtHymMk/bmEWiwRWsTTTfTTbu3fwMbRq
|
||||||
|
XuIS8J/FuOsXFIxZO4GRnNM6+5jnJt99qcE42k3kVQRjtoZPStWKPpLbXwKBgAJY
|
||||||
|
iHNZzGhwEURYOBE5cnGWNZxyhRa16/FIhQlc7ZAO0RdEnaGISrxIeKpzHiOlR+ib
|
||||||
|
9fCVp6A91PjaKUnnlLYX8xHeqSwtlTQ5/9SaquWe09eQq0fTwco1sZIFWKlgmXfN
|
||||||
|
y7trW1++Ek/Fr1/cGodeHroWuP9wD7P98MVdM75zAoGBAKEWZE+9Ppn3qDXU99J4
|
||||||
|
Ul32zTLYt+DtYdrryDpc68dPNn+bXb4zuvGgr+O0p4jR7fRh0xNfUKUSibvszR0w
|
||||||
|
aNk3cx2CRgRw2mMfX/Rh/sJ+QXzJhJhV0xFLXi9cEaTzzRNeK1xweZwlbxF8Vk20
|
||||||
|
rywQ9K9WgOEZpeUziuuTqw91
|
||||||
|
-----END PRIVATE KEY-----
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
-----BEGIN PUBLIC KEY-----
|
|
||||||
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA38CiYxIZNBkWvBs384Kl
|
|
||||||
7ekueMCt+46cEt5kA0XiCOPXJ16IDgsclVoduZzorL0hKdCnu7Mre2Beo4XymjZU
|
|
||||||
y6WUNISeBuw6z05ANwSFKrJruRGO/1KvPNEFK99uz6zeMWyELYtGb0e4JDW+quN8
|
|
||||||
bj/OlkgB7Hls2s+A5cPHfhPPU9IEnzo+8glj2ofTbiTgkBVm3cIt0/Afnl+nLE+D
|
|
||||||
vJ7BdWD5lNlQRvC+r7HXCDLWd6bqA9re6ZjBzqpxIze5X4KTiH8lP68Yh48ad7On
|
|
||||||
o67xbOoyNImx5Ycm/qMF517TPXqGcptu0SldhfqD+rdNHyvq3zcp4dGu+Y/SZLw1
|
|
||||||
gwIDAQAB
|
|
||||||
-----END PUBLIC KEY-----
|
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
-----BEGIN PUBLIC KEY-----
|
||||||
|
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAr3Es05+LJagX/lOpWVel
|
||||||
|
bFtY+lvnXzln9OG2Z0r4g/52lVqEqFcH2TNSgflGTLEACqqsVYazK8IItq2SzkyG
|
||||||
|
7pqo5jtNKAR+Y6qiPCa0V9u0IPLuV24GJ8274B5slRI+vP5eior/BKZ64YYf+iak
|
||||||
|
Xg3SXX1Ji9TDuS5lPGLvSHgUatMg8dyXzZ/EGjSMYev8a+dEFszXqiYAf6FcGd//
|
||||||
|
TOCNRxoHgPIU60wrRA7aSudG0r8CpOl/JlkP2S1TV22psovlCulKp6+6yeyK2DMr
|
||||||
|
O3YgBqfsSCMtAnYncJRRbv7ooM4xKkl/3IgvbAVTij6E9L5uDjFQ02LzmD4Zo9Qv
|
||||||
|
QQIDAQAB
|
||||||
|
-----END PUBLIC KEY-----
|
||||||
Reference in New Issue
Block a user