/*
* 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 */