MXC-A36-Demo/MCU/components/drivers/peripheral/Src/driver_ipc.c

156 lines
4.8 KiB
C

/*
******************************************************************************
* @file driver_ipc.c
* @author FreqChip Firmware Team
* @version V1.0.0
* @date 2021
* @brief ipc module driver.
* This file provides firmware functions to manage the
* IPC peripheral
******************************************************************************
* @attention
*
* Copyright (c) 2021 FreqChip.
* All rights reserved.
******************************************************************************
*/
#include "fr30xx.h"
/************************************************************************************
* @fn ipc_IRQHandler
*
* @brief Handle IPC interrupt request.
*
* @param hipc: IPC handle.
*/
void ipc_IRQHandler(IPC_HandleTypeDef *hipc)
{
uint32_t status;
volatile uint32_t msg;
status = hipc->IPCx->IPC_ISR_STA.Word;
if (status & IPC_INT_STATUS_CH0_IN) {
msg = hipc->IPCx->IPC_MSG_IN0;
if (hipc->RxCallback) {
hipc->RxCallback(hipc, IPC_CH_0, msg);
}
hipc->IPCx->IPC_ISR_STA.Word = IPC_INT_STATUS_CH0_IN;
hipc->IPCx->IPC_MSG_CLR.CH0_IN = 1;
}
if (status & IPC_INT_STATUS_CH1_IN) {
msg = hipc->IPCx->IPC_MSG_IN1;
if (hipc->RxCallback) {
hipc->RxCallback(hipc, IPC_CH_1, msg);
}
hipc->IPCx->IPC_ISR_STA.Word = IPC_INT_STATUS_CH1_IN;
hipc->IPCx->IPC_MSG_CLR.CH1_IN = 1;
}
if (status & IPC_INT_STATUS_CH2_IN) {
msg = hipc->IPCx->IPC_MSG_IN2;
if (hipc->RxCallback) {
hipc->RxCallback(hipc, IPC_CH_2, msg);
}
hipc->IPCx->IPC_ISR_STA.Word = IPC_INT_STATUS_CH2_IN;
hipc->IPCx->IPC_MSG_CLR.CH2_IN = 1;
}
if (status & IPC_INT_STATUS_CH3_IN) {
msg = hipc->IPCx->IPC_MSG_IN3;
if (hipc->RxCallback) {
hipc->RxCallback(hipc, IPC_CH_3, msg);
}
hipc->IPCx->IPC_ISR_STA.Word = IPC_INT_STATUS_CH3_IN;
hipc->IPCx->IPC_MSG_CLR.CH3_IN = 1;
}
status = hipc->IPCx->IPC_ISR_STA.Word;
if ((status & IPC_INT_STATUS_CH0_OUT)) {
hipc->IPCx->IPC_ISR_STA.Word = IPC_INT_STATUS_CH0_OUT;
if (hipc->TxCallback) {
hipc->TxCallback(hipc, IPC_CH_0);
}
}
if ((status & IPC_INT_STATUS_CH1_OUT)) {
hipc->IPCx->IPC_ISR_STA.Word = IPC_INT_STATUS_CH1_OUT;
if (hipc->TxCallback) {
hipc->TxCallback(hipc, IPC_CH_1);
}
}
if ((status & IPC_INT_STATUS_CH2_OUT)) {
hipc->IPCx->IPC_ISR_STA.Word = IPC_INT_STATUS_CH2_OUT;
if (hipc->TxCallback) {
hipc->TxCallback(hipc, IPC_CH_2);
}
}
if ((status & IPC_INT_STATUS_CH3_OUT)) {
hipc->IPCx->IPC_ISR_STA.Word = IPC_INT_STATUS_CH3_OUT;
if (hipc->TxCallback) {
hipc->TxCallback(hipc, IPC_CH_3);
}
}
}
void ipc_init(IPC_HandleTypeDef *hipc)
{
if (hipc->RxEnableChannels & IPC_CH_0) {
hipc->IPCx->IPC_CTRL.Bits.CH0_IN_EN = 1;
hipc->IPCx->IPC_ISR_EN.Bits.CH0_IN = 1;
}
if (hipc->RxEnableChannels & IPC_CH_1) {
hipc->IPCx->IPC_CTRL.Bits.CH1_IN_EN = 1;
hipc->IPCx->IPC_ISR_EN.Bits.CH1_IN = 1;
}
if (hipc->RxEnableChannels & IPC_CH_2) {
hipc->IPCx->IPC_CTRL.Bits.CH2_IN_EN = 1;
hipc->IPCx->IPC_ISR_EN.Bits.CH2_IN = 1;
}
if (hipc->RxEnableChannels & IPC_CH_3) {
hipc->IPCx->IPC_CTRL.Bits.CH3_IN_EN = 1;
hipc->IPCx->IPC_ISR_EN.Bits.CH3_IN = 1;
}
if (hipc->TxEnableChannels & IPC_CH_0) {
hipc->IPCx->IPC_CTRL.Bits.CH0_OUT_EN = 1;
hipc->IPCx->IPC_ISR_EN.Bits.CH0_OUT = 1;
}
if (hipc->TxEnableChannels & IPC_CH_1) {
hipc->IPCx->IPC_CTRL.Bits.CH1_OUT_EN = 1;
hipc->IPCx->IPC_ISR_EN.Bits.CH1_OUT = 1;
}
if (hipc->TxEnableChannels & IPC_CH_2) {
hipc->IPCx->IPC_CTRL.Bits.CH2_OUT_EN = 1;
hipc->IPCx->IPC_ISR_EN.Bits.CH2_OUT = 1;
}
if (hipc->TxEnableChannels & IPC_CH_3) {
hipc->IPCx->IPC_CTRL.Bits.CH3_OUT_EN = 1;
hipc->IPCx->IPC_ISR_EN.Bits.CH3_OUT = 1;
}
hipc->TxOngoingChannels = 0;
}
void ipc_msg_send(IPC_HandleTypeDef *hipc, enum_IPC_Chl_Sel_t ch, uint32_t msg)
{
switch (ch) {
case IPC_CH_0:
while (hipc->IPCx->IPC_PENDING.Bits.CH0_OUT);
hipc->IPCx->IPC_MSG_OUT0 = msg;
break;
case IPC_CH_1:
while (hipc->IPCx->IPC_PENDING.Bits.CH1_OUT);
hipc->IPCx->IPC_MSG_OUT1 = msg;
break;
case IPC_CH_2:
while (hipc->IPCx->IPC_PENDING.Bits.CH2_OUT);
hipc->IPCx->IPC_MSG_OUT2 = msg;
break;
case IPC_CH_3:
while (hipc->IPCx->IPC_PENDING.Bits.CH3_OUT);
hipc->IPCx->IPC_MSG_OUT3 = msg;
break;
default:
return;
}
hipc->TxOngoingChannels |= ch;
}