1 /* 2 * Copyright (c) 2020 Nordic Semiconductor ASA 3 * 4 * SPDX-License-Identifier: Apache-2.0 5 */ 6 7 #ifndef ZEPHYR_INCLUDE_BLUETOOTH_MESH_DFU_H__ 8 #define ZEPHYR_INCLUDE_BLUETOOTH_MESH_DFU_H__ 9 10 #include <sys/types.h> 11 12 #include <zephyr/kernel.h> 13 #include <zephyr/bluetooth/mesh/blob.h> 14 15 #ifdef __cplusplus 16 extern "C" { 17 #endif 18 19 /** 20 * @defgroup bt_mesh_dfu Bluetooth Mesh Device Firmware Update 21 * @ingroup bt_mesh 22 * @{ 23 */ 24 25 #ifndef CONFIG_BT_MESH_DFU_FWID_MAXLEN 26 #define CONFIG_BT_MESH_DFU_FWID_MAXLEN 0 27 #endif 28 29 #ifndef CONFIG_BT_MESH_DFU_METADATA_MAXLEN 30 #define CONFIG_BT_MESH_DFU_METADATA_MAXLEN 0 31 #endif 32 33 #ifndef CONFIG_BT_MESH_DFU_URI_MAXLEN 34 #define CONFIG_BT_MESH_DFU_URI_MAXLEN 0 35 #endif 36 37 #ifndef CONFIG_BT_MESH_DFU_SLOT_CNT 38 #define CONFIG_BT_MESH_DFU_SLOT_CNT 0 39 #endif 40 41 /** DFU transfer phase. */ 42 enum bt_mesh_dfu_phase { 43 /** Ready to start a Receive Firmware procedure. */ 44 BT_MESH_DFU_PHASE_IDLE, 45 46 /** The Transfer BLOB procedure failed. */ 47 BT_MESH_DFU_PHASE_TRANSFER_ERR, 48 49 /** The Receive Firmware procedure is being executed. */ 50 BT_MESH_DFU_PHASE_TRANSFER_ACTIVE, 51 52 /** The Verify Firmware procedure is being executed. */ 53 BT_MESH_DFU_PHASE_VERIFY, 54 55 /** The Verify Firmware procedure completed successfully. */ 56 BT_MESH_DFU_PHASE_VERIFY_OK, 57 58 /** The Verify Firmware procedure failed. */ 59 BT_MESH_DFU_PHASE_VERIFY_FAIL, 60 61 /** The Apply New Firmware procedure is being executed. */ 62 BT_MESH_DFU_PHASE_APPLYING, 63 64 /** Firmware transfer has been canceled. */ 65 BT_MESH_DFU_PHASE_TRANSFER_CANCELED, 66 67 /** Firmware applying succeeded. */ 68 BT_MESH_DFU_PHASE_APPLY_SUCCESS, 69 70 /** Firmware applying failed. */ 71 BT_MESH_DFU_PHASE_APPLY_FAIL, 72 73 /** Phase of a node was not yet retrieved. */ 74 BT_MESH_DFU_PHASE_UNKNOWN, 75 }; 76 77 78 /** DFU status. */ 79 enum bt_mesh_dfu_status { 80 /** The message was processed successfully. */ 81 BT_MESH_DFU_SUCCESS, 82 83 /** Insufficient resources on the node */ 84 BT_MESH_DFU_ERR_RESOURCES, 85 86 /** The operation cannot be performed while the Server is in the current 87 * phase. 88 */ 89 BT_MESH_DFU_ERR_WRONG_PHASE, 90 91 /** An internal error occurred on the node. */ 92 BT_MESH_DFU_ERR_INTERNAL, 93 94 /** The message contains a firmware index value that is not expected. */ 95 BT_MESH_DFU_ERR_FW_IDX, 96 97 /** The metadata check failed. */ 98 BT_MESH_DFU_ERR_METADATA, 99 100 /** The Server cannot start a firmware update. */ 101 BT_MESH_DFU_ERR_TEMPORARILY_UNAVAILABLE, 102 103 /** Another BLOB transfer is in progress. */ 104 BT_MESH_DFU_ERR_BLOB_XFER_BUSY, 105 }; 106 107 /** Expected effect of a DFU transfer. */ 108 enum bt_mesh_dfu_effect { 109 /** No changes to node Composition Data. */ 110 BT_MESH_DFU_EFFECT_NONE, 111 112 /** Node Composition Data changed and the node does not support remote 113 * provisioning. 114 */ 115 BT_MESH_DFU_EFFECT_COMP_CHANGE_NO_RPR, 116 117 /** Node Composition Data changed, and remote provisioning is supported. 118 * The node supports remote provisioning and Composition Data Page 119 * 0x80. Page 0x80 contains different Composition Data than Page 0x0. 120 */ 121 BT_MESH_DFU_EFFECT_COMP_CHANGE, 122 123 /** Node will be unprovisioned after the update. */ 124 BT_MESH_DFU_EFFECT_UNPROV, 125 }; 126 127 /** Action for DFU iteration callbacks. */ 128 enum bt_mesh_dfu_iter { 129 /** Stop iterating. */ 130 BT_MESH_DFU_ITER_STOP, 131 132 /** Continue iterating. */ 133 BT_MESH_DFU_ITER_CONTINUE, 134 }; 135 136 /** DFU image instance. 137 * 138 * Each DFU image represents a single updatable firmware image. 139 */ 140 struct bt_mesh_dfu_img { 141 /** Firmware ID. */ 142 const void *fwid; 143 144 /** Length of the firmware ID. */ 145 size_t fwid_len; 146 147 /** Update URI, or NULL. */ 148 const char *uri; 149 }; 150 151 /** DFU image slot for DFU distribution. */ 152 struct bt_mesh_dfu_slot { 153 /** Size of the firmware in bytes. */ 154 size_t size; 155 /** Length of the firmware ID. */ 156 size_t fwid_len; 157 /** Length of the metadata. */ 158 size_t metadata_len; 159 /** Firmware ID. */ 160 uint8_t fwid[CONFIG_BT_MESH_DFU_FWID_MAXLEN]; 161 /** Metadata. */ 162 uint8_t metadata[CONFIG_BT_MESH_DFU_METADATA_MAXLEN]; 163 }; 164 165 /** @} */ 166 167 #ifdef __cplusplus 168 } 169 #endif 170 171 #endif /* ZEPHYR_INCLUDE_BLUETOOTH_MESH_DFU_H__ */ 172