/* * Copyright (C) 2016 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef __NANOHUBPACKET_H #define __NANOHUBPACKET_H /** * Formats and constants related to nanohub packets. This header is intended * to be shared between the host Linux kernel and the nanohub implementation. */ #include "toolchain.h" #ifdef __KERNEL__ #include <linux/types.h> #else #include <hostIntf.h> #include <stdint.h> typedef uint16_t __le16; typedef uint16_t __be16; typedef uint32_t __le32; typedef uint32_t __be32; typedef uint64_t __le64; typedef uint64_t __be64; #endif SET_PACKED_STRUCT_MODE_ON struct NanohubPacket { uint8_t sync; __le32 seq; __le32 reason; uint8_t len; uint8_t data[0]; } ATTRIBUTE_PACKED; SET_PACKED_STRUCT_MODE_OFF SET_PACKED_STRUCT_MODE_ON struct NanohubPacketFooter { __le32 crc; } ATTRIBUTE_PACKED; SET_PACKED_STRUCT_MODE_OFF static inline struct NanohubPacketFooter *nanohubGetPacketFooter(struct NanohubPacket *packet) { return (struct NanohubPacketFooter *)(packet->data + packet->len); } #define NANOHUB_PACKET_SIZE(len) \ (sizeof(struct NanohubPacket) + (len) + sizeof(struct NanohubPacketFooter)) #define NANOHUB_PACKET_PAYLOAD_MAX 255 #define NANOHUB_PACKET_SIZE_MAX NANOHUB_PACKET_SIZE(NANOHUB_PACKET_PAYLOAD_MAX) #define NANOHUB_PACKET_SIZE_MIN NANOHUB_PACKET_SIZE(0) #define NANOHUB_SYNC_BYTE 0x31 #define NANOHUB_PREAMBLE_BYTE 0xFF #define NANOHUB_ACK_PREAMBLE_LEN 16 #define NANOHUB_PAYLOAD_PREAMBLE_LEN 512 #define NANOHUB_RSA_KEY_CHUNK_LEN 64 #define NANOHUB_INT_BOOT_COMPLETE 0 #define NANOHUB_INT_WAKE_COMPLETE 0 #define NANOHUB_INT_WAKEUP 1 #define NANOHUB_INT_NONWAKEUP 2 #define NANOHUB_INT_CMD_WAIT 3 #define NANOHUB_REASON_ACK 0x00000000 #define NANOHUB_REASON_NAK 0x00000001 #define NANOHUB_REASON_NAK_BUSY 0x00000002 /** * INFORMATIONAL */ #define NANOHUB_REASON_GET_OS_HW_VERSIONS 0x00001000 #if defined(__GNUC__) SET_PACKED_STRUCT_MODE_ON struct NanohubOsHwVersionsRequest { } ATTRIBUTE_PACKED; SET_PACKED_STRUCT_MODE_OFF #endif SET_PACKED_STRUCT_MODE_ON struct NanohubOsHwVersionsResponse { __le16 hwType; __le16 hwVer; __le16 blVer; __le16 osVer; __le32 variantVer; } ATTRIBUTE_PACKED; SET_PACKED_STRUCT_MODE_OFF #define NANOHUB_REASON_GET_APP_VERSIONS 0x00001001 SET_PACKED_STRUCT_MODE_ON struct NanohubAppVersionsRequest { __le64 appId; } ATTRIBUTE_PACKED; SET_PACKED_STRUCT_MODE_OFF SET_PACKED_STRUCT_MODE_ON struct NanohubAppVersionsResponse { __le32 appVer; } ATTRIBUTE_PACKED; SET_PACKED_STRUCT_MODE_OFF #define NANOHUB_REASON_QUERY_APP_INFO 0x00001002 SET_PACKED_STRUCT_MODE_ON struct NanohubAppInfoRequest { __le32 appIdx; } ATTRIBUTE_PACKED; SET_PACKED_STRUCT_MODE_OFF SET_PACKED_STRUCT_MODE_ON struct NanohubAppInfoResponse { __le64 appId; __le32 appVer; __le32 appSize; } ATTRIBUTE_PACKED; SET_PACKED_STRUCT_MODE_OFF #define NANOHUB_REASON_START_FIRMWARE_UPLOAD 0x00001040 SET_PACKED_STRUCT_MODE_ON struct NanohubStartFirmwareUploadRequest { __le32 size; __le32 crc; uint8_t type; } ATTRIBUTE_PACKED; SET_PACKED_STRUCT_MODE_OFF SET_PACKED_STRUCT_MODE_ON struct NanohubStartFirmwareUploadResponse { uint8_t accepted; } ATTRIBUTE_PACKED; SET_PACKED_STRUCT_MODE_OFF #define NANOHUB_REASON_FIRMWARE_CHUNK 0x00001041 SET_PACKED_STRUCT_MODE_ON struct NanohubFirmwareChunkRequest { __le32 offset; uint8_t data[NANOHUB_PACKET_PAYLOAD_MAX-sizeof(__le32)]; } ATTRIBUTE_PACKED; SET_PACKED_STRUCT_MODE_OFF enum NanohubFirmwareChunkReply { NANOHUB_FIRMWARE_CHUNK_REPLY_ACCEPTED = 0, NANOHUB_FIRMWARE_CHUNK_REPLY_WAIT, NANOHUB_FIRMWARE_CHUNK_REPLY_RESEND, NANOHUB_FIRMWARE_CHUNK_REPLY_RESTART, NANOHUB_FIRMWARE_CHUNK_REPLY_CANCEL, NANOHUB_FIRMWARE_CHUNK_REPLY_CANCEL_NO_RETRY, NANOHUB_FIRMWARE_CHUNK_REPLY_NO_SPACE, }; SET_PACKED_STRUCT_MODE_ON struct NanohubFirmwareChunkResponse { uint8_t chunkReply; } ATTRIBUTE_PACKED; SET_PACKED_STRUCT_MODE_OFF #define NANOHUB_REASON_FINISH_FIRMWARE_UPLOAD 0x00001042 #if defined(__GNUC__) SET_PACKED_STRUCT_MODE_ON struct NanohubFinishFirmwareUploadRequest { } ATTRIBUTE_PACKED; SET_PACKED_STRUCT_MODE_OFF #endif enum NanohubFirmwareUploadReply { NANOHUB_FIRMWARE_UPLOAD_SUCCESS = 0, NANOHUB_FIRMWARE_UPLOAD_PROCESSING, NANOHUB_FIRMWARE_UPLOAD_WAITING_FOR_DATA, NANOHUB_FIRMWARE_UPLOAD_APP_SEC_KEY_NOT_FOUND, NANOHUB_FIRMWARE_UPLOAD_APP_SEC_HEADER_ERROR, NANOHUB_FIRMWARE_UPLOAD_APP_SEC_TOO_MUCH_DATA, NANOHUB_FIRMWARE_UPLOAD_APP_SEC_TOO_LITTLE_DATA, NANOHUB_FIRMWARE_UPLOAD_APP_SEC_SIG_VERIFY_FAIL, NANOHUB_FIRMWARE_UPLOAD_APP_SEC_SIG_DECODE_FAIL, NANOHUB_FIRMWARE_UPLOAD_APP_SEC_SIG_ROOT_UNKNOWN, NANOHUB_FIRMWARE_UPLOAD_APP_SEC_MEMORY_ERROR, NANOHUB_FIRMWARE_UPLOAD_APP_SEC_INVALID_DATA, NANOHUB_FIRMWARE_UPLOAD_APP_SEC_VERIFY_FAILED, NANOHUB_FIRMWARE_UPLOAD_APP_SEC_BAD, }; SET_PACKED_STRUCT_MODE_ON struct NanohubFinishFirmwareUploadResponse { uint8_t uploadReply; } ATTRIBUTE_PACKED; SET_PACKED_STRUCT_MODE_OFF #define NANOHUB_REASON_GET_INTERRUPT 0x00001080 SET_PACKED_STRUCT_MODE_ON struct NanohubGetInterruptRequest { uint32_t clear[HOSTINTF_MAX_INTERRUPTS/(32*sizeof(uint8_t))]; } ATTRIBUTE_PACKED; SET_PACKED_STRUCT_MODE_OFF SET_PACKED_STRUCT_MODE_ON struct NanohubGetInterruptResponse { uint32_t interrupts[HOSTINTF_MAX_INTERRUPTS/(32*sizeof(uint8_t))]; } ATTRIBUTE_PACKED; SET_PACKED_STRUCT_MODE_OFF #define NANOHUB_REASON_MASK_INTERRUPT 0x00001081 SET_PACKED_STRUCT_MODE_ON struct NanohubMaskInterruptRequest { uint8_t interrupt; } ATTRIBUTE_PACKED; SET_PACKED_STRUCT_MODE_OFF SET_PACKED_STRUCT_MODE_ON struct NanohubMaskInterruptResponse { uint8_t accepted; } ATTRIBUTE_PACKED; SET_PACKED_STRUCT_MODE_OFF #define NANOHUB_REASON_UNMASK_INTERRUPT 0x00001082 SET_PACKED_STRUCT_MODE_ON struct NanohubUnmaskInterruptRequest { uint8_t interrupt; } ATTRIBUTE_PACKED; SET_PACKED_STRUCT_MODE_OFF SET_PACKED_STRUCT_MODE_ON struct NanohubUnmaskInterruptResponse { uint8_t accepted; } ATTRIBUTE_PACKED; SET_PACKED_STRUCT_MODE_OFF #define NANOHUB_REASON_READ_EVENT 0x00001090 SET_PACKED_STRUCT_MODE_ON struct NanohubReadEventRequest { __le64 apBootTime; } ATTRIBUTE_PACKED; SET_PACKED_STRUCT_MODE_OFF SET_PACKED_STRUCT_MODE_ON struct NanohubReadEventResponse { __le32 evtType; uint8_t evtData[NANOHUB_PACKET_PAYLOAD_MAX - sizeof(__le32)]; } ATTRIBUTE_PACKED; SET_PACKED_STRUCT_MODE_OFF #define NANOHUB_REASON_WRITE_EVENT 0x00001091 SET_PACKED_STRUCT_MODE_ON struct NanohubWriteEventRequest { __le32 evtType; uint8_t evtData[NANOHUB_PACKET_PAYLOAD_MAX - sizeof(__le32)]; } ATTRIBUTE_PACKED; SET_PACKED_STRUCT_MODE_OFF SET_PACKED_STRUCT_MODE_ON struct NanohubWriteEventResponse { uint8_t accepted; } ATTRIBUTE_PACKED; SET_PACKED_STRUCT_MODE_OFF // this behaves more stable w.r.t. endianness than bit field // this is setting byte fields in MgmtStatus response // the high-order bit, if set, is indication of counter overflow #define SET_COUNTER(counter, val) (counter = (val & 0x7F) | (val > 0x7F ? 0x80 : 0)) SET_PACKED_STRUCT_MODE_ON struct MgmtStatus { union { __le32 value; // NOTE: union fields are accessed in CPU native mode struct { uint8_t app; uint8_t task; uint8_t op; uint8_t erase; } ATTRIBUTE_PACKED; }; } ATTRIBUTE_PACKED; SET_PACKED_STRUCT_MODE_OFF #ifdef LEGACY_HAL_ENABLED SET_PACKED_STRUCT_MODE_ON struct NanohubHalLegacyHdr { uint64_t appId; uint8_t len; uint8_t msg; } ATTRIBUTE_PACKED; SET_PACKED_STRUCT_MODE_OFF #define NANOHUB_HAL_LEGACY_EXT_APPS_ON 0 #define NANOHUB_HAL_LEGACY_EXT_APPS_OFF 1 #define NANOHUB_HAL_LEGACY_EXT_APP_DELETE 2 SET_PACKED_STRUCT_MODE_ON struct NanohubHalLegacyMgmtRx { __le64 appId; struct MgmtStatus stat; } ATTRIBUTE_PACKED; SET_PACKED_STRUCT_MODE_OFF SET_PACKED_STRUCT_MODE_ON struct NanohubHalLegacyMgmtTx { struct NanohubHalLegacyHdr hdr; __le32 status; } ATTRIBUTE_PACKED; SET_PACKED_STRUCT_MODE_OFF #define NANOHUB_HAL_LEGACY_QUERY_MEMINFO 3 #define NANOHUB_HAL_LEGACY_QUERY_APPS 4 SET_PACKED_STRUCT_MODE_ON struct NanohubHalLegacyQueryAppsRx { __le32 idx; } ATTRIBUTE_PACKED; SET_PACKED_STRUCT_MODE_OFF SET_PACKED_STRUCT_MODE_ON struct NanohubHalLegacyQueryAppsTx { struct NanohubHalLegacyHdr hdr; __le64 appId; __le32 version; __le32 flashUse; __le32 ramUse; } ATTRIBUTE_PACKED; SET_PACKED_STRUCT_MODE_OFF #define NANOHUB_HAL_LEGACY_QUERY_RSA_KEYS 5 SET_PACKED_STRUCT_MODE_ON struct NanohubHalLegacyQueryRsaKeysRx { __le32 offset; } ATTRIBUTE_PACKED; SET_PACKED_STRUCT_MODE_OFF SET_PACKED_STRUCT_MODE_ON struct NanohubHalLegacyQueryRsaKeysTx { struct NanohubHalLegacyHdr hdr; uint8_t data[]; } ATTRIBUTE_PACKED; SET_PACKED_STRUCT_MODE_OFF #define NANOHUB_HAL_LEGACY_START_UPLOAD 6 SET_PACKED_STRUCT_MODE_ON struct NanohubHalLegacyStartUploadRx { uint8_t isOs; __le32 length; } ATTRIBUTE_PACKED; SET_PACKED_STRUCT_MODE_OFF SET_PACKED_STRUCT_MODE_ON struct NanohubHalLegacyStartUploadTx { struct NanohubHalLegacyHdr hdr; uint8_t success; } ATTRIBUTE_PACKED; SET_PACKED_STRUCT_MODE_OFF #define NANOHUB_HAL_LEGACY_CONT_UPLOAD 7 SET_PACKED_STRUCT_MODE_ON struct NanohubHalLegacyContUploadRx { __le32 offset; uint8_t data[]; } ATTRIBUTE_PACKED; SET_PACKED_STRUCT_MODE_OFF SET_PACKED_STRUCT_MODE_ON struct NanohubHalLegacyContUploadTx { struct NanohubHalLegacyHdr hdr; uint8_t success; } ATTRIBUTE_PACKED; SET_PACKED_STRUCT_MODE_OFF #define NANOHUB_HAL_LEGACY_FINISH_UPLOAD 8 SET_PACKED_STRUCT_MODE_ON struct NanohubHalLegacyFinishUploadTx { struct NanohubHalLegacyHdr hdr; uint8_t success; } ATTRIBUTE_PACKED; SET_PACKED_STRUCT_MODE_OFF #define NANOHUB_HAL_LEGACY_REBOOT 9 SET_PACKED_STRUCT_MODE_ON struct NanohubHalLegacyRebootTx { struct NanohubHalLegacyHdr hdr; __le32 reason; } ATTRIBUTE_PACKED; SET_PACKED_STRUCT_MODE_OFF #endif /* LEGACY_HAL_ENABLED */ SET_PACKED_STRUCT_MODE_ON struct NanohubHalHdr { __le64 appId; uint8_t len; __le32 transactionId; __le16 unused; } ATTRIBUTE_PACKED; SET_PACKED_STRUCT_MODE_OFF SET_PACKED_STRUCT_MODE_ON struct NanohubHalRet { uint8_t msg; __le32 status; } ATTRIBUTE_PACKED; #define NANOHUB_HAL_APP_MGMT 0x10 SET_PACKED_STRUCT_MODE_ON struct NanohubHalAppMgmtRx { __le64 appId; uint8_t cmd; } ATTRIBUTE_PACKED; SET_PACKED_STRUCT_MODE_OFF #define NANOHUB_HAL_APP_MGMT_START 0 #define NANOHUB_HAL_APP_MGMT_STOP 1 #define NANOHUB_HAL_APP_MGMT_UNLOAD 2 #define NANOHUB_HAL_APP_MGMT_DELETE 3 SET_PACKED_STRUCT_MODE_ON struct NanohubHalAppMgmtTx { struct NanohubHalHdr hdr; struct NanohubHalRet ret; uint8_t cmd; struct MgmtStatus stat; } ATTRIBUTE_PACKED; SET_PACKED_STRUCT_MODE_OFF #define NANOHUB_HAL_SYS_MGMT 0x11 SET_PACKED_STRUCT_MODE_ON struct NanohubHalSysMgmtRx { uint8_t cmd; } ATTRIBUTE_PACKED; SET_PACKED_STRUCT_MODE_OFF #define NANOHUB_HAL_SYS_MGMT_ERASE 0 #define NANOHUB_HAL_SYS_MGMT_REBOOT 1 SET_PACKED_STRUCT_MODE_ON struct NanohubHalSysMgmtTx { struct NanohubHalHdr hdr; struct NanohubHalRet ret; uint8_t cmd; } ATTRIBUTE_PACKED; SET_PACKED_STRUCT_MODE_OFF #define NANOHUB_HAL_APP_INFO 0x12 SET_PACKED_STRUCT_MODE_ON struct NanohubHalAppInfoRx { __le32 addr; uint8_t tags[HOST_HUB_CHRE_PACKET_MAX_LEN - sizeof(__le32)]; } ATTRIBUTE_PACKED; SET_PACKED_STRUCT_MODE_OFF #define NANOHUB_HAL_APP_INFO_APPID 0x00 #define NANOHUB_HAL_APP_INFO_CRC 0x01 #define NANOHUB_HAL_APP_INFO_TID 0x02 #define NANOHUB_HAL_APP_INFO_VERSION 0x03 #define NANOHUB_HAL_APP_INFO_ADDR 0x04 #define NANOHUB_HAL_APP_INFO_SIZE 0x05 #define NANOHUB_HAL_APP_INFO_HEAP 0x06 #define NANOHUB_HAL_APP_INFO_DATA 0x07 #define NANOHUB_HAL_APP_INFO_BSS 0x08 #define NANOHUB_HAL_APP_INFO_CHRE_MAJOR 0x09 #define NANOHUB_HAL_APP_INFO_CHRE_MINOR 0x0A #define NANOHUB_HAL_APP_INFO_END 0xFF SET_PACKED_STRUCT_MODE_ON struct NanohubHalAppInfoTx { struct NanohubHalHdr hdr; struct NanohubHalRet ret; uint8_t data[HOST_HUB_CHRE_PACKET_MAX_LEN - sizeof(struct NanohubHalRet)]; } ATTRIBUTE_PACKED; SET_PACKED_STRUCT_MODE_OFF #define NANOHUB_HAL_SYS_INFO 0x13 SET_PACKED_STRUCT_MODE_ON struct NanohubHalSysInfoRx { uint8_t tags[HOST_HUB_CHRE_PACKET_MAX_LEN]; } ATTRIBUTE_PACKED; SET_PACKED_STRUCT_MODE_OFF #define NANOHUB_HAL_SYS_INFO_HEAP_FREE 0x0F #define NANOHUB_HAL_SYS_INFO_RAM_SIZE 0x12 #define NANOHUB_HAL_SYS_INFO_EEDATA_SIZE 0x13 #define NANOHUB_HAL_SYS_INFO_EEDATA_FREE 0x14 #define NANOHUB_HAL_SYS_INFO_CODE_SIZE 0x15 #define NANOHUB_HAL_SYS_INFO_CODE_FREE 0x16 #define NANOHUB_HAL_SYS_INFO_SHARED_SIZE 0x17 #define NANOHUB_HAL_SYS_INFO_SHARED_FREE 0x18 #define NANOHUB_HAL_SYS_INFO_END 0xFF SET_PACKED_STRUCT_MODE_ON struct NanohubHalSysInfoTx { struct NanohubHalHdr hdr; struct NanohubHalRet ret; uint8_t data[HOST_HUB_CHRE_PACKET_MAX_LEN - sizeof(struct NanohubHalRet)]; } ATTRIBUTE_PACKED; SET_PACKED_STRUCT_MODE_OFF #define NANOHUB_HAL_KEY_INFO 0x14 SET_PACKED_STRUCT_MODE_ON struct NanohubHalKeyInfoRx { uint32_t keyNum; uint32_t dataOffset; } ATTRIBUTE_PACKED; SET_PACKED_STRUCT_MODE_OFF SET_PACKED_STRUCT_MODE_ON struct NanohubHalKeyInfoTx { struct NanohubHalHdr hdr; struct NanohubHalRet ret; uint32_t keyLength; uint8_t data[NANOHUB_RSA_KEY_CHUNK_LEN]; } ATTRIBUTE_PACKED; SET_PACKED_STRUCT_MODE_OFF #define NANOHUB_HAL_START_UPLOAD 0x16 SET_PACKED_STRUCT_MODE_ON struct NanohubHalStartUploadRx { uint8_t isOs; __le32 length; } ATTRIBUTE_PACKED; SET_PACKED_STRUCT_MODE_OFF SET_PACKED_STRUCT_MODE_ON struct NanohubHalStartUploadTx { struct NanohubHalHdr hdr; struct NanohubHalRet ret; } ATTRIBUTE_PACKED; SET_PACKED_STRUCT_MODE_OFF #define NANOHUB_HAL_CONT_UPLOAD 0x17 SET_PACKED_STRUCT_MODE_ON struct NanohubHalContUploadRx { __le32 offset; uint8_t data[HOST_HUB_CHRE_PACKET_MAX_LEN-sizeof(__le32)]; } ATTRIBUTE_PACKED; SET_PACKED_STRUCT_MODE_ON SET_PACKED_STRUCT_MODE_ON struct NanohubHalContUploadTx { struct NanohubHalHdr hdr; struct NanohubHalRet ret; } ATTRIBUTE_PACKED; SET_PACKED_STRUCT_MODE_OFF #define NANOHUB_HAL_FINISH_UPLOAD 0x18 SET_PACKED_STRUCT_MODE_ON struct NanohubHalFinishUploadTx { struct NanohubHalHdr hdr; struct NanohubHalRet ret; __le32 addr; __le32 crc; } ATTRIBUTE_PACKED; SET_PACKED_STRUCT_MODE_OFF #endif /* __NANOHUBPACKET_H */