blob: 713757dee7145e21c8f93ff4e03862af62b6221e [file] [log] [blame] [view]
Roman Okhrimenko89ecdac2020-02-28 17:05:55 +02001### Port of MCUBoot library to be used with Cypress targets
2
3**Solution Description**
4
5Given solution demonstrates operation of MCUBoot on Cypress' PSoC6 device.
6
7There are two applications implemented:
8* MCUBootApp - PSoC6 MCUBoot-based bootloading application;
9* BlinkyApp - simple PSoC6 blinking LED application which is a target of BOOT/UPGRADE;
10
11The demonstration device is CY8CPROTO-062-4343W board which is PSoC6 device with 2M of Flash available.
Roman Okhrimenko89ecdac2020-02-28 17:05:55 +020012The default flash map implemented is the following:
13
Bohdan Kovalchuka333a452020-07-09 16:55:58 +030014Single-image mode.
15
16`[0x10000000, 0x10018000]` - MCUBootApp (bootloader) area;
17
18`[0x10018000, 0x10028000]` - primary slot for BlinkyApp;
19
20`[0x10028000, 0x10038000]` - secondary slot for BlinkyApp;
21
22`[0x10038000, 0x10039000]` - scratch area (not used);
Roman Okhrimenko89ecdac2020-02-28 17:05:55 +020023
24Size of slots `0x10000` - 64kb
25
Bohdan Kovalchuka333a452020-07-09 16:55:58 +030026MCUBootApp checks image integrity with SHA256, image authenticity with EC256 digital signature verification and uses completely SW implementation of cryptographic functions based on mbedTLS Library.
27
Roman Okhrimenko89ecdac2020-02-28 17:05:55 +020028**Important**: make sure primary, secondary slot and bootloader app sizes are appropriate and correspond to flash area size defined in Applications' linker files.
29
Bohdan Kovalchuka333a452020-07-09 16:55:58 +030030**Important**: make sure RAM areas of CM0p-based MCUBootApp bootloader and CM4-based BlinkyApp do not overlap.
31Memory (stack) corruption of CM0p application can cause failure if SystemCall-served operations invoked from CM4.
Roman Okhrimenko89ecdac2020-02-28 17:05:55 +020032
Roman Okhrimenko6ea44be2020-09-24 17:20:15 +030033### Hardware cryptography acceleration
Roman Okhrimenko4c1c5b02020-01-31 16:22:39 +020034
35Cypress PSOC6 MCU family supports hardware acceleration of cryptography based on mbedTLS Library via shim layer. Implementation of this layer is supplied as separate submodule `cy-mbedtls-acceleration`. HW acceleration of cryptography shortens boot time more then 4 times, comparing to software implementation (observation results).
36
37To enable hardware acceleration in `MCUBootApp` pass flag `USE_CRYPTO_HW=1` to `make` while build.
38
39Hardware acceleration of cryptography is enabled for PSOC6 devices by default.
40
Roman Okhrimenko6ea44be2020-09-24 17:20:15 +030041### How to modify memory map
Roman Okhrimenko89ecdac2020-02-28 17:05:55 +020042
43__Option 1.__
44
45Navigate to `sysflash.h` and modify the flash area(s) / slots sizes to meet your needs.
46
47__Option 2.__
48
49Navigate to `sysflash.h`, uncomment `CY_FLASH_MAP_EXT_DESC` definition.
50Now define and initialize `struct flash_area *boot_area_descs[]` with flash memory addresses and sizes you need at the beginning of application, so flash APIs from `cy_flash_map.c` will use it.
51
52__Note:__ for both options make sure you have updated `MCUBOOT_MAX_IMG_SECTORS` appropriatery with sector size assumed to be 512.
53
54**How to override the flash map values during build process:**
55
56Navigate to MCUBootApp.mk, find section `DEFINES_APP +=`
57Update this line and or add similar for flash map parameters to override.
58
59The possible list could be:
60
61* MCUBOOT_MAX_IMG_SECTORS
62* CY_FLASH_MAP_EXT_DESC
63* CY_BOOT_SCRATCH_SIZE
64* CY_BOOT_BOOTLOADER_SIZE
65* CY_BOOT_PRIMARY_1_SIZE
66* CY_BOOT_SECONDARY_1_SIZE
67* CY_BOOT_PRIMARY_2_SIZE
68* CY_BOOT_SECONDARY_2_SIZE
69
70As an example in a makefile it should look like following:
71
72`DEFINES_APP +=-DCY_FLASH_MAP_EXT_DESC`
73
74`DEFINES_APP +=-DMCUBOOT_MAX_IMG_SECTORS=512`
75
76`DEFINES_APP +=-DCY_BOOT_PRIMARY_1_SIZE=0x15000`
77
78**Multi-Image Operation**
79
80Multi-image operation considers upgrading and verification of more then one image on the device.
81
Bohdan Kovalchuka333a452020-07-09 16:55:58 +030082To enable multi-image operation define `MCUBOOT_IMAGE_NUMBER` in `MCUBootApp/config/mcuboot_config.h` file should be set to 2 (only dual-image is supported at the moment). This could also be done on build time by passing `MCUBOOT_IMAGE_NUMBER=2` as parameter to `make`.
Roman Okhrimenko89ecdac2020-02-28 17:05:55 +020083
84Default value of `MCUBOOT_IMAGE_NUMBER` is 1, which corresponds to single image configuratios.
85
86In multi-image operation (two images are considered for simplicity) MCUBoot Bootloader application operates as following:
87
88* Verifies Primary_1 and Primary_2 images;
89* Verifies Secondary_1 and Secondary_2 images;
90* Upgrades Secondary to Primary if valid images found;
91* Boots image from Primary_1 slot only;
92* Boots Primary_1 only if both - Primary_1 and Primary_2 are present and valid;
93
94This ensures two dependent applications can be accepted by device only in case both images are valid.
95
96**Default Flash map for Multi-Image operation:**
97
98`0x10000000 - 0x10018000` - MCUBoot Bootloader
99
100`0x10018000 - 0x10028000` - Primary_1 (BOOT) slot of Bootloader
101
102`0x10028000 - 0x10038000` - Secondary_1 (UPGRADE) slot of Bootloader
103
104`0x10038000 - 0x10048000` - Primary_2 (BOOT) slot of Bootloader
105
106`0x10048000 - 0x10058000` - Secondary_2 (UPGRADE) slot of Bootloader
107
Bohdan Kovalchuka333a452020-07-09 16:55:58 +0300108`0x10058000 - 0x10059000` - Scratch of Bootloader
Roman Okhrimenko89ecdac2020-02-28 17:05:55 +0200109
110Size of slots `0x10000` - 64kb
111
Bohdan Kovalchuka333a452020-07-09 16:55:58 +0300112__Note:__ It is also possible to place secondary (upgrade) slots in external memory module so resulting image size can be doubled.
113For more details about External Memory usage, please refer to separate guiding document `ExternalMemory.md`.
114
Roman Okhrimenko6ea44be2020-09-24 17:20:15 +0300115### Hardware limitations
116
117Since this application is created to demonstrate MCUBoot library features and not as reference examples some considerations are taken.
118
1191. `SCB5` used to configure serial port for debug prints. This is the most commonly used Serial Communication Block number among available Cypress PSoC 6 kits. If you try to use custom hardware with this application - change definition of `CYBSP_UART_HW` in `main.c` of MCUBootApp to SCB* that correspond to your design.
120
1212. `CY_SMIF_SLAVE_SELECT_0` is used as definition SMIF driver API. This configuration is used on evaluation kit for this example CY8CPROTO-062-4343W. If you try to use custom hardware with this application - change value of `smif_id` in `main.c` of MCUBootApp to value that corresponds to your design.
122
123
124### Downloading Solution's Assets
Roman Okhrimenko89ecdac2020-02-28 17:05:55 +0200125
126There is a set assets required:
127
128* MCUBooot Library (root repository)
129* PSoC6 HAL Library
130* PSoC6 Peripheral Drivers Library (PDL)
131* mbedTLS Cryptographic Library
132
133To get submodules - run the following command:
134
135 git submodule update --init --recursive
136
Roman Okhrimenko6ea44be2020-09-24 17:20:15 +0300137### Building Solution
Roman Okhrimenko89ecdac2020-02-28 17:05:55 +0200138
139This folder contains make files infrastructure for building MCUBoot Bootloader. Same approach used in sample BlinkyLedApp application. Example command are provided below for couple different build configurations.
140
141* Build MCUBootApp in `Debug` for signle image use case.
142
143 make app APP_NAME=MCUBootApp PLATFORM=PSOC_062_2M BUILDCFG=Debug MCUBOOT_IMAGE_NUMBER=1
144
145* Build MCUBootApp in `Release` for multi image use case.
146
147 make app APP_NAME=MCUBootApp PLATFORM=PSOC_062_2M BUILDCFG=Release MCUBOOT_IMAGE_NUMBER=2
148
149Root directory for build is **boot/cypress.**
150
Bohdan Kovalchuk77256522020-04-15 18:03:43 +0300151**Programming solution**
152
153There are couple ways of programming hex of MCUBootApp and BlinkyApp. Following instructions assume one of Cypress development kits, for example `CY8CPROTO_062_4343W`.
154
1551. Direct usage of OpenOCD.
156OpenOCD package is supplied with ModuToolbox IDE and can be found in installation folder under `./tools_2.1/openocd`.
157Open terminal application - and execute following command after substitution `PATH_TO_APPLICATION.hex` and `OPENOCD` paths.
158
159Connect a board to your computer. Switch Kitprog3 to DAP-BULK mode by pressing `SW3 MODE` button until `LED2 STATUS` constantly shines.
160
161 export OPENOCD=/Applications/ModusToolbox/tools_2.1/openocd
162
163 ${OPENOCD}/bin/openocd -s ${OPENOCD}/scripts \
164 -f ${OPENOCD}/scripts/interface/kitprog3.cfg \
165 -f ${OPENOCD}/scripts/target/psoc6_2m.cfg \
166 -c "init; reset init; program PATH_TO_APPLICATION.hex" \
167 -c "resume; reset; exit"
168
1692. Using GUI tool `Cypress Programmer` - follow [link](https://www.cypress.com/products/psoc-programming-solutions) to download.
170 Connect board to your computer. Switch Kitprog3 to DAP-BULK mode by pressing `SW3 MODE` button until `LED2 STATUS` constantly shines. Open `Cypress Programmer` and click `Connect`, then choose hex file: `MCUBootApp.hex` or `BlinkyApp.hex` and click `Program`. Check log to ensure programming success. Reset board.
171
1723. Using `DAPLINK`.
173 Connect board to your computer. Switch embeded Kitprog3 to `DAPLINK` mode by pressing `SW3 MODE` button until `LED2 STATUS` blinks fast and mass storage device appeared in OS. Drag and drop `hex` files you wish to program to `DAPLINK` drive in your OS.
174
175
176
Roman Okhrimenko89ecdac2020-02-28 17:05:55 +0200177**Currently supported platforms:**
178
179* PSOC_062_2M
180
181**Build environment troubleshooting:**
182
183Regular shell/terminal combination on Linux and MacOS.
184
185On Windows:
186
187* Cygwin
188* Msys2
189
190Also IDE may be used:
191* Eclipse / ModusToolbox ("makefile project from existing source")
192
193*Make* - make sure it is added to system's `PATH` variable and correct path is first in the list;
194
195*Python/Python3* - make sure you have correct path referenced in `PATH`;
196
197*Msys2* - to use systems PATH navigate to msys2 folder, open `msys2_shell.cmd`, uncomment set `MSYS2_PATH_TYPE=inherit`, restart MSYS2 shell.
198
Roman Okhrimenkoaa7c0212020-03-24 23:33:00 +0200199*Cygwin* - add following to build command `CURDIR=pwd | cygpath --mixed -f -` so that build command looks like that:
200
201 make app APP_NAME=MCUBootApp PLATFORM=PSOC_062_2M CURDIR=`pwd | cygpath --mixed -f -`
202
Roman Okhrimenko89ecdac2020-02-28 17:05:55 +0200203This will iherit system's PATH so should find `python3.7` installed in regular way as well as imgtool and its dependencies.
204