NSUKit 1.4.0
板卡级统一交互接口
载入中...
搜索中...
未找到
base_itf.cpp
浏览该文件的文档.
1//
2// Created by 56585 on 2023/8/14.
3//
4
6
7using namespace nsukit;
8
9
10nsukitStatus_t Mixin_NativeRegCmd::multi_write(std::vector<nsuRegAddr_t> &addr, std::vector<nsuRegValue_t> &value) {
11 auto res = nsukitStatus_t::NSUKIT_STATUS_SUCCESS;
12 if (addr.size() != value.size()) {
13 return nsukitStatus_t::NSUKIT_STATUS_INVALID_VALUE;
14 }
15 auto _a = addr.begin();
16 auto _v = value.begin();
17
18 while (_a != addr.end() && _v != value.end()) {
19 res |= cmd_itf_->write(*_a, *_v);
20 _a++;
21 _v++;
22 }
23 return res;
24}
25
26
27nsukitStatus_t Mixin_NativeRegCmd::multi_read(std::vector<nsuRegAddr_t> &addr, std::vector<nsuRegValue_t *> &value) {
28 auto res = nsukitStatus_t::NSUKIT_STATUS_SUCCESS;
29 if (addr.size() != value.size()) {
30 return nsukitStatus_t::NSUKIT_STATUS_INVALID_VALUE;
31 }
32 auto _a = addr.begin();
33 auto _v = value.begin();
34
35 while (_a != addr.end() && _v != value.end()) {
36 res |= cmd_itf_->read(*_a, *_v);
37 _a++;
38 _v++;
39 }
40 return res;
41}
42
43
46 auto res = nsukitStatus_t::NSUKIT_STATUS_SUCCESS;
47 auto num = length / reg_len;
48 auto ptr = (nsuRegValue_t *) value;
49 for (int i=0;i<num;i++){
50 res |= cmd_itf_->write(addr+reg_len*i, *(ptr+i));
51 }
52 if ((length - num*reg_len) > 0) {
53 nsuRegValue_t last = 0;
54 memcpy(&last, ptr+num, length - num*reg_len);
55 res |= cmd_itf_->write(addr+reg_len*num, last);
56 }
57 return res;
58}
59
60
63 auto res = nsukitStatus_t::NSUKIT_STATUS_SUCCESS;
64 if (value == nullptr) {
65 return nsukitStatus_t::NSUKIT_STATUS_INVALID_VALUE;
66 }
67 auto ceil_num = (nsuSize_t )std::ceil((float )length/(float )reg_len);
68 auto buf = (nsuRegValue_t *) malloc(ceil_num* sizeof(nsuRegValue_t));
69 for (int i=0;i<ceil_num;i++){
70 res |= cmd_itf_->read(addr+reg_len*i, buf+i);
71 }
72 memcpy(value, buf, length);
73 free(buf);
74 return res;
75}
76
77
80 auto res = nsukitStatus_t::NSUKIT_STATUS_SUCCESS;
81 auto num = length / reg_len;
82 auto ptr = (nsuRegValue_t *) value;
83 for (int i=0;i<num;i++){
84 res |= cmd_itf_->write(addr, *(ptr+i));
85 }
86 if ((length - num*reg_len) > 0) {
87 nsuRegValue_t last = 0;
88 memcpy(&last, ptr+num, length - num*reg_len);
89 res |= cmd_itf_->write(addr, last);
90 }
91 return res;
92}
93
94
97 auto res = nsukitStatus_t::NSUKIT_STATUS_SUCCESS;
98 if (value == nullptr) {
99 return nsukitStatus_t::NSUKIT_STATUS_INVALID_VALUE;
100 }
101 auto ceil_num = (nsuSize_t )std::ceil((float )length/(float )reg_len);
102 auto buf = (nsuRegValue_t *) malloc(ceil_num*sizeof(nsuRegValue_t));
103 memcpy(buf, value, length);
104 for (int i=0;i<ceil_num;i++){
105 res |= cmd_itf_->read(addr, buf+i);
106 }
107 free(buf);
108 return res;
109}
110
111
113 static constexpr uint32_t DataPacketID = 0x31001001;
114 static constexpr size_t DataPacketSize = sizeof(RegPack) - sizeof(nsuRegValue_t);
115
116 if (!buf) {
117 return -1; // 缓冲区为空,返回错误状态
118 }
119
120 RegPack pack;
121 pack.id = DataPacketID;
122 pack.length = DataPacketSize;
123 pack.addr = reg;
124 memcpy(buf, &pack, DataPacketSize);
125
126 return DataPacketSize;
127}
128
129
131 static constexpr uint32_t DataPacketID = 0x31001000;
132 static constexpr size_t DataPacketLength = sizeof(RegPack);
133
134 if (buf == nullptr) {
135 return -1; // 缓冲区为空,返回错误
136 }
137
138 RegPack pack;
139 pack.id = DataPacketID;
140 pack.length = DataPacketLength;
141 pack.addr = reg;
142 pack.value = value;
143
144 memcpy(buf, &pack, sizeof(RegPack));
145 return DataPacketLength; // 数据格式化成功
146}
147
148
150 auto buf = (nsuCharBuf_p) malloc(sizeof(RegPack));
151 auto len = _fmt_reg_write(reg, value, buf);
152 auto res = cmd_itf_->send_bytes(buf, len);
153 free(buf);
154
155 char r_head[16];
156 RegPack pack;
157 res |= cmd_itf_->recv_bytes(16, r_head);
158 memcpy(&pack, r_head, 16);
159 res |= cmd_itf_->recv_bytes(pack.length-16, r_head);
160 if (*(nsuRegValue_t *)r_head!=0) {
161 res |= nsukitStatus_t::NSUKIT_STATUS_ITF_FAIL;
162 DEBUG_PRINT_CLASS("cmd result!=0");
163 }
164 return res;
165}
166
168 if (buf == nullptr) return nsukitStatus_t::NSUKIT_STATUS_INVALID_VALUE;
169 auto cmd_buf = (nsuCharBuf_p) malloc(sizeof(RegPack));
170 auto len = _fmt_reg_read(reg, cmd_buf);
171 auto res = cmd_itf_->send_bytes(cmd_buf, len);
172 free(cmd_buf);
173
174 char r_head[16];
175 RegPack pack;
176 res |= cmd_itf_->recv_bytes(16, r_head);
177 memcpy(&pack, r_head, 16);
178 res |= cmd_itf_->recv_bytes(pack.length-16, r_head);
179 if (*(nsuRegValue_t *)r_head!=0) {
180 res |= nsukitStatus_t::NSUKIT_STATUS_ITF_FAIL;
181 DEBUG_PRINT_CLASS("cmd result!=0");
182 }
183 if (res == nsukitStatus_t::NSUKIT_STATUS_SUCCESS) *buf = *(nsuRegValue_t *)r_head;
184 return res;
185}
186
187
188nsukitStatus_t Mixin_VirtualRegCmd::multi_write(std::vector<nsuRegAddr_t> &addr, std::vector<nsuRegValue_t> &value) {
189 auto res = nsukitStatus_t::NSUKIT_STATUS_SUCCESS;
190 if (addr.size() != value.size()) {
191 return nsukitStatus_t::NSUKIT_STATUS_INVALID_VALUE;
192 }
193 auto _a = addr.begin();
194 auto _v = value.begin();
195
196 while (_a != addr.end() && _v != value.end()) {
197 res |= cmd_itf_->write(*_a, *_v);
198 _a++;
199 _v++;
200 }
201 return res;
202}
203
204nsukitStatus_t Mixin_VirtualRegCmd::multi_read(std::vector<nsuRegAddr_t> &addr, std::vector<nsuRegValue_t *> &value) {
205 auto res = nsukitStatus_t::NSUKIT_STATUS_SUCCESS;
206 if (addr.size() != value.size()) {
207 return nsukitStatus_t::NSUKIT_STATUS_INVALID_VALUE;
208 }
209 auto _a = addr.begin();
210 auto _v = value.begin();
211
212 while (_a != addr.end() && _v != value.end()) {
213 res |= cmd_itf_->read(*_a, *_v);
214 _a++;
215 _v++;
216 }
217 return res;
218}
219
222 auto padding_len = (nsuRegValue_t)(std::ceil((float )length/(float )reg_len)*(float)reg_len);
223 RegPack head = {0x5F5F5F5F, 0x31001010, 0x00000000, padding_len+6*4, addr, padding_len};
224 auto buf = (nsuCharBuf_p ) malloc(sizeof(RegPack)+padding_len);
225 memcpy(buf, &head, sizeof(RegPack));
226 memcpy(buf+sizeof(RegPack), value, length);
227 if (padding_len > length) memset(buf+sizeof(RegPack)+length, 0, padding_len-length);
228
229 auto res = cmd_itf_->send_bytes(buf, sizeof(RegPack)+padding_len);
230 free(buf);
231
232 char r_head[16];
233 res |= cmd_itf_->recv_bytes(16, r_head);
234 memcpy(&head, r_head, 16);
235 res |= cmd_itf_->recv_bytes(head.length-16, r_head);
236 if (*(nsuRegValue_t *)r_head!=0) {
237 res |= nsukitStatus_t::NSUKIT_STATUS_ITF_FAIL;
238 }
239 return res;
240}
241
244 auto padding_len = (nsuRegValue_t)(std::ceil((float )length/(float )reg_len)*(float)reg_len);
245 RegPack head = {0x5F5F5F5F, 0x31001011, 0x00000000, 24, addr, padding_len};
246 auto res = cmd_itf_->send_bytes((nsuCharBuf_p )&head, sizeof(RegPack));
247
248 auto buf = (nsuCharBuf_p ) malloc(sizeof(RegPack)+padding_len);
249 res |= cmd_itf_->recv_bytes(sizeof(RegPack)+padding_len-4, buf);
250 if (*(nsuRegValue_t *)(buf+16)!=0) {
251 res |= nsukitStatus_t::NSUKIT_STATUS_ITF_FAIL;
252 DEBUG_PRINT_CLASS("cmd result!=0");
253 }
254 memcpy(value, buf+4*20, padding_len);
255 free(buf);
256 return res;
257}
258
261 auto padding_len = (nsuRegValue_t)(std::ceil((float )length/(float )reg_len)*(float)reg_len);
262 RegPack head = {0x5F5F5F5F, 0x31001020, 0x00000000, padding_len+6*4, addr, padding_len};
263 auto buf = (nsuCharBuf_p ) malloc(sizeof(RegPack)+padding_len);
264 memcpy(buf, &head, sizeof(RegPack));
265 memcpy(buf+sizeof(RegPack), value, length);
266 if (padding_len > length) memset(buf+sizeof(RegPack)+length, 0, padding_len-length);
267
268 auto res = cmd_itf_->send_bytes(buf, sizeof(RegPack)+padding_len);
269 free(buf);
270
271 char r_head[16];
272 res |= cmd_itf_->recv_bytes(16, r_head);
273 memcpy(&head, r_head, 16);
274 res |= cmd_itf_->recv_bytes(head.length-16, r_head);
275 if (*(nsuRegValue_t *)r_head!=0) {
276 res |= nsukitStatus_t::NSUKIT_STATUS_ITF_FAIL;
277 DEBUG_PRINT_CLASS("cmd result!=0");
278 }
279 return res;
280}
281
284 auto padding_len = (nsuRegValue_t)(std::ceil((float )length/(float )reg_len)*(float)reg_len);
285 RegPack head = {0x5F5F5F5F, 0x31001021, 0x00000000, 24, addr, padding_len};
286 auto res = cmd_itf_->send_bytes((nsuCharBuf_p )&head, sizeof(RegPack));
287
288 auto buf = (nsuCharBuf_p ) malloc(sizeof(RegPack)+padding_len);
289 res |= cmd_itf_->recv_bytes(sizeof(RegPack)+padding_len-4, buf);
290 if (*(nsuRegValue_t *)(buf+16)!=0) {
291 res |= nsukitStatus_t::NSUKIT_STATUS_ITF_FAIL;
292 DEBUG_PRINT_CLASS("cmd result!=0");
293 }
294 memcpy(value, buf+20, padding_len);
295 free(buf);
296 return res;
297}
virtual nsukitStatus_t recv_bytes(nsuSize_t size, nsuCharBuf_p buf)
Definition: base_itf.h:90
virtual nsukitStatus_t write(nsuRegAddr_t addr, nsuRegValue_t value)
Definition: base_itf.h:92
virtual nsukitStatus_t send_bytes(nsuBytes_t &bytes)
Definition: base_itf.h:85
virtual nsukitStatus_t read(nsuRegAddr_t addr, nsuRegValue_t *buf)
Definition: base_itf.h:96
nsukitStatus_t multi_write(std::vector< nsuRegAddr_t > &addr, std::vector< nsuRegValue_t > &value)
Definition: base_itf.cpp:10
nsukitStatus_t multi_read(std::vector< nsuRegAddr_t > &addr, std::vector< nsuRegValue_t * > &value)
Definition: base_itf.cpp:27
nsukitStatus_t increment_write(nsuRegAddr_t addr, nsuVoidBuf_p value, nsuSize_t length, nsuSize_t reg_len=NSU_REG_BWIDTH)
Definition: base_itf.cpp:45
nsukitStatus_t loop_read(nsuRegAddr_t addr, nsuSize_t length, nsuVoidBuf_p value, nsuSize_t reg_len=NSU_REG_BWIDTH)
Definition: base_itf.cpp:96
nsukitStatus_t loop_write(nsuRegAddr_t addr, nsuVoidBuf_p value, nsuSize_t length, nsuSize_t reg_len=NSU_REG_BWIDTH)
Definition: base_itf.cpp:79
nsukitStatus_t increment_read(nsuRegAddr_t addr, nsuSize_t length, nsuVoidBuf_p value, nsuSize_t reg_len=NSU_REG_BWIDTH)
Definition: base_itf.cpp:62
nsukitStatus_t increment_read(nsuRegAddr_t addr, nsuSize_t length, nsuVoidBuf_p value, nsuSize_t reg_len=NSU_REG_BWIDTH)
Definition: base_itf.cpp:243
static nsuSize_t _fmt_reg_write(nsuRegAddr_t reg, nsuRegValue_t value, nsuCharBuf_p buf)
Definition: base_itf.cpp:130
nsukitStatus_t _common_read(nsuRegAddr_t reg, nsuRegValue_t *buf)
Definition: base_itf.cpp:167
nsukitStatus_t multi_read(std::vector< nsuRegAddr_t > &addr, std::vector< nsuRegValue_t * > &value)
Definition: base_itf.cpp:204
nsukitStatus_t multi_write(std::vector< nsuRegAddr_t > &addr, std::vector< nsuRegValue_t > &value)
Definition: base_itf.cpp:188
nsukitStatus_t loop_write(nsuRegAddr_t addr, nsuVoidBuf_p value, nsuSize_t length, nsuSize_t reg_len=NSU_REG_BWIDTH)
Definition: base_itf.cpp:260
nsukitStatus_t loop_read(nsuRegAddr_t addr, nsuSize_t length, nsuVoidBuf_p value, nsuSize_t reg_len=NSU_REG_BWIDTH)
Definition: base_itf.cpp:283
nsukitStatus_t _common_write(nsuRegAddr_t reg, nsuRegValue_t value)
Definition: base_itf.cpp:149
static nsuSize_t _fmt_reg_read(nsuRegAddr_t reg, nsuCharBuf_p buf)
Definition: base_itf.cpp:112
nsukitStatus_t increment_write(nsuRegAddr_t addr, nsuVoidBuf_p value, nsuSize_t length, nsuSize_t reg_len=NSU_REG_BWIDTH)
Definition: base_itf.cpp:221
#define DEBUG_PRINT_CLASS(message)
Definition: config.h:42
nsukitStatus_t
Definition: type.h:53
DLLEXTERN typedef size_t nsuSize_t
Definition: type.h:87
DLLEXTERN typedef void * nsuVoidBuf_p
Definition: type.h:83
DLLEXTERN typedef char * nsuCharBuf_p
Definition: type.h:82
DLLEXTERN typedef uint32_t nsuRegValue_t
Definition: type.h:90
DLLEXTERN typedef uint32_t nsuRegAddr_t
Definition: type.h:89