建立工程,成功创建两个虚拟串口
This commit is contained in:
291
source/main/openamp.c
Normal file
291
source/main/openamp.c
Normal file
@@ -0,0 +1,291 @@
|
||||
/**
|
||||
******************************************************************************
|
||||
* @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****/
|
Reference in New Issue
Block a user