blob: 6b6afda352f9cc287ba51a1b5402d5d4d096dd53 [file] [log] [blame]
/*
* 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_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,
};
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
SET_PACKED_STRUCT_MODE_ON
struct NanohubHalHdr {
uint64_t appId;
uint8_t len;
uint8_t msg;
} ATTRIBUTE_PACKED;
SET_PACKED_STRUCT_MODE_OFF
#define NANOHUB_HAL_EXT_APPS_ON 0
#define NANOHUB_HAL_EXT_APPS_OFF 1
#define NANOHUB_HAL_EXT_APP_DELETE 2
// 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
SET_PACKED_STRUCT_MODE_ON
struct NanohubHalMgmtRx {
__le64 appId;
struct MgmtStatus stat;
} ATTRIBUTE_PACKED;
SET_PACKED_STRUCT_MODE_OFF
SET_PACKED_STRUCT_MODE_ON
struct NanohubHalMgmtTx {
struct NanohubHalHdr hdr;
__le32 status;
} ATTRIBUTE_PACKED;
SET_PACKED_STRUCT_MODE_OFF
#define NANOHUB_HAL_QUERY_MEMINFO 3
#define NANOHUB_HAL_QUERY_APPS 4
SET_PACKED_STRUCT_MODE_ON
struct NanohubHalQueryAppsRx {
__le32 idx;
} ATTRIBUTE_PACKED;
SET_PACKED_STRUCT_MODE_OFF
SET_PACKED_STRUCT_MODE_ON
struct NanohubHalQueryAppsTx {
struct NanohubHalHdr hdr;
__le64 appId;
__le32 version;
__le32 flashUse;
__le32 ramUse;
} ATTRIBUTE_PACKED;
SET_PACKED_STRUCT_MODE_OFF
#define NANOHUB_HAL_QUERY_RSA_KEYS 5
SET_PACKED_STRUCT_MODE_ON
struct NanohubHalQueryRsaKeysRx {
__le32 offset;
} ATTRIBUTE_PACKED;
SET_PACKED_STRUCT_MODE_OFF
SET_PACKED_STRUCT_MODE_ON
struct NanohubHalQueryRsaKeysTx {
struct NanohubHalHdr hdr;
uint8_t data[];
} ATTRIBUTE_PACKED;
SET_PACKED_STRUCT_MODE_OFF
#define NANOHUB_HAL_START_UPLOAD 6
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;
uint8_t success;
} ATTRIBUTE_PACKED;
SET_PACKED_STRUCT_MODE_OFF
#define NANOHUB_HAL_CONT_UPLOAD 7
SET_PACKED_STRUCT_MODE_ON
struct NanohubHalContUploadRx {
__le32 offset;
uint8_t data[];
} ATTRIBUTE_PACKED;
SET_PACKED_STRUCT_MODE_OFF
SET_PACKED_STRUCT_MODE_ON
struct NanohubHalContUploadTx {
struct NanohubHalHdr hdr;
uint8_t success;
} ATTRIBUTE_PACKED;
SET_PACKED_STRUCT_MODE_OFF
#define NANOHUB_HAL_FINISH_UPLOAD 8
SET_PACKED_STRUCT_MODE_ON
struct NanohubHalFinishUploadTx {
struct NanohubHalHdr hdr;
uint8_t success;
} ATTRIBUTE_PACKED;
SET_PACKED_STRUCT_MODE_OFF
#define NANOHUB_HAL_REBOOT 9
SET_PACKED_STRUCT_MODE_ON
struct NanohubHalRebootTx {
struct NanohubHalHdr hdr;
__le32 reason;
} ATTRIBUTE_PACKED;
SET_PACKED_STRUCT_MODE_OFF
#endif /* __NANOHUBPACKET_H */