blob: 6977424218f5329d5e86fda30ef830b5e942f033 [file] [log] [blame]
/**
* @file app_boot.c
* @author NXP Semiconductors
* @version 1.0
* @par License
*
* Copyright 2017-2020 NXP
* SPDX-License-Identifier: Apache-2.0
*
* @par Description
* Implementation of the App booting time initilization functions
*/
#include "sm_types.h"
#include "app_boot.h"
#include "sm_printf.h"
#include "smCom.h"
#include <nxLog.h>
#include <time.h>
#include "sm_api.h"
#include "global_platf.h"
#include "sm_const.h"
#include "PlugAndTrust_HostLib_Ver.h"
#include "nxLog_App.h"
#include "inttypes.h"
#if AX_EMBEDDED
#include <ax_reset.h>
#include <se_reset_config.h>
#include "fsl_gpio.h"
#endif
#ifdef CPU_MIMXRT1062DVL6A
#include "fsl_trng.h"
#include "fsl_dcp.h"
#endif
//TODO: have all the ex included
//#include "a71ch_ex.h"
#include "sm_printf.h"
#include "sm_timer.h"
#if AX_EMBEDDED
#include "board.h"
#include "pin_mux.h"
#if defined(MBEDTLS)
#include "ksdk_mbedtls.h"
#endif
#endif /* FREEDOM */
#if defined(CPU_LPC54018)
#include "fsl_clock.h"
#include "fsl_reset.h"
#endif
#if defined(FRDM_K64F)
#define TARGET_PLATFORM "FRDM-K64F"
#elif defined(FRDM_KW41Z)
#define TARGET_PLATFORM "FRDM-KW41Z"
#elif defined(FRDM_K82F)
#define TARGET_PLATFORM "FRDM-K82F"
#elif defined(CPU_MIMXRT1062DVL6A)
#define TARGET_PLATFORM "i.MX RT 1060"
#endif
#ifdef CPU_MIMXRT1062DVL6A
#define TRNG0 TRNG
#endif
#if defined(CPU_LPC54018)
volatile uint32_t gDummy = 1; /* Put this is .data. Probably at 0x000 address */
#endif
static U16 establishConnnection(SmCommState_t *pCommState, const char *pConnectionParam);
static int translateCommunicationStatus(U16 connectStatus);
#ifdef USE_SERGER_RTT
extern void nInit_segger_Log(void);
#endif
int app_boot_Init()
{
#if defined(_WIN32) && defined(WIN32) && defined(DEBUG)
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
_CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_DEBUG);
#endif
#if defined(FRDM_KW41Z) || defined(FRDM_K64F)
BOARD_BootClockRUN();
#endif
#if defined(FRDM_K82F)
BOARD_BootClockHSRUN();
#endif
#ifdef FREEDOM
BOARD_InitPins();
BOARD_InitDebugConsole();
LED_BLUE_INIT(1);
LED_GREEN_INIT(1);
LED_RED_INIT(1);
#endif
#ifdef CPU_MIMXRT1062DVL6A
dcp_config_t dcpConfig;
trng_config_t trngConfig;
BOARD_ConfigMPU();
BOARD_InitBootPins();
BOARD_BootClockRUN();
BOARD_InitDebugConsole();
#if defined(IMX_RT)
/* Data cache must be temporarily disabled to be able to use sdram */
SCB_DisableDCache();
#endif
/* Initialize DCP */
DCP_GetDefaultConfig(&dcpConfig);
DCP_Init(DCP, &dcpConfig);
/* Initialize TRNG */
TRNG_GetDefaultConfig(&trngConfig);
/* Set sample mode of the TRNG ring oscillator to Von Neumann, for better random data.
* It is optional.*/
trngConfig.sampleMode = kTRNG_SampleModeVonNeumann;
/* Initialize TRNG */
TRNG_Init(TRNG0, &trngConfig);
#endif
#if defined(CPU_LPC54018)
while (gDummy--) {
/* Forcefully use gDummy so that linker does not kick it out */
}
/* attach 12 MHz clock to FLEXCOMM0 (debug console) */
CLOCK_AttachClk(BOARD_DEBUG_USART_CLK_ATTACH);
/* Enable Clock for RIT */
CLOCK_EnableClock(kCLOCK_Gpio3);
/* attach 12 MHz clock to FLEXCOMM2 (I2C master) */
CLOCK_AttachClk(kFRO12M_to_FLEXCOMM2);
/* reset FLEXCOMM for I2C */
RESET_PeripheralReset(kFC2_RST_SHIFT_RSTn);
BOARD_InitBootPins();
BOARD_BootClockFROHF96M();
BOARD_InitDebugConsole();
#endif /* CPU_LPC54018 */
#ifdef FREEDOM
LED_BLUE_ON();
#endif
#ifdef FRDM_K64F
{
/* For DHCP Ethernet */
SYSMPU_Type *base = SYSMPU;
base->CESR &= ~SYSMPU_CESR_VLD_MASK;
}
axReset_HostConfigure();
axReset_PowerUp();
axReset_HostUnconfigure();
#endif
#ifdef USE_SERGER_RTT
nInit_segger_Log();
#endif
#if !defined(USE_RTOS) || USE_RTOS == 0
app_boot_Init_RTOS();
#endif
LOG_I(PLUGANDTRUST_HOSTLIB_PROD_NAME_VER_FULL);
return 0;
}
int app_boot_Init_RTOS()
{
#if (AX_EMBEDDED) && defined(MBEDTLS)
CRYPTO_InitHardware();
#if defined(FSL_FEATURE_SOC_SHA_COUNT) && (FSL_FEATURE_SOC_SHA_COUNT > 0)
CLOCK_EnableClock(kCLOCK_Sha0);
RESET_PeripheralReset(kSHA_RST_SHIFT_RSTn);
#endif /* SHA */
#endif /* (AX_EMBEDDED) && defined(MBEDTLS) */
#if (AX_EMBEDDED)
PRINTF("\r\nWarning: Running this example will issue a debug reset of the attached " SE_NAME "\r\n");
PRINTF(" The content of the " SE_NAME " will be erased.\r\n");
PRINTF(" ****************************************\r\n");
PRINTF("Press any character to continue.\r\n");
//GETCHAR();
#endif
sm_initSleep();
return 0;
}
int app_boot_Connect(SmCommState_t *pCommState, const char *pConnectionParam)
{
int retVal;
U16 comStatus = establishConnnection(pCommState, pConnectionParam);
retVal = translateCommunicationStatus(comStatus);
if (retVal == 0) {
#if defined(SCI2C)
PRINTF("SCI2C_"); // To highlight the ATR format for SCI2C deviates from ISO7816-3
#elif defined(SPI)
PRINTF("SCSPI_");
#elif defined(T1oI2C)
PRINTF("SCT1oI2C_");
#endif
#if defined(TDA8029_UART)
PRINTF("UART Baudrate Idx: 0x%02X\r\n", pCommState->param2);
PRINTF("T=1 TA1: 0x%02X\r\n", pCommState->param1);
#endif
PRINTF(PLUGANDTRUST_HOSTLIB_PROD_NAME_VER_FULL "\r\n");
PRINTF("Applet Version : 0x%" PRIX32 "X\r\n", pCommState->appletVersion);
PRINTF("SecureBox Version: 0x%" PRIX16 "X\r\n", pCommState->sbVersion);
PRINTF("\r\n");
PRINTF("==========SELECT-DONE=========\r\n");
}
else {
PRINTF("\r\n");
PRINTF("==========SELECT-FAILED=========\r\n");
}
#ifdef TARGET_PLATFORM
PRINTF("Platform: %s\r\n", TARGET_PLATFORM);
#endif
#ifdef FREEDOM
if (retVal != 0) {
LED_RED_ON();
}
#endif
return retVal;
}
/**
* Local static function to handle communication status
* @param[in] connectStatus The status of the communication.
* @return returns the legacy error code
*/
static int translateCommunicationStatus(U16 connectStatus)
{
if ((connectStatus == ERR_CONNECT_LINK_FAILED) || (connectStatus == ERR_CONNECT_SELECT_FAILED)) {
PRINTF("SM_Connect failed with status 0x%" PRIX16 "X\n", connectStatus);
return 2;
}
else if (connectStatus == SMCOM_COM_FAILED) {
PRINTF("SM_Connect failed with status 0x%" PRIX16 "X (Could not open communication channel)\n", connectStatus);
return 4;
}
else if (connectStatus == SMCOM_PROTOCOL_FAILED) {
PRINTF("SM_Connect failed with status 0x%" PRIX16 "X (Could not establish communication protocol)\n",
connectStatus);
return 5;
}
else if (connectStatus == ERR_NO_VALID_IP_PORT_PATTERN) {
PRINTF("Pass the IP address and port number as arguments, e.g. \"127.0.0.1:8050\"!\n");
return 3;
}
else if (connectStatus != SW_OK) {
// return error code asis to handle AX layer errors
return connectStatus;
}
else {
return 0;
}
}
/**
* Local static function to establish a connection based on the communication port selected
* @param[in] pCommState pointer where the communication state is updated.
* @param[in] argc varibale length arg count based on the communication channel used.
* @param[in] argv variable arguments based on the communication channel used.
* @return returns the status of connection establishment
*/
static U16 establishConnnection(SmCommState_t *pCommState, const char *pConnectionParam)
{
U16 connectStatus = 0;
U8 Atr[64] = {0};
U16 AtrLen = sizeof(Atr);
#if defined(TDA8029_UART) || defined(SCI2C) || defined(PCSC) || defined(SPI) || defined(IPC) || defined(T1oI2C) || \
defined(SMCOM_PN7150) || defined(SMCOM_THREAD)
connectStatus = SM_Connect(NULL, pCommState, Atr, &AtrLen);
#elif defined(SMCOM_JRCP_V1) || defined(SMCOM_JRCP_V2)
#if defined SMCOM_JRCP_V1 && !defined(SMCOM_JRCP_V2)
pCommState->connType = kType_SE_Conn_Type_JRCP_V1;
#endif
#if defined SMCOM_JRCP_V2 && !defined(SMCOM_JRCP_V1)
pCommState->connType = kType_SE_Conn_Type_JRCP_V2;
#endif
if (pConnectionParam == NULL) {
PRINTF("Pass the IP address and port number as arguments, e.g. \"127.0.0.1:8050\"!\n");
return 4;
}
else {
connectStatus = SM_RjctConnect(NULL, pConnectionParam, pCommState, Atr, &AtrLen);
}
#elif defined(RJCT_VCOM)
if (pConnectionParam == NULL) {
PRINTF("Pass the COM Port as arguments, e.g. \"COM3\" or \"\\\\.\\COM18\" !\n");
return 4;
}
else {
connectStatus = SM_RjctConnect(NULL, pConnectionParam, pCommState, Atr, &AtrLen);
}
#elif defined(SMCOM_PCSC)
if (pConnectionParam == NULL) {
PRINTF("Pass the COM Port as arguments, e.g. \"TBU\"\n");
return 4;
}
else {
connectStatus = SM_RjctConnect(NULL, pConnectionParam, pCommState, Atr, &AtrLen);
}
#elif defined(SMCOM_RC663_VCOM)
if (pConnectionParam == NULL) {
PRINTF("Pass the COM Port as arguments, e.g. \"COM5\"\n");
return 4;
}
else {
connectStatus = SM_RjctConnect(NULL, pConnectionParam, pCommState, Atr, &AtrLen);
}
#else
#error "No communication channel defined"
#endif // SMCOM_JRCP_V1
if (AtrLen > 0) {
int i = 0;
#if defined(T1oI2C_UM11225)
PRINTF("ATR=0x");
#elif defined(T1oI2C_GP1_0)
/* for GP ATR is noting but CIP response*/
PRINTF("CIP=0x");
#endif
for (i = 0; i < AtrLen; i++) {
PRINTF("%02X.", Atr[i]);
}
PRINTF("\n");
}
#if defined(TDA8029_UART)
PRINTF("UART Baudrate Idx: 0x%02X\n", pCommState->param2);
PRINTF("T=1 TA1: 0x%02X\n", pCommState->param1);
#endif
return connectStatus;
}
void app_test_status(U8 result)
{
#if FREEDOM
LED_BLUE_OFF();
if (result == 0) {
LED_RED_ON();
}
else {
LED_GREEN_ON();
}
#endif
PRINTF("END. Status %s (Compiled on %s %s)\r\n", ((result == 1) ? "OK" : "FAILED"), __DATE__, __TIME__);
}