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