| /* |
| * Copyright 2017 NXP |
| * All rights reserved. |
| * |
| * SPDX-License-Identifier: BSD-3-Clause |
| */ |
| |
| #include "fsl_common.h" |
| #include "fsl_sema4.h" |
| #include "fsl_debug_console.h" |
| #include "board.h" |
| |
| #include "pin_mux.h" |
| #include "clock_config.h" |
| /******************************************************************************* |
| * Definitions |
| ******************************************************************************/ |
| #define APP_SEMA4 SEMA4 |
| #define APP_PROC_NUM 1 |
| #define APP_OTHER_PROC_NUM 0 |
| #define APP_SEMA4_GATE 0 |
| #define APP_SEMA4_GATE_ADDR ((uint32_t)(&(APP_SEMA4->Gate00))) |
| #define SEMA4_IRQHandler HS_CP1_IRQHandler |
| #define SOC_EnableSEMA4Intterrupt() NVIC_EnableIRQ(HS_CP1_IRQn) |
| #define SOC_DisableSEMA4Intterrupt() NVIC_DisableIRQ(HS_CP1_IRQn) |
| #define APP_ASSERT(x) \ |
| if (!(x)) \ |
| { \ |
| PRINTF("Example error\r\n"); \ |
| for (;;) \ |
| ; \ |
| } |
| |
| /******************************************************************************* |
| * Variables |
| ******************************************************************************/ |
| |
| /******************************************************************************* |
| * Prototypes |
| ******************************************************************************/ |
| |
| /******************************************************************************* |
| * Code |
| ******************************************************************************/ |
| |
| void SEMA4_IRQHandler(void) |
| { |
| /* If gate notification IRQ received, then lock the gate. */ |
| if (((1U << APP_SEMA4_GATE) & SEMA4_GetGateNotifyStatus(APP_SEMA4, APP_PROC_NUM))) |
| { |
| SEMA4_TryLock(APP_SEMA4, APP_SEMA4_GATE, APP_PROC_NUM); |
| } |
| __DSB(); |
| } |
| |
| /*! |
| * @brief Main function |
| */ |
| int main(void) |
| { |
| /* Board specific RDC settings */ |
| BOARD_RdcInit(); |
| |
| BOARD_InitPins(); |
| BOARD_BootClockRUN(); |
| BOARD_InitDebugConsole(); |
| BOARD_InitMemory(); |
| |
| PRINTF("SEMA4 uboot example start\r\n"); |
| |
| SEMA4_Init(APP_SEMA4); |
| |
| SEMA4_EnableGateNotifyInterrupt(APP_SEMA4, APP_PROC_NUM, (1 << APP_SEMA4_GATE)); |
| |
| SOC_EnableSEMA4Intterrupt(); |
| |
| /* Step 1: The other core lock the sema4 gate. */ |
| PRINTF("Lock sema4 gate in uboot using:\r\n"); |
| PRINTF(" > mw.b 0x%08x %d 1 \r\n", APP_SEMA4_GATE_ADDR, APP_OTHER_PROC_NUM + 1); |
| |
| /* Wait SEMA4 gate is locked by the other core. */ |
| while (SEMA4_GetLockProc(APP_SEMA4, APP_SEMA4_GATE) != APP_OTHER_PROC_NUM) |
| { |
| } |
| |
| /* Step 2: Current core try to lock the sema4 gate and lock failed. */ |
| APP_ASSERT(kStatus_Fail == SEMA4_TryLock(APP_SEMA4, APP_SEMA4_GATE, APP_PROC_NUM)); |
| |
| /* Step 3: The other core unlock the sema4 gate. */ |
| PRINTF("Unlock sema4 gate in uboot using:\r\n"); |
| PRINTF(" > mw.b 0x%08x 0 1 \r\n", APP_SEMA4_GATE_ADDR); |
| |
| /* Wait SEMA4 gate is locked by the other core. */ |
| while (SEMA4_GetLockProc(APP_SEMA4, APP_SEMA4_GATE) == APP_OTHER_PROC_NUM) |
| { |
| } |
| |
| /* |
| * When the other core unlocked the gate, current core receives the notification |
| * interrupt and lock the gate in ISR. |
| */ |
| APP_ASSERT(SEMA4_GetLockProc(APP_SEMA4, APP_SEMA4_GATE) == APP_PROC_NUM); |
| |
| SEMA4_Unlock(APP_SEMA4, APP_SEMA4_GATE); |
| |
| SOC_DisableSEMA4Intterrupt(); |
| |
| SEMA4_DisableGateNotifyInterrupt(APP_SEMA4, APP_PROC_NUM, (1 << APP_SEMA4_GATE)); |
| |
| SEMA4_Deinit(APP_SEMA4); |
| |
| PRINTF("SEMA4 uboot example success\r\n"); |
| |
| while (1) |
| { |
| } |
| } |