Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of BLE_BlueNRG by
hci_internal.h
00001 /****************************************************************************** 00002 * 00003 * File Description 00004 * --------------------- 00005 * This file defines constants and functions for HCI layer. 00006 * See Bluetooth Core v 4.0, Vol. 2, Part E. 00007 * 00008 *******************************************************************************/ 00009 00010 #ifndef __HCI_INTERNAL_H_ 00011 #define __HCI_INTERNAL_H_ 00012 00013 #include "compiler.h" 00014 #include "hal_types.h" 00015 #include "clock.h" 00016 #include "link_layer.h" 00017 #include "hci.h" 00018 00019 #define DEFAULT_TIMEOUT (CLOCK_SECOND/100) 00020 00021 #define HCI_MAX_EVENT_SIZE 260 00022 00023 #define HCI_MAX_PACKET_SIZE HCI_MAX_EVENT_SIZE 00024 00025 /* HCI Packet types */ 00026 #define HCI_COMMAND_PKT 0x01 00027 #define HCI_ACLDATA_PKT 0x02 00028 #define HCI_SCODATA_PKT 0x03 00029 #define HCI_EVENT_PKT 0x04 00030 #define HCI_VENDOR_PKT 0xff 00031 00032 00033 typedef __packed struct _hci_uart_pckt{ 00034 tHalUint8 type; 00035 tHalUint8 data[0]; 00036 } PACKED hci_uart_pckt; 00037 #define HCI_HDR_SIZE 1 00038 00039 typedef __packed struct _hci_command_hdr{ 00040 tHalUint16 opcode; /* OCF & OGF */ 00041 tHalUint8 plen; 00042 } PACKED hci_command_hdr; 00043 #define HCI_COMMAND_HDR_SIZE 3 00044 00045 typedef __packed struct _hci_event_pckt{ 00046 tHalUint8 evt; 00047 tHalUint8 plen; 00048 tHalUint8 data[0]; 00049 } PACKED hci_event_pckt; 00050 #define HCI_EVENT_HDR_SIZE 2 00051 00052 typedef __packed struct _hci_acl_hdr{ 00053 tHalUint16 handle; /* Handle & Flags(PB, BC) */ 00054 tHalUint16 dlen; 00055 } PACKED hci_acl_hdr; 00056 #define HCI_ACL_HDR_SIZE 4 00057 00058 00059 /* Link Control */ 00060 #define OGF_LINK_CTL 0x01 00061 00062 #define OCF_DISCONNECT 0x0006 00063 typedef __packed struct _disconnect_cp{ 00064 uint16_t handle; 00065 uint8_t reason; 00066 } PACKED disconnect_cp; 00067 #define DISCONNECT_CP_SIZE 3 00068 00069 00070 /* Host Controller and Baseband */ 00071 #define OGF_HOST_CTL 0x03 00072 00073 #define OCF_SET_EVENT_MASK 0x0001 00074 #define OCF_RESET 0x0003 00075 00076 #define OCF_READ_TRANSMIT_POWER_LEVEL 0x002D 00077 typedef __packed struct _read_transmit_power_level_cp{ 00078 uint16_t handle; 00079 uint8_t type; 00080 } PACKED read_transmit_power_level_cp; 00081 #define READ_TRANSMIT_POWER_LEVEL_CP_SIZE 3 00082 typedef __packed struct _read_transmit_power_level_rp{ 00083 uint8_t status; 00084 uint16_t handle; 00085 int8_t level; 00086 } PACKED read_transmit_power_level_rp; 00087 #define READ_TRANSMIT_POWER_LEVEL_RP_SIZE 4 00088 00089 #define OCF_SET_CONTROLLER_TO_HOST_FC 0x0031 00090 #define OCF_HOST_BUFFER_SIZE 0x0033 00091 #define OCF_HOST_NUM_COMP_PKTS 0x0035 00092 00093 /* Informational Parameters */ 00094 #define OGF_INFO_PARAM 0x04 00095 00096 #define OCF_READ_LOCAL_VERSION 0x0001 00097 typedef __packed struct _read_local_version_rp{ 00098 uint8_t status; 00099 uint8_t hci_version; 00100 uint16_t hci_revision; 00101 uint8_t lmp_pal_version; 00102 uint16_t manufacturer_name; 00103 uint16_t lmp_pal_subversion; 00104 } PACKED read_local_version_rp; 00105 #define READ_LOCAL_VERSION_RP_SIZE 9 00106 00107 #define OCF_READ_LOCAL_COMMANDS 0x0002 00108 #define OCF_READ_LOCAL_FEATURES 0x0003 00109 00110 #define OCF_READ_BD_ADDR 0x0009 00111 typedef __packed struct _read_bd_addr_rp{ 00112 uint8_t status; 00113 tBDAddr bdaddr; 00114 } PACKED read_bd_addr_rp; 00115 #define READ_BD_ADDR_RP_SIZE 7 00116 00117 /* Status params */ 00118 #define OGF_STATUS_PARAM 0x05 00119 00120 #define OCF_READ_RSSI 0x0005 00121 typedef __packed struct _read_rssi_cp{ 00122 uint16_t handle; 00123 } PACKED read_rssi_cp; 00124 #define READ_RSSI_CP_SIZE 2 00125 typedef __packed struct _read_rssi_rp{ 00126 uint8_t status; 00127 uint16_t handle; 00128 int8_t rssi; 00129 } PACKED read_rssi_rp; 00130 #define READ_RSSI_RP_SIZE 4 00131 00132 00133 /* LE commands */ 00134 #define OGF_LE_CTL 0x08 00135 00136 #define OCF_LE_SET_EVENT_MASK 0x0001 00137 typedef __packed struct _le_set_event_mask_cp{ 00138 uint8_t mask[8]; 00139 } PACKED le_set_event_mask_cp; 00140 #define LE_SET_EVENT_MASK_CP_SIZE 8 00141 00142 #define OCF_LE_READ_BUFFER_SIZE 0x0002 00143 typedef __packed struct _le_read_buffer_size_rp{ 00144 uint8_t status; 00145 uint16_t pkt_len; 00146 uint8_t max_pkt; 00147 } PACKED le_read_buffer_size_rp; 00148 #define LE_READ_BUFFER_SIZE_RP_SIZE 4 00149 00150 #define OCF_LE_READ_LOCAL_SUPPORTED_FEATURES 0x0003 00151 typedef __packed struct _le_read_local_supported_features_rp{ 00152 uint8_t status; 00153 uint8_t features[8]; 00154 } PACKED le_read_local_supported_features_rp; 00155 #define LE_READ_LOCAL_SUPPORTED_FEATURES_RP_SIZE 9 00156 00157 #define OCF_LE_SET_RANDOM_ADDRESS 0x0005 00158 typedef __packed struct _le_set_random_address_cp{ 00159 tBDAddr bdaddr; 00160 } PACKED le_set_random_address_cp; 00161 #define LE_SET_RANDOM_ADDRESS_CP_SIZE 6 00162 00163 #define OCF_LE_SET_ADV_PARAMETERS 0x0006 00164 typedef __packed struct _le_set_adv_parameters_cp{ 00165 uint16_t min_interval; 00166 uint16_t max_interval; 00167 uint8_t advtype; 00168 uint8_t own_bdaddr_type; 00169 uint8_t direct_bdaddr_type; 00170 tBDAddr direct_bdaddr; 00171 uint8_t chan_map; 00172 uint8_t filter; 00173 } PACKED le_set_adv_parameters_cp; 00174 #define LE_SET_ADV_PARAMETERS_CP_SIZE 15 00175 00176 #define OCF_LE_READ_ADV_CHANNEL_TX_POWER 0x0007 00177 typedef __packed struct _le_read_adv_channel_tx_power_rp{ 00178 uint8_t status; 00179 int8_t level; 00180 } PACKED le_read_adv_channel_tx_power_rp; 00181 #define LE_READ_ADV_CHANNEL_TX_POWER_RP_SIZE 2 00182 00183 #define OCF_LE_SET_ADV_DATA 0x0008 00184 typedef __packed struct _le_set_adv_data_cp{ 00185 uint8_t length; 00186 uint8_t data[31]; 00187 } PACKED le_set_adv_data_cp; 00188 #define LE_SET_ADV_DATA_CP_SIZE 32 00189 00190 #define OCF_LE_SET_SCAN_RESPONSE_DATA 0x0009 00191 typedef __packed struct _le_set_scan_response_data_cp{ 00192 uint8_t length; 00193 uint8_t data[31]; 00194 } PACKED le_set_scan_response_data_cp; 00195 #define LE_SET_SCAN_RESPONSE_DATA_CP_SIZE 32 00196 00197 #define OCF_LE_SET_ADVERTISE_ENABLE 0x000A 00198 typedef __packed struct _le_set_advertise_enable_cp{ 00199 uint8_t enable; 00200 } PACKED le_set_advertise_enable_cp; 00201 #define LE_SET_ADVERTISE_ENABLE_CP_SIZE 1 00202 00203 #define OCF_LE_SET_SCAN_PARAMETERS 0x000B 00204 typedef __packed struct _le_set_scan_parameters_cp{ 00205 uint8_t type; 00206 uint16_t interval; 00207 uint16_t window; 00208 uint8_t own_bdaddr_type; 00209 uint8_t filter; 00210 } PACKED le_set_scan_parameters_cp; 00211 #define LE_SET_SCAN_PARAMETERS_CP_SIZE 7 00212 00213 #define OCF_LE_SET_SCAN_ENABLE 0x000C 00214 typedef __packed struct _le_set_scan_enable_cp{ 00215 uint8_t enable; 00216 uint8_t filter_dup; 00217 } PACKED le_set_scan_enable_cp; 00218 #define LE_SET_SCAN_ENABLE_CP_SIZE 2 00219 00220 #define OCF_LE_CREATE_CONN 0x000D 00221 typedef __packed struct _le_create_connection_cp{ 00222 uint16_t interval; 00223 uint16_t window; 00224 uint8_t initiator_filter; 00225 uint8_t peer_bdaddr_type; 00226 tBDAddr peer_bdaddr; 00227 uint8_t own_bdaddr_type; 00228 uint16_t min_interval; 00229 uint16_t max_interval; 00230 uint16_t latency; 00231 uint16_t supervision_timeout; 00232 uint16_t min_ce_length; 00233 uint16_t max_ce_length; 00234 } PACKED le_create_connection_cp; 00235 #define LE_CREATE_CONN_CP_SIZE 25 00236 00237 #define OCF_LE_CREATE_CONN_CANCEL 0x000E 00238 00239 #define OCF_LE_READ_WHITE_LIST_SIZE 0x000F 00240 typedef __packed struct _le_read_white_list_size_rp{ 00241 uint8_t status; 00242 uint8_t size; 00243 } PACKED le_read_white_list_size_rp; 00244 #define LE_READ_WHITE_LIST_SIZE_RP_SIZE 2 00245 00246 #define OCF_LE_CLEAR_WHITE_LIST 0x0010 00247 00248 #define OCF_LE_ADD_DEVICE_TO_WHITE_LIST 0x0011 00249 typedef __packed struct _le_add_device_to_white_list_cp{ 00250 uint8_t bdaddr_type; 00251 tBDAddr bdaddr; 00252 } PACKED le_add_device_to_white_list_cp; 00253 #define LE_ADD_DEVICE_TO_WHITE_LIST_CP_SIZE 7 00254 00255 #define OCF_LE_REMOVE_DEVICE_FROM_WHITE_LIST 0x0012 00256 typedef __packed struct _le_remove_device_from_white_list_cp{ 00257 uint8_t bdaddr_type; 00258 tBDAddr bdaddr; 00259 } PACKED le_remove_device_from_white_list_cp; 00260 #define LE_REMOVE_DEVICE_FROM_WHITE_LIST_CP_SIZE 7 00261 00262 #define OCF_LE_CONN_UPDATE 0x0013 00263 typedef __packed struct _le_connection_update_cp{ 00264 uint16_t handle; 00265 uint16_t min_interval; 00266 uint16_t max_interval; 00267 uint16_t latency; 00268 uint16_t supervision_timeout; 00269 uint16_t min_ce_length; 00270 uint16_t max_ce_length; 00271 } PACKED le_connection_update_cp; 00272 #define LE_CONN_UPDATE_CP_SIZE 14 00273 00274 #define OCF_LE_SET_HOST_CHANNEL_CLASSIFICATION 0x0014 00275 typedef __packed struct _le_set_host_channel_classification_cp{ 00276 uint8_t map[5]; 00277 } PACKED le_set_host_channel_classification_cp; 00278 #define LE_SET_HOST_CHANNEL_CLASSIFICATION_CP_SIZE 5 00279 00280 #define OCF_LE_READ_CHANNEL_MAP 0x0015 00281 typedef __packed struct _le_read_channel_map_cp{ 00282 uint16_t handle; 00283 } PACKED le_read_channel_map_cp; 00284 #define LE_READ_CHANNEL_MAP_CP_SIZE 2 00285 00286 typedef __packed struct _le_read_channel_map_rp{ 00287 uint8_t status; 00288 uint16_t handle; 00289 uint8_t map[5]; 00290 } le_read_channel_map_rp; 00291 #define LE_READ_CHANNEL_MAP_RP_SIZE 8 00292 00293 #define OCF_LE_READ_REMOTE_USED_FEATURES 0x0016 00294 typedef __packed struct _le_read_remote_used_features_cp{ 00295 uint16_t handle; 00296 } PACKED le_read_remote_used_features_cp; 00297 #define LE_READ_REMOTE_USED_FEATURES_CP_SIZE 2 00298 00299 #define OCF_LE_ENCRYPT 0x0017 00300 typedef __packed struct _le_encrypt_cp{ 00301 uint8_t key[16]; 00302 uint8_t plaintext[16]; 00303 } PACKED le_encrypt_cp; 00304 #define LE_ENCRYPT_CP_SIZE 32 00305 00306 typedef __packed struct _le_encrypt_rp{ 00307 uint8_t status; 00308 uint8_t encdata[16]; 00309 } PACKED le_encrypt_rp; 00310 #define LE_ENCRYPT_RP_SIZE 17 00311 00312 #define OCF_LE_RAND 0x0018 00313 typedef __packed struct _le_rand_rp{ 00314 uint8_t status; 00315 uint8_t random[8]; 00316 } PACKED le_rand_rp; 00317 #define LE_RAND_RP_SIZE 9 00318 00319 #define OCF_LE_START_ENCRYPTION 0x0019 00320 typedef __packed struct _le_start_encryption_cp{ 00321 uint16_t handle; 00322 uint8_t random[8]; 00323 uint16_t diversifier; 00324 uint8_t key[16]; 00325 } PACKED le_start_encryption_cp; 00326 #define LE_START_ENCRYPTION_CP_SIZE 28 00327 00328 #define OCF_LE_LTK_REPLY 0x001A 00329 typedef __packed struct _le_ltk_reply_cp{ 00330 uint16_t handle; 00331 uint8_t key[16]; 00332 } PACKED le_ltk_reply_cp; 00333 #define LE_LTK_REPLY_CP_SIZE 18 00334 00335 typedef __packed struct _le_ltk_reply_rp{ 00336 uint8_t status; 00337 uint16_t handle; 00338 } PACKED le_ltk_reply_rp; 00339 #define LE_LTK_REPLY_RP_SIZE 3 00340 00341 #define OCF_LE_LTK_NEG_REPLY 0x001B 00342 typedef __packed struct _le_ltk_neg_reply_cp{ 00343 uint16_t handle; 00344 } PACKED le_ltk_neg_reply_cp; 00345 #define LE_LTK_NEG_REPLY_CP_SIZE 2 00346 00347 typedef __packed struct _le_ltk_neg_reply_rp{ 00348 uint8_t status; 00349 uint16_t handle; 00350 } PACKED le_ltk_neg_reply_rp; 00351 #define LE_LTK_NEG_REPLY_RP_SIZE 3 00352 00353 #define OCF_LE_READ_SUPPORTED_STATES 0x001C 00354 typedef __packed struct _le_read_supported_states_rp{ 00355 uint8_t status; 00356 uint8_t states[8]; 00357 } PACKED le_read_supported_states_rp; 00358 #define LE_READ_SUPPORTED_STATES_RP_SIZE 9 00359 00360 #define OCF_LE_RECEIVER_TEST 0x001D 00361 typedef __packed struct _le_receiver_test_cp{ 00362 uint8_t frequency; 00363 } PACKED le_receiver_test_cp; 00364 #define LE_RECEIVER_TEST_CP_SIZE 1 00365 00366 #define OCF_LE_TRANSMITTER_TEST 0x001E 00367 typedef __packed struct _le_transmitter_test_cp{ 00368 uint8_t frequency; 00369 uint8_t length; 00370 uint8_t payload; 00371 } PACKED le_transmitter_test_cp; 00372 #define LE_TRANSMITTER_TEST_CP_SIZE 3 00373 00374 #define OCF_LE_TEST_END 0x001F 00375 typedef __packed struct _le_test_end_rp{ 00376 uint8_t status; 00377 uint16_t num_pkts; 00378 } PACKED le_test_end_rp; 00379 #define LE_TEST_END_RP_SIZE 3 00380 00381 /* Vendor specific commands */ 00382 #define OGF_VENDOR_CMD 0x3f 00383 00384 00385 /*------------- Events -------------*/ 00386 #define EVT_CONN_COMPLETE 0x03 00387 typedef __packed struct _evt_conn_complete{ 00388 uint8_t status; 00389 uint16_t handle; 00390 tBDAddr bdaddr; 00391 uint8_t link_type; 00392 uint8_t encr_mode; 00393 } PACKED evt_conn_complete; 00394 #define EVT_CONN_COMPLETE_SIZE 13 00395 00396 #define EVT_DISCONN_COMPLETE 0x05 00397 typedef __packed struct _evt_disconn_complete{ 00398 uint8_t status; 00399 uint16_t handle; 00400 uint8_t reason; 00401 } PACKED evt_disconn_complete; 00402 #define EVT_DISCONN_COMPLETE_SIZE 4 00403 00404 #define EVT_ENCRYPT_CHANGE 0x08 00405 typedef __packed struct _evt_encrypt_change{ 00406 uint8_t status; 00407 uint16_t handle; 00408 uint8_t encrypt; 00409 } PACKED evt_encrypt_change; 00410 #define EVT_ENCRYPT_CHANGE_SIZE 5 00411 00412 #define EVT_READ_REMOTE_VERSION_COMPLETE 0x0C 00413 00414 #define EVT_CMD_COMPLETE 0x0E 00415 typedef __packed struct _evt_cmd_complete{ 00416 tHalUint8 ncmd; 00417 tHalUint16 opcode; 00418 } PACKED evt_cmd_complete; 00419 #define EVT_CMD_COMPLETE_SIZE 3 00420 00421 #define EVT_CMD_STATUS 0x0F 00422 typedef __packed struct _evt_cmd_status{ 00423 tHalUint8 status; 00424 tHalUint8 ncmd; 00425 tHalUint16 opcode; 00426 } PACKED evt_cmd_status; 00427 #define EVT_CMD_STATUS_SIZE 4 00428 00429 #define EVT_HARDWARE_ERROR 0x10 00430 typedef __packed struct _evt_hardware_error{ 00431 uint8_t code; 00432 } PACKED evt_hardware_error; 00433 #define EVT_HARDWARE_ERROR_SIZE 1 00434 00435 #define EVT_NUM_COMP_PKTS 0x13 00436 typedef __packed struct _evt_num_comp_pkts{ 00437 uint8_t num_hndl; 00438 /* variable length part */ 00439 } PACKED evt_num_comp_pkts; 00440 #define EVT_NUM_COMP_PKTS_SIZE 1 00441 00442 /* variable length part of evt_num_comp_pkts. */ 00443 typedef __packed struct _evt_num_comp_pkts_param{ 00444 uint16_t hndl; 00445 uint16_t num_comp_pkts; 00446 } PACKED evt_num_comp_pkts_param; 00447 #define EVT_NUM_COMP_PKTS_PARAM_SIZE 1 00448 00449 #define EVT_ENCRYPTION_KEY_REFRESH_COMPLETE 0x30 00450 typedef __packed struct _evt_encryption_key_refresh_complete{ 00451 uint8_t status; 00452 uint16_t handle; 00453 } PACKED evt_encryption_key_refresh_complete; 00454 #define EVT_ENCRYPTION_KEY_REFRESH_COMPLETE_SIZE 3 00455 00456 #define EVT_LE_META_EVENT 0x3E 00457 typedef __packed struct _evt_le_meta_event{ 00458 tHalUint8 subevent; 00459 tHalUint8 data[0]; 00460 } PACKED evt_le_meta_event; 00461 #define EVT_LE_META_EVENT_SIZE 1 00462 00463 #define EVT_LE_CONN_COMPLETE 0x01 00464 typedef __packed struct _evt_le_connection_complete{ 00465 uint8_t status; 00466 uint16_t handle; 00467 uint8_t role; 00468 uint8_t peer_bdaddr_type; 00469 tBDAddr peer_bdaddr; 00470 uint16_t interval; 00471 uint16_t latency; 00472 uint16_t supervision_timeout; 00473 uint8_t master_clock_accuracy; 00474 } PACKED evt_le_connection_complete; 00475 #define EVT_LE_CONN_COMPLETE_SIZE 18 00476 00477 #define EVT_LE_ADVERTISING_REPORT 0x02 00478 typedef __packed struct _le_advertising_info{ 00479 uint8_t evt_type; 00480 uint8_t bdaddr_type; 00481 tBDAddr bdaddr; 00482 uint8_t length; 00483 uint8_t data[0]; 00484 } PACKED le_advertising_info; 00485 #define LE_ADVERTISING_INFO_SIZE 9 00486 00487 #define EVT_LE_CONN_UPDATE_COMPLETE 0x03 00488 typedef __packed struct _evt_le_connection_update_complete{ 00489 uint8_t status; 00490 uint16_t handle; 00491 uint16_t interval; 00492 uint16_t latency; 00493 uint16_t supervision_timeout; 00494 } PACKED evt_le_connection_update_complete; 00495 #define EVT_LE_CONN_UPDATE_COMPLETE_SIZE 9 00496 00497 #define EVT_LE_READ_REMOTE_USED_FEATURES_COMPLETE 0x04 00498 typedef __packed struct _evt_le_read_remote_used_features_complete{ 00499 uint8_t status; 00500 uint16_t handle; 00501 uint8_t features[8]; 00502 } PACKED evt_le_read_remote_used_features_complete; 00503 #define EVT_LE_READ_REMOTE_USED_FEATURES_COMPLETE_SIZE 11 00504 00505 #define EVT_LE_LTK_REQUEST 0x05 00506 typedef __packed struct _evt_le_long_term_key_request{ 00507 uint16_t handle; 00508 uint8_t random[8]; 00509 uint16_t ediv; 00510 } PACKED evt_le_long_term_key_request; 00511 #define EVT_LE_LTK_REQUEST_SIZE 12 00512 00513 00514 /* Command opcode pack/unpack */ 00515 #define cmd_opcode_pack(ogf, ocf) (tHalUint16)((ocf & 0x03ff)|(ogf << 10)) 00516 #define cmd_opcode_ogf(op) (op >> 10) 00517 #define cmd_opcode_ocf(op) (op & 0x03ff) 00518 00519 00520 struct hci_request { 00521 uint16_t ogf; 00522 uint16_t ocf; 00523 int event; 00524 void *cparam; 00525 int clen; 00526 void *rparam; 00527 int rlen; 00528 }; 00529 00530 int hci_send_cmd(uint16_t ogf, uint16_t ocf, uint8_t plen, void *param); 00531 00532 typedef enum { 00533 WAITING_TYPE, 00534 WAITING_OPCODE1, 00535 WAITING_OPCODE2, 00536 WAITING_EVENT_CODE, 00537 WAITING_HANDLE, 00538 WAITING_HANDLE_FLAG, 00539 WAITING_PARAM_LEN, 00540 WAITING_DATA_LEN1, 00541 WAITING_DATA_LEN2, 00542 WAITING_PAYLOAD 00543 }hci_state; 00544 00545 typedef void (*hci_packet_complete_callback)(void *pckt, tHalUint16 len); 00546 00547 /* HCI library functions. */ 00548 void hci_init(void); 00549 00550 int hci_send_req(struct hci_request *r); 00551 00552 #endif /* __HCI_INTERNAL_H_ */
Generated on Tue Jul 12 2022 16:24:20 by
1.7.2
