| /** |
| * @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__); |
| } |