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