eRPC API Reference  Rev. 1.11.0
NXP Semiconductors
erpc_mu_transport.hpp
Go to the documentation of this file.
1 /*
2  * Copyright 2017-2023 NXP
3  * All rights reserved.
4  *
5  *
6  * SPDX-License-Identifier: BSD-3-Clause
7  */
8 
9 #ifndef _EMBEDDED_RPC__MU_TRANSPORT_H_
10 #define _EMBEDDED_RPC__MU_TRANSPORT_H_
11 
12 #include "erpc_config_internal.h"
13 #if !ERPC_THREADS_IS(NONE)
14 #include "erpc_threading.h"
15 #endif
16 #include "erpc_message_buffer.hpp"
17 #include "erpc_transport.hpp"
18 
19 extern "C" {
20 #include "fsl_device_registers.h"
21 #include "fsl_mu.h"
22 }
23 
30 // Definitions
33 #if ERPC_TRANSPORT_MU_USE_MCMGR
34 
36 #define MU_REG_COUNT (MU_RR_COUNT - 1U)
37 #define MU_LAST_REG_IDX 2
38 
39 #define MU_RX_Interrupt_Handler(x) MU_RX_Interrupt(x)
40 #define MU_RX_Interrupt(number) MU_Rx##number##FullFlagISR
41 #define MU_RxFullFlagISRCallback MU_RX_Interrupt_Handler(MU_LAST_REG_IDX)
42 
43 #define MU_TX_Interrupt_Handler(x) MU_TX_Interrupt(x)
44 #define MU_TX_Interrupt(number) MU_Tx##number##EmptyFlagISR
45 #define MU_TxEmptyFlagISRCallback MU_TX_Interrupt_Handler(MU_LAST_REG_IDX)
46 
47 #else
48 #define MU_REG_COUNT (MU_RR_COUNT)
49 #endif /* ERPC_TRANSPORT_MU_USE_MCMGR */
50 
51 #if (defined(MIMXRT1187_cm7_SERIES) || defined(MIMXRT1187_cm33_SERIES) || defined(MIMXRT1189_cm7_SERIES) || defined(MIMXRT1189_cm33_SERIES))
52 #define MU_TX_SHIFT (1UL << (MU_REG_COUNT - 1U))
53 #define MU_RX_SHIFT (1UL << (MU_REG_COUNT - 1U))
54 #define MU_RX_INTR_MASK (MU_RX_INTR(MU_RX_SHIFT))
55 #define MU_TX_INTR_MASK (MU_TX_INTR(MU_TX_SHIFT))
56 #define MU_IS_TX_EMPTY_FLAG_SET (0U != (transport->m_muBase->TCR & MU_TX_SHIFT))
57 #define MU_IS_RX_FULL_FLAG_SET (0U != (transport->m_muBase->RCR & MU_RX_SHIFT))
58 #define MU_SR_TX_MASK (1UL << (20U + (MU_REG_COUNT - 1U)))
59 #define MU_SR_RX_MASK (1UL << (24U + (MU_REG_COUNT - 1U)))
60 #else
61 #define MU_TX_SHIFT (1UL << (MU_CR_TIEn_SHIFT + MU_TR_COUNT - MU_REG_COUNT))
62 #define MU_RX_SHIFT (1UL << (MU_CR_RIEn_SHIFT + MU_RR_COUNT - MU_REG_COUNT))
63 #define MU_RX_INTR_MASK (MU_RX_SHIFT)
64 #define MU_TX_INTR_MASK (MU_TX_SHIFT)
65 #define MU_IS_TX_EMPTY_FLAG_SET (0U != (transport->m_muBase->CR & MU_TX_SHIFT))
66 #define MU_IS_RX_FULL_FLAG_SET (0U != (transport->m_muBase->CR & MU_RX_SHIFT))
67 #define MU_SR_TX_MASK (1UL << (MU_SR_TEn_SHIFT + MU_TR_COUNT - MU_REG_COUNT))
68 #define MU_SR_RX_MASK (1UL << (MU_SR_RFn_SHIFT + MU_RR_COUNT - MU_REG_COUNT))
69 #endif
70 // Classes
73 
74 namespace erpc {
93 class MUTransport : public Transport
94 {
95 public:
101  MUTransport(void);
102 
106  virtual ~MUTransport(void);
107 
118  virtual erpc_status_t init(MU_Type *muBase);
119 
129  virtual erpc_status_t receive(MessageBuffer *message);
130 
139  virtual erpc_status_t send(MessageBuffer *message);
140 
148  virtual bool hasMessage(void) { return m_newMessage; }
149 
150 #if ERPC_TRANSPORT_MU_USE_MCMGR
151 
159  static void mu_tx_empty_irq_callback(void);
167  static void mu_rx_full_irq_callback(void);
168 #else
169 
176  static void mu_irq_callback(void);
177 #endif /* ERPC_TRANSPORT_MU_USE_MCMGR */
178 
179 protected:
189  void rx_cb(void);
190 
197  void tx_cb(void);
198 
199  volatile bool m_newMessage;
201  volatile uint32_t m_rxMsgSize;
203  uint32_t m_rxCntBytes;
204  uint32_t *volatile m_rxBuffer;
205  volatile uint32_t m_txMsgSize;
207  uint32_t m_txCntBytes;
208  uint32_t *volatile m_txBuffer;
210 #if !ERPC_THREADS_IS(NONE)
216 #endif
217 
218  MU_Type *m_muBase;
219 };
220 
221 } // namespace erpc
222 
225 #endif // _EMBEDDED_RPC__MU_TRANSPORT_H_
Abstract interface for transport layer.
Definition: erpc_transport.hpp:36
volatile uint32_t m_rxMsgSize
Definition: erpc_mu_transport.hpp:201
virtual erpc_status_t receive(MessageBuffer *message)
Start receiving data and stores it to passed message buffer.
Definition: erpc_mu_transport.cpp:197
virtual ~MUTransport(void)
Destructor of MU transport.
Definition: erpc_mu_transport.cpp:99
MUTransport(void)
Constructor of MU transport.
Definition: erpc_mu_transport.cpp:79
enum _erpc_status erpc_status_t
Type used for all status and error return values.
Definition: erpc_common.h:85
Semaphore m_txSemaphore
Definition: erpc_mu_transport.hpp:212
virtual bool hasMessage(void)
Function to check if is new message to receive.
Definition: erpc_mu_transport.hpp:148
MU_Type * m_muBase
Definition: erpc_mu_transport.hpp:218
Semaphore m_rxSemaphore
Definition: erpc_mu_transport.hpp:211
Mutex m_sendLock
Definition: erpc_mu_transport.hpp:214
virtual erpc_status_t init(MU_Type *muBase)
Initialization of MU transport layer.
Definition: erpc_mu_transport.cpp:101
Represents a memory buffer containing a message.
Definition: erpc_message_buffer.hpp:37
uint32_t m_rxCntBytes
Definition: erpc_mu_transport.hpp:203
Definition: erpc_arbitrated_client_manager.hpp:25
uint32_t *volatile m_txBuffer
Definition: erpc_mu_transport.hpp:208
virtual erpc_status_t send(MessageBuffer *message)
Function to send prepared message.
Definition: erpc_mu_transport.cpp:235
Transport that uses Messaging Unit (MU) for interprocessor messaging.
Definition: erpc_mu_transport.hpp:93
uint32_t *volatile m_rxBuffer
Definition: erpc_mu_transport.hpp:204
void tx_cb(void)
Function called from MU IRQ when the MU TX empty flag is asserted and the IRQ is enabled.
Definition: erpc_mu_transport.cpp:165
volatile uint32_t m_txMsgSize
Definition: erpc_mu_transport.hpp:205
Mutex m_receiveLock
Definition: erpc_mu_transport.hpp:215
volatile bool m_newMessage
Definition: erpc_mu_transport.hpp:199
uint32_t m_txCntBytes
Definition: erpc_mu_transport.hpp:207
static void mu_irq_callback(void)
Callback function called from MU IRQ.
Definition: erpc_mu_transport.cpp:58
Mutex.
Definition: erpc_threading.h:338
Simple semaphore class.
Definition: erpc_threading.h:445
void rx_cb(void)
Function called from MU IRQ when the MU RX full flag is asserted and the IRQ is enabled.
Definition: erpc_mu_transport.cpp:119