292 lines
		
	
	
		
			6.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			292 lines
		
	
	
		
			6.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /**
 | |
|   ******************************************************************************
 | |
|   * @file   openamp.c
 | |
|   * @author  MCD Application Team
 | |
|   * @brief  Code for openamp applications
 | |
|   ******************************************************************************
 | |
|   * @attention
 | |
|   *
 | |
|   * <h2><center>© Copyright (c) 2019 STMicroelectronics. 
 | |
|   * All rights reserved.</center></h2>
 | |
|   *
 | |
|   * 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
 | |
|   *
 | |
|   ******************************************************************************
 | |
|   */
 | |
| 
 | |
| #include "openamp.h"
 | |
| #include "rsc_table.h"
 | |
| #include "metal/sys.h"
 | |
| #include "metal/device.h"
 | |
| 
 | |
| /* Private includes ----------------------------------------------------------*/
 | |
| /* USER CODE BEGIN Includes */
 | |
| 
 | |
| /* USER CODE END Includes */
 | |
| 
 | |
| 
 | |
| /* Private define ------------------------------------------------------------*/
 | |
| /* USER CODE BEGIN Define */
 | |
| 
 | |
| /* USER CODE END Define */
 | |
| 
 | |
| #define SHM_DEVICE_NAME         "STM32_SHM"
 | |
| 
 | |
| /* Private macro -------------------------------------------------------------*/
 | |
| /* USER CODE BEGIN PM */
 | |
| 
 | |
| /* USER CODE END PM */
 | |
| 
 | |
| 
 | |
| /* Private variables ---------------------------------------------------------*/
 | |
| /* USER CODE BEGIN PV */
 | |
| 
 | |
| /* USER CODE END PV */
 | |
| 
 | |
| static struct metal_io_region *shm_io;
 | |
| static struct metal_io_region *rsc_io;
 | |
| static struct shared_resource_table *rsc_table;
 | |
| static struct rpmsg_virtio_shm_pool shpool;
 | |
| static struct rpmsg_virtio_device rvdev;
 | |
| 
 | |
| 
 | |
| static metal_phys_addr_t shm_physmap;
 | |
| 
 | |
| struct metal_device shm_device = {
 | |
|   .name = SHM_DEVICE_NAME,
 | |
|   .num_regions = 2,
 | |
|   .regions = {
 | |
|       {.virt = NULL}, /* shared memory */
 | |
|       {.virt = NULL}, /* rsc_table memory */
 | |
|   },
 | |
|   .node = { NULL },
 | |
|   .irq_num = 0,
 | |
|   .irq_info = NULL
 | |
| };
 | |
| 
 | |
| /* Private functions ---------------------------------------------------------*/
 | |
| /* USER CODE BEGIN PFP */
 | |
| 
 | |
| /* USER CODE END PFP */
 | |
| 
 | |
| static int OPENAMP_shmem_init(int RPMsgRole)
 | |
