Home | History | Annotate | Download | only in inc
      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 
     32 typedef uint16_t __le16;
     33 typedef uint16_t __be16;
     34 typedef uint32_t __le32;
     35 typedef uint32_t __be32;
     36 typedef uint64_t __le64;
     37 typedef uint64_t __be64;
     38 #endif
     39 
     40 SET_PACKED_STRUCT_MODE_ON
     41 struct NanohubPacket {
     42     uint8_t sync;
     43     __le32 seq;
     44     __le32 reason;
     45     uint8_t len;
     46     uint8_t data[0];
     47 } ATTRIBUTE_PACKED;
     48 SET_PACKED_STRUCT_MODE_OFF
     49 
     50 SET_PACKED_STRUCT_MODE_ON
     51 struct NanohubPacketFooter {
     52     __le32 crc;
     53 } ATTRIBUTE_PACKED;
     54 SET_PACKED_STRUCT_MODE_OFF
     55 
     56 static 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 
     67 #define NANOHUB_SYNC_BYTE             0x31
     68 
     69 #define NANOHUB_PREAMBLE_BYTE         0xFF
     70 #define NANOHUB_ACK_PREAMBLE_LEN      16
     71 #define NANOHUB_PAYLOAD_PREAMBLE_LEN  512
     72 #define NANOHUB_RSA_KEY_CHUNK_LEN     64
     73 
     74 #define NANOHUB_INT_BOOT_COMPLETE     0
     75 #define NANOHUB_INT_WAKE_COMPLETE     0
     76 #define NANOHUB_INT_WAKEUP            1
     77 #define NANOHUB_INT_NONWAKEUP         2
     78 #define NANOHUB_INT_CMD_WAIT          3
     79 
     80 #define NANOHUB_REASON_ACK                    0x00000000
     81 #define NANOHUB_REASON_NAK                    0x00000001
     82 #define NANOHUB_REASON_NAK_BUSY               0x00000002
     83 
     84 /**
     85  * INFORMATIONAL
     86  */
     87 
     88 #define NANOHUB_REASON_GET_OS_HW_VERSIONS     0x00001000
     89 #if defined(__GNUC__)
     90 SET_PACKED_STRUCT_MODE_ON
     91 struct NanohubOsHwVersionsRequest {
     92 } ATTRIBUTE_PACKED;
     93 SET_PACKED_STRUCT_MODE_OFF
     94 #endif
     95 
     96 SET_PACKED_STRUCT_MODE_ON
     97 struct NanohubOsHwVersionsResponse {
     98     __le16 hwType;
     99     __le16 hwVer;
    100     __le16 blVer;
    101     __le16 osVer;
    102     __le32 variantVer;
    103 } ATTRIBUTE_PACKED;
    104 SET_PACKED_STRUCT_MODE_OFF
    105 
    106 #define NANOHUB_REASON_GET_APP_VERSIONS       0x00001001
    107 
    108 SET_PACKED_STRUCT_MODE_ON
    109 struct NanohubAppVersionsRequest {
    110     __le64 appId;
    111 } ATTRIBUTE_PACKED;
    112 SET_PACKED_STRUCT_MODE_OFF
    113 
    114 SET_PACKED_STRUCT_MODE_ON
    115 struct NanohubAppVersionsResponse {
    116     __le32 appVer;
    117 } ATTRIBUTE_PACKED;
    118 SET_PACKED_STRUCT_MODE_OFF
    119 
    120 #define NANOHUB_REASON_QUERY_APP_INFO         0x00001002
    121 
    122 SET_PACKED_STRUCT_MODE_ON
    123 struct NanohubAppInfoRequest {
    124     __le32 appIdx;
    125 } ATTRIBUTE_PACKED;
    126 SET_PACKED_STRUCT_MODE_OFF
    127 
    128 SET_PACKED_STRUCT_MODE_ON
    129 struct NanohubAppInfoResponse {
    130     __le64 appId;
    131     __le32 appVer;
    132     __le32 appSize;
    133 } ATTRIBUTE_PACKED;
    134 SET_PACKED_STRUCT_MODE_OFF
    135 
    136 #define NANOHUB_REASON_START_FIRMWARE_UPLOAD  0x00001040
    137 
    138 SET_PACKED_STRUCT_MODE_ON
    139 struct NanohubStartFirmwareUploadRequest {
    140     __le32 size;
    141     __le32 crc;
    142     uint8_t type;
    143 } ATTRIBUTE_PACKED;
    144 SET_PACKED_STRUCT_MODE_OFF
    145 
    146 SET_PACKED_STRUCT_MODE_ON
    147 struct NanohubStartFirmwareUploadResponse {
    148     uint8_t accepted;
    149 } ATTRIBUTE_PACKED;
    150 SET_PACKED_STRUCT_MODE_OFF
    151 
    152 #define NANOHUB_REASON_FIRMWARE_CHUNK         0x00001041
    153 
    154 SET_PACKED_STRUCT_MODE_ON
    155 struct NanohubFirmwareChunkRequest {
    156     __le32 offset;
    157     uint8_t data[NANOHUB_PACKET_PAYLOAD_MAX-sizeof(__le32)];
    158 } ATTRIBUTE_PACKED;
    159 SET_PACKED_STRUCT_MODE_OFF
    160 
    161 enum NanohubFirmwareChunkReply {
    162     NANOHUB_FIRMWARE_CHUNK_REPLY_ACCEPTED = 0,
    163     NANOHUB_FIRMWARE_CHUNK_REPLY_WAIT,
    164     NANOHUB_FIRMWARE_CHUNK_REPLY_RESEND,
    165     NANOHUB_FIRMWARE_CHUNK_REPLY_RESTART,
    166     NANOHUB_FIRMWARE_CHUNK_REPLY_CANCEL,
    167     NANOHUB_FIRMWARE_CHUNK_REPLY_CANCEL_NO_RETRY,
    168 };
    169 
    170 SET_PACKED_STRUCT_MODE_ON
    171 struct NanohubFirmwareChunkResponse {
    172     uint8_t chunkReply;
    173 } ATTRIBUTE_PACKED;
    174 SET_PACKED_STRUCT_MODE_OFF
    175 
    176 #define NANOHUB_REASON_FINISH_FIRMWARE_UPLOAD 0x00001042
    177 
    178 #if defined(__GNUC__)
    179 SET_PACKED_STRUCT_MODE_ON
    180 struct NanohubFinishFirmwareUploadRequest {
    181 } ATTRIBUTE_PACKED;
    182 SET_PACKED_STRUCT_MODE_OFF
    183 #endif
    184 
    185 enum NanohubFirmwareUploadReply {
    186     NANOHUB_FIRMWARE_UPLOAD_SUCCESS = 0,
    187     NANOHUB_FIRMWARE_UPLOAD_PROCESSING,
    188     NANOHUB_FIRMWARE_UPLOAD_WAITING_FOR_DATA,
    189     NANOHUB_FIRMWARE_UPLOAD_APP_SEC_KEY_NOT_FOUND,
    190     NANOHUB_FIRMWARE_UPLOAD_APP_SEC_HEADER_ERROR,
    191     NANOHUB_FIRMWARE_UPLOAD_APP_SEC_TOO_MUCH_DATA,
    192     NANOHUB_FIRMWARE_UPLOAD_APP_SEC_TOO_LITTLE_DATA,
    193     NANOHUB_FIRMWARE_UPLOAD_APP_SEC_SIG_VERIFY_FAIL,
    194     NANOHUB_FIRMWARE_UPLOAD_APP_SEC_SIG_DECODE_FAIL,
    195     NANOHUB_FIRMWARE_UPLOAD_APP_SEC_SIG_ROOT_UNKNOWN,
    196     NANOHUB_FIRMWARE_UPLOAD_APP_SEC_MEMORY_ERROR,
    197     NANOHUB_FIRMWARE_UPLOAD_APP_SEC_INVALID_DATA,
    198     NANOHUB_FIRMWARE_UPLOAD_APP_SEC_VERIFY_FAILED,
    199     NANOHUB_FIRMWARE_UPLOAD_APP_SEC_BAD,
    200 };
    201 
    202 SET_PACKED_STRUCT_MODE_ON
    203 struct NanohubFinishFirmwareUploadResponse {
    204    uint8_t uploadReply;
    205 } ATTRIBUTE_PACKED;
    206 SET_PACKED_STRUCT_MODE_OFF
    207 
    208 #define NANOHUB_REASON_GET_INTERRUPT          0x00001080
    209 
    210 SET_PACKED_STRUCT_MODE_ON
    211 struct NanohubGetInterruptRequest {
    212     uint32_t clear[HOSTINTF_MAX_INTERRUPTS/(32*sizeof(uint8_t))];
    213 } ATTRIBUTE_PACKED;
    214 SET_PACKED_STRUCT_MODE_OFF
    215 
    216 SET_PACKED_STRUCT_MODE_ON
    217 struct NanohubGetInterruptResponse {
    218     uint32_t interrupts[HOSTINTF_MAX_INTERRUPTS/(32*sizeof(uint8_t))];
    219 } ATTRIBUTE_PACKED;
    220 SET_PACKED_STRUCT_MODE_OFF
    221 
    222 #define NANOHUB_REASON_MASK_INTERRUPT         0x00001081
    223 
    224 SET_PACKED_STRUCT_MODE_ON
    225 struct NanohubMaskInterruptRequest {
    226     uint8_t interrupt;
    227 } ATTRIBUTE_PACKED;
    228 SET_PACKED_STRUCT_MODE_OFF
    229 
    230 SET_PACKED_STRUCT_MODE_ON
    231 struct NanohubMaskInterruptResponse {
    232     uint8_t accepted;
    233 } ATTRIBUTE_PACKED;
    234 SET_PACKED_STRUCT_MODE_OFF
    235 
    236 #define NANOHUB_REASON_UNMASK_INTERRUPT       0x00001082
    237 
    238 SET_PACKED_STRUCT_MODE_ON
    239 struct NanohubUnmaskInterruptRequest {
    240     uint8_t interrupt;
    241 } ATTRIBUTE_PACKED;
    242 SET_PACKED_STRUCT_MODE_OFF
    243 
    244 SET_PACKED_STRUCT_MODE_ON
    245 struct NanohubUnmaskInterruptResponse {
    246     uint8_t accepted;
    247 } ATTRIBUTE_PACKED;
    248 SET_PACKED_STRUCT_MODE_OFF
    249 
    250 #define NANOHUB_REASON_READ_EVENT             0x00001090
    251 
    252 SET_PACKED_STRUCT_MODE_ON
    253 struct NanohubReadEventRequest {
    254     __le64 apBootTime;
    255 } ATTRIBUTE_PACKED;
    256 SET_PACKED_STRUCT_MODE_OFF
    257 
    258 SET_PACKED_STRUCT_MODE_ON
    259 struct NanohubReadEventResponse {
    260     __le32 evtType;
    261     uint8_t evtData[NANOHUB_PACKET_PAYLOAD_MAX - sizeof(__le32)];
    262 } ATTRIBUTE_PACKED;
    263 SET_PACKED_STRUCT_MODE_OFF
    264 
    265 #define NANOHUB_REASON_WRITE_EVENT            0x00001091
    266 
    267 SET_PACKED_STRUCT_MODE_ON
    268 struct NanohubWriteEventRequest {
    269     __le32 evtType;
    270     uint8_t evtData[NANOHUB_PACKET_PAYLOAD_MAX - sizeof(__le32)];
    271 } ATTRIBUTE_PACKED;
    272 SET_PACKED_STRUCT_MODE_OFF
    273 
    274 SET_PACKED_STRUCT_MODE_ON
    275 struct NanohubWriteEventResponse {
    276     uint8_t accepted;
    277 } ATTRIBUTE_PACKED;
    278 SET_PACKED_STRUCT_MODE_OFF
    279 
    280 SET_PACKED_STRUCT_MODE_ON
    281 struct NanohubHalHdr {
    282     uint64_t appId;
    283     uint8_t len;
    284     uint8_t msg;
    285 } ATTRIBUTE_PACKED;
    286 SET_PACKED_STRUCT_MODE_OFF
    287 
    288 #define NANOHUB_HAL_EXT_APPS_ON     0
    289 #define NANOHUB_HAL_EXT_APPS_OFF    1
    290 #define NANOHUB_HAL_EXT_APP_DELETE  2
    291 
    292 // this behaves more stable w.r.t. endianness than bit field
    293 // this is setting byte fields in MgmtStatus response
    294 // the high-order bit, if set, is indication of counter overflow
    295 #define SET_COUNTER(counter, val) (counter = (val & 0x7F) | (val > 0x7F ? 0x80 : 0))
    296 
    297 SET_PACKED_STRUCT_MODE_ON
    298 struct MgmtStatus {
    299     union {
    300         __le32 value;
    301         // NOTE: union fields are accessed in CPU native mode
    302         struct {
    303             uint8_t app;
    304             uint8_t task;
    305             uint8_t op;
    306             uint8_t erase;
    307         } ATTRIBUTE_PACKED;
    308     };
    309 } ATTRIBUTE_PACKED;
    310 SET_PACKED_STRUCT_MODE_OFF
    311 
    312 SET_PACKED_STRUCT_MODE_ON
    313 struct NanohubHalMgmtRx {
    314     __le64 appId;
    315     struct MgmtStatus stat;
    316 } ATTRIBUTE_PACKED;
    317 SET_PACKED_STRUCT_MODE_OFF
    318 
    319 SET_PACKED_STRUCT_MODE_ON
    320 struct NanohubHalMgmtTx {
    321     struct NanohubHalHdr hdr;
    322     __le32 status;
    323 } ATTRIBUTE_PACKED;
    324 SET_PACKED_STRUCT_MODE_OFF
    325 
    326 #define NANOHUB_HAL_QUERY_MEMINFO   3
    327 #define NANOHUB_HAL_QUERY_APPS      4
    328 
    329 SET_PACKED_STRUCT_MODE_ON
    330 struct NanohubHalQueryAppsRx {
    331     __le32 idx;
    332 } ATTRIBUTE_PACKED;
    333 SET_PACKED_STRUCT_MODE_OFF
    334 
    335 SET_PACKED_STRUCT_MODE_ON
    336 struct NanohubHalQueryAppsTx {
    337     struct NanohubHalHdr hdr;
    338     __le64 appId;
    339     __le32 version;
    340     __le32 flashUse;
    341     __le32 ramUse;
    342 } ATTRIBUTE_PACKED;
    343 SET_PACKED_STRUCT_MODE_OFF
    344 
    345 #define NANOHUB_HAL_QUERY_RSA_KEYS  5
    346 
    347 SET_PACKED_STRUCT_MODE_ON
    348 struct NanohubHalQueryRsaKeysRx {
    349     __le32 offset;
    350 } ATTRIBUTE_PACKED;
    351 SET_PACKED_STRUCT_MODE_OFF
    352 
    353 SET_PACKED_STRUCT_MODE_ON
    354 struct NanohubHalQueryRsaKeysTx {
    355     struct NanohubHalHdr hdr;
    356     uint8_t data[];
    357 } ATTRIBUTE_PACKED;
    358 SET_PACKED_STRUCT_MODE_OFF
    359 
    360 #define NANOHUB_HAL_START_UPLOAD    6
    361 
    362 SET_PACKED_STRUCT_MODE_ON
    363 struct NanohubHalStartUploadRx {
    364     uint8_t isOs;
    365     __le32 length;
    366 } ATTRIBUTE_PACKED;
    367 SET_PACKED_STRUCT_MODE_OFF
    368 
    369 SET_PACKED_STRUCT_MODE_ON
    370 struct NanohubHalStartUploadTx {
    371     struct NanohubHalHdr hdr;
    372     uint8_t success;
    373 } ATTRIBUTE_PACKED;
    374 SET_PACKED_STRUCT_MODE_OFF
    375 
    376 #define NANOHUB_HAL_CONT_UPLOAD     7
    377 
    378 SET_PACKED_STRUCT_MODE_ON
    379 struct NanohubHalContUploadRx {
    380     __le32 offset;
    381     uint8_t data[];
    382 } ATTRIBUTE_PACKED;
    383 SET_PACKED_STRUCT_MODE_OFF
    384 
    385 SET_PACKED_STRUCT_MODE_ON
    386 struct NanohubHalContUploadTx {
    387     struct NanohubHalHdr hdr;
    388     uint8_t success;
    389 } ATTRIBUTE_PACKED;
    390 SET_PACKED_STRUCT_MODE_OFF
    391 
    392 #define NANOHUB_HAL_FINISH_UPLOAD   8
    393 
    394 SET_PACKED_STRUCT_MODE_ON
    395 struct NanohubHalFinishUploadTx {
    396     struct NanohubHalHdr hdr;
    397     uint8_t success;
    398 } ATTRIBUTE_PACKED;
    399 SET_PACKED_STRUCT_MODE_OFF
    400 
    401 #define NANOHUB_HAL_REBOOT          9
    402 
    403 SET_PACKED_STRUCT_MODE_ON
    404 struct NanohubHalRebootTx {
    405     struct NanohubHalHdr hdr;
    406     __le32 reason;
    407 } ATTRIBUTE_PACKED;
    408 SET_PACKED_STRUCT_MODE_OFF
    409 
    410 #endif /* __NANOHUBPACKET_H */
    411