int rpmsg_send(struct rpmsgg_endpoint *ept, const void *data, int len);
向远程处理器发送消息。基于ept发送长度为len的消息data。消息将使用ept的源地址和目标地址发送到信道所属的远程处理器。 如果没有可用的TX缓冲区,该功能将被阻止,直到一个缓冲区可用或超时15秒。
错误码说明:
static inline int rpmsg_sendto(struct rpmsg_endpoint *ept, const void *data, int len, uint32_t dst);
向远程处理器发送消息到指定目的地dst。将长度为len的data发送到远程dst地址。消息将使用ept的源地址发送到ept通道 所属的远程处理器。如果没有可用的TX缓冲区,该功能将被阻止,直到一个缓冲区可用或超时15秒。
错误码说明:
static inline int rpmsg_send_offchannel_raw(struct rpmsg_endpoint *ept, uint32_t src, uint32_t dst
, const void *data, int len);
向远程处理器发送消息,指定源地址和目标地址。将长度为len的消息data从源@src地址发送到远程@dst地址, 消息将发送到通道所属的远程处理器。消息将发送到通道所属的远程处理器。
错误码说明:
static inline int rpmsg_trysend(struct rpmsg_endpoint *ept, const void *data, int len);
在@ept通道上发送长度为len的消息data。消息将使用ept的源地址和目标地址发送到ept通道所属的远程处理器。 如果没有可用的TX缓冲区,该函数将立即返回错误码,而无需等待一个可用的缓冲区
错误码说明:
static inline int rpmsg_trysendto(struct rpmsg_endpoint *ept, const void *data, int len, uint32_t dst);
将长度为len的data发送到远程@dst地址。消息将使用ept的源地址发送到ept通道所属的远程处理器。如果没有可用的 TX缓冲区,函数将立即返回错误码-ENOMM,而无需等待一个可用缓冲器。
错误码说明:
static inline unsigned int is_rpmsg_ept_ready(struct rpmsg_endpoint *ept);
检查本地RPMsg 终端是否已经与远程的终端绑定,以及是够已经准备好可以发送信息
int rpmsg_create_ept(struct rpmsg_endpoint *ept, struct rpmsg_device *rdev, const char *name,
uint32_t src, uint32_t dest, rpmsg_ept_cb cb, rpmsg_ns_unbind_cb ns_unbind_cb);
创建rpmsg端点并将其注册到rpmsg设备,创建rpmsg端点,使用名称、源地址、远程进程地址、端点回调和销毁端点 回调对其进行初始化,然后将其注册至rpmsg设备。本质上,rpmsg端点表示rpmsg总线上的侦听器,因为它将rpmsg地 址与rx回调处理程序绑定。Rpmsg客户端应该创建一个端点与远程关联。rpmsg客户端至少提供一个通道名称、消息通 知的回调,默认情况下,端点源地址应设置为rpmsg_ADDR_ANY。一些rpmsg客户端可以指定具有特定源地址的端点
错误码说明:
RPMSG_ERR_ADDR,ept、rdev、cb是空指针。
RPMSG_ERR_PARAM,rdev地址越界或不可用。
void rpmsg_destroy_ept(struct rpmsg_endpoint *ept);
销毁rpmsg端点并从rpmsg设备注销
void rpmsg_virtio_init_shm_pool(struct rpmsg_virtio_shm_pool *shpool, void *shbuf, size_t size);
初始化默认共享缓冲池,RPMsg-virtio具有默认的共享缓冲池实现。分配给该池的内存将专用于RPMsg-virtio。 在调用rpmsg_init_vdev以初始化rpmsg_virtio_shm_pool结构之前,必须调用此函数。
int rpmsg_init_vdev(struct rpmsg_virtio_device *rvdev,struct virtio_device *vdev,
rpmsg_ns_bind_cb ns_bind_cb,struct metal_io_region *shm_io,
struct rpmsg_virtio_shm_pool *shpool);
初始化rpmsg virtio设备。 主机侧: 初始化RPMsg-virtio队列和共享缓冲区,shm的地址可以是ANY。在这种情况下,函数将从系统共享内存池中 获取共享内存。如果vdev具有RPMsg名称服务功能,则此API将创建名称服务端点。 远程侧: 在主机端设置驱动程序就绪之前,此API不会返回。
错误码说明:
RPMSG_ERR_NO_BUFF,共享内存池内存分配失败。
RPMSG_ERR_PARAM,rvdev、vdev、shm_io是空指针。
void rpmsg_deinit_vdev(struct rpmsg_virtio_device *rvdev);
取消对rpmsg virtio设备的初始化。
static inline struct rpmsg_device *rpmsg_virtio_get_rpmsg_device(struct rpmsg_virtio_device *rvdev);
从RPMsg-virtio设备获取RPMsg设备
struct remoteproc *remoteproc_init(struct remoteproc *rproc, struct remoteproc_ops *ops, void *priv));
创建和初始化remoteproc实例
int remoteproc_remove(struct remoteproc *rproc);
删除remoteproc实例
int remoteproc_config(struct remoteproc *rproc, void *data);
初始化remoteproc资源并加载和执行镜像
int remoteproc_start(struct remoteproc *rproc);
从内存中已经存在的镜像入口启动远程处理器
int remoteproc_stop(struct remoteproc *rproc);
停止远程处理器但不释放资源
int remoteproc_load(struct remoteproc *rproc, const char *path, void *store, struct image_store_ops *store_ops, void **img_info);
从内存中已经存在的镜像入口启动远程处理器属性
int remoteproc_shutdown(struct remoteproc *rproc);
关闭远程处理器并释放资源
struct virtio_device *remoteproc_create_virtio(struct remoteproc *rproc,
int vdev_id, unsigned int role,
void (*rst_cb)(struct virtio_device *vdev));
创建virtio设备实例
void remoteproc_remove_virtio(struct remoteproc *rproc, struct virtio_device *vdev);
删除virtio设备
void remoteproc_add_mem(struct remoteproc *rproc, struct remoteproc_mem *mem)
添加remoteproc内存
struct metal_io_region *remoteproc_get_io_with_name(struct remoteproc *rproc, const char *name);
通过指定内存名称的remoteproc获取内存libmetal I/O区域
struct metal_io_region *remoteproc_get_io_with_pa(struct remoteproc *rproc, metal_phys_addr_t pa);
通过指定物理地址的remoteproc获取内存libmetal I/O区域
struct metal_io_region *remoteproc_get_io_with_va(struct remoteproc *rproc, void *va);
通过指定虚拟地址的remoteproc获取内存libmetal I/O区域
void *remoteproc_mmap(struct remoteproc *rproc, metal_phys_addr_t *pa, metal_phys_addr_t *da, size_t size, unsigned int attribute, struct metal_io_region **io);
映射内存并将内存添加到remoteproc实例
int remoteproc_set_rsc_table(struct remoteproc *rproc, struct resource_table *rsc_table, size_t rsc_size);
解析并设置remoteproc的资源表
核间通信第三方库openamp的实现:
已经实现了rpmsg
组件、virtIO
组件、libmetal
库、UIO
库、libsysfs
库。
proxy
组件的性质不属于功能,而是对rpmsg的封装而已,暂未实现该组件。
remoteproc
需要芯片SDK支持,暂未实现该组件。
CPU 绑定:
rpmsg-sample-ping程序绑定于core0,rpmsg-sample-echo程序绑定于core1,完成不同核之间的消息处理。
LiteOS-A新增eventfd接口,用以支持Libmetal处理主线程与irq线程之间的通信。
libsysfs主要用于读取设备信息,由于LiteOS-A中没有sysfs,并且openamp中设备信息只用到uio0和uio1。 因此对使用libsysfs组件的相关代码逻辑进行适配,不从sysfs读取设备信息,而是直接指定uio0或uio1。
系统增加了2个uio设备,并实现了对应的设备驱动。
设备 | 作用 |
---|---|
/dev/uio0 | 用于访问共享内存 |
/dev/uio1 | 用于操作核间中断 |
可通过命令行查看到单板这个2个设备。
ls /dev
-rwxrwxrwx 0 u:0 g:0 uio1
-rwxrwxrwx 0 u:0 g:0 uio0
新定义1个IPI中断,专门用于主核与从核之间的核间中断通知。
#define LOS_MP_IPI_NOTIFY 15
内核预留了物理内存最末端的2M,作为主核与从核的共享内存。用户调用mmap
接口时,最多映射内存不得大于2MB。
共享内存起始地址的计算方式:物理内存起始地址 + 物理内存大小 - 2MB = (DDR_MEM_ADDR + SYS_MEM_SIZE_DEFAULT) - 2MB = (0x87f00000 - 0x200000) = 0x87d00000
#define DDR_MEM_ADDR 0x80000000
#define SYS_MEM_SIZE_DEFAULT 0x7f00000
#define DDR_MEM_AMP_SHM_SIZE 200000 //(2 * 1024 * 1024)
#define DDR_MEM_AMP_SHM_ADDR DDR_MEM_ADDR + SYS_MEM_SIZE_DEFAULT - DDR_MEM_AMP_SHM_SIZE
添加了核间中断的2个demo app, rpmsg-sample-ping
和rpmsg-sample-echo
。
完成了对libsysfs库解耦,不再依赖和解析libsysfs特有的文件设备信息,改为通过入参中dev name的字符串,判断访问设备uio0
还是设备uio1
。
rpmsg-sample-ping
rpmsg-sample-echo
通过openamp框架接收消息(绑定于core1)
rpmsg-sample-echo
在系统启动时,自动运行。
对系统启动的配置脚本:vendor/hisilicon/hispark_taurus/init_configs/init_liteos_a_3516dv300.cfg,做了如下修改:
jobs的init部分增加自动启动命令start rpmsg-sample-echo
。
{
"name" : "init",
"cmds" : [
"start apphilogcat",
"start hiview",
"start deviceauth_service",
"start sensor_service",
"start ai_server",
"start softbus_server",
"start rpmsg-sample-echo"
]
}
service部分增加启动的配置。
{
"name" : "rpmsg-sample-echo",
"path" : ["/bin/rpmsg-sample-echo", "-L", "auto"],
"uid" : 4,
"gid" : 4,
"once" : 1,
"importance" : 0,
"caps" : []
}
增加了新的编译宏KERNEL_AMP
,在这个宏之下,包括两个编译宏,依赖于该宏。
KERNEL_PRIMARY_CORE - 对应于主核
KERNEL_SECONDARY_CORE - 对应于从核
config KERNEL_AMP
bool "Enable Kernel AMP"
default n
help
This option will enable amp support of LiteOS.
config KERNEL_PRIMARY_CORE
bool "Enable Kernel Primary Core"
default n
depends on KERNEL_AMP
help
This option will enable primary core support of LiteOS.
config KERNEL_SECONDARY_CORE
bool "Enable Kernel Secondary Core"
default n
depends on KERNEL_AMP
help
This option will enable secondary core support of LiteOS.
系统内存中占用2MB作为共享内存
系统中新增2个设备/dev/uio0
、/dev/uio1
,作为主核与从核通信所用的UIO设备
系统中的15号中断占用,作为IPI中断
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。