1### 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 11Cypress boards, that can be used with this evaluation example: 12- CY8CPROTO-062-4343W - PSoC 6 2M on board 13- CY8CKIT-062-WIFI-BT - PSoC 6 1M on board 14- CY8CPROTO-062S3-4343W - PSoC 6 512K on board 15The default flash map implemented is the following: 16 17Single-image mode. 18 19`[0x10000000, 0x10018000]` - MCUBootApp (bootloader) area; 20 21`[0x10018000, 0x10028000]` - primary slot for BlinkyApp; 22 23`[0x10028000, 0x10038000]` - secondary slot for BlinkyApp; 24 25`[0x10038000, 0x10039000]` - scratch area (not used); 26 27Size of slots `0x10000` - 64kb 28 29MCUBootApp checks image integrity with SHA256, image authenticity with EC256 digital signature verification and uses completely SW implementation of cryptographic functions based on Mbed TLS Library. 30 31**Important**: make sure primary, secondary slot and bootloader app sizes are appropriate and correspond to flash area size defined in Applications' linker files. 32 33**Important**: make sure RAM areas of CM0p-based MCUBootApp bootloader and CM4-based BlinkyApp do not overlap. 34Memory (stack) corruption of CM0p application can cause failure if SystemCall-served operations invoked from CM4. 35 36### Hardware cryptography acceleration 37 38Cypress PSOC6 MCU family supports hardware acceleration of cryptography based on Mbed TLS 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). 39 40To enable hardware acceleration in `MCUBootApp` pass flag `USE_CRYPTO_HW=1` to `make` while build. 41 42Hardware acceleration of cryptography is enabled for PSOC6 devices by default. 43 44### How to modify memory map 45 46__Option 1.__ 47 48Navigate to `sysflash.h` and modify the flash area(s) / slots sizes to meet your needs. 49 50__Option 2.__ 51 52Navigate to `sysflash.h`, uncomment `CY_FLASH_MAP_EXT_DESC` definition. 53Now 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. 54 55__Note:__ for both options make sure you have updated `MCUBOOT_MAX_IMG_SECTORS` appropriatery with sector size assumed to be 512. 56 57**How to override the flash map values during build process:** 58 59Navigate to MCUBootApp.mk, find section `DEFINES_APP +=` 60Update this line and or add similar for flash map parameters to override. 61 62The possible list could be: 63 64* MCUBOOT_MAX_IMG_SECTORS 65* CY_FLASH_MAP_EXT_DESC 66* CY_BOOT_SCRATCH_SIZE 67* CY_BOOT_BOOTLOADER_SIZE 68* CY_BOOT_PRIMARY_1_SIZE 69* CY_BOOT_SECONDARY_1_SIZE 70* CY_BOOT_PRIMARY_2_SIZE 71* CY_BOOT_SECONDARY_2_SIZE 72 73As an example in a makefile it should look like following: 74 75`DEFINES_APP +=-DCY_FLASH_MAP_EXT_DESC` 76 77`DEFINES_APP +=-DMCUBOOT_MAX_IMG_SECTORS=512` 78 79`DEFINES_APP +=-DCY_BOOT_PRIMARY_1_SIZE=0x15000` 80 81**Multi-Image Operation** 82 83Multi-image operation considers upgrading and verification of more then one image on the device. 84 85To 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`. 86 87Default value of `MCUBOOT_IMAGE_NUMBER` is 1, which corresponds to single image configuratios. 88 89In multi-image operation (two images are considered for simplicity) MCUboot Bootloader application operates as following: 90 91* Verifies Primary_1 and Primary_2 images; 92* Verifies Secondary_1 and Secondary_2 images; 93* Upgrades Secondary to Primary if valid images found; 94* Boots image from Primary_1 slot only; 95* Boots Primary_1 only if both - Primary_1 and Primary_2 are present and valid; 96 97This ensures two dependent applications can be accepted by device only in case both images are valid. 98 99**Default Flash map for Multi-Image operation:** 100 101`0x10000000 - 0x10018000` - MCUboot Bootloader 102 103`0x10018000 - 0x10028000` - Primary_1 (BOOT) slot of Bootloader 104 105`0x10028000 - 0x10038000` - Secondary_1 (UPGRADE) slot of Bootloader 106 107`0x10038000 - 0x10048000` - Primary_2 (BOOT) slot of Bootloader 108 109`0x10048000 - 0x10058000` - Secondary_2 (UPGRADE) slot of Bootloader 110 111`0x10058000 - 0x10059000` - Scratch of Bootloader 112 113Size of slots `0x10000` - 64kb 114 115__Note:__ It is also possible to place secondary (upgrade) slots in external memory module so resulting image size can be doubled. 116For more details about External Memory usage, please refer to separate guiding document `ExternalMemory.md`. 117 118### Hardware limitations 119 120Since this application is created to demonstrate MCUboot library features and not as reference examples some considerations are taken. 121 1221. `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. 123 1242. `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, CY8PROTO-062S3-4343W, CY8CKIT-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. 125 126 127### Downloading solution's assets 128 129There is a set assets required: 130 131* MCUBooot Library (root repository) 132* PSoC6 HAL Library 133* PSoC6 Peripheral Drivers Library (PDL) 134* Mbed TLS Cryptographic Library 135 136To get submodules - run the following command: 137 138 git submodule update --init --recursive 139 140### Building solution 141 142This 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. 143 144* Build MCUBootApp in `Debug` for signle image use case. 145 146 make app APP_NAME=MCUBootApp PLATFORM=PSOC_062_2M BUILDCFG=Debug MCUBOOT_IMAGE_NUMBER=1 147 148* Build MCUBootApp in `Release` for multi image use case. 149 150 make app APP_NAME=MCUBootApp PLATFORM=PSOC_062_2M BUILDCFG=Release MCUBOOT_IMAGE_NUMBER=2 151 152* To Build MCUBootApp with external memory support - pass `USE_EXTERNAL_FLASH=1` flag to `make` command in examples above. In this case UPGRADE image will be located in external memory. Refer to ExternalMemory.md for additional details. 153 154Root directory for build is **boot/cypress.** 155 156**Encrypted Image Support** 157 158To protect user image from unwanted read - Upgrade Image Encryption can be applied. The ECDH/HKDF with EC256 scheme is used in a given solution as well as Mbed TLS as a crypto provider. 159 160To enable image encryption support use `ENC_IMG=1` build flag (BlinkyApp should also be built with this flash set 1). 161 162User is also responsible for providing corresponding binary key data in `enc_priv_key[]` (file `\MCUBootApp\keys.c`). The public part will be used by imgtool when signing and encrypting upgrade image. Signing image with encryption is described in `\BlinkyApp\Readme.md`. 163 164After MCUBootApp is built with these settings unencrypted and encrypted images will be accepted in secondary (upgrade) slot. 165 166Example command: 167 168 make app APP_NAME=MCUBootApp PLATFORM=PSOC_062_2M BUILDCFG=Debug MCUBOOT_IMAGE_NUMBER=1 ENC_IMG=1 169 170**Programming solution** 171 172There are couple ways of programming hex of MCUBootApp and BlinkyApp. Following instructions assume one of Cypress development kits, for example `CY8CPROTO_062_4343W`. 173 1741. Direct usage of OpenOCD. 175OpenOCD package is supplied with ModuToolbox IDE and can be found in installation folder under `./tools_2.1/openocd`. 176Open terminal application - and execute following command after substitution `PATH_TO_APPLICATION.hex` and `OPENOCD` paths. 177 178Connect a board to your computer. Switch Kitprog3 to DAP-BULK mode by pressing `SW3 MODE` button until `LED2 STATUS` constantly shines. 179 180 export OPENOCD=/Applications/ModusToolbox/tools_2.1/openocd 181 182 ${OPENOCD}/bin/openocd -s ${OPENOCD}/scripts \ 183 -f ${OPENOCD}/scripts/interface/kitprog3.cfg \ 184 -f ${OPENOCD}/scripts/target/psoc6_2m.cfg \ 185 -c "init; reset init; program PATH_TO_APPLICATION.hex" \ 186 -c "resume; reset; exit" 187 1882. Using GUI tool `Cypress Programmer` - follow [link](https://www.cypress.com/products/psoc-programming-solutions) to download. 189 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. 190 1913. Using `DAPLINK`. 192 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. 193 194 195 196**Currently supported platforms:** 197 198* PSOC_062_2M 199* PSOC_062_1M 200* PSOC_062_512K 201 202**Build environment troubleshooting:** 203 204Regular shell/terminal combination on Linux and MacOS. 205 206On Windows: 207 208* Cygwin 209* Msys2 210 211Also IDE may be used: 212* Eclipse / ModusToolbox ("makefile project from existing source") 213 214*Make* - make sure it is added to system's `PATH` variable and correct path is first in the list; 215 216*Python/Python3* - make sure you have correct path referenced in `PATH`; 217 218*Msys2* - to use systems PATH navigate to msys2 folder, open `msys2_shell.cmd`, uncomment set `MSYS2_PATH_TYPE=inherit`, restart MSYS2 shell. 219 220This will iherit system's PATH so should find `python3.7` installed in regular way as well as imgtool and its dependencies. 221 222