blob: 86f37fe04c7c8223a313d97d42bbd8e857c8d056 [file] [log] [blame]
Roman Okhrimenko89ecdac2020-02-28 17:05:55 +02001/***************************************************************************//**
2* \file main.c
3* \version 1.0
4********************************************************************************
5* \copyright
6* SPDX-License-Identifier: Apache-2.0
7*
8* Licensed under the Apache License, Version 2.0 (the "License");
9* you may not use this file except in compliance with the License.
10* You may obtain a copy of the License at
11*
12* http://www.apache.org/licenses/LICENSE-2.0
13*
14* Unless required by applicable law or agreed to in writing, software
15* distributed under the License is distributed on an "AS IS" BASIS,
16* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17* See the License for the specific language governing permissions and
18* limitations under the License.
19*******************************************************************************/
Roman Okhrimenko977b3752022-03-31 14:40:48 +030020#include <inttypes.h>
21#include <stdbool.h>
22
Roman Okhrimenko89ecdac2020-02-28 17:05:55 +020023/* Cypress pdl headers */
24#include "cy_pdl.h"
Roman Okhrimenkodc0ca082023-06-21 20:49:51 +030025#include "cyhal.h"
Roman Okhrimenko977b3752022-03-31 14:40:48 +030026#include "cyhal_wdt.h"
Roman Okhrimenkodc0ca082023-06-21 20:49:51 +030027
28#if defined CYW20829
Roman Okhrimenko977b3752022-03-31 14:40:48 +030029#include "cy_service_app.h"
Roman Okhrimenkodc0ca082023-06-21 20:49:51 +030030#endif
31
32#include "cybsp.h"
33#include "cy_retarget_io.h"
Dovhal Artem (CSUKR CSS ICW SW FW 1)f7a3d1b2022-04-01 15:07:37 +000034#include "cyw_platform_utils.h"
Bohdan Kovalchuk0324f1b2020-05-26 08:04:24 -050035
Dovhal Artem (CSUKR CSS ICW SW FW 1)f7a3d1b2022-04-01 15:07:37 +000036#if defined(CY_BOOT_USE_EXTERNAL_FLASH) || defined(CYW20829)
Bohdan Kovalchuk0324f1b2020-05-26 08:04:24 -050037#include "flash_qspi.h"
Dovhal Artem (CSUKR CSS ICW SW FW 1)f7a3d1b2022-04-01 15:07:37 +000038#endif /* defined(CY_BOOT_USE_EXTERNAL_FLASH) || defined(CYW20829) */
Roman Okhrimenko977b3752022-03-31 14:40:48 +030039
40#include "cycfg_pins.h"
41#include "cy_result.h"
Roman Okhrimenko89ecdac2020-02-28 17:05:55 +020042#include "sysflash/sysflash.h"
43#include "flash_map_backend/flash_map_backend.h"
44
45#include "bootutil/image.h"
46#include "bootutil/bootutil.h"
47#include "bootutil/sign_key.h"
48
49#include "bootutil/bootutil_log.h"
50
Tamas Ban4e8d8382020-09-30 08:01:58 +010051#include "bootutil/fault_injection_hardening.h"
Tamas Ban4e8d8382020-09-30 08:01:58 +010052
Dovhal Artem (CSUKR CSS ICW SW FW 1)f7a3d1b2022-04-01 15:07:37 +000053#ifdef USE_EXEC_TIME_CHECK
54#include "misc/timebase_us.h"
55#include "misc/exec_time_check.h"
56#endif /* USE_EXEC_TIME_CHECK */
57
58#ifdef USE_LOG_TIMESTAMP
59#include "timestamp.h"
60#endif /* USE_LOG_TIMESTAMP */
61
Roman Okhrimenko977b3752022-03-31 14:40:48 +030062#define CY_RSLT_MODULE_MCUBOOTAPP 0x500U
63#define CY_RSLT_MODULE_MCUBOOTAPP_MAIN 0x51U
64
65/** General module error */
66#define MCUBOOTAPP_RSLT_ERR \
67 (CY_RSLT_CREATE_EX(CY_RSLT_TYPE_ERROR, CY_RSLT_MODULE_MCUBOOTAPP, CY_RSLT_MODULE_MCUBOOTAPP_MAIN, 0))
68
Roman Okhrimenko0c7aebc2020-09-02 13:37:51 +030069/* WDT time out for reset mode, in milliseconds. */
70#define WDT_TIME_OUT_MS 4000
71
dmiv8672c8e2020-09-16 12:59:20 +030072#ifdef CY_BOOT_USE_EXTERNAL_FLASH
73/* Choose SMIF slot number (slave select).
74 * Acceptable values are:
75 * 0 - SMIF disabled (no external memory);
76 * 1, 2, 3 or 4 - slave select line memory module is connected to.
77 */
Roman Okhrimenko977b3752022-03-31 14:40:48 +030078#define SMIF_ID (1U) /* Assume SlaveSelect_0 is used for External Memory */
79#endif /* CY_BOOT_USE_EXTERNAL_FLASH */
dmiv8672c8e2020-09-16 12:59:20 +030080
Roman Okhrimenkodc0ca082023-06-21 20:49:51 +030081#define BOOT_MSG_FINISH "MCUBoot Bootloader finished.\r\n" \
Roman Okhrimenko977b3752022-03-31 14:40:48 +030082 "Deinitializing hardware..."
dmiv8672c8e2020-09-16 12:59:20 +030083
Roman Okhrimenko977b3752022-03-31 14:40:48 +030084static void hw_deinit(void);
dmiv8672c8e2020-09-16 12:59:20 +030085
Roman Okhrimenko977b3752022-03-31 14:40:48 +030086static inline __attribute__((always_inline))
87fih_uint calc_app_addr(uintptr_t flash_base, const struct boot_rsp *rsp)
Roman Okhrimenko89ecdac2020-02-28 17:05:55 +020088{
Roman Okhrimenko977b3752022-03-31 14:40:48 +030089 return fih_uint_encode(flash_base +
90 rsp->br_image_off +
91 rsp->br_hdr->ih_hdr_size);
92}
Roman Okhrimenko89ecdac2020-02-28 17:05:55 +020093
Roman Okhrimenkodc0ca082023-06-21 20:49:51 +030094#if defined CYW20829
Roman Okhrimenko89ecdac2020-02-28 17:05:55 +020095
Roman Okhrimenko977b3752022-03-31 14:40:48 +030096#if defined(CY_BOOT_USE_EXTERNAL_FLASH) && !defined(MCUBOOT_ENC_IMAGES_XIP)
97CY_RAMFUNC_BEGIN /* SMIF will be deinitialized in this case! */
98#else
99inline __attribute__((always_inline))
100#endif /* defined(CY_BOOT_USE_EXTERNAL_FLASH) && !defined(MCUBOOT_ENC_IMAGES_XIP) */
101__NO_RETURN
102static void cyw20829_launch_app(fih_uint app_addr, uint32_t *key, uint32_t *iv)
103{
104#if defined(CY_BOOT_USE_EXTERNAL_FLASH) && !defined(MCUBOOT_ENC_IMAGES_XIP)
105 qspi_deinit(SMIF_ID);
106#endif /* defined(CY_BOOT_USE_EXTERNAL_FLASH) && !defined(MCUBOOT_ENC_IMAGES_XIP) */
Dovhal Artem (CSUKR CSS ICW SW FW 1)f7a3d1b2022-04-01 15:07:37 +0000107 platform_RunNextApp(app_addr, key, iv);
Roman Okhrimenko977b3752022-03-31 14:40:48 +0300108}
109#if defined(CY_BOOT_USE_EXTERNAL_FLASH) && !defined(MCUBOOT_ENC_IMAGES_XIP)
110CY_RAMFUNC_END /* SMIF will be deinitialized in this case! */
111#endif /* defined(CY_BOOT_USE_EXTERNAL_FLASH) && !defined(MCUBOOT_ENC_IMAGES_XIP) */
Roman Okhrimenkoff026122020-09-23 12:58:07 +0300112
Roman Okhrimenkodc0ca082023-06-21 20:49:51 +0300113#endif /* defined CYW20829 */
Roman Okhrimenko89ecdac2020-02-28 17:05:55 +0200114
Roman Okhrimenko977b3752022-03-31 14:40:48 +0300115static bool do_boot(struct boot_rsp *rsp)
116{
117 uintptr_t flash_base = 0;
Roman Okhrimenko89ecdac2020-02-28 17:05:55 +0200118
Roman Okhrimenkodc0ca082023-06-21 20:49:51 +0300119#if defined CYW20829
Roman Okhrimenko977b3752022-03-31 14:40:48 +0300120 uint32_t *key = NULL;
121 uint32_t *iv = NULL;
Roman Okhrimenkodc0ca082023-06-21 20:49:51 +0300122#endif /* defined CYW20829 */
Roman Okhrimenko977b3752022-03-31 14:40:48 +0300123
Roman Okhrimenkodc0ca082023-06-21 20:49:51 +0300124 if ((rsp != NULL) && (rsp->br_hdr != NULL)) {
Roman Okhrimenko977b3752022-03-31 14:40:48 +0300125 int rc = flash_device_base(rsp->br_flash_dev_id, &flash_base);
126
127 if (0 == rc) {
128 fih_uint app_addr = calc_app_addr(flash_base, rsp);
129
130 BOOT_LOG_INF("Starting User Application (wait)...");
131 if (IS_ENCRYPTED(rsp->br_hdr)) {
132 BOOT_LOG_DBG(" * User application is encrypted");
133 }
134 BOOT_LOG_INF("Start slot Address: 0x%08" PRIx32, (uint32_t)fih_uint_decode(app_addr));
135
136 rc = flash_device_base(rsp->br_flash_dev_id, &flash_base);
Roman Okhrimenkodc0ca082023-06-21 20:49:51 +0300137 if (rc != 0 || fih_uint_eq(calc_app_addr(flash_base, rsp), app_addr) != FIH_TRUE) {
Roman Okhrimenko977b3752022-03-31 14:40:48 +0300138 return false;
139 }
140
Roman Okhrimenkodc0ca082023-06-21 20:49:51 +0300141#if defined CYW20829
142
Roman Okhrimenko977b3752022-03-31 14:40:48 +0300143#ifdef MCUBOOT_ENC_IMAGES_XIP
144 if (IS_ENCRYPTED(rsp->br_hdr)) {
145 key = rsp->xip_key;
146 iv = rsp->xip_iv;
147 } else {
148 BOOT_LOG_ERR("User image is not encrypted, while MCUBootApp is compiled with encryption support.");
149 return false;
150 }
151#endif /* MCUBOOT_ENC_IMAGES_XIP */
Dovhal Artem (CSUKR CSS ICW SW FW 1)f7a3d1b2022-04-01 15:07:37 +0000152
153
154#ifdef APP_CM33
Roman Okhrimenko977b3752022-03-31 14:40:48 +0300155 /* This function does not return */
Dovhal Artem (CSUKR CSS ICW SW FW 1)f7a3d1b2022-04-01 15:07:37 +0000156 BOOT_LOG_INF("Launching app on CM33 core");
Roman Okhrimenko977b3752022-03-31 14:40:48 +0300157 BOOT_LOG_INF(BOOT_MSG_FINISH);
158 hw_deinit();
159 cyw20829_launch_app(app_addr, key, iv);
160#else
Dovhal Artem (CSUKR CSS ICW SW FW 1)f7a3d1b2022-04-01 15:07:37 +0000161#error "Application should run on Cortex-M33"
162#endif /* APP_CM33 */
Roman Okhrimenko977b3752022-03-31 14:40:48 +0300163
Roman Okhrimenko25165622023-05-23 08:58:29 +0300164#else /* defined CYW20829 */
Dovhal Artem (CSUKR CSS ICW SW FW 1)f7a3d1b2022-04-01 15:07:37 +0000165
Roman Okhrimenko977b3752022-03-31 14:40:48 +0300166#ifdef USE_XIP
167 BOOT_LOG_DBG("XIP: Switch to SMIF XIP mode");
168 qspi_set_mode(CY_SMIF_MEMORY);
Dovhal Artem (CSUKR CSS ICW SW FW 1)f7a3d1b2022-04-01 15:07:37 +0000169#endif /* USE_XIP */
170
171#ifdef APP_CM4
172 /* This function turns on CM4 and returns */
173 BOOT_LOG_INF("Launching app on CM4 core");
174 BOOT_LOG_INF(BOOT_MSG_FINISH);
175 hw_deinit();
Roman Okhrimenkodc0ca082023-06-21 20:49:51 +0300176#ifdef BOOT_CM0P
Roman Okhrimenko977b3752022-03-31 14:40:48 +0300177 Cy_SysEnableCM4(fih_uint_decode(app_addr));
178 return true;
Dovhal Artem (CSUKR CSS ICW SW FW 1)f7a3d1b2022-04-01 15:07:37 +0000179#else
180 psoc6_launch_cm4_app(app_addr);
Roman Okhrimenkodc0ca082023-06-21 20:49:51 +0300181#endif /* BOOT_CM0P */
Dovhal Artem (CSUKR CSS ICW SW FW 1)f7a3d1b2022-04-01 15:07:37 +0000182
183#elif defined APP_CM0P
Roman Okhrimenkodc0ca082023-06-21 20:49:51 +0300184#ifdef BOOT_CM0P
Dovhal Artem (CSUKR CSS ICW SW FW 1)f7a3d1b2022-04-01 15:07:37 +0000185 /* This function does not return */
186 BOOT_LOG_INF("Launching app on CM0P core");
187 BOOT_LOG_INF(BOOT_MSG_FINISH);
188 hw_deinit();
189 psoc6_launch_cm0p_app(app_addr);
190#else
191#error "Application should run on Cortex-M4"
Roman Okhrimenkodc0ca082023-06-21 20:49:51 +0300192#endif /* BOOT_CM0P */
Dovhal Artem (CSUKR CSS ICW SW FW 1)f7a3d1b2022-04-01 15:07:37 +0000193
Roman Okhrimenkodc0ca082023-06-21 20:49:51 +0300194#elif defined APP_CM7
195 /* This function does not return */
196 BOOT_LOG_INF("Launching app on CM7 core");
197 BOOT_LOG_INF(BOOT_MSG_FINISH);
198 hw_deinit();
199 xmc7000_launch_cm7_app(app_addr);
200 return true;
Dovhal Artem (CSUKR CSS ICW SW FW 1)f7a3d1b2022-04-01 15:07:37 +0000201#else
202#error "Application should run on either Cortex-M0+ or Cortex-M4"
203#endif /* APP_CM4 */
204
205#endif /* defined CYW20829 */
Roman Okhrimenko977b3752022-03-31 14:40:48 +0300206 } else {
207 BOOT_LOG_ERR("Flash device ID not found");
208 return false;
209 }
210 }
211
212 return false;
Roman Okhrimenko89ecdac2020-02-28 17:05:55 +0200213}
214
Roman Okhrimenko409941a2023-11-20 02:18:09 +0200215static void DeepSleep_Prepare(void)
216{
217 static cy_stc_syspm_callback_params_t syspmSleepAppParams;
218 static cy_stc_syspm_callback_t syspmAppSleepCallbackHandler =
219 {
220 Cy_SCB_UART_DeepSleepCallback, CY_SYSPM_DEEPSLEEP, 0u, &syspmSleepAppParams,
221 NULL, NULL, 0};
222
223 syspmSleepAppParams.base = cy_retarget_io_uart_obj.base;
224 syspmSleepAppParams.context = (void *)&(cy_retarget_io_uart_obj.context);
225
226 if (!Cy_SysPm_RegisterCallback(&syspmAppSleepCallbackHandler)) {
227 BOOT_LOG_ERR("Failed to register syspmAppSleepCallbackHandler");
228 CY_ASSERT(false);
229 }
230}
231
Roman Okhrimenko89ecdac2020-02-28 17:05:55 +0200232int main(void)
233{
Roman Okhrimenkodc0ca082023-06-21 20:49:51 +0300234 struct boot_rsp rsp = {};
Roman Okhrimenkoff026122020-09-23 12:58:07 +0300235 bool boot_succeeded = false;
Tamas Ban4e8d8382020-09-30 08:01:58 +0100236 fih_int fih_rc = FIH_FAILURE;
Roman Okhrimenkodc0ca082023-06-21 20:49:51 +0300237 cy_rslt_t rc = cybsp_init();
Roman Okhrimenko89ecdac2020-02-28 17:05:55 +0200238
Roman Okhrimenkodc0ca082023-06-21 20:49:51 +0300239
Roman Okhrimenko977b3752022-03-31 14:40:48 +0300240 if (rc != CY_RSLT_SUCCESS) {
Roman Okhrimenko409941a2023-11-20 02:18:09 +0200241 CY_ASSERT(false);
Roman Okhrimenko977b3752022-03-31 14:40:48 +0300242 /* Loop forever... */
243 while (true) {
244 __WFI();
245 }
246 }
Dovhal Artem (CSUKR CSS ICW SW FW 1)f7a3d1b2022-04-01 15:07:37 +0000247
248#ifdef USE_EXEC_TIME_CHECK
249 timebase_us_init();
250#endif /* USE_EXEC_TIME_CHECK */
251
252#ifdef USE_LOG_TIMESTAMP
253 log_timestamp_init();
254#endif /* USE_LOG_TIMESTAMP */
255
Roman Okhrimenko977b3752022-03-31 14:40:48 +0300256 /* enable interrupts */
257 __enable_irq();
dmiv8672c8e2020-09-16 12:59:20 +0300258
Roman Okhrimenko977b3752022-03-31 14:40:48 +0300259 /* Certain PSoC 6 devices enable CM4 by default at startup. It must be
Roman Okhrimenko4bc28102021-02-01 19:31:41 +0200260 * either disabled or enabled & running a valid application for flash write
261 * to work from CM0+. Since flash write may happen in boot_go() for updating
262 * the image before this bootloader app can enable CM4 in do_boot(), we need
263 * to keep CM4 disabled. Note that debugging of CM4 is not supported when it
264 * is disabled.
265 */
Roman Okhrimenkodc0ca082023-06-21 20:49:51 +0300266#if defined(CY_DEVICE_PSOC6ABLE2) && !defined(BOOT_CM4)
Roman Okhrimenko977b3752022-03-31 14:40:48 +0300267 if (CY_SYS_CM4_STATUS_ENABLED == Cy_SysGetCM4Status()) {
Roman Okhrimenko4bc28102021-02-01 19:31:41 +0200268 Cy_SysDisableCM4();
269 }
Roman Okhrimenkodc0ca082023-06-21 20:49:51 +0300270#endif /* defined(CY_DEVICE_PSOC6ABLE2) && !defined(BOOT_CM4) */
Roman Okhrimenko977b3752022-03-31 14:40:48 +0300271 /* Initialize retarget-io to use the debug UART port */
272 rc = cy_retarget_io_init(CYBSP_DEBUG_UART_TX,
273 CYBSP_DEBUG_UART_RX,
274 CY_RETARGET_IO_BAUDRATE);
Roman Okhrimenkodc0ca082023-06-21 20:49:51 +0300275
Roman Okhrimenko977b3752022-03-31 14:40:48 +0300276 if (rc != CY_RSLT_SUCCESS) {
Roman Okhrimenko409941a2023-11-20 02:18:09 +0200277 CY_ASSERT(false);
Roman Okhrimenko977b3752022-03-31 14:40:48 +0300278 /* Loop forever... */
279 while (true) {
280 __WFI();
281 }
dmiv8672c8e2020-09-16 12:59:20 +0300282 }
Roman Okhrimenko89ecdac2020-02-28 17:05:55 +0200283
284 BOOT_LOG_INF("MCUBoot Bootloader Started");
285
Bohdan Kovalchuk0324f1b2020-05-26 08:04:24 -0500286#ifdef CY_BOOT_USE_EXTERNAL_FLASH
Roman Okhrimenko977b3752022-03-31 14:40:48 +0300287 {
288 cy_en_smif_status_t qspi_status = qspi_init_sfdp(SMIF_ID);
Bohdan Kovalchuka333a452020-07-09 16:55:58 +0300289
Roman Okhrimenko977b3752022-03-31 14:40:48 +0300290 if (CY_SMIF_SUCCESS == qspi_status) {
291 rc = CY_RSLT_SUCCESS;
292 BOOT_LOG_INF("External Memory initialized w/ SFDP.");
293 } else {
294 rc = MCUBOOTAPP_RSLT_ERR;
295 BOOT_LOG_ERR("External Memory initialization w/ SFDP FAILED: 0x%08" PRIx32, (uint32_t)qspi_status);
296 }
Bohdan Kovalchuk0324f1b2020-05-26 08:04:24 -0500297 }
Tamas Ban4e8d8382020-09-30 08:01:58 +0100298
Roman Okhrimenko977b3752022-03-31 14:40:48 +0300299 if (CY_RSLT_SUCCESS == rc)
300#endif /* CY_BOOT_USE_EXTERNAL_FLASH */
301 {
302#if defined(CYW20829) && defined(MCUBOOT_HW_ROLLBACK_PROT)
303 /* Check service application completion status */
304 if (check_service_app_status() != 0) {
305 BOOT_LOG_ERR("Service application failed");
Roman Okhrimenko409941a2023-11-20 02:18:09 +0200306 CY_ASSERT(false);
Roman Okhrimenko977b3752022-03-31 14:40:48 +0300307 /* Loop forever... */
308 while (true) {
309 __WFI();
310 }
311 }
312#endif /* CYW20829 && MCUBOOT_HW_ROLLBACK_PROT */
313
Dovhal Artem (CSUKR CSS ICW SW FW 1)f7a3d1b2022-04-01 15:07:37 +0000314#ifdef USE_EXEC_TIME_CHECK
315 {
316 uint32_t exec_time;
317 EXEC_TIME_CHECK_BEGIN(&exec_time);
318#endif /* USE_EXEC_TIME_CHECK */
319 FIH_CALL(boot_go, fih_rc, &rsp);
320#ifdef USE_EXEC_TIME_CHECK
321 EXEC_TIME_CHECK_END();
322 BOOT_LOG_INF("Exec time: %" PRIu32 " [ms]", exec_time / 1000U);
323 }
324#endif /* USE_EXEC_TIME_CHECK */
Roman Okhrimenkodc0ca082023-06-21 20:49:51 +0300325 if (FIH_TRUE == fih_eq(fih_rc, FIH_SUCCESS)) {
Bohdan Kovalchuk0324f1b2020-05-26 08:04:24 -0500326 BOOT_LOG_INF("User Application validated successfully");
Roman Okhrimenko0c7aebc2020-09-02 13:37:51 +0300327 /* initialize watchdog timer. it should be updated from user app
328 * to mark successful start up of this app. if the watchdog is not updated,
329 * reset will be initiated by watchdog timer and swap revert operation started
330 * to roll back to operable image.
331 */
Roman Okhrimenkodc0ca082023-06-21 20:49:51 +0300332 cyhal_wdt_t *wdt = NULL;
Roman Okhrimenko977b3752022-03-31 14:40:48 +0300333
Roman Okhrimenkodc0ca082023-06-21 20:49:51 +0300334 rc = cyhal_wdt_init(wdt, WDT_TIME_OUT_MS);
335
Roman Okhrimenko977b3752022-03-31 14:40:48 +0300336 if (CY_RSLT_SUCCESS == rc) {
337
338 boot_succeeded = do_boot(&rsp);
339
340 if (!boot_succeeded) {
341 BOOT_LOG_ERR("Boot of next app failed");
342 }
343 } else {
344 BOOT_LOG_ERR("Failed to init WDT");
345 }
346 } else {
347 BOOT_LOG_ERR("MCUBoot Bootloader found none of bootable images");
dmiv8672c8e2020-09-16 12:59:20 +0300348 }
Bohdan Kovalchuk0324f1b2020-05-26 08:04:24 -0500349 }
dmiv8672c8e2020-09-16 12:59:20 +0300350
Roman Okhrimenko409941a2023-11-20 02:18:09 +0200351 DeepSleep_Prepare();
352
Roman Okhrimenko977b3752022-03-31 14:40:48 +0300353 while (true) {
Roman Okhrimenkoff026122020-09-23 12:58:07 +0300354 if (boot_succeeded) {
Roman Okhrimenko977b3752022-03-31 14:40:48 +0300355 (void)Cy_SysPm_CpuEnterDeepSleep(CY_SYSPM_WAIT_FOR_INTERRUPT);
356 } else {
Roman Okhrimenkoff026122020-09-23 12:58:07 +0300357 __WFI();
358 }
dmiv8672c8e2020-09-16 12:59:20 +0300359 }
Roman Okhrimenko89ecdac2020-02-28 17:05:55 +0200360}
dmiv8672c8e2020-09-16 12:59:20 +0300361
Roman Okhrimenko977b3752022-03-31 14:40:48 +0300362static void hw_deinit(void)
dmiv8672c8e2020-09-16 12:59:20 +0300363{
Roman Okhrimenko977b3752022-03-31 14:40:48 +0300364#if defined(CY_BOOT_USE_EXTERNAL_FLASH) && !defined(MCUBOOT_ENC_IMAGES_XIP) && !defined(USE_XIP)
365 qspi_deinit(SMIF_ID);
366#endif /* defined(CY_BOOT_USE_EXTERNAL_FLASH) && !defined(MCUBOOT_ENC_IMAGES_XIP) */
Roman Okhrimenkodc0ca082023-06-21 20:49:51 +0300367
368 /* Flush the TX buffer, need to be fixed in retarget_io */
369 while(cy_retarget_io_is_tx_active()){}
370 cy_retarget_io_deinit();
Dovhal Artem (CSUKR CSS ICW SW FW 1)f7a3d1b2022-04-01 15:07:37 +0000371
372#ifdef USE_EXEC_TIME_CHECK
373 timebase_us_deinit();
374#endif /* USE_EXEC_TIME_CHECK */
375
376#ifdef USE_LOG_TIMESTAMP
377 log_timestamp_deinit();
378#endif /* USE_LOG_TIMESTAMP */
dmiv8672c8e2020-09-16 12:59:20 +0300379}