From c3355e013c2a371c4786d49a8b0e46bc4db60a71 Mon Sep 17 00:00:00 2001 From: anan_bj Date: Wed, 7 Jun 2023 14:32:30 +0800 Subject: [PATCH] [modify] modify rpmsg API & template --- Middlewares/Rpmsg_Library/Inc/rpmsg_api.h | 29 +--- Middlewares/Rpmsg_Library/Src/rpmsg_api.c | 125 +++--------------- .../include}/remoteproc_rsc_table.h | 11 +- .../include}/rpmsg_config.h | 0 .../Templates/template-riscv-rpmsg/main.c | 82 +++++++++++- 5 files changed, 115 insertions(+), 132 deletions(-) rename {Middlewares/Rpmsg_Library/Inc => projects/x2660-halley/Templates/template-riscv-rpmsg/include}/remoteproc_rsc_table.h (89%) rename {Middlewares/Rpmsg_Library/Inc => projects/x2660-halley/Templates/template-riscv-rpmsg/include}/rpmsg_config.h (100%) diff --git a/Middlewares/Rpmsg_Library/Inc/rpmsg_api.h b/Middlewares/Rpmsg_Library/Inc/rpmsg_api.h index a69047bc..c1141994 100755 --- a/Middlewares/Rpmsg_Library/Inc/rpmsg_api.h +++ b/Middlewares/Rpmsg_Library/Inc/rpmsg_api.h @@ -25,9 +25,6 @@ */ /* 1. 头文件 (Includes)----------------------------------------------- */ -#include "rpmsg_config.h" -#include "rpmsg_lite.h" -#include "rpmsg_ns.h" #include "list.h" /* 2. 导出的类型 (Exported Types)--------------------------------------- */ @@ -35,13 +32,6 @@ * @defgroup RPMSG_LIBRARY_exported_types RPMSG_LIBRARY 导出的类型 (Exported Types) * @{ */ -typedef struct { - struct rpmsg_lite_instance rpmsg_lite_dev_ctx; - struct rpmsg_lite_instance *rpmsg_instance; - struct rpmsg_lite_ept_static_context rpmsg_lite_ept_ctx; - struct rpmsg_lite_endpoint *rpmsg_ept; -}ingenic_rpmsg_t; - /** * @} @@ -65,13 +55,6 @@ typedef struct { */ #define MAX_MSG_NUM 20 -#define VRING_RX_ADDRESS 0x12400000 -#define VRING_TX_ADDRESS 0x12401000 - -#define VRING_ALIGNMENT 16 -#define VRING_NUM_BUFFS RL_BUFFER_COUNT -#define VRING0_ID 0 -#define VRING1_ID 1 /** * @} @@ -82,9 +65,11 @@ typedef struct { * @defgroup RPMSG_LIBRARY_exported_funcs RPMSG_LIBRARY 导出函数申明 Exported Funcs * @{ */ -void create_channel(ingenic_rpmsg_t *ingenic_rpmsg); -int32_t msg_recv(void **buffer, uint32_t *len, uint32_t *src); -int32_t msg_send(ingenic_rpmsg_t *ingenic_rpmsg, uint32_t dst, char *data, uint32_t size, uint32_t timeout); + +int msg_queue_init(); +int msg_enqueue(void *payload, unsigned int payload_len, unsigned int src); +int msg_dequeue(void **payload, unsigned int *payload_len, unsigned int *src); + /** * @} @@ -108,8 +93,8 @@ int32_t msg_send(ingenic_rpmsg_t *ingenic_rpmsg, uint32_t dst, char *data, uint3 */ struct msg{ void *buf; - uint32_t size; - uint32_t src; + unsigned int size; + unsigned int src; struct list_head entry; }; diff --git a/Middlewares/Rpmsg_Library/Src/rpmsg_api.c b/Middlewares/Rpmsg_Library/Src/rpmsg_api.c index 5fac0918..a3d5e14e 100755 --- a/Middlewares/Rpmsg_Library/Src/rpmsg_api.c +++ b/Middlewares/Rpmsg_Library/Src/rpmsg_api.c @@ -18,9 +18,9 @@ */ /* 1.头文件 (Includes)------------------------------------------------ */ -#include +#include +#include #include -#include /** @addtogroup RPMSG_LIBRARY * @{ @@ -57,7 +57,6 @@ DEFINE_SPINLOCK(lock); * @{ */ -#define CLIENT_NAME "rpmsg_chrdev" /** * @} @@ -80,12 +79,6 @@ DEFINE_SPINLOCK(lock); * @{ */ -static int32_t msg_queue_init(); -static int32_t msg_available(); -static int32_t msg_enqueue(void *payload, uint32_t payload_len, uint32_t src); -static int32_t msg_dequeue(void **payload, uint32_t *payload_len, uint32_t *src); -static int32_t riscv_ept_rx_cb_t(void *payload, uint32_t payload_len, uint32_t src, void *priv); -static void rpmsg_mailbox_handler(int irq, void *data); /** * @} @@ -95,21 +88,25 @@ static void rpmsg_mailbox_handler(int irq, void *data); * @defgroup RPMSG_LIBRARY_private_funcs_impl RPMSG_LIBRARY 私有函数实现 * @{ */ -static int32_t msg_queue_init() + + +/** + * @} + */ +/* 8. 导出函数实现------------------------------------------------------- */ +/** + * @defgroup RPMSG_LIBRARY_exported_funcs_impl RPMSG_LIBRARY 导出函数实现 + * @{ + */ + +int msg_queue_init() { - uint32_t i; + unsigned int i; for(i = 0; i < MAX_MSG_NUM; i++) list_add_tail(&msg[i].entry, &avali); } -static int32_t msg_available() -{ - int32_t ret; - ret = list_empty(&used); - return !ret; -} - -static int32_t msg_enqueue(void *payload, uint32_t payload_len, uint32_t src) +int msg_enqueue(void *payload, unsigned int payload_len, unsigned int src) { struct msg *msg; @@ -127,11 +124,16 @@ static int32_t msg_enqueue(void *payload, uint32_t payload_len, uint32_t src) return 0; } -static int32_t msg_dequeue(void **payload, uint32_t *payload_len, uint32_t *src) +int msg_dequeue(void **payload, unsigned int *payload_len, unsigned int *src) { struct msg *msg; spin_lock(&lock); + if(list_empty(&used)){ + spin_unlock(&lock); + return -1; + } + msg = list_first_entry(&used, struct msg, entry); *payload = msg->buf; @@ -146,89 +148,6 @@ static int32_t msg_dequeue(void **payload, uint32_t *payload_len, uint32_t *src) } -static int32_t riscv_ept_rx_cb_t(void *payload, uint32_t payload_len, uint32_t src, void *priv) -{ - ingenic_rpmsg_t *ingenic_rpmsg = priv; - char* data = (char*)payload; - if(payload_len && data[0] != '0') - - msg_enqueue(payload, payload_len, src); - - return 0; -} - -static void rpmsg_mailbox_handler(int irq, void *data) { - RISCV_CCU_TypeDef *RISC_CCU = (RISCV_CCU_TypeDef *)data; - uint32_t msg = 0; - msg = LL_RISC_CCU_Mbox_Recvmsg(RISC_CCU); - rpmsg_handler(msg); -} - -/** - * @} - */ -/* 8. 导出函数实现------------------------------------------------------- */ -/** - * @defgroup RPMSG_LIBRARY_exported_funcs_impl RPMSG_LIBRARY 导出函数实现 - * @{ - */ -void create_channel(ingenic_rpmsg_t *ingenic_rpmsg) -{ - unsigned int timeout = 0xffff; - int ret = 0; - - ingenic_rpmsg->rpmsg_instance = rpmsg_lite_remote_init((void*)VRING_RX_ADDRESS, - 0,0,&ingenic_rpmsg->rpmsg_lite_dev_ctx); - if(!ingenic_rpmsg->rpmsg_instance){ - prom_printk("rpmsg_lite_remote_init failed \r\n"); - } - - ll_request_irq(IRQ_RISCV_MAILBOX, rpmsg_mailbox_handler, RISC_CCU_Instance); - - - ingenic_rpmsg->rpmsg_ept = rpmsg_lite_create_ept(ingenic_rpmsg->rpmsg_instance,RL_ADDR_ANY, - riscv_ept_rx_cb_t,ingenic_rpmsg,&ingenic_rpmsg->rpmsg_lite_ept_ctx); - if(!ingenic_rpmsg->rpmsg_ept){ - prom_printk("rpmsg_lite_create_ept failed \r\n"); - } - - do { - ret = rpmsg_ns_announce(ingenic_rpmsg->rpmsg_instance, - ingenic_rpmsg->rpmsg_ept, - CLIENT_NAME, - 0); - timeout--; - } - while((ret == RL_NOT_READY) && timeout); - - msg_queue_init(); - - return ret; -} - -int32_t msg_recv(void **buffer, uint32_t *len, uint32_t *src) -{ - while(1) - { - spin_lock(&lock); - if(!msg_available()) - { - spin_unlock(&lock); - continue; - } - - msg_dequeue(buffer, len, src); - spin_unlock(&lock); - break; - } - return 0; -} - -int32_t msg_send(ingenic_rpmsg_t *ingenic_rpmsg, uint32_t dst, char *data, uint32_t size, uint32_t timeout) -{ - return rpmsg_lite_send(ingenic_rpmsg->rpmsg_instance,ingenic_rpmsg->rpmsg_ept, dst, data, size, timeout); -} - /** * @} diff --git a/Middlewares/Rpmsg_Library/Inc/remoteproc_rsc_table.h b/projects/x2660-halley/Templates/template-riscv-rpmsg/include/remoteproc_rsc_table.h similarity index 89% rename from Middlewares/Rpmsg_Library/Inc/remoteproc_rsc_table.h rename to projects/x2660-halley/Templates/template-riscv-rpmsg/include/remoteproc_rsc_table.h index d6bb0c28..e53017ab 100644 --- a/Middlewares/Rpmsg_Library/Inc/remoteproc_rsc_table.h +++ b/projects/x2660-halley/Templates/template-riscv-rpmsg/include/remoteproc_rsc_table.h @@ -1,8 +1,6 @@ #ifndef __REMOTEPROC_RSC_TABLE_H__ #define __REMOTEPROC_RSC_TABLE_H__ -#include "rpmsg_api.h" - #define VIRTIO_ID_RPMSG 7 #define VRING_COUNT 2 @@ -53,6 +51,15 @@ enum fw_resource_type { RSC_VENDOR_END = 512, }; +#define VRING_RX_ADDRESS 0x12400000 +#define VRING_TX_ADDRESS 0x12401000 + +#define VRING_ALIGNMENT 16 +#define VRING_NUM_BUFFS RL_BUFFER_COUNT +#define VRING0_ID 0 +#define VRING1_ID 1 + + volatile struct sh_resource_table __attribute__((used,section(".resource_table"))) resource_table = { /* volatile struct sh_resource_table __attribute__((used)) resource_table = { */ .ver = 1, diff --git a/Middlewares/Rpmsg_Library/Inc/rpmsg_config.h b/projects/x2660-halley/Templates/template-riscv-rpmsg/include/rpmsg_config.h similarity index 100% rename from Middlewares/Rpmsg_Library/Inc/rpmsg_config.h rename to projects/x2660-halley/Templates/template-riscv-rpmsg/include/rpmsg_config.h diff --git a/projects/x2660-halley/Templates/template-riscv-rpmsg/main.c b/projects/x2660-halley/Templates/template-riscv-rpmsg/main.c index f7219a63..5c2c08a8 100644 --- a/projects/x2660-halley/Templates/template-riscv-rpmsg/main.c +++ b/projects/x2660-halley/Templates/template-riscv-rpmsg/main.c @@ -1,24 +1,96 @@ #include +#include +#include +#include +#include #include -static ingenic_rpmsg_t ingenic_rpmsg_ctx; +#define CLIENT_NAME "rpmsg_chrdev" + +struct rpmsg_lite_instance rpmsg_lite_dev_ctx; +struct rpmsg_lite_instance *rpmsg_instance; +struct rpmsg_lite_ept_static_context rpmsg_lite_ept_ctx; +struct rpmsg_lite_endpoint *rpmsg_ept; + +int32_t riscv_ept_rx_cb_t(void *payload, uint32_t payload_len, uint32_t src, void *priv) +{ + char* data = (char*)payload; + if(payload_len && data[0] != '0') + + msg_enqueue(payload, payload_len, src); + + return 0; +} + +void rpmsg_mailbox_handler(int irq, void *data) { + RISCV_CCU_TypeDef *RISC_CCU = (RISCV_CCU_TypeDef *)data; + uint32_t msg = 0; + msg = LL_RISC_CCU_Mbox_Recvmsg(RISC_CCU); + rpmsg_handler(msg); +} + +uint32_t msg_recv(void **buffer, uint32_t *len, uint32_t *src, uint32_t block) +{ + unsigned int ret = 0; + unsigned int timeout = 0xffff; + + while(timeout--|| block) + { + ret = msg_dequeue(buffer, len, src); + if(ret) + continue; + return ret; + } + + return -ETIMEDOUT; +} + +int32_t msg_send(struct rpmsg_lite_endpoint *rpmsg_ept, uint32_t dst, char *data, uint32_t size, uint32_t timeout) +{ + return rpmsg_lite_send(rpmsg_instance,rpmsg_ept, dst, data, size, timeout); +} + int main() { - unsigned int i,j; void *buffer; uint32_t len, src; char msg[16]; + uint32_t timeout = 0xffff; + uint32_t ret = 0; printf("\nriscv start\n"); - create_channel(&ingenic_rpmsg_ctx); + rpmsg_instance = rpmsg_lite_remote_init((void*)VRING_RX_ADDRESS, + 0,0,&rpmsg_lite_dev_ctx); + if(!rpmsg_instance){ + prom_printk("rpmsg_lite_remote_init failed \r\n"); + } + + ll_request_irq(IRQ_RISCV_MAILBOX, rpmsg_mailbox_handler, RISC_CCU_Instance); + + + rpmsg_ept = rpmsg_lite_create_ept(rpmsg_instance,RL_ADDR_ANY, + riscv_ept_rx_cb_t,NULL,&rpmsg_lite_ept_ctx); + if(!rpmsg_ept){ + prom_printk("rpmsg_lite_create_ept failed \r\n"); + } + + do { + ret = rpmsg_ns_announce(rpmsg_instance, + rpmsg_ept, + CLIENT_NAME, + 0); + timeout--; + } + while((ret == RL_NOT_READY) && timeout); + msg_queue_init(); while(1) { - msg_recv(&buffer, &len, &src); + ret = msg_recv(&buffer, &len, &src, 1); printf("====%s\n", buffer); sprintf(msg, "hello host!"); - msg_send(&ingenic_rpmsg_ctx, src, msg, sizeof(msg), 100); + msg_send(rpmsg_ept, src, msg, sizeof(msg), timeout); } printf("\nriscv end\n"); -- Gitee