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