| /* |
| * Copyright (c) 2015, Freescale Semiconductor, Inc. |
| * Copyright 2016-2017 NXP |
| * All rights reserved. |
| * |
| * SPDX-License-Identifier: BSD-3-Clause |
| */ |
| |
| #ifndef _FSL_SEMA42_H_ |
| #define _FSL_SEMA42_H_ |
| |
| #include "fsl_common.h" |
| |
| /*! |
| * @addtogroup sema42 |
| * @{ |
| */ |
| |
| /****************************************************************************** |
| * Definitions |
| *****************************************************************************/ |
| |
| /*! @name Driver version */ |
| /*@{*/ |
| /*! @brief SEMA42 driver version */ |
| #define FSL_SEMA42_DRIVER_VERSION (MAKE_VERSION(2, 0, 0)) |
| /*@}*/ |
| |
| /*! |
| * @brief SEMA42 status return codes. |
| */ |
| enum _sema42_status |
| { |
| kStatus_SEMA42_Busy = MAKE_STATUS(kStatusGroup_SEMA42, 0), /*!< SEMA42 gate has been locked by other processor. */ |
| kStatus_SEMA42_Reseting = MAKE_STATUS(kStatusGroup_SEMA42, 1) /*!< SEMA42 gate reseting is ongoing. */ |
| }; |
| |
| /*! |
| * @brief SEMA42 gate lock status. |
| */ |
| typedef enum _sema42_gate_status |
| { |
| kSEMA42_Unlocked = 0U, /*!< The gate is unlocked. */ |
| kSEMA42_LockedByProc0 = 1U, /*!< The gate is locked by processor 0. */ |
| kSEMA42_LockedByProc1 = 2U, /*!< The gate is locked by processor 1. */ |
| kSEMA42_LockedByProc2 = 3U, /*!< The gate is locked by processor 2. */ |
| kSEMA42_LockedByProc3 = 4U, /*!< The gate is locked by processor 3. */ |
| kSEMA42_LockedByProc4 = 5U, /*!< The gate is locked by processor 4. */ |
| kSEMA42_LockedByProc5 = 6U, /*!< The gate is locked by processor 5. */ |
| kSEMA42_LockedByProc6 = 7U, /*!< The gate is locked by processor 6. */ |
| kSEMA42_LockedByProc7 = 8U, /*!< The gate is locked by processor 7. */ |
| kSEMA42_LockedByProc8 = 9U, /*!< The gate is locked by processor 8. */ |
| kSEMA42_LockedByProc9 = 10U, /*!< The gate is locked by processor 9. */ |
| kSEMA42_LockedByProc10 = 11U, /*!< The gate is locked by processor 10. */ |
| kSEMA42_LockedByProc11 = 12U, /*!< The gate is locked by processor 11. */ |
| kSEMA42_LockedByProc12 = 13U, /*!< The gate is locked by processor 12. */ |
| kSEMA42_LockedByProc13 = 14U, /*!< The gate is locked by processor 13. */ |
| kSEMA42_LockedByProc14 = 15U /*!< The gate is locked by processor 14. */ |
| } sema42_gate_status_t; |
| |
| /*! @brief The number to reset all SEMA42 gates. */ |
| #define SEMA42_GATE_NUM_RESET_ALL (64U) |
| |
| /*! @brief SEMA42 gate n register address. |
| * |
| * The SEMA42 gates are sorted in the order 3, 2, 1, 0, 7, 6, 5, 4, ... not in the order |
| * 0, 1, 2, 3, 4, 5, 6, 7, ... The macro SEMA42_GATEn gets the SEMA42 gate based on the gate |
| * index. |
| * |
| * The input gate index is XOR'ed with 3U: |
| * 0 ^ 3 = 3 |
| * 1 ^ 3 = 2 |
| * 2 ^ 3 = 1 |
| * 3 ^ 3 = 0 |
| * 4 ^ 3 = 7 |
| * 5 ^ 3 = 6 |
| * 6 ^ 3 = 5 |
| * 7 ^ 3 = 4 |
| * ... |
| */ |
| #define SEMA42_GATEn(base, n) (*(&((base)->GATE3) + ((n) ^ 3U))) |
| |
| /******************************************************************************* |
| * API |
| ******************************************************************************/ |
| |
| #if defined(__cplusplus) |
| extern "C" { |
| #endif |
| |
| /*! |
| * @brief Initializes the SEMA42 module. |
| * |
| * This function initializes the SEMA42 module. It only enables the clock but does |
| * not reset the gates because the module might be used by other processors |
| * at the same time. To reset the gates, call either SEMA42_ResetGate or |
| * SEMA42_ResetAllGates function. |
| * |
| * @param base SEMA42 peripheral base address. |
| */ |
| void SEMA42_Init(SEMA42_Type *base); |
| |
| /*! |
| * @brief De-initializes the SEMA42 module. |
| * |
| * This function de-initializes the SEMA42 module. It only disables the clock. |
| * |
| * @param base SEMA42 peripheral base address. |
| */ |
| void SEMA42_Deinit(SEMA42_Type *base); |
| |
| /*! |
| * @brief Tries to lock the SEMA42 gate. |
| * |
| * This function tries to lock the specific SEMA42 gate. If the gate has been |
| * locked by another processor, this function returns an error code. |
| * |
| * @param base SEMA42 peripheral base address. |
| * @param gateNum Gate number to lock. |
| * @param procNum Current processor number. |
| * |
| * @retval kStatus_Success Lock the sema42 gate successfully. |
| * @retval kStatus_SEMA42_Busy Sema42 gate has been locked by another processor. |
| */ |
| status_t SEMA42_TryLock(SEMA42_Type *base, uint8_t gateNum, uint8_t procNum); |
| |
| /*! |
| * @brief Locks the SEMA42 gate. |
| * |
| * This function locks the specific SEMA42 gate. If the gate has been |
| * locked by other processors, this function waits until it is unlocked and then |
| * lock it. |
| * |
| * @param base SEMA42 peripheral base address. |
| * @param gateNum Gate number to lock. |
| * @param procNum Current processor number. |
| */ |
| void SEMA42_Lock(SEMA42_Type *base, uint8_t gateNum, uint8_t procNum); |
| |
| /*! |
| * @brief Unlocks the SEMA42 gate. |
| * |
| * This function unlocks the specific SEMA42 gate. It only writes unlock value |
| * to the SEMA42 gate register. However, it does not check whether the SEMA42 gate is locked |
| * by the current processor or not. As a result, if the SEMA42 gate is not locked by the current |
| * processor, this function has no effect. |
| * |
| * @param base SEMA42 peripheral base address. |
| * @param gateNum Gate number to unlock. |
| */ |
| static inline void SEMA42_Unlock(SEMA42_Type *base, uint8_t gateNum) |
| { |
| assert(gateNum < FSL_FEATURE_SEMA42_GATE_COUNT); |
| |
| /* ^= 0x03U because SEMA42 gates are in the order 3, 2, 1, 0, 7, 6, 5, 4, 11, 10, 9, 8, 7, ...*/ |
| SEMA42_GATEn(base, gateNum) = kSEMA42_Unlocked; |
| } |
| |
| /*! |
| * @brief Gets the status of the SEMA42 gate. |
| * |
| * This function checks the lock status of a specific SEMA42 gate. |
| * |
| * @param base SEMA42 peripheral base address. |
| * @param gateNum Gate number. |
| * |
| * @return status Current status. |
| */ |
| static inline sema42_gate_status_t SEMA42_GetGateStatus(SEMA42_Type *base, uint8_t gateNum) |
| { |
| assert(gateNum < FSL_FEATURE_SEMA42_GATE_COUNT); |
| |
| return (sema42_gate_status_t)(SEMA42_GATEn(base, gateNum)); |
| } |
| |
| /*! |
| * @brief Resets the SEMA42 gate to an unlocked status. |
| * |
| * This function resets a SEMA42 gate to an unlocked status. |
| * |
| * @param base SEMA42 peripheral base address. |
| * @param gateNum Gate number. |
| * |
| * @retval kStatus_Success SEMA42 gate is reset successfully. |
| * @retval kStatus_SEMA42_Reseting Some other reset process is ongoing. |
| */ |
| status_t SEMA42_ResetGate(SEMA42_Type *base, uint8_t gateNum); |
| |
| /*! |
| * @brief Resets all SEMA42 gates to an unlocked status. |
| * |
| * This function resets all SEMA42 gate to an unlocked status. |
| * |
| * @param base SEMA42 peripheral base address. |
| * |
| * @retval kStatus_Success SEMA42 is reset successfully. |
| * @retval kStatus_SEMA42_Reseting Some other reset process is ongoing. |
| */ |
| static inline status_t SEMA42_ResetAllGates(SEMA42_Type *base) |
| { |
| return SEMA42_ResetGate(base, SEMA42_GATE_NUM_RESET_ALL); |
| } |
| |
| #if defined(__cplusplus) |
| } |
| #endif |
| |
| /*! |
| * @} |
| */ |
| |
| #endif /* _FSL_SEMA42_H_ */ |