| {
 | |
|   int status = 0;
 | |
|   struct metal_device *device = NULL;
 | |
|   struct metal_init_params metal_params = METAL_INIT_DEFAULTS;
 | |
|   void* rsc_tab_addr = NULL;
 | |
|   int rsc_size = 0;
 | |
| 
 | |
| 
 | |
|   /* USER CODE BEGIN PRE_LIB_METAL_INIT */
 | |
| 
 | |
|   /* USER CODE END  PRE_LIB_METAL_INIT */
 | |
|   metal_init(&metal_params);
 | |
| 
 | |
|   status = metal_register_generic_device(&shm_device);
 | |
|   if (status != 0) {
 | |
|     return status;
 | |
|   }
 | |
| 
 | |
|   status = metal_device_open("generic", SHM_DEVICE_NAME, &device);
 | |
|   if (status != 0) {
 | |
|     return status;
 | |
|   }
 | |
| 
 | |
|   shm_physmap = SHM_START_ADDRESS;
 | |
|   metal_io_init(&device->regions[0], (void *)SHM_START_ADDRESS, &shm_physmap,
 | |
|                 SHM_SIZE, -1, 0, NULL);
 | |
| 
 | |
|   /* USER CODE BEGIN PRE_SHM_IO_INIT */
 | |
| 
 | |
|   /* USER CODE END PRE_SHM_IO_INIT */
 | |
|   shm_io = metal_device_io_region(device, 0);
 | |
|   if (shm_io == NULL) {
 | |
|     return -1;
 | |
|   }
 | |
| 
 | |
|   /* USER CODE BEGIN POST_SHM_IO_INIT */
 | |
| 
 | |
|   /* USER CODE END POST_SHM_IO_INIT */
 | |
| 
 | |
|   /* Initialize resources table variables */
 | |
|   resource_table_init(RPMsgRole, &rsc_tab_addr, &rsc_size);
 | |
|   rsc_table = (struct shared_resource_table *)rsc_tab_addr;
 | |
|   if (!rsc_table)
 | |
|   {
 | |
|     return -1;
 | |
|   }
 | |
| 
 | |
|   /* USER CODE BEGIN POST_RSC_TABLE_INIT */
 | |
| 
 | |
|   /* USER CODE END  POST_RSC_TABLE_INIT */
 | |
| 
 | |
|   metal_io_init(&device->regions[1], rsc_table,
 | |
|                (metal_phys_addr_t *)rsc_table, rsc_size, -1U, 0, NULL);
 | |
| 
 | |
|   /* USER CODE BEGIN POST_METAL_IO_INIT */
 | |
| 
 | |
|   /* USER CODE END  POST_METAL_IO_INIT */
 | |
|   rsc_io = metal_device_io_region(device, 1);
 | |
|   if (rsc_io == NULL) {
 | |
|     return -1;
 | |
|   }
 | |
| 
 | |
|   /* USER CODE BEGIN POST_RSC_IO_INIT */
 | |
| 
 | |
|   /* USER CODE END  POST_RSC_IO_INIT */
 | |
|   return 0;
 | |
| }
 | |
| 
 | |
| int MX_OPENAMP_Init(int RPMsgRole, rpmsg_ns_bind_cb ns_bind_cb)
 | |
| {
 | |
|   struct fw_rsc_vdev_vring *vring_rsc = NULL;
 | |
|   struct virtio_device *vdev = NULL;
 | |
|   int status = 0;
 | |
| 
 | |
| 
 | |
|   /* USER CODE BEGIN MAILBOX_Init */
 | |
| 
 | |
|   /* USER CODE END MAIL_BOX_Init */
 | |
| 
 | |
|   MAILBOX_Init();
 | |
| 
 | |
|   /* Libmetal Initilalization */
 | |
|   status = OPENAMP_shmem_init(RPMsgRole);
 | |
|   if(status)
 | |
|   {
 | |
|     return status;
 | |
|   }
 | |
| 
 | |
|   /* USER CODE BEGIN  PRE_VIRTIO_INIT */
 | |
| 
 | |
|   /* USER CODE END PRE_VIRTIO_INIT */
 | |
|   vdev = rproc_virtio_create_vdev(RPMsgRole, VDEV_ID, &rsc_table->vdev,
 | |
|                                   rsc_io, NULL, MAILBOX_Notify, NULL);
 | |
|   if (vdev == NULL)
 | |
|   {
 | |
|     return -1;
 | |
|   }
 | |
| 
 | |
| 
 | |
|   rproc_virtio_wait_remote_ready(vdev);
 | |
| 
 | |
|   /* USER CODE BEGIN  POST_VIRTIO_INIT */
 | |
| 
 | |
|   /* USER CODE END POST_VIRTIO_INIT */
 | |
|   vring_rsc = &rsc_table->vring0;
 | |
|   status = rproc_virtio_init_vring(vdev, 0, vring_rsc->notifyid,
 | |
|                                    (void *)vring_rsc->da, shm_io,
 | |
|                                    vring_rsc->num, vring_rsc->align);
 | |
|   if (status != 0)
 | |
|   {
 | |
|     return status;
 | |
|   }
 | |
| 
 | |
| 
 | |
|   /* USER CODE BEGIN  POST_VRING0_INIT */
 | |
| 
 | |
|   /* USER CODE END POST_VRING0_INIT */
 | |
|   vring_rsc = &rsc_table->vring1;
 | |
|   status = rproc_virtio_init_vring(vdev, 1, vring_rsc->notifyid,
 | |
|                                    (void *)vring_rsc->da, shm_io,
 | |
|                                    vring_rsc->num, vring_rsc->align);
 | |
|   if (status != 0)
 | |
|   {
 | |
|     return status;
 | |
|   }
 | |
| 
 | |
|   /* USER CODE BEGIN  POST_VRING1_INIT */
 | |
| 
 | |
|   /* USER CODE END POST_VRING1_INIT */
 | |
| 
 | |
|   rpmsg_virtio_init_shm_pool(&shpool, (void *)VRING_BUFF_ADDRESS,
 | |
|                              (size_t)SHM_SIZE);
 | |
|   rpmsg_init_vdev(&rvdev, vdev, ns_bind_cb, shm_io, &shpool);
 | |
| 
 | |
|   /* USER CODE BEGIN POST_RPMSG_INIT */
 | |
| 
 | |
|   /* USER CODE END POST_RPMSG_INIT */
 | |
| 
 | |
|   return 0;
 | |
| }
 | |
