[T106][ZXW-22]7520V3SCV2.01.01.02P42U09_VEC_V0.8_AP_VEC origin source commit

Change-Id: Ic6e05d89ecd62fc34f82b23dcf306c93764aec4b
diff --git a/ap/app/zte_comm/nvserver/sc_rpc.c b/ap/app/zte_comm/nvserver/sc_rpc.c
new file mode 100755
index 0000000..eddf7b5
--- /dev/null
+++ b/ap/app/zte_comm/nvserver/sc_rpc.c
@@ -0,0 +1,164 @@
+/*******************************************************************************
+ * 版权所有 (C)2023, 中兴通讯股份有限公司。
+ *
+ * 文件名称:     nvserver_rpc.c
+ * 文件标识:     nvserver_rpc.c
+ * 内容摘要:     nvserver转接cap的nvserver
+ *
+ * 修改日期        版本号      修改标记        修改人          修改内容
+ * ------------------------------------------------------------------------------
+ * 2016/06/13      V1.0        Create          刘亚南          创建
+ *
+ *******************************************************************************/
+
+/*******************************************************************************
+ *                                   头文件                                     *
+ *******************************************************************************/
+#include <unistd.h>
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <dirent.h>
+#include <string.h>
+#include <sys/file.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/ipc.h>
+#include <sys/msg.h>
+#include <sys/ioctl.h>
+#include <unistd.h>
+#include "sc_rpc.h"
+#include "zxicbasic_api.h"
+#include "rpmsg_zx29.h"
+
+/*******************************************************************************
+ *                                  常量定义                                    *
+ *******************************************************************************/
+
+/*******************************************************************************
+ *                                   宏定义                                     *
+ *******************************************************************************/
+#define RPC_CHN_MAX_BUF_LEN 8192
+
+/*******************************************************************************
+ *                                数据类型定义                                  *
+ *******************************************************************************/
+
+/*******************************************************************************
+ *                                局部函数声明                                  *
+ *******************************************************************************/
+
+/*******************************************************************************
+ *                              局部静态变量定义                                *
+ *******************************************************************************/
+
+/*******************************************************************************
+ *                                全局变量定义                                  *
+ *******************************************************************************/
+
+/*******************************************************************************
+ *                                局部函数实现                                  *
+ *******************************************************************************/
+
+/*******************************************************************************
+ *                                全局函数实现                                  *
+ *******************************************************************************/
+
+int sc_rpc_open(const char *rpmsg_dev)
+{
+    int fd;
+    fd = open(rpmsg_dev, O_RDWR);
+
+    if (fd < 0)
+    {
+        perror("[rpc] open device fail\n");
+        return -1;
+    }
+
+    if (ioctl(fd, RPMSG_CREATE_CHANNEL, RPC_CHN_MAX_BUF_LEN) < 0)
+    {
+        perror("[rpc] RPMSG_CREATE_CHANNEL error\n");
+        return -1;
+    }
+
+    // 发送消息时,触发中断
+    if (ioctl(fd, RPMSG_SET_INT_FLAG, NULL) < 0)
+    {
+        perror("[rpc] RPMSG_SET_INT_FLAG error\n");
+        return -1;
+    }
+
+    // 阻塞的方式读
+    if (ioctl(fd, RPMSG_CLEAR_POLL_FLAG, NULL) < 0)
+    {
+        perror("[rpc] RPMSG_CLEAR_POLL_FLAG error\n");
+        return -1;
+    }
+
+    return fd;
+}
+
+int sc_rpc_clear(int fd)
+{
+    char tmp_buf[1024];
+    int ret = -1;
+
+    if (ioctl(fd, RPMSG_SET_POLL_FLAG, NULL) < 0)
+    {
+        perror("[rpc] RPMSG_SET_POLL_FLAG error\n");
+        return -1;
+    }
+
+    while (1)
+    {
+        ret = safe_read(fd, tmp_buf, sizeof(tmp_buf));
+        if (ret == 0)
+        {
+            break; /* channel clear */
+        }
+        else
+        {
+            printf("[rpc] UNBLOCK read len = %d!\n", ret);
+        }
+    }
+    if (ioctl(fd, RPMSG_CLEAR_POLL_FLAG, NULL) < 0)
+    {
+        perror("[rpc] RPMSG_CLEAR_POLL_FLAG error\n");
+        return -1;
+    }
+
+    return 0;
+}
+
+int sc_rpc_send(int fd, T_sc_rpc_header *data, unsigned int flag)
+{
+    ssize_t ret;
+
+    ret = full_write(fd, data, sizeof(T_sc_rpc_header));
+    if (ret != sizeof(T_sc_rpc_header))
+    {
+        printf("[rpc] write error, len=%d != %d!\n", ret, (int)sizeof(T_sc_rpc_header));
+        return -1;
+    }
+
+    return 0;
+}
+
+int sc_rpc_recv(int fd, T_sc_rpc_header *data, unsigned int flag)
+{
+    ssize_t ret;
+
+    ret = full_read(fd, data, sizeof(T_sc_rpc_header));
+    if (ret != sizeof(T_sc_rpc_header))
+    {
+        printf("[rpc] read error, len=%d != %d!\n", ret, (int)sizeof(T_sc_rpc_header));
+        return -1;
+    }
+
+    return 0;
+}
+
+int sc_rpc_close(int fd)
+{
+    return close(fd);
+}