237 lines
11 KiB
C
237 lines
11 KiB
C
/*******************************************************************************
|
|
* File Name: main_cm0p.c
|
|
*
|
|
* Version: 1.30
|
|
*
|
|
* Description: This file provides the source code for the DFU (App0)
|
|
* running on the core CM0+ (core0).
|
|
* App0 core0 firmware does the following:
|
|
* - Switches to the App1 on reset if it was scheduled.
|
|
* - Else starts App0 core1 firmware.
|
|
*
|
|
* Related Document: Code example CE216767.pdf
|
|
*
|
|
* Hardware Dependency: CY8CKIT-062-BLE PSoC 6 BLE Pioneer Kit
|
|
* CY5677 CySmart USB Dongle
|
|
*
|
|
******************************************************************************
|
|
* Copyright (2019), Cypress Semiconductor Corporation.
|
|
******************************************************************************
|
|
* This software is owned by Cypress Semiconductor Corporation (Cypress) and is
|
|
* protected by and subject to worldwide patent protection (United States and
|
|
* foreign), United States copyright laws and international treaty provisions.
|
|
* Cypress hereby grants to licensee a personal, non-exclusive, non-transferable
|
|
* license to copy, use, modify, create derivative works of, and compile the
|
|
* Cypress Source Code and derivative works for the sole purpose of creating
|
|
* custom software in support of licensee product to be used only in conjunction
|
|
* with a Cypress integrated circuit as specified in the applicable agreement.
|
|
* Any reproduction, modification, translation, compilation, or representation of
|
|
* this software except as specified above is prohibited without the express
|
|
* written permission of Cypress.
|
|
*
|
|
* Disclaimer: CYPRESS MAKES NO WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, WITH
|
|
* REGARD TO THIS MATERIAL, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
|
* Cypress reserves the right to make changes without further notice to the
|
|
* materials described herein. Cypress does not assume any liability arising out
|
|
* of the application or use of any product or circuit described herein. Cypress
|
|
* does not authorize its products for use as critical components in life-support
|
|
* systems where a malfunction or failure may reasonably be expected to result in
|
|
* significant injury to the user. The inclusion of Cypress' product in a life-
|
|
* support systems application implies that the manufacturer assumes all risk of
|
|
* such use and in doing so indemnifies Cypress against all charges. Use may be
|
|
* limited by and subject to the applicable Cypress software license agreement.
|
|
*******************************************************************************/
|
|
|
|
#include "dfu/cy_dfu.h"
|
|
#include "project.h"
|
|
#include "cy_si_config.h"
|
|
|
|
/*
|
|
* Set this define to any value different than 0, to use a standard TOC2,
|
|
* erase the public key, and enable the device to run code generated by other projects.
|
|
*/
|
|
#define UNLOCK_SYSTEM (1u)
|
|
|
|
#if CY_DFU_OPT_CRYPTO_HW != 0
|
|
#define MY_CHAN_CRYPTO (uint32_t)(3u) /* IPC data channel for the Crypto */
|
|
#define MY_INTR_CRYPTO_SRV (uint32_t)(1u) /* IPC interrupt structure for the Crypto server */
|
|
#define MY_INTR_CRYPTO_CLI (uint32_t)(2u) /* IPC interrupt structure for the Crypto client */
|
|
#define MY_INTR_CRYPTO_SRV_MUX (IRQn_Type)(2u) /* CM0+ IPC interrupt mux number the Crypto server */
|
|
#define MY_INTR_CRYPTO_CLI_MUX (IRQn_Type)(3u) /* CM0+ IPC interrupt mux number the Crypto client */
|
|
#define MY_INTR_CRYPTO_ERR_MUX (IRQn_Type)(4u) /* CM0+ ERROR interrupt mux number the Crypto server */
|
|
|
|
const cy_stc_crypto_config_t cryptoConfig =
|
|
{
|
|
/* .ipcChannel */ MY_CHAN_CRYPTO,
|
|
/* .acquireNotifierChannel */ MY_INTR_CRYPTO_SRV,
|
|
/* .releaseNotifierChannel */ MY_INTR_CRYPTO_CLI,
|
|
/* .releaseNotifierConfig */ {
|
|
#if (CY_CPU_CORTEX_M0P)
|
|
/* .intrSrc */ MY_INTR_CRYPTO_CLI_MUX,
|
|
/* .cm0pSrc */ cpuss_interrupts_ipc_2_IRQn, /* depends on selected releaseNotifierChannel value */
|
|
#else
|
|
/* .intrSrc */ cpuss_interrupts_ipc_2_IRQn, /* depends on selected releaseNotifierChannel value */
|
|
#endif
|
|
/* .intrPriority */ 2u,
|
|
},
|
|
/* .userCompleteCallback */ NULL,
|
|
/* .userGetDataHandler */ NULL,
|
|
/* .userErrorHandler */ NULL,
|
|
/* .acquireNotifierConfig */ {
|
|
#if (CY_CPU_CORTEX_M0P)
|
|
/* .intrSrc */ MY_INTR_CRYPTO_SRV_MUX, /* to use with DeepSleep mode should be in DeepSleep capable muxer's range */
|
|
/* .cm0pSrc */ cpuss_interrupts_ipc_1_IRQn, /* depends on selected acquireNotifierChannel value */
|
|
#else
|
|
/* .intrSrc */ cpuss_interrupts_ipc_1_IRQn, /* depends on selected acquireNotifierChannel value */
|
|
#endif
|
|
/* .intrPriority */ 2u,
|
|
},
|
|
/* .cryptoErrorIntrConfig */ {
|
|
#if (CY_CPU_CORTEX_M0P)
|
|
/* .intrSrc */ MY_INTR_CRYPTO_ERR_MUX,
|
|
/* .cm0pSrc */ cpuss_interrupt_crypto_IRQn,
|
|
#else
|
|
/* .intrSrc */ cpuss_interrupt_crypto_IRQn,
|
|
#endif
|
|
/* .intrPriority */ 2u,
|
|
}
|
|
};
|
|
|
|
cy_stc_crypto_server_context_t cryptoServerContext;
|
|
cy_en_crypto_status_t cryptoStatus;
|
|
#endif
|
|
|
|
#if UNLOCK_SYSTEM == (0u)
|
|
/* Flashboot parameters */
|
|
#define CY_SI_FLASHBOOT_FLAGS ((CY_SI_FLASHBOOT_VALIDATE_YES << CY_SI_TOC_FLAGS_APP_VERIFY_POS) \
|
|
| (CY_SI_FLASHBOOT_WAIT_20MS << CY_SI_TOC_FLAGS_DELAY_POS) \
|
|
| (CY_SI_FLASHBOOT_CLK_25MHZ << CY_SI_TOC_FLAGS_CLOCKS_POS))
|
|
|
|
/* TOC Part 2 Definition */
|
|
CY_SECTION(".cy_toc_part2") __USED
|
|
const cy_stc_si_toc_t cy_toc2 =
|
|
{
|
|
.objSize = sizeof(cy_stc_si_toc_t) - sizeof(uint32_t), /**< Object Size (Bytes) excluding CRC */
|
|
.magicNum = CY_SI_TOC2_MAGICNUMBER, /**< TOC2 ID (magic number) */
|
|
.userKeyAddr = (uint32_t) &CySecureKeyStorage, /**< User key storage address */
|
|
.smifCfgAddr = 0UL, /**< SMIF config list pointer */
|
|
.appAddr1 = CY_DFU_APP0_VERIFY_START, /**< App0 start address */
|
|
.appFormat1 = CY_DFU_CYPRESS_APP, /**< App0 Format */
|
|
.shashObj = 1UL, /**< Include public key in the SECURE HASH */
|
|
.sigKeyAddr = (uint32_t)&SFLASH->PUBLIC_KEY, /**< Address of signature verification key */
|
|
.tocFlags = CY_SI_FLASHBOOT_FLAGS, /**< Flashboot flags stored in TOC2 */
|
|
.crc = 0UL, /**< CRC populated by cymcuelftool */
|
|
};
|
|
|
|
/* Assuming App0 is located at start of flash, change define if different */
|
|
#define APP0_START_ADDRESS CY_FLASH_BASE
|
|
|
|
/* Cypress Standard Application Format Header */
|
|
CY_SECTION(".cy_app_header") __USED
|
|
const cy_stc_user_appheader_t applicationHeader =
|
|
{
|
|
.objSize = CY_DFU_APP0_VERIFY_LENGTH, /* Application Size (Bytes) excluding hash */
|
|
.appId = CY_SI_APP_VERSION, /* App ID */
|
|
.appAttributes = 0UL, /* Reserved */
|
|
.numCores = 2UL, /* CM0+ and CM4 */
|
|
.core0Vt = (uint32_t)(&__Vectors[0]) - APP0_START_ADDRESS - offsetof(cy_stc_user_appheader_t, core0Vt), /* Offset to CM0+ Vector Table in flash */
|
|
.core1Vt = (uint32_t)(&__cy_app_core1_start_addr) - APP0_START_ADDRESS - offsetof(cy_stc_user_appheader_t, core1Vt), /* Offset to CM4 Vector Table in flash */
|
|
.core0Id = CY_ARM_CM0P_CPUID, /* ARM CM0+ CPU ID */
|
|
.core1Id = CY_ARM_CM4_CPUID, /* ARM CM4 CPU ID */
|
|
};
|
|
#endif /* UNLOCK_SYSTEM == (0u) */
|
|
|
|
#if UNLOCK_SYSTEM != (0u)
|
|
/* Flashboot parameters */
|
|
#define CY_SI_FLASHBOOT_FLAGS ((CY_SI_FLASHBOOT_VALIDATE_NO << CY_SI_TOC_FLAGS_APP_VERIFY_POS) \
|
|
| (CY_SI_FLASHBOOT_WAIT_20MS << CY_SI_TOC_FLAGS_DELAY_POS) \
|
|
| (CY_SI_FLASHBOOT_CLK_25MHZ << CY_SI_TOC_FLAGS_CLOCKS_POS))
|
|
|
|
/* Standard TOC Part 2 Definition */
|
|
CY_SECTION(".cy_toc_part2") __USED
|
|
const cy_stc_si_toc_t cy_toc2 =
|
|
{
|
|
.objSize = sizeof(cy_stc_si_toc_t) - sizeof(uint32_t), /**< Object Size (Bytes) excluding CRC */
|
|
.magicNum = CY_SI_TOC2_MAGICNUMBER, /**< TOC2 ID (magic number) */
|
|
.userKeyAddr = 0UL, /**< User key storage address */
|
|
.smifCfgAddr = 0UL, /**< SMIF config list pointer */
|
|
.appAddr1 = CY_FLASH_BASE, /**< Main Flash base address */
|
|
.appFormat1 = CY_DFU_BASIC_APP, /**< Basic format */
|
|
.shashObj = 0UL,
|
|
.sigKeyAddr = 0UL, /**< Address of signature verification key */
|
|
.tocFlags = CY_SI_FLASHBOOT_FLAGS, /**< Flashboot flags stored in TOC2 */
|
|
.crc = 0UL, /**< CRC populated by cymcuelftool */
|
|
};
|
|
#endif /* UNLOCK_SYSTEM != 0UL */
|
|
|
|
/*******************************************************************************
|
|
* Function Name: main
|
|
********************************************************************************
|
|
*
|
|
* Summary:
|
|
* Main function of App0 core0. Unfreezes IO and sets up the user button (SW2)
|
|
* as the hibernate wakeup source. Afterwards initializes core1 (CM4) and goes
|
|
* into deep sleep.
|
|
*
|
|
* Parameters:
|
|
* None
|
|
*
|
|
* Return:
|
|
* None
|
|
*
|
|
*******************************************************************************/
|
|
int main(void)
|
|
{
|
|
/* Unfreeze IO after Hibernate */
|
|
if(Cy_SysPm_GetIoFreezeStatus())
|
|
{
|
|
Cy_SysPm_IoUnfreeze();
|
|
}
|
|
/* Set SW2 as hibernate wakeup pin */
|
|
Cy_SysPm_SetHibWakeupSource(CY_SYSPM_HIBPIN1_LOW);
|
|
|
|
/* enable global interrupts */
|
|
__enable_irq();
|
|
|
|
#if CY_DFU_OPT_CRYPTO_HW != 0
|
|
/* Start the Crypto Server */
|
|
Cy_Crypto_Server_Start(&cryptoConfig, &cryptoServerContext);
|
|
#endif
|
|
|
|
/* Enable CM4 with the CM4 start address defined in the
|
|
DFU SDK linker script */
|
|
Cy_SysEnableCM4( (uint32_t)(&__cy_app_core1_start_addr) );
|
|
|
|
for (;;)
|
|
{
|
|
/* Process crypto server requests */
|
|
Cy_Crypto_Server_Process();
|
|
//Go into Deep Sleep
|
|
Cy_SysPm_DeepSleep(CY_SYSPM_WAIT_FOR_INTERRUPT);
|
|
}
|
|
}
|
|
|
|
/*******************************************************************************
|
|
* Function Name: Cy_OnResetUser
|
|
********************************************************************************
|
|
*
|
|
* Summary:
|
|
* This function is called at the start of Reset_Handler(). It is a weak function
|
|
* that may be redefined by user code.
|
|
* DFU SDK requires it to call Cy_DFU_OnResetApp0().
|
|
* Checks if an App switch has been scheduled and transfers control to it.
|
|
*
|
|
* Parameters:
|
|
* None
|
|
*
|
|
* Return:
|
|
* None
|
|
*
|
|
*******************************************************************************/
|
|
void Cy_OnResetUser(void)
|
|
{
|
|
Cy_DFU_OnResetApp0();
|
|
}
|
|
|
|
/* [] END OF FILE */
|