1 /*
2  * Copyright (C) 2016 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #ifndef __NANOHUBPACKET_H
18 #define __NANOHUBPACKET_H
19 
20 /**
21  * Formats and constants related to nanohub packets.  This header is intended
22  * to be shared between the host Linux kernel and the nanohub implementation.
23  */
24 #include "toolchain.h"
25 
26 #ifdef __KERNEL__
27 #include <linux/types.h>
28 #else
29 #include <hostIntf.h>
30 #include <stdint.h>
31 
32 typedef uint16_t __le16;
33 typedef uint16_t __be16;
34 typedef uint32_t __le32;
35 typedef uint32_t __be32;
36 typedef uint64_t __le64;
37 typedef uint64_t __be64;
38 #endif
39 
40 SET_PACKED_STRUCT_MODE_ON
41 struct NanohubPacket {
42     uint8_t sync;
43     __le32 seq;
44     __le32 reason;
45     uint8_t len;
46     uint8_t data[0];
47 } ATTRIBUTE_PACKED;
48 SET_PACKED_STRUCT_MODE_OFF
49 
50 SET_PACKED_STRUCT_MODE_ON
51 struct NanohubPacketFooter {
52     __le32 crc;
53 } ATTRIBUTE_PACKED;
54 SET_PACKED_STRUCT_MODE_OFF
55 
nanohubGetPacketFooter(struct NanohubPacket * packet)56 static inline struct NanohubPacketFooter *nanohubGetPacketFooter(struct NanohubPacket *packet)
57 {
58     return (struct NanohubPacketFooter *)(packet->data + packet->len);
59 }
60 
61 #define NANOHUB_PACKET_SIZE(len) \
62     (sizeof(struct NanohubPacket) + (len) + sizeof(struct NanohubPacketFooter))
63 
64 #define NANOHUB_PACKET_PAYLOAD_MAX    255
65 #define NANOHUB_PACKET_SIZE_MAX       NANOHUB_PACKET_SIZE(NANOHUB_PACKET_PAYLOAD_MAX)
66 #define NANOHUB_PACKET_SIZE_MIN       NANOHUB_PACKET_SIZE(0)
67 
68 #define NANOHUB_SYNC_BYTE             0x31
69 
70 #define NANOHUB_PREAMBLE_BYTE         0xFF
71 #define NANOHUB_ACK_PREAMBLE_LEN      16
72 #define NANOHUB_PAYLOAD_PREAMBLE_LEN  512
73 #define NANOHUB_RSA_KEY_CHUNK_LEN     64
74 
75 #define NANOHUB_INT_BOOT_COMPLETE     0
76 #define NANOHUB_INT_WAKE_COMPLETE     0
77 #define NANOHUB_INT_WAKEUP            1
78 #define NANOHUB_INT_NONWAKEUP         2
79 #define NANOHUB_INT_CMD_WAIT          3
80 
81 #define NANOHUB_REASON_ACK                    0x00000000
82 #define NANOHUB_REASON_NAK                    0x00000001
83 #define NANOHUB_REASON_NAK_BUSY               0x00000002
84 
85 /**
86  * INFORMATIONAL
87  */
88 
89 #define NANOHUB_REASON_GET_OS_HW_VERSIONS     0x00001000
90 #if defined(__GNUC__)
91 SET_PACKED_STRUCT_MODE_ON
92 struct NanohubOsHwVersionsRequest {
93 } ATTRIBUTE_PACKED;
94 SET_PACKED_STRUCT_MODE_OFF
95 #endif
96 
97 SET_PACKED_STRUCT_MODE_ON
98 struct NanohubOsHwVersionsResponse {
99     __le16 hwType;
100     __le16 hwVer;
101     __le16 blVer;
102     __le16 osVer;
103     __le32 variantVer;
104 } ATTRIBUTE_PACKED;
105 SET_PACKED_STRUCT_MODE_OFF
106 
107 #define NANOHUB_REASON_GET_APP_VERSIONS       0x00001001
108 
109 SET_PACKED_STRUCT_MODE_ON
110 struct NanohubAppVersionsRequest {
111     __le64 appId;
112 } ATTRIBUTE_PACKED;
113 SET_PACKED_STRUCT_MODE_OFF
114 
115 SET_PACKED_STRUCT_MODE_ON
116 struct NanohubAppVersionsResponse {
117     __le32 appVer;
118 } ATTRIBUTE_PACKED;
119 SET_PACKED_STRUCT_MODE_OFF
120 
121 #define NANOHUB_REASON_QUERY_APP_INFO         0x00001002
122 
123 SET_PACKED_STRUCT_MODE_ON
124 struct NanohubAppInfoRequest {
125     __le32 appIdx;
126 } ATTRIBUTE_PACKED;
127 SET_PACKED_STRUCT_MODE_OFF
128 
129 SET_PACKED_STRUCT_MODE_ON
130 struct NanohubAppInfoResponse {
131     __le64 appId;
132     __le32 appVer;
133     __le32 appSize;
134 } ATTRIBUTE_PACKED;
135 SET_PACKED_STRUCT_MODE_OFF
136 
137 #define NANOHUB_REASON_START_FIRMWARE_UPLOAD  0x00001040
138 
139 SET_PACKED_STRUCT_MODE_ON
140 struct NanohubStartFirmwareUploadRequest {
141     __le32 size;
142     __le32 crc;
143     uint8_t type;
144 } ATTRIBUTE_PACKED;
145 SET_PACKED_STRUCT_MODE_OFF
146 
147 SET_PACKED_STRUCT_MODE_ON
148 struct NanohubStartFirmwareUploadResponse {
149     uint8_t accepted;
150 } ATTRIBUTE_PACKED;
151 SET_PACKED_STRUCT_MODE_OFF
152 
153 #define NANOHUB_REASON_FIRMWARE_CHUNK         0x00001041
154 
155 SET_PACKED_STRUCT_MODE_ON
156 struct NanohubFirmwareChunkRequest {
157     __le32 offset;
158     uint8_t data[NANOHUB_PACKET_PAYLOAD_MAX-sizeof(__le32)];
159 } ATTRIBUTE_PACKED;
160 SET_PACKED_STRUCT_MODE_OFF
161 
162 enum NanohubFirmwareChunkReply {
163     NANOHUB_FIRMWARE_CHUNK_REPLY_ACCEPTED = 0,
164     NANOHUB_FIRMWARE_CHUNK_REPLY_WAIT,
165     NANOHUB_FIRMWARE_CHUNK_REPLY_RESEND,
166     NANOHUB_FIRMWARE_CHUNK_REPLY_RESTART,
167     NANOHUB_FIRMWARE_CHUNK_REPLY_CANCEL,
168     NANOHUB_FIRMWARE_CHUNK_REPLY_CANCEL_NO_RETRY,
169     NANOHUB_FIRMWARE_CHUNK_REPLY_NO_SPACE,
170 };
171 
172 SET_PACKED_STRUCT_MODE_ON
173 struct NanohubFirmwareChunkResponse {
174     uint8_t chunkReply;
175 } ATTRIBUTE_PACKED;
176 SET_PACKED_STRUCT_MODE_OFF
177 
178 #define NANOHUB_REASON_FINISH_FIRMWARE_UPLOAD 0x00001042
179 
180 #if defined(__GNUC__)
181 SET_PACKED_STRUCT_MODE_ON
182 struct NanohubFinishFirmwareUploadRequest {
183 } ATTRIBUTE_PACKED;
184 SET_PACKED_STRUCT_MODE_OFF
185 #endif
186 
187 enum NanohubFirmwareUploadReply {
188     NANOHUB_FIRMWARE_UPLOAD_SUCCESS = 0,
189     NANOHUB_FIRMWARE_UPLOAD_PROCESSING,
190     NANOHUB_FIRMWARE_UPLOAD_WAITING_FOR_DATA,
191     NANOHUB_FIRMWARE_UPLOAD_APP_SEC_KEY_NOT_FOUND,
192     NANOHUB_FIRMWARE_UPLOAD_APP_SEC_HEADER_ERROR,
193     NANOHUB_FIRMWARE_UPLOAD_APP_SEC_TOO_MUCH_DATA,
194     NANOHUB_FIRMWARE_UPLOAD_APP_SEC_TOO_LITTLE_DATA,
195     NANOHUB_FIRMWARE_UPLOAD_APP_SEC_SIG_VERIFY_FAIL,
196     NANOHUB_FIRMWARE_UPLOAD_APP_SEC_SIG_DECODE_FAIL,
197     NANOHUB_FIRMWARE_UPLOAD_APP_SEC_SIG_ROOT_UNKNOWN,
198     NANOHUB_FIRMWARE_UPLOAD_APP_SEC_MEMORY_ERROR,
199     NANOHUB_FIRMWARE_UPLOAD_APP_SEC_INVALID_DATA,
200     NANOHUB_FIRMWARE_UPLOAD_APP_SEC_VERIFY_FAILED,
201     NANOHUB_FIRMWARE_UPLOAD_APP_SEC_BAD,
202 };
203 
204 SET_PACKED_STRUCT_MODE_ON
205 struct NanohubFinishFirmwareUploadResponse {
206    uint8_t uploadReply;
207 } ATTRIBUTE_PACKED;
208 SET_PACKED_STRUCT_MODE_OFF
209 
210 #define NANOHUB_REASON_GET_INTERRUPT          0x00001080
211 
212 SET_PACKED_STRUCT_MODE_ON
213 struct NanohubGetInterruptRequest {
214     uint32_t clear[HOSTINTF_MAX_INTERRUPTS/(32*sizeof(uint8_t))];
215 } ATTRIBUTE_PACKED;
216 SET_PACKED_STRUCT_MODE_OFF
217 
218 SET_PACKED_STRUCT_MODE_ON
219 struct NanohubGetInterruptResponse {
220     uint32_t interrupts[HOSTINTF_MAX_INTERRUPTS/(32*sizeof(uint8_t))];
221 } ATTRIBUTE_PACKED;
222 SET_PACKED_STRUCT_MODE_OFF
223 
224 #define NANOHUB_REASON_MASK_INTERRUPT         0x00001081
225 
226 SET_PACKED_STRUCT_MODE_ON
227 struct NanohubMaskInterruptRequest {
228     uint8_t interrupt;
229 } ATTRIBUTE_PACKED;
230 SET_PACKED_STRUCT_MODE_OFF
231 
232 SET_PACKED_STRUCT_MODE_ON
233 struct NanohubMaskInterruptResponse {
234     uint8_t accepted;
235 } ATTRIBUTE_PACKED;
236 SET_PACKED_STRUCT_MODE_OFF
237 
238 #define NANOHUB_REASON_UNMASK_INTERRUPT       0x00001082
239 
240 SET_PACKED_STRUCT_MODE_ON
241 struct NanohubUnmaskInterruptRequest {
242     uint8_t interrupt;
243 } ATTRIBUTE_PACKED;
244 SET_PACKED_STRUCT_MODE_OFF
245 
246 SET_PACKED_STRUCT_MODE_ON
247 struct NanohubUnmaskInterruptResponse {
248     uint8_t accepted;
249 } ATTRIBUTE_PACKED;
250 SET_PACKED_STRUCT_MODE_OFF
251 
252 #define NANOHUB_REASON_READ_EVENT             0x00001090
253 
254 SET_PACKED_STRUCT_MODE_ON
255 struct NanohubReadEventRequest {
256     __le64 apBootTime;
257 } ATTRIBUTE_PACKED;
258 SET_PACKED_STRUCT_MODE_OFF
259 
260 SET_PACKED_STRUCT_MODE_ON
261 struct NanohubReadEventResponse {
262     __le32 evtType;
263     uint8_t evtData[NANOHUB_PACKET_PAYLOAD_MAX - sizeof(__le32)];
264 } ATTRIBUTE_PACKED;
265 SET_PACKED_STRUCT_MODE_OFF
266 
267 #define NANOHUB_REASON_WRITE_EVENT            0x00001091
268 
269 SET_PACKED_STRUCT_MODE_ON
270 struct NanohubWriteEventRequest {
271     __le32 evtType;
272     uint8_t evtData[NANOHUB_PACKET_PAYLOAD_MAX - sizeof(__le32)];
273 } ATTRIBUTE_PACKED;
274 SET_PACKED_STRUCT_MODE_OFF
275 
276 SET_PACKED_STRUCT_MODE_ON
277 struct NanohubWriteEventResponse {
278     uint8_t accepted;
279 } ATTRIBUTE_PACKED;
280 SET_PACKED_STRUCT_MODE_OFF
281 
282 // this behaves more stable w.r.t. endianness than bit field
283 // this is setting byte fields in MgmtStatus response
284 // the high-order bit, if set, is indication of counter overflow
285 #define SET_COUNTER(counter, val) (counter = (val & 0x7F) | (val > 0x7F ? 0x80 : 0))
286 
287 SET_PACKED_STRUCT_MODE_ON
288 struct MgmtStatus {
289     union {
290         __le32 value;
291         // NOTE: union fields are accessed in CPU native mode
292         struct {
293             uint8_t app;
294             uint8_t task;
295             uint8_t op;
296             uint8_t erase;
297         } ATTRIBUTE_PACKED;
298     };
299 } ATTRIBUTE_PACKED;
300 SET_PACKED_STRUCT_MODE_OFF
301 
302 #ifdef LEGACY_HAL_ENABLED
303 
304 SET_PACKED_STRUCT_MODE_ON
305 struct NanohubHalLegacyHdr {
306     uint64_t appId;
307     uint8_t len;
308     uint8_t msg;
309 } ATTRIBUTE_PACKED;
310 SET_PACKED_STRUCT_MODE_OFF
311 
312 #define NANOHUB_HAL_LEGACY_EXT_APPS_ON      0
313 #define NANOHUB_HAL_LEGACY_EXT_APPS_OFF     1
314 #define NANOHUB_HAL_LEGACY_EXT_APP_DELETE   2
315 
316 SET_PACKED_STRUCT_MODE_ON
317 struct NanohubHalLegacyMgmtRx {
318     __le64 appId;
319     struct MgmtStatus stat;
320 } ATTRIBUTE_PACKED;
321 SET_PACKED_STRUCT_MODE_OFF
322 
323 SET_PACKED_STRUCT_MODE_ON
324 struct NanohubHalLegacyMgmtTx {
325     struct NanohubHalLegacyHdr hdr;
326     __le32 status;
327 } ATTRIBUTE_PACKED;
328 SET_PACKED_STRUCT_MODE_OFF
329 
330 #define NANOHUB_HAL_LEGACY_QUERY_MEMINFO    3
331 #define NANOHUB_HAL_LEGACY_QUERY_APPS       4
332 
333 SET_PACKED_STRUCT_MODE_ON
334 struct NanohubHalLegacyQueryAppsRx {
335     __le32 idx;
336 } ATTRIBUTE_PACKED;
337 SET_PACKED_STRUCT_MODE_OFF
338 
339 SET_PACKED_STRUCT_MODE_ON
340 struct NanohubHalLegacyQueryAppsTx {
341     struct NanohubHalLegacyHdr hdr;
342     __le64 appId;
343     __le32 version;
344     __le32 flashUse;
345     __le32 ramUse;
346 } ATTRIBUTE_PACKED;
347 SET_PACKED_STRUCT_MODE_OFF
348 
349 #define NANOHUB_HAL_LEGACY_QUERY_RSA_KEYS   5
350 
351 SET_PACKED_STRUCT_MODE_ON
352 struct NanohubHalLegacyQueryRsaKeysRx {
353     __le32 offset;
354 } ATTRIBUTE_PACKED;
355 SET_PACKED_STRUCT_MODE_OFF
356 
357 SET_PACKED_STRUCT_MODE_ON
358 struct NanohubHalLegacyQueryRsaKeysTx {
359     struct NanohubHalLegacyHdr hdr;
360     uint8_t data[];
361 } ATTRIBUTE_PACKED;
362 SET_PACKED_STRUCT_MODE_OFF
363 
364 #define NANOHUB_HAL_LEGACY_START_UPLOAD     6
365 
366 SET_PACKED_STRUCT_MODE_ON
367 struct NanohubHalLegacyStartUploadRx {
368     uint8_t isOs;
369     __le32 length;
370 } ATTRIBUTE_PACKED;
371 SET_PACKED_STRUCT_MODE_OFF
372 
373 SET_PACKED_STRUCT_MODE_ON
374 struct NanohubHalLegacyStartUploadTx {
375     struct NanohubHalLegacyHdr hdr;
376     uint8_t success;
377 } ATTRIBUTE_PACKED;
378 SET_PACKED_STRUCT_MODE_OFF
379 
380 #define NANOHUB_HAL_LEGACY_CONT_UPLOAD      7
381 
382 SET_PACKED_STRUCT_MODE_ON
383 struct NanohubHalLegacyContUploadRx {
384     __le32 offset;
385     uint8_t data[];
386 } ATTRIBUTE_PACKED;
387 SET_PACKED_STRUCT_MODE_OFF
388 
389 SET_PACKED_STRUCT_MODE_ON
390 struct NanohubHalLegacyContUploadTx {
391     struct NanohubHalLegacyHdr hdr;
392     uint8_t success;
393 } ATTRIBUTE_PACKED;
394 SET_PACKED_STRUCT_MODE_OFF
395 
396 #define NANOHUB_HAL_LEGACY_FINISH_UPLOAD    8
397 
398 SET_PACKED_STRUCT_MODE_ON
399 struct NanohubHalLegacyFinishUploadTx {
400     struct NanohubHalLegacyHdr hdr;
401     uint8_t success;
402 } ATTRIBUTE_PACKED;
403 SET_PACKED_STRUCT_MODE_OFF
404 
405 #define NANOHUB_HAL_LEGACY_REBOOT           9
406 
407 SET_PACKED_STRUCT_MODE_ON
408 struct NanohubHalLegacyRebootTx {
409     struct NanohubHalLegacyHdr hdr;
410     __le32 reason;
411 } ATTRIBUTE_PACKED;
412 SET_PACKED_STRUCT_MODE_OFF
413 
414 #endif /* LEGACY_HAL_ENABLED */
415 
416 SET_PACKED_STRUCT_MODE_ON
417 struct NanohubHalHdr {
418     __le64 appId;
419     uint8_t len;
420     __le32 transactionId;
421     __le16 unused;
422 } ATTRIBUTE_PACKED;
423 SET_PACKED_STRUCT_MODE_OFF
424 
425 SET_PACKED_STRUCT_MODE_ON
426 struct NanohubHalRet {
427     uint8_t msg;
428     __le32 status;
429 } ATTRIBUTE_PACKED;
430 
431 #define NANOHUB_HAL_APP_MGMT            0x10
432 
433 SET_PACKED_STRUCT_MODE_ON
434 struct NanohubHalAppMgmtRx {
435     __le64 appId;
436     uint8_t cmd;
437 } ATTRIBUTE_PACKED;
438 SET_PACKED_STRUCT_MODE_OFF
439 
440 #define NANOHUB_HAL_APP_MGMT_START      0
441 #define NANOHUB_HAL_APP_MGMT_STOP       1
442 #define NANOHUB_HAL_APP_MGMT_UNLOAD     2
443 #define NANOHUB_HAL_APP_MGMT_DELETE     3
444 
445 SET_PACKED_STRUCT_MODE_ON
446 struct NanohubHalAppMgmtTx {
447     struct NanohubHalHdr hdr;
448     struct NanohubHalRet ret;
449     uint8_t cmd;
450     struct MgmtStatus stat;
451 } ATTRIBUTE_PACKED;
452 SET_PACKED_STRUCT_MODE_OFF
453 
454 #define NANOHUB_HAL_SYS_MGMT            0x11
455 
456 SET_PACKED_STRUCT_MODE_ON
457 struct NanohubHalSysMgmtRx {
458     uint8_t cmd;
459 } ATTRIBUTE_PACKED;
460 SET_PACKED_STRUCT_MODE_OFF
461 
462 #define NANOHUB_HAL_SYS_MGMT_ERASE      0
463 #define NANOHUB_HAL_SYS_MGMT_REBOOT     1
464 
465 SET_PACKED_STRUCT_MODE_ON
466 struct NanohubHalSysMgmtTx {
467     struct NanohubHalHdr hdr;
468     struct NanohubHalRet ret;
469     uint8_t cmd;
470 } ATTRIBUTE_PACKED;
471 SET_PACKED_STRUCT_MODE_OFF
472 
473 #define NANOHUB_HAL_APP_INFO            0x12
474 
475 SET_PACKED_STRUCT_MODE_ON
476 struct NanohubHalAppInfoRx {
477     __le32 addr;
478     uint8_t tags[HOST_HUB_CHRE_PACKET_MAX_LEN - sizeof(__le32)];
479 } ATTRIBUTE_PACKED;
480 SET_PACKED_STRUCT_MODE_OFF
481 
482 #define NANOHUB_HAL_APP_INFO_APPID          0x00
483 #define NANOHUB_HAL_APP_INFO_CRC            0x01
484 #define NANOHUB_HAL_APP_INFO_TID            0x02
485 #define NANOHUB_HAL_APP_INFO_VERSION        0x03
486 #define NANOHUB_HAL_APP_INFO_ADDR           0x04
487 #define NANOHUB_HAL_APP_INFO_SIZE           0x05
488 #define NANOHUB_HAL_APP_INFO_HEAP           0x06
489 #define NANOHUB_HAL_APP_INFO_DATA           0x07
490 #define NANOHUB_HAL_APP_INFO_BSS            0x08
491 #define NANOHUB_HAL_APP_INFO_CHRE_MAJOR     0x09
492 #define NANOHUB_HAL_APP_INFO_CHRE_MINOR     0x0A
493 #define NANOHUB_HAL_APP_INFO_END            0xFF
494 
495 SET_PACKED_STRUCT_MODE_ON
496 struct NanohubHalAppInfoTx {
497     struct NanohubHalHdr hdr;
498     struct NanohubHalRet ret;
499     uint8_t data[HOST_HUB_CHRE_PACKET_MAX_LEN - sizeof(struct NanohubHalRet)];
500 } ATTRIBUTE_PACKED;
501 SET_PACKED_STRUCT_MODE_OFF
502 
503 #define NANOHUB_HAL_SYS_INFO            0x13
504 
505 SET_PACKED_STRUCT_MODE_ON
506 struct NanohubHalSysInfoRx {
507     uint8_t tags[HOST_HUB_CHRE_PACKET_MAX_LEN];
508 } ATTRIBUTE_PACKED;
509 SET_PACKED_STRUCT_MODE_OFF
510 
511 #define NANOHUB_HAL_SYS_INFO_HEAP_FREE      0x0F
512 #define NANOHUB_HAL_SYS_INFO_RAM_SIZE       0x12
513 #define NANOHUB_HAL_SYS_INFO_EEDATA_SIZE    0x13
514 #define NANOHUB_HAL_SYS_INFO_EEDATA_FREE    0x14
515 #define NANOHUB_HAL_SYS_INFO_CODE_SIZE      0x15
516 #define NANOHUB_HAL_SYS_INFO_CODE_FREE      0x16
517 #define NANOHUB_HAL_SYS_INFO_SHARED_SIZE    0x17
518 #define NANOHUB_HAL_SYS_INFO_SHARED_FREE    0x18
519 #define NANOHUB_HAL_SYS_INFO_END            0xFF
520 
521 SET_PACKED_STRUCT_MODE_ON
522 struct NanohubHalSysInfoTx {
523     struct NanohubHalHdr hdr;
524     struct NanohubHalRet ret;
525     uint8_t data[HOST_HUB_CHRE_PACKET_MAX_LEN - sizeof(struct NanohubHalRet)];
526 } ATTRIBUTE_PACKED;
527 SET_PACKED_STRUCT_MODE_OFF
528 
529 #define NANOHUB_HAL_KEY_INFO            0x14
530 
531 SET_PACKED_STRUCT_MODE_ON
532 struct NanohubHalKeyInfoRx {
533     uint32_t keyNum;
534     uint32_t dataOffset;
535 } ATTRIBUTE_PACKED;
536 SET_PACKED_STRUCT_MODE_OFF
537 
538 SET_PACKED_STRUCT_MODE_ON
539 struct NanohubHalKeyInfoTx {
540     struct NanohubHalHdr hdr;
541     struct NanohubHalRet ret;
542     uint32_t keyLength;
543     uint8_t data[NANOHUB_RSA_KEY_CHUNK_LEN];
544 } ATTRIBUTE_PACKED;
545 SET_PACKED_STRUCT_MODE_OFF
546 
547 #define NANOHUB_HAL_START_UPLOAD        0x16
548 
549 SET_PACKED_STRUCT_MODE_ON
550 struct NanohubHalStartUploadRx {
551     uint8_t isOs;
552     __le32 length;
553 } ATTRIBUTE_PACKED;
554 SET_PACKED_STRUCT_MODE_OFF
555 
556 SET_PACKED_STRUCT_MODE_ON
557 struct NanohubHalStartUploadTx {
558     struct NanohubHalHdr hdr;
559     struct NanohubHalRet ret;
560 } ATTRIBUTE_PACKED;
561 SET_PACKED_STRUCT_MODE_OFF
562 
563 #define NANOHUB_HAL_CONT_UPLOAD         0x17
564 
565 SET_PACKED_STRUCT_MODE_ON
566 struct NanohubHalContUploadRx {
567     __le32 offset;
568     uint8_t data[HOST_HUB_CHRE_PACKET_MAX_LEN-sizeof(__le32)];
569 } ATTRIBUTE_PACKED;
570 SET_PACKED_STRUCT_MODE_ON
571 
572 SET_PACKED_STRUCT_MODE_ON
573 struct NanohubHalContUploadTx {
574     struct NanohubHalHdr hdr;
575     struct NanohubHalRet ret;
576 } ATTRIBUTE_PACKED;
577 SET_PACKED_STRUCT_MODE_OFF
578 
579 #define NANOHUB_HAL_FINISH_UPLOAD       0x18
580 
581 SET_PACKED_STRUCT_MODE_ON
582 struct NanohubHalFinishUploadTx {
583     struct NanohubHalHdr hdr;
584     struct NanohubHalRet ret;
585     __le32 addr;
586     __le32 crc;
587 } ATTRIBUTE_PACKED;
588 SET_PACKED_STRUCT_MODE_OFF
589 
590 #endif /* __NANOHUBPACKET_H */
591