/**
******************************************************************************
* File Name : mbox_hsem.c
* Description : This file provides code for the configuration
* of the mailbox based on hardware semaphore.
******************************************************************************
* @attention
*
*
© Copyright (c) 2019 STMicroelectronics.
* All rights reserved.
*
* This software component is licensed by ST under BSD 3-Clause license,
* the "License"; You may not use this file except in compliance with the
* License. You may obtain a copy of the License at:
* opensource.org/licenses/BSD-3-Clause
*
******************************************************************************
*/
/* Includes ------------------------------------------------------------------*/
#include "openamp/open_amp.h"
#include "stm32h7xx_hal.h"
#include "openamp_conf.h"
#include "mbox_hsem.h"
/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN Define */
/* USER CODE END Define */
#define RX_NO_MSG 0
#define RX_NEW_MSG 1
/* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN PV */
/* USER CODE END PV */
static uint32_t msg_received = RX_NO_MSG;
/* Private functions ---------------------------------------------------------*/
/* USER CODE BEGIN PFP */
/* USER CODE END PFP */
void HAL_HSEM_FreeCallback(uint32_t SemMask)
{
/* USER CODE BEGIN HSEM_FREE_CALLBACK */
/* USER CODE END HSEM_FREE_CALLBACK */
/* Prevent unused argument(s) compilation warning */
UNUSED(SemMask);
msg_received = RX_NEW_MSG;
#ifdef CORE_CM7
/* USER CODE BEGIN PRE_HSEM_FREE_CALLBACK_CM7 */
/* USER CODE END PRE_HSEM_FREE_CALLBACK_CM7 */
HAL_HSEM_ActivateNotification(__HAL_HSEM_SEMID_TO_MASK(HSEM_ID_1));
/* USER CODE BEGIN POST_HSEM_FREE_CALLBACK_CM7 */
/* USER CODE END POST_HSEM_FREE_CALLBACK_CM7 */
#endif
#ifdef CORE_CM4
/* USER CODE BEGIN PRE_HSEM_FREE_CALLBACK_CM4 */
/* USER CODE END PRE_HSEM_FREE_CALLBACK_CM4 */
HAL_HSEM_ActivateNotification(__HAL_HSEM_SEMID_TO_MASK(HSEM_ID_0));
/* USER CODE BEGIN POST_HSEM_FREE_CALLBACK_CM4 */
/* USER CODE END POST_HSEM_FREE_CALLBACK_CM4 */
#endif
}
/**
* @brief Initialize MAILBOX with IPCC peripheral
* @param None
* @retval : Operation result
*/
int MAILBOX_Init(void)
{
/* USER CODE BEGIN MAILBOX_INIT */
/* USER CODE END MAILBOX_INIT */
__HAL_RCC_HSEM_CLK_ENABLE();
#ifdef CORE_CM7
/* USER CODE BEGIN PRE_MAILBOX_INIT_CM7 */
/* USER CODE END PRE_MAILBOX_INIT_CM7 */
/* Enable CM7 receive irq */
HAL_NVIC_SetPriority(HSEM1_IRQn, 0, 1);
HAL_NVIC_EnableIRQ(HSEM1_IRQn);
HAL_HSEM_ActivateNotification(__HAL_HSEM_SEMID_TO_MASK(HSEM_ID_1));
/* USER CODE BEGIN POST_MAILBOX_INIT_CM7 */
/* USER CODE END POST_MAILBOX_INIT_CM7 */
#endif
#ifdef CORE_CM4
/* USER CODE BEGIN MAILBOX_INIT_CM4 */
/* USER CODE END MAILBOX_INIT_CM4 */
/* Enable CM4 receive irq */
HAL_NVIC_SetPriority(HSEM2_IRQn, 0, 1);
HAL_NVIC_EnableIRQ(HSEM2_IRQn);
HAL_HSEM_ActivateNotification(__HAL_HSEM_SEMID_TO_MASK(HSEM_ID_0));
/* USER CODE BEGIN POST_MAILBOX_INIT_CM4 */
/* USER CODE END POST_MAILBOX_INIT_CM4 */
#endif
return 0;
}
/**
* @brief Initialize MAILBOX with IPCC peripheral
* @param virtio device
* @retval : Operation result
*/
int MAILBOX_Poll(struct virtio_device *vdev)
{
/* If we got an interrupt, ask for the corresponding virtqueue processing */
if (msg_received == RX_NEW_MSG)
{
/* USER CODE BEGIN NEW_MSG */
/* USER CODE END NEW_MSG */
#ifdef CORE_CM7
/* USER CODE BEGIN PRE_NEW_MSG_CM7 */
/* USER CODE END PRE_NEW_MSG_CM7 */
rproc_virtio_notified(vdev, VRING0_ID);
/* USER CODE BEGIN POST_NEW_MSG_CM7 */
/* USER CODE END POST_NEW_MSG_CM7 */
#endif
#ifdef CORE_CM4
/* USER CODE BEGIN PRE_NEW_MSG_CM4 */
/* USER CODE END PRE_NEW_MSG_CM4 */
rproc_virtio_notified(vdev, VRING1_ID);
/* USER CODE BEGIN POST_NEW_MSG_CM4 */
/* USER CODE END POST_NEW_MSG_CM4 */
#endif
msg_received = RX_NO_MSG;
return 0;
}
/* USER CODE BEGIN NO_MSG */
/* USER CODE END NO_MSG */
return -EAGAIN;
}
/**
* @brief Callback function called by OpenAMP MW to notify message processing
* @param VRING id
* @retval Operation result
*/
int MAILBOX_Notify(void *priv, uint32_t id)
{
(void)priv;
(void)id;
/* USER CODE BEGIN MAILBOX_NOTIFY*/
/* USER CODE END MAILBOX_NOTIFY */
#ifdef CORE_CM7
/* USER CODE BEGIN PRE_MAILBOX_NOTIFY_CM7 */
/* USER CODE END PRE_MAILBOX_NOTIFY_CM7 */
HAL_HSEM_FastTake(HSEM_ID_0);
HAL_HSEM_Release(HSEM_ID_0,0);
/* USER CODE BEGIN POST_MAILBOX_NOTIFY_CM7 */
/* USER CODE END POST_MAILBOX_NOTIFY_CM7 */
#endif
#ifdef CORE_CM4
/* USER CODE BEGIN PRE_MAILBOX_NOTIFY_CM4 */
/* USER CODE END PRE_MAILBOX_NOTIFY_CM4 */
HAL_HSEM_FastTake(HSEM_ID_1);
HAL_HSEM_Release(HSEM_ID_1,0);
/* USER CODE BEGIN POST_MAILBOX_NOTIFY_CM4 */
/* USER CODE END POST_MAILBOX_NOTIFY_CM4 */
#endif
return 0;
}
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/