| 
 | |
| void OPENAMP_DeInit()
 | |
| {
 | |
| 
 | |
|   /* USER CODE BEGIN PRE_OPENAMP_DEINIT */
 | |
| 
 | |
|   /* USER CODE END PRE_OPENAMP_DEINIT */
 | |
| 
 | |
|   rpmsg_deinit_vdev(&rvdev);
 | |
| 
 | |
|   metal_finish();
 | |
| 
 | |
|   /* USER CODE BEGIN POST_OPENAMP_DEINIT */
 | |
| 
 | |
|   /* USER CODE END POST_OPENAMP_DEINIT */
 | |
| }
 | |
| 
 | |
| void OPENAMP_init_ept(struct rpmsg_endpoint *ept)
 | |
| {
 | |
|   /* USER CODE BEGIN PRE_EP_INIT */
 | |
| 
 | |
|   /* USER CODE END PRE_EP_INIT */
 | |
| 
 | |
|   rpmsg_init_ept(ept, "", RPMSG_ADDR_ANY, RPMSG_ADDR_ANY, NULL, NULL);
 | |
| 
 | |
|   /* USER CODE BEGIN POST_EP_INIT */
 | |
| 
 | |
|   /* USER CODE END POST_EP_INIT */
 | |
| }
 | |
| 
 | |
| int OPENAMP_create_endpoint(struct rpmsg_endpoint *ept, const char *name,
 | |
|                             uint32_t dest, rpmsg_ept_cb cb,
 | |
|                             rpmsg_ns_unbind_cb unbind_cb)
 | |
| {
 | |
|   int ret = 0;
 | |
|   /* USER CODE BEGIN PRE_EP_CREATE */
 | |
| 
 | |
|   /* USER CODE END PRE_EP_CREATE */
 | |
| 
 | |
|   ret = rpmsg_create_ept(ept, &rvdev.rdev, name, RPMSG_ADDR_ANY, dest, cb,
 | |
| 		          unbind_cb);
 | |
| 
 | |
|   /* USER CODE BEGIN POST_EP_CREATE */
 | |
| 
 | |
|   /* USER CODE END POST_EP_CREATE */
 | |
|   return ret;
 | |
| }
 | |
| 
 | |
| void OPENAMP_check_for_message(void)
 | |
| {
 | |
|   /* USER CODE BEGIN MSG_CHECK */
 | |
| 
 | |
|   /* USER CODE END MSG_CHECK */
 | |
|   MAILBOX_Poll(rvdev.vdev);
 | |
| }
 | |
| 
 | |
| void OPENAMP_Wait_EndPointready(struct rpmsg_endpoint *rp_ept)
 | |
| {
 | |
|   /* USER CODE BEGIN EP_READY */
 | |
| 
 | |
|   /* USER CODE END EP_READY */
 | |
| 
 | |
|   while(!is_rpmsg_ept_ready(rp_ept))
 | |
|   {
 | |
|     /* USER CODE BEGIN 0 */
 | |
| 
 | |
|     /* USER CODE END 0 */
 | |
|       MAILBOX_Poll(rvdev.vdev);
 | |
| 
 | |
|     /* USER CODE BEGIN 1 */
 | |
| 
 | |
|     /* USER CODE END 1 */
 | |
|   }
 | |
| }
 | |
| 
 | |
| /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
 | 
