summaryrefslogtreecommitdiff
path: root/platform/drivers/inc/sema4.h
diff options
context:
space:
mode:
Diffstat (limited to 'platform/drivers/inc/sema4.h')
-rw-r--r--platform/drivers/inc/sema4.h285
1 files changed, 285 insertions, 0 deletions
diff --git a/platform/drivers/inc/sema4.h b/platform/drivers/inc/sema4.h
new file mode 100644
index 0000000..55ed0e0
--- /dev/null
+++ b/platform/drivers/inc/sema4.h
@@ -0,0 +1,285 @@
+/*
+ * Copyright (c) 2015, Freescale Semiconductor, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * o Redistributions of source code must retain the above copyright notice, this list
+ * of conditions and the following disclaimer.
+ *
+ * o Redistributions in binary form must reproduce the above copyright notice, this
+ * list of conditions and the following disclaimer in the documentation and/or
+ * other materials provided with the distribution.
+ *
+ * o Neither the name of Freescale Semiconductor, Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef __SEMA4_H__
+#define __SEMA4_H__
+
+#include <stdint.h>
+#include <stdbool.h>
+#include "device_imx.h"
+
+/*!
+ * @addtogroup sema4_driver
+ * @{
+ */
+
+/*******************************************************************************
+ * Definitions
+ ******************************************************************************/
+#define SEMA4_PROCESSOR_NONE (0xFF)
+#define SEMA4_GATE_STATUS_FLAG(gate) ((uint16_t)(1U << ((gate) ^ 7)))
+
+/*!
+ * @brief Status flag
+ */
+enum _sema4_status_flag {
+ sema4StatusFlagGate0 = 1U << 7,
+ sema4StatusFlagGate1 = 1U << 6,
+ sema4StatusFlagGate2 = 1U << 5,
+ sema4StatusFlagGate3 = 1U << 4,
+ sema4StatusFlagGate4 = 1U << 3,
+ sema4StatusFlagGate5 = 1U << 2,
+ sema4StatusFlagGate6 = 1U << 1,
+ sema4StatusFlagGate7 = 1U << 0,
+ sema4StatusFlagGate8 = 1U << 15,
+ sema4StatusFlagGate9 = 1U << 14,
+ sema4StatusFlagGate10 = 1U << 13,
+ sema4StatusFlagGate11 = 1U << 12,
+ sema4StatusFlagGate12 = 1U << 11,
+ sema4StatusFlagGate13 = 1U << 10,
+ sema4StatusFlagGate14 = 1U << 9,
+ sema4StatusFlagGate15 = 1U << 8
+};
+
+/*!
+ * @brief SEMA4 reset finite state machine.
+ */
+enum _sema4_reset_state
+{
+ sema4ResetIdle = 0U, /*!< Idle, waiting for the first data pattern write. */
+ sema4ResetMid = 1U, /*!< Waiting for the second data pattern write. */
+ sema4ResetFinished = 2U, /*!< Reset completed. Software could not get this state. */
+};
+
+/*!
+ * @brief SEMA4 status return codes.
+ */
+typedef enum _sema4_status
+{
+ statusSema4Success = 0U, /*!< Success. */
+ statusSema4Busy = 1U /*!< SEMA4 gate has been locked by other processor. */
+} sema4_status_t;
+
+/*******************************************************************************
+ * API
+ ******************************************************************************/
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
+/*!
+ * @name SEMA4 State Control
+ * @{
+ */
+
+/*!
+ * @brief Lock SEMA4 gate for exclusive access between multicore
+ *
+ * @param base SEMA4 base address
+ * @param gateIndex SEMA4 gate index
+ * @retval statusSema4Success Lock the gate successfully.
+ * @retval statusSema4Busy SEMA4 gate has been locked by other processor.
+ */
+sema4_status_t SEMA4_TryLock(SEMA4_Type *base, uint32_t gateIndex);
+
+/*!
+ * @brief Lock SEMA4 gate for exclusive access between multicore, polling until success.
+ *
+ * @param base SEMA4 base address
+ * @param gateIndex SEMA4 gate index
+ */
+void SEMA4_Lock(SEMA4_Type *base, uint32_t gateIndex);
+
+/*!
+ * @brief Unlock SEMA4 gate
+ *
+ * @param base SEMA4 base pointer.
+ * @param gateIndex SEMA4 gate index
+ */
+void SEMA4_Unlock(SEMA4_Type *base, uint32_t gateIndex);
+
+/*!
+ * @brief Get processor number which locks the SEMA4 gate
+ *
+ * @param base SEMA4 base pointer.
+ * @param gateIndex SEMA4 gate index
+ * @return processor number which locks the SEMA4 gate, or SEMA4_PROCESSOR_NONE
+ * to indicate the gate is not locked.
+ */
+uint32_t SEMA4_GetLockProcessor(SEMA4_Type *base, uint32_t gateIndex);
+
+/*@}*/
+
+/*!
+ * @name SEMA4 Reset Control
+ * @{
+ */
+
+/*!
+ * @brief Reset SEMA4 gate to unlocked status
+ *
+ * @param base SEMA4 base pointer.
+ * @param gateIndex SEMA4 gate index
+ */
+void SEMA4_ResetGate(SEMA4_Type *base, uint32_t gateIndex);
+
+/*!
+ * @brief Reset all SEMA4 gates to unlocked status
+ *
+ * @param base SEMA4 base pointer.
+ */
+void SEMA4_ResetAllGates(SEMA4_Type *base);
+
+/*!
+ * @brief Get bus master number which performing the gate reset function.
+ *
+ * This function gets the bus master number which performing the gate reset
+ * function.
+ *
+ * @param base SEMA4 base pointer.
+ * @return Bus master number.
+ */
+static inline uint8_t SEMA4_GetGateResetBus(SEMA4_Type *base)
+{
+ return (uint8_t)(base->RSTGT & 7);
+}
+
+/*!
+ * @brief Get sema4 gate reset state.
+ *
+ * This function gets current state of the sema4 reset gate finite state machine.
+ *
+ * @param base SEMA4 base pointer.
+ * @return Current state, see _sema4_reset_state.
+ */
+static inline uint8_t SEMA4_GetGateResetState(SEMA4_Type *base)
+{
+ return (uint8_t)((base->RSTGT & 0x30) >> 4);
+}
+
+/*!
+ * @brief Reset SEMA4 IRQ notification
+ *
+ * @param base SEMA4 base pointer.
+ * @param gateIndex SEMA4 gate index
+ */
+void SEMA4_ResetNotification(SEMA4_Type *base, uint32_t gateIndex);
+
+/*!
+ * @brief Reset all IRQ notifications
+ *
+ * @param base SEMA4 base pointer.
+ */
+void SEMA4_ResetAllNotifications(SEMA4_Type *base);
+
+/*!
+ * @brief Get bus master number which performing the notification reset function.
+ *
+ * This function gets the bus master number which performing the notification reset
+ * function.
+ *
+ * @param base SEMA4 base pointer.
+ * @return Bus master number.
+ */
+static inline uint8_t SEMA4_GetNotificationResetBus(SEMA4_Type *base)
+{
+ return (uint8_t)(base->RSTNTF & 7);
+}
+
+/*!
+ * @brief Get sema4 notification reset state.
+ *
+ * This function gets current state of the sema4 reset notification finite state machine.
+ *
+ * @param base SEMA4 base pointer.
+ * @return Current state, see _sema4_reset_state.
+ */
+static inline uint8_t SEMA4_GetNotificationResetState(SEMA4_Type *base)
+{
+ return (uint8_t)((base->RSTNTF & 0x30) >> 4);
+}
+
+/*@}*/
+
+/*!
+ * @name SEMA4 Interupt and Status Control
+ * @{
+ */
+
+/*!
+ * @brief Get SEMA4 notification status.
+ *
+ * @param base SEMA4 base pointer.
+ * @param flags SEMA4 gate status mask (see _sema4_status_flag)
+ * @return SEMA4 notification status bits. If bit value is set, the corresponding
+ * gate's notification is available.
+ */
+static inline uint16_t SEMA4_GetStatusFlag(SEMA4_Type * base, uint16_t flags)
+{
+ return base->CPnNTF[SEMA4_PROCESSOR_SELF].NTF & flags;
+}
+
+/*!
+ * @brief Enable or disable SEMA4 IRQ notification.
+ *
+ * @param base SEMA4 base pointer.
+ * @param intMask SEMA4 gate status mask (see _sema4_status_flag)
+ * @param enable Interrupt enable (true: enable, false: disable), only those gates
+ * whose intMask is set will be affected.
+ */
+void SEMA4_SetIntCmd(SEMA4_Type * base, uint16_t intMask, bool enable);
+
+/*!
+ * @brief check whether SEMA4 IRQ notification enabled.
+ *
+ * @param base SEMA4 base pointer.
+ * @param flags SEMA4 gate status mask (see _sema4_status_flag)
+ * @return SEMA4 notification interrupt enable status bits. If bit value is set,
+ * the corresponding gate's notification is enabled
+ */
+static inline uint16_t SEMA4_GetIntEnabled(SEMA4_Type * base, uint16_t flags)
+{
+ return base->CPnINE[SEMA4_PROCESSOR_SELF].INE & flags;
+}
+
+/*@}*/
+
+
+#if defined(__cplusplus)
+}
+#endif
+
+/*! @}*/
+
+#endif /* __SEMA4_H__ */
+/*******************************************************************************
+ * EOF
+ ******************************************************************************/