blob: c7416015df37eb5999036ffcf7f6b2a39943ccda [file] [log] [blame]
lh9ed821d2023-04-07 01:36:19 -07001/*******************************************************************************
2 * 版权所有 (C)2023, 中兴通讯股份有限公司。
3 *
4 * 文件名称: nvserver_rpc.c
5 * 文件标识: nvserver_rpc.c
6 * 内容摘要: nvserver转接cap的nvserver
7 *
8 * 修改日期 版本号 修改标记 修改人 修改内容
9 * ------------------------------------------------------------------------------
10 * 2016/06/13 V1.0 Create 刘亚南 创建
11 *
12 *******************************************************************************/
13
14/*******************************************************************************
15 * 头文件 *
16 *******************************************************************************/
17#include <unistd.h>
18#include <errno.h>
19#include <stdio.h>
20#include <stdlib.h>
21#include <dirent.h>
22#include <string.h>
23#include <sys/file.h>
24#include <sys/types.h>
25#include <sys/stat.h>
26#include <sys/ipc.h>
27#include <sys/msg.h>
28#include <sys/ioctl.h>
29#include <unistd.h>
30#include "sc_rpc.h"
31#include "zxicbasic_api.h"
32#include "rpmsg_zx29.h"
33
34/*******************************************************************************
35 * 常量定义 *
36 *******************************************************************************/
37
38/*******************************************************************************
39 * 宏定义 *
40 *******************************************************************************/
41#define RPC_CHN_MAX_BUF_LEN 8192
42
43/*******************************************************************************
44 * 数据类型定义 *
45 *******************************************************************************/
46
47/*******************************************************************************
48 * 局部函数声明 *
49 *******************************************************************************/
50
51/*******************************************************************************
52 * 局部静态变量定义 *
53 *******************************************************************************/
54
55/*******************************************************************************
56 * 全局变量定义 *
57 *******************************************************************************/
58
59/*******************************************************************************
60 * 局部函数实现 *
61 *******************************************************************************/
62
63/*******************************************************************************
64 * 全局函数实现 *
65 *******************************************************************************/
66
67int sc_rpc_open(const char *rpmsg_dev)
68{
69 int fd;
70 fd = open(rpmsg_dev, O_RDWR);
71
72 if (fd < 0)
73 {
74 perror("[rpc] open device fail\n");
75 return -1;
76 }
77
78 if (ioctl(fd, RPMSG_CREATE_CHANNEL, RPC_CHN_MAX_BUF_LEN) < 0)
79 {
80 perror("[rpc] RPMSG_CREATE_CHANNEL error\n");
81 return -1;
82 }
83
84 // 发送消息时,触发中断
85 if (ioctl(fd, RPMSG_SET_INT_FLAG, NULL) < 0)
86 {
87 perror("[rpc] RPMSG_SET_INT_FLAG error\n");
88 return -1;
89 }
90
91 // 阻塞的方式读
92 if (ioctl(fd, RPMSG_CLEAR_POLL_FLAG, NULL) < 0)
93 {
94 perror("[rpc] RPMSG_CLEAR_POLL_FLAG error\n");
95 return -1;
96 }
97
98 return fd;
99}
100
101int sc_rpc_clear(int fd)
102{
103 char tmp_buf[1024];
104 int ret = -1;
105
106 if (ioctl(fd, RPMSG_SET_POLL_FLAG, NULL) < 0)
107 {
108 perror("[rpc] RPMSG_SET_POLL_FLAG error\n");
109 return -1;
110 }
111
112 while (1)
113 {
114 ret = safe_read(fd, tmp_buf, sizeof(tmp_buf));
115 if (ret == 0)
116 {
117 break; /* channel clear */
118 }
119 else
120 {
121 printf("[rpc] UNBLOCK read len = %d!\n", ret);
122 }
123 }
124 if (ioctl(fd, RPMSG_CLEAR_POLL_FLAG, NULL) < 0)
125 {
126 perror("[rpc] RPMSG_CLEAR_POLL_FLAG error\n");
127 return -1;
128 }
129
130 return 0;
131}
132
133int sc_rpc_send(int fd, T_sc_rpc_header *data, unsigned int flag)
134{
135 ssize_t ret;
136
137 ret = full_write(fd, data, sizeof(T_sc_rpc_header));
138 if (ret != sizeof(T_sc_rpc_header))
139 {
140 printf("[rpc] write error, len=%d != %d!\n", ret, (int)sizeof(T_sc_rpc_header));
141 return -1;
142 }
143
144 return 0;
145}
146
xf.libdd93d52023-05-12 07:10:14 -0700147int sc_rpc_recv(int fd, T_sc_rpc_header *data, unsigned int timeout)
lh9ed821d2023-04-07 01:36:19 -0700148{
xf.libdd93d52023-05-12 07:10:14 -0700149#if 1
150 fd_set readfds;
151 ssize_t len;
152 int ret;
153 struct timeval timeout_t = {timeout, 0};
154 int errNo = 0;
155
156 FD_ZERO(&readfds);
157 FD_SET(fd, &readfds);
158
159 //ret = select(fd + 1, &readfds, NULL, NULL, &timeout_t);
160 do {
161 ret = select(fd + 1, &readfds, NULL, NULL, &timeout_t);
162 } while (ret < 0 && errno == EINTR);
163
164 if (ret == 0)
165 {
166 printf("[error] nvrpc select timeout!\n");
167 return -1;
168 }
169 else if(ret < 0)
170 {
171 printf("[error] nvrpc ret:%d\n", ret);
172 return -2;
173 }
174
175 len = full_read(fd, data, sizeof(T_sc_rpc_header));
176 if (len != sizeof(T_sc_rpc_header))
177 {
178 printf("[nvrpc] read error, len=%d != %d!\n", len, (int)sizeof(T_sc_rpc_header));
179 return -3;
180 }
181
182 return 0;
183#else
lh9ed821d2023-04-07 01:36:19 -0700184 ssize_t ret;
185
186 ret = full_read(fd, data, sizeof(T_sc_rpc_header));
187 if (ret != sizeof(T_sc_rpc_header))
188 {
189 printf("[rpc] read error, len=%d != %d!\n", ret, (int)sizeof(T_sc_rpc_header));
190 return -1;
191 }
192
193 return 0;
xf.libdd93d52023-05-12 07:10:14 -0700194#endif
lh9ed821d2023-04-07 01:36:19 -0700195}
196
197int sc_rpc_close(int fd)
198{
199 return close(fd);
200}