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
32typedef uint16_t __le16;
33typedef uint16_t __be16;
34typedef uint32_t __le32;
35typedef uint32_t __be32;
36typedef uint64_t __le64;
37typedef uint64_t __be64;
38#endif
39
40SET_PACKED_STRUCT_MODE_ON
41struct NanohubPacket {
42    uint8_t sync;
43    __le32 seq;
44    __le32 reason;
45    uint8_t len;
46    uint8_t data[0];
47} ATTRIBUTE_PACKED;
48SET_PACKED_STRUCT_MODE_OFF
49
50SET_PACKED_STRUCT_MODE_ON
51struct NanohubPacketFooter {
52    __le32 crc;
53} ATTRIBUTE_PACKED;
54SET_PACKED_STRUCT_MODE_OFF
55
56static 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__)
91SET_PACKED_STRUCT_MODE_ON
92struct NanohubOsHwVersionsRequest {
93} ATTRIBUTE_PACKED;
94SET_PACKED_STRUCT_MODE_OFF
95#endif
96
97SET_PACKED_STRUCT_MODE_ON
98struct NanohubOsHwVersionsResponse {
99    __le16 hwType;
100    __le16 hwVer;
101    __le16 blVer;
102    __le16 osVer;
103    __le32 variantVer;
104} ATTRIBUTE_PACKED;
105SET_PACKED_STRUCT_MODE_OFF
106
107#define NANOHUB_REASON_GET_APP_VERSIONS       0x00001001
108
109SET_PACKED_STRUCT_MODE_ON
110struct NanohubAppVersionsRequest {
111    __le64 appId;
112} ATTRIBUTE_PACKED;
113SET_PACKED_STRUCT_MODE_OFF
114
115SET_PACKED_STRUCT_MODE_ON
116struct NanohubAppVersionsResponse {
117    __le32 appVer;
118} ATTRIBUTE_PACKED;
119SET_PACKED_STRUCT_MODE_OFF
120
121#define NANOHUB_REASON_QUERY_APP_INFO         0x00001002
122
123SET_PACKED_STRUCT_MODE_ON
124struct NanohubAppInfoRequest {
125    __le32 appIdx;
126} ATTRIBUTE_PACKED;
127SET_PACKED_STRUCT_MODE_OFF
128
129SET_PACKED_STRUCT_MODE_ON
130struct NanohubAppInfoResponse {
131    __le64 appId;
132    __le32 appVer;
133    __le32 appSize;
134} ATTRIBUTE_PACKED;
135SET_PACKED_STRUCT_MODE_OFF
136
137#define NANOHUB_REASON_START_FIRMWARE_UPLOAD  0x00001040
138
139SET_PACKED_STRUCT_MODE_ON
140struct NanohubStartFirmwareUploadRequest {
141    __le32 size;
142    __le32 crc;
143    uint8_t type;
144} ATTRIBUTE_PACKED;
145SET_PACKED_STRUCT_MODE_OFF
146
147SET_PACKED_STRUCT_MODE_ON
148struct NanohubStartFirmwareUploadResponse {
149    uint8_t accepted;
150} ATTRIBUTE_PACKED;
151SET_PACKED_STRUCT_MODE_OFF
152
153#define NANOHUB_REASON_FIRMWARE_CHUNK         0x00001041
154
155SET_PACKED_STRUCT_MODE_ON
156struct NanohubFirmwareChunkRequest {
157    __le32 offset;
158    uint8_t data[NANOHUB_PACKET_PAYLOAD_MAX-sizeof(__le32)];
159} ATTRIBUTE_PACKED;
160SET_PACKED_STRUCT_MODE_OFF
161
162enum 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
172SET_PACKED_STRUCT_MODE_ON
173struct NanohubFirmwareChunkResponse {
174    uint8_t chunkReply;
175} ATTRIBUTE_PACKED;
176SET_PACKED_STRUCT_MODE_OFF
177
178#define NANOHUB_REASON_FINISH_FIRMWARE_UPLOAD 0x00001042
179
180#if defined(__GNUC__)
181SET_PACKED_STRUCT_MODE_ON
182struct NanohubFinishFirmwareUploadRequest {
183} ATTRIBUTE_PACKED;
184SET_PACKED_STRUCT_MODE_OFF
185#endif
186
187enum 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
204SET_PACKED_STRUCT_MODE_ON
205struct NanohubFinishFirmwareUploadResponse {
206   uint8_t uploadReply;
207} ATTRIBUTE_PACKED;
208SET_PACKED_STRUCT_MODE_OFF
209
210#define NANOHUB_REASON_GET_INTERRUPT          0x00001080
211
212SET_PACKED_STRUCT_MODE_ON
213struct NanohubGetInterruptRequest {
214    uint32_t clear[HOSTINTF_MAX_INTERRUPTS/(32*sizeof(uint8_t))];
215} ATTRIBUTE_PACKED;
216SET_PACKED_STRUCT_MODE_OFF
217
218SET_PACKED_STRUCT_MODE_ON
219struct NanohubGetInterruptResponse {
220    uint32_t interrupts[HOSTINTF_MAX_INTERRUPTS/(32*sizeof(uint8_t))];
221} ATTRIBUTE_PACKED;
222SET_PACKED_STRUCT_MODE_OFF
223
224#define NANOHUB_REASON_MASK_INTERRUPT         0x00001081
225
226SET_PACKED_STRUCT_MODE_ON
227struct NanohubMaskInterruptRequest {
228    uint8_t interrupt;
229} ATTRIBUTE_PACKED;
230SET_PACKED_STRUCT_MODE_OFF
231
232SET_PACKED_STRUCT_MODE_ON
233struct NanohubMaskInterruptResponse {
234    uint8_t accepted;
235} ATTRIBUTE_PACKED;
236SET_PACKED_STRUCT_MODE_OFF
237
238#define NANOHUB_REASON_UNMASK_INTERRUPT       0x00001082
239
240SET_PACKED_STRUCT_MODE_ON
241struct NanohubUnmaskInterruptRequest {
242    uint8_t interrupt;
243} ATTRIBUTE_PACKED;
244SET_PACKED_STRUCT_MODE_OFF
245
246SET_PACKED_STRUCT_MODE_ON
247struct NanohubUnmaskInterruptResponse {
248    uint8_t accepted;
249} ATTRIBUTE_PACKED;
250SET_PACKED_STRUCT_MODE_OFF
251
252#define NANOHUB_REASON_READ_EVENT             0x00001090
253
254SET_PACKED_STRUCT_MODE_ON
255struct NanohubReadEventRequest {
256    __le64 apBootTime;
257} ATTRIBUTE_PACKED;
258SET_PACKED_STRUCT_MODE_OFF
259
260SET_PACKED_STRUCT_MODE_ON
261struct NanohubReadEventResponse {
262    __le32 evtType;
263    uint8_t evtData[NANOHUB_PACKET_PAYLOAD_MAX - sizeof(__le32)];
264} ATTRIBUTE_PACKED;
265SET_PACKED_STRUCT_MODE_OFF
266
267#define NANOHUB_REASON_WRITE_EVENT            0x00001091
268
269SET_PACKED_STRUCT_MODE_ON
270struct NanohubWriteEventRequest {
271    __le32 evtType;
272    uint8_t evtData[NANOHUB_PACKET_PAYLOAD_MAX - sizeof(__le32)];
273} ATTRIBUTE_PACKED;
274SET_PACKED_STRUCT_MODE_OFF
275
276SET_PACKED_STRUCT_MODE_ON
277struct NanohubWriteEventResponse {
278    uint8_t accepted;
279} ATTRIBUTE_PACKED;
280SET_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
287SET_PACKED_STRUCT_MODE_ON
288struct 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;
300SET_PACKED_STRUCT_MODE_OFF
301
302#ifdef LEGACY_HAL_ENABLED
303
304SET_PACKED_STRUCT_MODE_ON
305struct NanohubHalLegacyHdr {
306    uint64_t appId;
307    uint8_t len;
308    uint8_t msg;
309} ATTRIBUTE_PACKED;
310SET_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
316SET_PACKED_STRUCT_MODE_ON
317struct NanohubHalLegacyMgmtRx {
318    __le64 appId;
319    struct MgmtStatus stat;
320} ATTRIBUTE_PACKED;
321SET_PACKED_STRUCT_MODE_OFF
322
323SET_PACKED_STRUCT_MODE_ON
324struct NanohubHalLegacyMgmtTx {
325    struct NanohubHalLegacyHdr hdr;
326    __le32 status;
327} ATTRIBUTE_PACKED;
328SET_PACKED_STRUCT_MODE_OFF
329
330#define NANOHUB_HAL_LEGACY_QUERY_MEMINFO    3
331#define NANOHUB_HAL_LEGACY_QUERY_APPS       4
332
333SET_PACKED_STRUCT_MODE_ON
334struct NanohubHalLegacyQueryAppsRx {
335    __le32 idx;
336} ATTRIBUTE_PACKED;
337SET_PACKED_STRUCT_MODE_OFF
338
339SET_PACKED_STRUCT_MODE_ON
340struct NanohubHalLegacyQueryAppsTx {
341    struct NanohubHalLegacyHdr hdr;
342    __le64 appId;
343    __le32 version;
344    __le32 flashUse;
345    __le32 ramUse;
346} ATTRIBUTE_PACKED;
347SET_PACKED_STRUCT_MODE_OFF
348
349#define NANOHUB_HAL_LEGACY_QUERY_RSA_KEYS   5
350
351SET_PACKED_STRUCT_MODE_ON
352struct NanohubHalLegacyQueryRsaKeysRx {
353    __le32 offset;
354} ATTRIBUTE_PACKED;
355SET_PACKED_STRUCT_MODE_OFF
356
357SET_PACKED_STRUCT_MODE_ON
358struct NanohubHalLegacyQueryRsaKeysTx {
359    struct NanohubHalLegacyHdr hdr;
360    uint8_t data[];
361} ATTRIBUTE_PACKED;
362SET_PACKED_STRUCT_MODE_OFF
363
364#define NANOHUB_HAL_LEGACY_START_UPLOAD     6
365
366SET_PACKED_STRUCT_MODE_ON
367struct NanohubHalLegacyStartUploadRx {
368    uint8_t isOs;
369    __le32 length;
370} ATTRIBUTE_PACKED;
371SET_PACKED_STRUCT_MODE_OFF
372
373SET_PACKED_STRUCT_MODE_ON
374struct NanohubHalLegacyStartUploadTx {
375    struct NanohubHalLegacyHdr hdr;
376    uint8_t success;
377} ATTRIBUTE_PACKED;
378SET_PACKED_STRUCT_MODE_OFF
379
380#define NANOHUB_HAL_LEGACY_CONT_UPLOAD      7
381
382SET_PACKED_STRUCT_MODE_ON
383struct NanohubHalLegacyContUploadRx {
384    __le32 offset;
385    uint8_t data[];
386} ATTRIBUTE_PACKED;
387SET_PACKED_STRUCT_MODE_OFF
388
389SET_PACKED_STRUCT_MODE_ON
390struct NanohubHalLegacyContUploadTx {
391    struct NanohubHalLegacyHdr hdr;
392    uint8_t success;
393} ATTRIBUTE_PACKED;
394SET_PACKED_STRUCT_MODE_OFF
395
396#define NANOHUB_HAL_LEGACY_FINISH_UPLOAD    8
397
398SET_PACKED_STRUCT_MODE_ON
399struct NanohubHalLegacyFinishUploadTx {
400    struct NanohubHalLegacyHdr hdr;
401    uint8_t success;
402} ATTRIBUTE_PACKED;
403SET_PACKED_STRUCT_MODE_OFF
404
405#define NANOHUB_HAL_LEGACY_REBOOT           9
406
407SET_PACKED_STRUCT_MODE_ON
408struct NanohubHalLegacyRebootTx {
409    struct NanohubHalLegacyHdr hdr;
410    __le32 reason;
411} ATTRIBUTE_PACKED;
412SET_PACKED_STRUCT_MODE_OFF
413
414#endif /* LEGACY_HAL_ENABLED */
415
416SET_PACKED_STRUCT_MODE_ON
417struct NanohubHalHdr {
418    __le64 appId;
419    uint8_t len;
420    __le32 transactionId;
421    __le16 unused;
422} ATTRIBUTE_PACKED;
423SET_PACKED_STRUCT_MODE_OFF
424
425SET_PACKED_STRUCT_MODE_ON
426struct NanohubHalRet {
427    uint8_t msg;
428    __le32 status;
429} ATTRIBUTE_PACKED;
430
431#define NANOHUB_HAL_APP_MGMT            0x10
432
433SET_PACKED_STRUCT_MODE_ON
434struct NanohubHalAppMgmtRx {
435    __le64 appId;
436    uint8_t cmd;
437} ATTRIBUTE_PACKED;
438SET_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
445SET_PACKED_STRUCT_MODE_ON
446struct NanohubHalAppMgmtTx {
447    struct NanohubHalHdr hdr;
448    struct NanohubHalRet ret;
449    uint8_t cmd;
450    struct MgmtStatus stat;
451} ATTRIBUTE_PACKED;
452SET_PACKED_STRUCT_MODE_OFF
453
454#define NANOHUB_HAL_SYS_MGMT            0x11
455
456SET_PACKED_STRUCT_MODE_ON
457struct NanohubHalSysMgmtRx {
458    uint8_t cmd;
459} ATTRIBUTE_PACKED;
460SET_PACKED_STRUCT_MODE_OFF
461
462#define NANOHUB_HAL_SYS_MGMT_ERASE      0
463#define NANOHUB_HAL_SYS_MGMT_REBOOT     1
464
465SET_PACKED_STRUCT_MODE_ON
466struct NanohubHalSysMgmtTx {
467    struct NanohubHalHdr hdr;
468    struct NanohubHalRet ret;
469    uint8_t cmd;
470} ATTRIBUTE_PACKED;
471SET_PACKED_STRUCT_MODE_OFF
472
473#define NANOHUB_HAL_APP_INFO            0x12
474
475SET_PACKED_STRUCT_MODE_ON
476struct NanohubHalAppInfoRx {
477    __le32 addr;
478    uint8_t tags[HOST_HUB_CHRE_PACKET_MAX_LEN - sizeof(__le32)];
479} ATTRIBUTE_PACKED;
480SET_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
495SET_PACKED_STRUCT_MODE_ON
496struct 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;
501SET_PACKED_STRUCT_MODE_OFF
502
503#define NANOHUB_HAL_SYS_INFO            0x13
504
505SET_PACKED_STRUCT_MODE_ON
506struct NanohubHalSysInfoRx {
507    uint8_t tags[HOST_HUB_CHRE_PACKET_MAX_LEN];
508} ATTRIBUTE_PACKED;
509SET_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
521SET_PACKED_STRUCT_MODE_ON
522struct 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;
527SET_PACKED_STRUCT_MODE_OFF
528
529#define NANOHUB_HAL_KEY_INFO            0x14
530
531SET_PACKED_STRUCT_MODE_ON
532struct NanohubHalKeyInfoRx {
533    uint32_t keyNum;
534    uint32_t dataOffset;
535} ATTRIBUTE_PACKED;
536SET_PACKED_STRUCT_MODE_OFF
537
538SET_PACKED_STRUCT_MODE_ON
539struct 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;
545SET_PACKED_STRUCT_MODE_OFF
546
547#define NANOHUB_HAL_START_UPLOAD        0x16
548
549SET_PACKED_STRUCT_MODE_ON
550struct NanohubHalStartUploadRx {
551    uint8_t isOs;
552    __le32 length;
553} ATTRIBUTE_PACKED;
554SET_PACKED_STRUCT_MODE_OFF
555
556SET_PACKED_STRUCT_MODE_ON
557struct NanohubHalStartUploadTx {
558    struct NanohubHalHdr hdr;
559    struct NanohubHalRet ret;
560} ATTRIBUTE_PACKED;
561SET_PACKED_STRUCT_MODE_OFF
562
563#define NANOHUB_HAL_CONT_UPLOAD         0x17
564
565SET_PACKED_STRUCT_MODE_ON
566struct NanohubHalContUploadRx {
567    __le32 offset;
568    uint8_t data[HOST_HUB_CHRE_PACKET_MAX_LEN-sizeof(__le32)];
569} ATTRIBUTE_PACKED;
570SET_PACKED_STRUCT_MODE_ON
571
572SET_PACKED_STRUCT_MODE_ON
573struct NanohubHalContUploadTx {
574    struct NanohubHalHdr hdr;
575    struct NanohubHalRet ret;
576} ATTRIBUTE_PACKED;
577SET_PACKED_STRUCT_MODE_OFF
578
579#define NANOHUB_HAL_FINISH_UPLOAD       0x18
580
581SET_PACKED_STRUCT_MODE_ON
582struct NanohubHalFinishUploadTx {
583    struct NanohubHalHdr hdr;
584    struct NanohubHalRet ret;
585    __le32 addr;
586    __le32 crc;
587} ATTRIBUTE_PACKED;
588SET_PACKED_STRUCT_MODE_OFF
589
590#endif /* __NANOHUBPACKET_H */
591