BLE UART example
Fork of Nucleo_BLE_BlueNRG by
hci/inc/hci_internal.h
- Committer:
- sjallouli
- Date:
- 2014-12-19
- Revision:
- 0:a948f5f3904c
File content as of revision 0:a948f5f3904c:
/****************************************************************************** * * File Description * --------------------- * This file defines constants and functions for HCI layer. * See Bluetooth Core v 4.0, Vol. 2, Part E. * *******************************************************************************/ #ifndef __HCI_INTERNAL_H_ #define __HCI_INTERNAL_H_ #include "compiler.h" #include "hal_types.h" #include "clock.h" #include "link_layer.h" #include "hci.h" #define DEFAULT_TIMEOUT (CLOCK_SECOND/100) #define HCI_MAX_EVENT_SIZE 260 #define HCI_MAX_PACKET_SIZE HCI_MAX_EVENT_SIZE /* HCI Packet types */ #define HCI_COMMAND_PKT 0x01 #define HCI_ACLDATA_PKT 0x02 #define HCI_SCODATA_PKT 0x03 #define HCI_EVENT_PKT 0x04 #define HCI_VENDOR_PKT 0xff typedef struct __packed _hci_uart_pckt{ tHalUint8 type; tHalUint8 data[0]; } PACKED hci_uart_pckt; #define HCI_HDR_SIZE 1 typedef struct __packed _hci_command_hdr{ tHalUint16 opcode; /* OCF & OGF */ tHalUint8 plen; } PACKED hci_command_hdr; #define HCI_COMMAND_HDR_SIZE 3 typedef struct __packed _hci_event_pckt{ tHalUint8 evt; tHalUint8 plen; tHalUint8 data[0]; } PACKED hci_event_pckt; #define HCI_EVENT_HDR_SIZE 2 typedef struct __packed _hci_acl_hdr{ tHalUint16 handle; /* Handle & Flags(PB, BC) */ tHalUint16 dlen; } PACKED hci_acl_hdr; #define HCI_ACL_HDR_SIZE 4 /* Link Control */ #define OGF_LINK_CTL 0x01 #define OCF_DISCONNECT 0x0006 typedef struct __packed _disconnect_cp{ uint16_t handle; uint8_t reason; } PACKED disconnect_cp; #define DISCONNECT_CP_SIZE 3 /* Host Controller and Baseband */ #define OGF_HOST_CTL 0x03 #define OCF_SET_EVENT_MASK 0x0001 #define OCF_RESET 0x0003 #define OCF_READ_TRANSMIT_POWER_LEVEL 0x002D typedef struct __packed _read_transmit_power_level_cp{ uint16_t handle; uint8_t type; } PACKED read_transmit_power_level_cp; #define READ_TRANSMIT_POWER_LEVEL_CP_SIZE 3 typedef struct __packed _read_transmit_power_level_rp{ uint8_t status; uint16_t handle; int8_t level; } PACKED read_transmit_power_level_rp; #define READ_TRANSMIT_POWER_LEVEL_RP_SIZE 4 #define OCF_SET_CONTROLLER_TO_HOST_FC 0x0031 #define OCF_HOST_BUFFER_SIZE 0x0033 #define OCF_HOST_NUM_COMP_PKTS 0x0035 /* Informational Parameters */ #define OGF_INFO_PARAM 0x04 #define OCF_READ_LOCAL_VERSION 0x0001 typedef struct __packed _read_local_version_rp{ uint8_t status; uint8_t hci_version; uint16_t hci_revision; uint8_t lmp_pal_version; uint16_t manufacturer_name; uint16_t lmp_pal_subversion; } PACKED read_local_version_rp; #define READ_LOCAL_VERSION_RP_SIZE 9 #define OCF_READ_LOCAL_COMMANDS 0x0002 #define OCF_READ_LOCAL_FEATURES 0x0003 #define OCF_READ_BD_ADDR 0x0009 typedef struct __packed _read_bd_addr_rp{ uint8_t status; tBDAddr bdaddr; } PACKED read_bd_addr_rp; #define READ_BD_ADDR_RP_SIZE 7 /* Status params */ #define OGF_STATUS_PARAM 0x05 #define OCF_READ_RSSI 0x0005 typedef struct __packed _read_rssi_cp{ uint16_t handle; } PACKED read_rssi_cp; #define READ_RSSI_CP_SIZE 2 typedef struct __packed _read_rssi_rp{ uint8_t status; uint16_t handle; int8_t rssi; } PACKED read_rssi_rp; #define READ_RSSI_RP_SIZE 4 /* LE commands */ #define OGF_LE_CTL 0x08 #define OCF_LE_SET_EVENT_MASK 0x0001 typedef struct __packed _le_set_event_mask_cp{ uint8_t mask[8]; } PACKED le_set_event_mask_cp; #define LE_SET_EVENT_MASK_CP_SIZE 8 #define OCF_LE_READ_BUFFER_SIZE 0x0002 typedef struct __packed _le_read_buffer_size_rp{ uint8_t status; uint16_t pkt_len; uint8_t max_pkt; } PACKED le_read_buffer_size_rp; #define LE_READ_BUFFER_SIZE_RP_SIZE 4 #define OCF_LE_READ_LOCAL_SUPPORTED_FEATURES 0x0003 typedef struct __packed _le_read_local_supported_features_rp{ uint8_t status; uint8_t features[8]; } PACKED le_read_local_supported_features_rp; #define LE_READ_LOCAL_SUPPORTED_FEATURES_RP_SIZE 9 #define OCF_LE_SET_RANDOM_ADDRESS 0x0005 typedef struct __packed _le_set_random_address_cp{ tBDAddr bdaddr; } PACKED le_set_random_address_cp; #define LE_SET_RANDOM_ADDRESS_CP_SIZE 6 #define OCF_LE_SET_ADV_PARAMETERS 0x0006 typedef struct __packed _le_set_adv_parameters_cp{ uint16_t min_interval; uint16_t max_interval; uint8_t advtype; uint8_t own_bdaddr_type; uint8_t direct_bdaddr_type; tBDAddr direct_bdaddr; uint8_t chan_map; uint8_t filter; } PACKED le_set_adv_parameters_cp; #define LE_SET_ADV_PARAMETERS_CP_SIZE 15 #define OCF_LE_READ_ADV_CHANNEL_TX_POWER 0x0007 typedef struct __packed _le_read_adv_channel_tx_power_rp{ uint8_t status; int8_t level; } PACKED le_read_adv_channel_tx_power_rp; #define LE_READ_ADV_CHANNEL_TX_POWER_RP_SIZE 2 #define OCF_LE_SET_ADV_DATA 0x0008 typedef struct __packed _le_set_adv_data_cp{ uint8_t length; uint8_t data[31]; } PACKED le_set_adv_data_cp; #define LE_SET_ADV_DATA_CP_SIZE 32 #define OCF_LE_SET_SCAN_RESPONSE_DATA 0x0009 typedef struct __packed _le_set_scan_response_data_cp{ uint8_t length; uint8_t data[31]; } PACKED le_set_scan_response_data_cp; #define LE_SET_SCAN_RESPONSE_DATA_CP_SIZE 32 #define OCF_LE_SET_ADVERTISE_ENABLE 0x000A typedef struct __packed _le_set_advertise_enable_cp{ uint8_t enable; } PACKED le_set_advertise_enable_cp; #define LE_SET_ADVERTISE_ENABLE_CP_SIZE 1 #define OCF_LE_SET_SCAN_PARAMETERS 0x000B typedef struct __packed _le_set_scan_parameters_cp{ uint8_t type; uint16_t interval; uint16_t window; uint8_t own_bdaddr_type; uint8_t filter; } PACKED le_set_scan_parameters_cp; #define LE_SET_SCAN_PARAMETERS_CP_SIZE 7 #define OCF_LE_SET_SCAN_ENABLE 0x000C typedef struct __packed _le_set_scan_enable_cp{ uint8_t enable; uint8_t filter_dup; } PACKED le_set_scan_enable_cp; #define LE_SET_SCAN_ENABLE_CP_SIZE 2 #define OCF_LE_CREATE_CONN 0x000D typedef struct __packed _le_create_connection_cp{ uint16_t interval; uint16_t window; uint8_t initiator_filter; uint8_t peer_bdaddr_type; tBDAddr peer_bdaddr; uint8_t own_bdaddr_type; uint16_t min_interval; uint16_t max_interval; uint16_t latency; uint16_t supervision_timeout; uint16_t min_ce_length; uint16_t max_ce_length; } PACKED le_create_connection_cp; #define LE_CREATE_CONN_CP_SIZE 25 #define OCF_LE_CREATE_CONN_CANCEL 0x000E #define OCF_LE_READ_WHITE_LIST_SIZE 0x000F typedef struct __packed _le_read_white_list_size_rp{ uint8_t status; uint8_t size; } PACKED le_read_white_list_size_rp; #define LE_READ_WHITE_LIST_SIZE_RP_SIZE 2 #define OCF_LE_CLEAR_WHITE_LIST 0x0010 #define OCF_LE_ADD_DEVICE_TO_WHITE_LIST 0x0011 typedef struct __packed _le_add_device_to_white_list_cp{ uint8_t bdaddr_type; tBDAddr bdaddr; } PACKED le_add_device_to_white_list_cp; #define LE_ADD_DEVICE_TO_WHITE_LIST_CP_SIZE 7 #define OCF_LE_REMOVE_DEVICE_FROM_WHITE_LIST 0x0012 typedef struct __packed _le_remove_device_from_white_list_cp{ uint8_t bdaddr_type; tBDAddr bdaddr; } PACKED le_remove_device_from_white_list_cp; #define LE_REMOVE_DEVICE_FROM_WHITE_LIST_CP_SIZE 7 #define OCF_LE_CONN_UPDATE 0x0013 typedef struct __packed _le_connection_update_cp{ uint16_t handle; uint16_t min_interval; uint16_t max_interval; uint16_t latency; uint16_t supervision_timeout; uint16_t min_ce_length; uint16_t max_ce_length; } PACKED le_connection_update_cp; #define LE_CONN_UPDATE_CP_SIZE 14 #define OCF_LE_SET_HOST_CHANNEL_CLASSIFICATION 0x0014 typedef struct __packed _le_set_host_channel_classification_cp{ uint8_t map[5]; } PACKED le_set_host_channel_classification_cp; #define LE_SET_HOST_CHANNEL_CLASSIFICATION_CP_SIZE 5 #define OCF_LE_READ_CHANNEL_MAP 0x0015 typedef struct __packed _le_read_channel_map_cp{ uint16_t handle; } PACKED le_read_channel_map_cp; #define LE_READ_CHANNEL_MAP_CP_SIZE 2 typedef struct __packed _le_read_channel_map_rp{ uint8_t status; uint16_t handle; uint8_t map[5]; } le_read_channel_map_rp; #define LE_READ_CHANNEL_MAP_RP_SIZE 8 #define OCF_LE_READ_REMOTE_USED_FEATURES 0x0016 typedef struct __packed _le_read_remote_used_features_cp{ uint16_t handle; } PACKED le_read_remote_used_features_cp; #define LE_READ_REMOTE_USED_FEATURES_CP_SIZE 2 #define OCF_LE_ENCRYPT 0x0017 typedef struct __packed _le_encrypt_cp{ uint8_t key[16]; uint8_t plaintext[16]; } PACKED le_encrypt_cp; #define LE_ENCRYPT_CP_SIZE 32 typedef struct __packed _le_encrypt_rp{ uint8_t status; uint8_t encdata[16]; } PACKED le_encrypt_rp; #define LE_ENCRYPT_RP_SIZE 17 #define OCF_LE_RAND 0x0018 typedef struct __packed _le_rand_rp{ uint8_t status; uint8_t random[8]; } PACKED le_rand_rp; #define LE_RAND_RP_SIZE 9 #define OCF_LE_START_ENCRYPTION 0x0019 typedef struct __packed _le_start_encryption_cp{ uint16_t handle; uint8_t random[8]; uint16_t diversifier; uint8_t key[16]; } PACKED le_start_encryption_cp; #define LE_START_ENCRYPTION_CP_SIZE 28 #define OCF_LE_LTK_REPLY 0x001A typedef struct __packed _le_ltk_reply_cp{ uint16_t handle; uint8_t key[16]; } PACKED le_ltk_reply_cp; #define LE_LTK_REPLY_CP_SIZE 18 typedef struct __packed _le_ltk_reply_rp{ uint8_t status; uint16_t handle; } PACKED le_ltk_reply_rp; #define LE_LTK_REPLY_RP_SIZE 3 #define OCF_LE_LTK_NEG_REPLY 0x001B typedef struct __packed _le_ltk_neg_reply_cp{ uint16_t handle; } PACKED le_ltk_neg_reply_cp; #define LE_LTK_NEG_REPLY_CP_SIZE 2 typedef struct __packed _le_ltk_neg_reply_rp{ uint8_t status; uint16_t handle; } PACKED le_ltk_neg_reply_rp; #define LE_LTK_NEG_REPLY_RP_SIZE 3 #define OCF_LE_READ_SUPPORTED_STATES 0x001C typedef struct __packed _le_read_supported_states_rp{ uint8_t status; uint8_t states[8]; } PACKED le_read_supported_states_rp; #define LE_READ_SUPPORTED_STATES_RP_SIZE 9 #define OCF_LE_RECEIVER_TEST 0x001D typedef struct __packed _le_receiver_test_cp{ uint8_t frequency; } PACKED le_receiver_test_cp; #define LE_RECEIVER_TEST_CP_SIZE 1 #define OCF_LE_TRANSMITTER_TEST 0x001E typedef struct __packed _le_transmitter_test_cp{ uint8_t frequency; uint8_t length; uint8_t payload; } PACKED le_transmitter_test_cp; #define LE_TRANSMITTER_TEST_CP_SIZE 3 #define OCF_LE_TEST_END 0x001F typedef struct __packed _le_test_end_rp{ uint8_t status; uint16_t num_pkts; } PACKED le_test_end_rp; #define LE_TEST_END_RP_SIZE 3 /* Vendor specific commands */ #define OGF_VENDOR_CMD 0x3f /*------------- Events -------------*/ #define EVT_CONN_COMPLETE 0x03 typedef struct __packed _evt_conn_complete{ uint8_t status; uint16_t handle; tBDAddr bdaddr; uint8_t link_type; uint8_t encr_mode; } PACKED evt_conn_complete; #define EVT_CONN_COMPLETE_SIZE 13 #define EVT_DISCONN_COMPLETE 0x05 typedef struct __packed _evt_disconn_complete{ uint8_t status; uint16_t handle; uint8_t reason; } PACKED evt_disconn_complete; #define EVT_DISCONN_COMPLETE_SIZE 4 #define EVT_ENCRYPT_CHANGE 0x08 typedef struct __packed _evt_encrypt_change{ uint8_t status; uint16_t handle; uint8_t encrypt; } PACKED evt_encrypt_change; #define EVT_ENCRYPT_CHANGE_SIZE 5 #define EVT_READ_REMOTE_VERSION_COMPLETE 0x0C #define EVT_CMD_COMPLETE 0x0E typedef struct __packed _evt_cmd_complete{ tHalUint8 ncmd; tHalUint16 opcode; } PACKED evt_cmd_complete; #define EVT_CMD_COMPLETE_SIZE 3 #define EVT_CMD_STATUS 0x0F typedef struct __packed _evt_cmd_status{ tHalUint8 status; tHalUint8 ncmd; tHalUint16 opcode; } PACKED evt_cmd_status; #define EVT_CMD_STATUS_SIZE 4 #define EVT_HARDWARE_ERROR 0x10 typedef struct __packed _evt_hardware_error{ uint8_t code; } PACKED evt_hardware_error; #define EVT_HARDWARE_ERROR_SIZE 1 #define EVT_NUM_COMP_PKTS 0x13 typedef struct __packed _evt_num_comp_pkts{ uint8_t num_hndl; /* variable length part */ } PACKED evt_num_comp_pkts; #define EVT_NUM_COMP_PKTS_SIZE 1 /* variable length part of evt_num_comp_pkts. */ typedef struct __packed _evt_num_comp_pkts_param{ uint16_t hndl; uint16_t num_comp_pkts; } PACKED evt_num_comp_pkts_param; #define EVT_NUM_COMP_PKTS_PARAM_SIZE 1 #define EVT_ENCRYPTION_KEY_REFRESH_COMPLETE 0x30 typedef struct __packed _evt_encryption_key_refresh_complete{ uint8_t status; uint16_t handle; } PACKED evt_encryption_key_refresh_complete; #define EVT_ENCRYPTION_KEY_REFRESH_COMPLETE_SIZE 3 #define EVT_LE_META_EVENT 0x3E typedef struct __packed _evt_le_meta_event{ tHalUint8 subevent; tHalUint8 data[0]; } PACKED evt_le_meta_event; #define EVT_LE_META_EVENT_SIZE 1 #define EVT_LE_CONN_COMPLETE 0x01 typedef struct __packed _evt_le_connection_complete{ uint8_t status; uint16_t handle; uint8_t role; uint8_t peer_bdaddr_type; tBDAddr peer_bdaddr; uint16_t interval; uint16_t latency; uint16_t supervision_timeout; uint8_t master_clock_accuracy; } PACKED evt_le_connection_complete; #define EVT_LE_CONN_COMPLETE_SIZE 18 #define EVT_LE_ADVERTISING_REPORT 0x02 typedef struct __packed _le_advertising_info{ uint8_t evt_type; uint8_t bdaddr_type; tBDAddr bdaddr; uint8_t length; uint8_t data[0]; } PACKED le_advertising_info; #define LE_ADVERTISING_INFO_SIZE 9 #define EVT_LE_CONN_UPDATE_COMPLETE 0x03 typedef struct __packed _evt_le_connection_update_complete{ uint8_t status; uint16_t handle; uint16_t interval; uint16_t latency; uint16_t supervision_timeout; } PACKED evt_le_connection_update_complete; #define EVT_LE_CONN_UPDATE_COMPLETE_SIZE 9 #define EVT_LE_READ_REMOTE_USED_FEATURES_COMPLETE 0x04 typedef struct __packed _evt_le_read_remote_used_features_complete{ uint8_t status; uint16_t handle; uint8_t features[8]; } PACKED evt_le_read_remote_used_features_complete; #define EVT_LE_READ_REMOTE_USED_FEATURES_COMPLETE_SIZE 11 #define EVT_LE_LTK_REQUEST 0x05 typedef struct __packed _evt_le_long_term_key_request{ uint16_t handle; uint8_t random[8]; uint16_t ediv; } PACKED evt_le_long_term_key_request; #define EVT_LE_LTK_REQUEST_SIZE 12 /* Command opcode pack/unpack */ #define cmd_opcode_pack(ogf, ocf) (tHalUint16)((ocf & 0x03ff)|(ogf << 10)) #define cmd_opcode_ogf(op) (op >> 10) #define cmd_opcode_ocf(op) (op & 0x03ff) struct hci_request { uint16_t ogf; uint16_t ocf; int event; void *cparam; int clen; void *rparam; int rlen; }; int hci_send_cmd(uint16_t ogf, uint16_t ocf, uint8_t plen, void *param); typedef enum { WAITING_TYPE, WAITING_OPCODE1, WAITING_OPCODE2, WAITING_EVENT_CODE, WAITING_HANDLE, WAITING_HANDLE_FLAG, WAITING_PARAM_LEN, WAITING_DATA_LEN1, WAITING_DATA_LEN2, WAITING_PAYLOAD }hci_state; typedef void (*hci_packet_complete_callback)(void *pckt, tHalUint16 len); /* HCI library functions. */ void hci_init(void); int hci_send_req(struct hci_request *r); #endif /* __HCI_INTERNAL_H_ */