1 /* Copyright (c) 2014, Nordic Semiconductor ASA 2 * 3 * Permission is hereby granted, free of charge, to any person obtaining a copy 4 * of this software and associated documentation files (the "Software"), to deal 5 * in the Software without restriction, including without limitation the rights 6 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 * copies of the Software, and to permit persons to whom the Software is 8 * furnished to do so, subject to the following conditions: 9 * 10 * The above copyright notice and this permission notice shall be included in all 11 * copies or substantial portions of the Software. 12 * 13 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 19 * SOFTWARE. 20 */ 21 22 /** 23 * @file 24 * @ingroup aci 25 * @brief Definitions for the ACI (Application Control Interface) commands 26 * @remarks 27 * 28 */ 29 30 #ifndef ACI_CMDS_H__ 31 #define ACI_CMDS_H__ 32 33 #include "aci.h" 34 35 /** 36 * @enum aci_cmd_opcode_t 37 * @brief ACI command opcodes 38 */ 39 typedef enum 40 { 41 /** 42 * Enter test mode 43 */ 44 ACI_CMD_TEST = 0x01, 45 /** 46 * Echo (loopback) test command 47 */ 48 ACI_CMD_ECHO = 0x02, 49 /** 50 * Send a BTLE DTM command to the radio 51 */ 52 ACI_CMD_DTM_CMD = 0x03, 53 /** 54 * Put the device to sleep 55 */ 56 ACI_CMD_SLEEP = 0x04, 57 /** 58 * Wakeup the device from deep sleep 59 */ 60 ACI_CMD_WAKEUP = 0x05, 61 /** 62 * Replace the contents of the internal database with 63 * user provided data 64 */ 65 ACI_CMD_SETUP = 0x06, 66 /** 67 * Read the portions of memory required to be restored after a power cycle 68 */ 69 ACI_CMD_READ_DYNAMIC_DATA = 0x07, 70 /** 71 * Write back the data retrieved using ACI_CMD_READ_DYNAMIC_DATA 72 */ 73 ACI_CMD_WRITE_DYNAMIC_DATA = 0x08, 74 /** 75 * Retrieve the device's version information 76 */ 77 ACI_CMD_GET_DEVICE_VERSION = 0x09, 78 /** 79 * Request the Bluetooth address and its type 80 */ 81 ACI_CMD_GET_DEVICE_ADDRESS = 0x0A, 82 /** 83 * Request the battery level measured by nRF8001 84 */ 85 ACI_CMD_GET_BATTERY_LEVEL = 0x0B, 86 /** 87 * Request the temperature value measured by nRF8001 88 */ 89 ACI_CMD_GET_TEMPERATURE = 0x0C, 90 /** 91 * Write to the local Attribute Database 92 */ 93 ACI_CMD_SET_LOCAL_DATA = 0x0D, 94 /** 95 * Reset the baseband and radio and go back to idle 96 */ 97 ACI_CMD_RADIO_RESET = 0x0E, 98 /** 99 * Start advertising and wait for a master connection 100 */ 101 ACI_CMD_CONNECT = 0x0F, 102 /** 103 * Start advertising and wait for a master connection 104 */ 105 ACI_CMD_BOND = 0x10, 106 /** 107 * Start advertising and wait for a master connection 108 */ 109 ACI_CMD_DISCONNECT = 0x11, 110 /** 111 * Throttles the Radio transmit power 112 */ 113 ACI_CMD_SET_TX_POWER = 0x12, 114 /** 115 * Trigger a connection parameter update 116 */ 117 ACI_CMD_CHANGE_TIMING = 0x13, 118 /** 119 * Open a remote pipe for data reception 120 */ 121 ACI_CMD_OPEN_REMOTE_PIPE = 0x14, 122 /** 123 * Transmit data over an open pipe 124 */ 125 ACI_CMD_SEND_DATA = 0x15, 126 /** 127 * Send an acknowledgment of received data 128 */ 129 ACI_CMD_SEND_DATA_ACK = 0x16, 130 /** 131 * Request data over an open pipe 132 */ 133 ACI_CMD_REQUEST_DATA = 0x17, 134 /** 135 * NACK a data reception 136 */ 137 ACI_CMD_SEND_DATA_NACK = 0x18, 138 /** 139 * Set application latency 140 */ 141 ACI_CMD_SET_APP_LATENCY = 0x19, 142 /** 143 * Set a security key 144 */ 145 ACI_CMD_SET_KEY = 0x1A, 146 /** 147 * Open Advertising Pipes 148 */ 149 ACI_CMD_OPEN_ADV_PIPE = 0x1B, 150 /** 151 * Start non-connectable advertising 152 */ 153 ACI_CMD_BROADCAST = 0x1C, 154 /** 155 * Start a security request in bonding mode 156 */ 157 ACI_CMD_BOND_SECURITY_REQUEST = 0x1D, 158 /** 159 * Start Directed advertising towards a Bonded Peer 160 */ 161 ACI_CMD_CONNECT_DIRECT = 0x1E, 162 /** 163 * Close a previously opened remote pipe 164 */ 165 ACI_CMD_CLOSE_REMOTE_PIPE = 0x1F, 166 /** 167 * Invalid ACI command opcode 168 */ 169 ACI_CMD_INVALID = 0xFF 170 171 } _aci_packed_ aci_cmd_opcode_t; 172 173 ACI_ASSERT_SIZE(aci_cmd_opcode_t, 1); 174 175 /** 176 * @struct aci_cmd_params_test_t 177 * @brief Structure for the ACI_CMD_TEST ACI command parameters 178 */ 179 typedef struct 180 { 181 aci_test_mode_change_t test_mode_change; /**< enum aci_test_mode_change_t */ 182 } _aci_packed_ aci_cmd_params_test_t; 183 184 ACI_ASSERT_SIZE(aci_cmd_params_test_t, 1); 185 186 /** 187 * @struct aci_cmd_params_echo_t 188 * @brief Structure for the ACI_CMD_ECHO ACI command parameters 189 */ 190 typedef struct 191 { 192 uint8_t echo_data[ACI_ECHO_DATA_MAX_LEN]; 193 } _aci_packed_ aci_cmd_params_echo_t; 194 195 ACI_ASSERT_SIZE(aci_cmd_params_echo_t, ACI_ECHO_DATA_MAX_LEN); 196 197 /** 198 * @struct aci_cmd_params_dtm_cmd_t 199 * @brief Structure for the ACI_CMD_DTM_CMD ACI command parameters 200 */ 201 typedef struct 202 { 203 uint8_t cmd_msb; 204 uint8_t cmd_lsb; 205 } _aci_packed_ aci_cmd_params_dtm_cmd_t; 206 207 /** 208 * @struct aci_cmd_params_setup_t 209 * @brief Structure for the ACI_CMD_SETUP ACI command parameters 210 */ 211 typedef struct 212 { 213 uint8_t setup_data[1]; 214 } _aci_packed_ aci_cmd_params_setup_t; 215 216 ACI_ASSERT_SIZE(aci_cmd_params_setup_t, 1); 217 218 /** 219 * @struct aci_cmd_params_write_dynamic_data_t 220 * @brief Structure for the ACI_CMD_WRITE_DYNAMIC_DATA ACI command parameters 221 * @note Dynamic data chunk size in this command is defined to go up to ACI_PACKET_MAX_LEN - 3 222 */ 223 typedef struct 224 { 225 uint8_t seq_no; 226 uint8_t dynamic_data[1]; 227 } _aci_packed_ aci_cmd_params_write_dynamic_data_t; 228 229 /** 230 * @define aci_cmd_params_set_local_data_t 231 * @brief Structure for the ACI_CMD_SET_LOCAL_DATA ACI command parameters 232 */ 233 typedef struct 234 { 235 aci_tx_data_t tx_data; 236 } _aci_packed_ aci_cmd_params_set_local_data_t; 237 238 /** 239 * @struct aci_cmd_params_connect_t 240 * @brief Structure for the ACI_CMD_CONNECT ACI command parameters 241 */ 242 typedef struct 243 { 244 uint16_t timeout; /**< 0x0000 (no timeout) to 0x3FFF */ 245 uint16_t adv_interval; /**< 16 bits of advertising interval for general discovery */ 246 } _aci_packed_ aci_cmd_params_connect_t; 247 248 ACI_ASSERT_SIZE(aci_cmd_params_connect_t, 4); 249 250 /** 251 * @define aci_cmd_params_bond_t 252 * @brief Structure for the ACI_CMD_BOND ACI command parameters 253 */ 254 typedef struct 255 { 256 uint16_t timeout; /**< 0x0000 (no timeout) to 0x3FFF */ 257 uint16_t adv_interval; /**< 16 bits of advertising interval for general discovery */ 258 } _aci_packed_ aci_cmd_params_bond_t; 259 260 ACI_ASSERT_SIZE(aci_cmd_params_bond_t, 4); 261 262 /** 263 * @struct aci_cmd_params_disconnect_t 264 * @brief Structure for the ACI_CMD_DISCONNECT ACI command parameters 265 */ 266 typedef struct 267 { 268 aci_disconnect_reason_t reason; /**< enum aci_disconnect_reason_t */ 269 } _aci_packed_ aci_cmd_params_disconnect_t; 270 271 ACI_ASSERT_SIZE(aci_cmd_params_disconnect_t, 1); 272 273 /** 274 * @struct aci_cmd_params_set_tx_power_t 275 * @brief Structure for the ACI_CMD_SET_TX_POWER ACI command parameters 276 */ 277 typedef struct 278 { 279 aci_device_output_power_t device_power; /**< enum aci_device_output_power_t */ 280 } _aci_packed_ aci_cmd_params_set_tx_power_t; 281 282 ACI_ASSERT_SIZE(aci_cmd_params_set_tx_power_t, 1); 283 /** 284 * @struct aci_cmd_params_change_timing_t 285 * @brief Structure for the ACI_CMD_CHANGE_TIMING ACI command parameters 286 */ 287 typedef struct 288 { 289 aci_ll_conn_params_t conn_params; 290 } _aci_packed_ aci_cmd_params_change_timing_t; 291 292 ACI_ASSERT_SIZE(aci_cmd_params_change_timing_t, 8); 293 294 /** 295 * @struct aci_cmd_params_open_remote_pipe_t 296 * @brief Structure for the ACI_CMD_OPEN_REMOTE_PIPE ACI command parameters 297 */ 298 typedef struct 299 { 300 uint8_t pipe_number; 301 } _aci_packed_ aci_cmd_params_open_remote_pipe_t; 302 303 /** 304 * @struct aci_cmd_params_send_data_t 305 * @brief Structure for the ACI_CMD_SEND_DATA ACI command parameters 306 */ 307 typedef struct 308 { 309 aci_tx_data_t tx_data; 310 } _aci_packed_ aci_cmd_params_send_data_t; 311 312 /** 313 * @define aci_cmd_params_send_data_ack_t 314 * @brief Structure for the ACI_CMD_SEND_DATA_ACK ACI command parameters 315 */ 316 typedef struct 317 { 318 uint8_t pipe_number; 319 } _aci_packed_ aci_cmd_params_send_data_ack_t; 320 321 /** 322 * @struct aci_cmd_params_send_data_t 323 * @brief Structure for the ACI_CMD_SEND_DATA ACI command parameters 324 */ 325 typedef struct 326 { 327 uint8_t pipe_number; 328 } _aci_packed_ aci_cmd_params_request_data_t; 329 330 /** 331 * @define aci_cmd_params_send_data_nack_t 332 * @brief Structure for the ACI_CMD_SEND_DATA_NACK ACI command parameters 333 */ 334 typedef struct 335 { 336 uint8_t pipe_number; 337 uint8_t error_code; 338 } _aci_packed_ aci_cmd_params_send_data_nack_t; 339 340 ACI_ASSERT_SIZE(aci_cmd_params_send_data_nack_t, 2); 341 342 /** 343 * @define aci_cmd_params_set_app_latency_t 344 * @brief Structure for the ACI_CMD_SET_APP_LATENCY ACI command parameters 345 */ 346 typedef struct 347 { 348 aci_app_latency_mode_t mode; 349 uint16_t latency; 350 } _aci_packed_ aci_cmd_params_set_app_latency_t; 351 352 ACI_ASSERT_SIZE(aci_cmd_params_set_app_latency_t, 3); 353 /** 354 * @define aci_cmd_params_set_key_t 355 * @brief Structure for the ACI_CMD_SET_KEY ACI command parameters 356 */ 357 typedef struct 358 { 359 aci_key_type_t key_type; 360 union 361 { 362 uint8_t passkey[6]; 363 uint8_t oob_key[16]; 364 } key; 365 } _aci_packed_ aci_cmd_params_set_key_t; 366 367 ACI_ASSERT_SIZE(aci_cmd_params_set_key_t, 17); 368 /** 369 * @define aci_cmd_params_open_adv_pipe_t 370 * @brief Structure for the ACI_CMD_OPEN_ADV_PIPE ACI command parameters 371 */ 372 typedef struct 373 { 374 uint8_t pipes[8]; 375 } _aci_packed_ aci_cmd_params_open_adv_pipe_t; 376 377 /** 378 * @define aci_cmd_params_broadcast_t 379 * @brief Structure for the ACI_CMD_BROADCAST ACI command parameters 380 */ 381 typedef struct 382 { 383 uint16_t timeout; /**< 0x0000 (no timeout) to 0x3FFF */ 384 uint16_t adv_interval; /**< 16 bits of advertising interval for general discovery */ 385 } _aci_packed_ aci_cmd_params_broadcast_t; 386 387 /** 388 * @struct aci_cmd_params_close_remote_pipe_t 389 * @brief Structure for the ACI_CMD_CLOSE_REMOTE_PIPE ACI command parameters 390 */ 391 typedef struct 392 { 393 uint8_t pipe_number; 394 } _aci_packed_ aci_cmd_params_close_remote_pipe_t; 395 396 /** 397 * @struct aci_cmd_t 398 * @brief Encapsulates a generic ACI command 399 */ 400 typedef struct 401 { 402 uint8_t len; /**< Length of the ACI command */ 403 aci_cmd_opcode_t cmd_opcode; /**< enum aci_cmd_opcode_t -> Opcode of the ACI command */ 404 union 405 { 406 aci_cmd_params_test_t test; 407 aci_cmd_params_echo_t echo; 408 aci_cmd_params_dtm_cmd_t dtm_cmd; 409 aci_cmd_params_setup_t setup; 410 aci_cmd_params_write_dynamic_data_t write_dynamic_data; 411 aci_cmd_params_set_local_data_t set_local_data; 412 aci_cmd_params_connect_t connect; 413 aci_cmd_params_bond_t bond; 414 aci_cmd_params_disconnect_t disconnect; 415 aci_cmd_params_set_tx_power_t set_tx_power; 416 aci_cmd_params_change_timing_t change_timing; 417 aci_cmd_params_open_remote_pipe_t open_remote_pipe; 418 aci_cmd_params_send_data_t send_data; 419 aci_cmd_params_send_data_ack_t send_data_ack; 420 aci_cmd_params_request_data_t request_data; 421 aci_cmd_params_send_data_nack_t send_data_nack; 422 aci_cmd_params_set_app_latency_t set_app_latency; 423 aci_cmd_params_set_key_t set_key; 424 aci_cmd_params_open_adv_pipe_t open_adv_pipe; 425 aci_cmd_params_broadcast_t broadcast; 426 aci_cmd_params_close_remote_pipe_t close_remote_pipe; 427 428 } params; 429 } _aci_packed_ aci_cmd_t; 430 431 #endif // ACI_CMDS_H__ 432 433 434