BLE_API wrapper library for STMicroelectronics' BlueNRG Bluetooth Low Energy expansion board shield (Component)

Dependents:   Nucleo_Zumo_BLE_IDB04A1 contest_IOT5 contest_IOT6 contest_IOT_10 ... more

Fork of X_NUCLEO_IDB0XA1 by ST Expansion SW Team

Arduino Connector Compatibility Warning

X-NUCLEO-IDB04A1 and X-NUCLEO-IDB05A1 are Arduino compatible with an exception: instead of using pin D13 for the SPI clock, they use pin D3. The default configuration for this library is having the SPI clock on pin D3.

To be fully Arduino compatible, X-NUCLEO-IDB04A1 and X-NUCLEO-IDB05A1 need a small HW patch.

For X-NUCLEO-IDB04A1 this patch consists in removing zero resistor R10 and instead soldering zero resistor R11. For X-NUCLEO-IDB05A1 this patch consists in removing zero resistor R4 and instead soldering zero resistor R6.

In case you patch your board, then you also have to configure this library to use pin D13 to drive the SPI clock (see macro IDB0XA1_D13_PATCH in file x_nucleo_idb0xa1_targets.h).

If you use pin D13 for the SPI clock, please be aware that on STM32 Nucleo boards you may not drive the LED, otherwise you will get a conflict: the LED on STM32 Nucleo boards is connected to pin D13.

Referring to the current list of tested platforms (see X-NUCLEO-IDB04A1 and X-NUCLEO-IDB05A1 pages), the patch is required by ST-Nucleo-F103RB; ST-Nucleo-F302R8; ST-Nucleo-F411RE; and ST-Nucleo-F446RE.

x-nucleo-idb0xa1/bluenrg-hci/ble_hci.h

Committer:
Andrea Palmieri
Date:
2016-09-16
Revision:
307:fa98703ece8e
Parent:
282:27ead63b6cfc

File content as of revision 307:fa98703ece8e:

/******************** (C) COPYRIGHT 2012 STMicroelectronics ********************
* File Name          : hci.h
* Author             : AMS - HEA&RF BU
* Version            : V1.0.0
* Date               : 19-July-2012
* Description        : Constants and functions for HCI layer. See Bluetooth Core
*                      v 4.0, Vol. 2, Part E.
********************************************************************************
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME.
* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT,
* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE
* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING
* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
*******************************************************************************/

#ifndef __HCI_H_
#define __HCI_H_

#include "ble_hal_types.h"
#include "ble_link_layer.h"
#include <ble_list.h>

#define HCI_READ_PACKET_SIZE                    128 //71

/*** Data types ***/

/* structure used to read received data */
typedef struct _tHciDataPacket
{
  tListNode currentNode;
  uint8_t dataBuff[HCI_READ_PACKET_SIZE];
  uint8_t data_len;
} tHciDataPacket;

typedef enum
{
  BUSY,
  AVAILABLE
} HCI_CMD_STATUS_t;

/**
 * @defgroup HCI_Error_codes HCI Error codes
 * @{
 */
#define HCI_UNKNOWN_COMMAND                     0x01
#define HCI_NO_CONNECTION                       0x02
#define HCI_HARDWARE_FAILURE                    0x03
#define HCI_PAGE_TIMEOUT                        0x04
#define HCI_AUTHENTICATION_FAILURE              0x05
#define HCI_PIN_OR_KEY_MISSING                  0x06
#define HCI_MEMORY_FULL                         0x07
#define HCI_CONNECTION_TIMEOUT                  0x08
#define HCI_MAX_NUMBER_OF_CONNECTIONS		0x09
#define HCI_MAX_NUMBER_OF_SCO_CONNECTIONS	0x0a
#define HCI_ACL_CONNECTION_EXISTS               0x0b
#define HCI_COMMAND_DISALLOWED                  0x0c
#define HCI_REJECTED_LIMITED_RESOURCES          0x0d
#define HCI_REJECTED_SECURITY                   0x0e
#define HCI_REJECTED_PERSONAL                   0x0f
#define HCI_HOST_TIMEOUT                        0x10
#define HCI_UNSUPPORTED_FEATURE                 0x11
#define HCI_INVALID_PARAMETERS                  0x12
#define HCI_OE_USER_ENDED_CONNECTION            0x13
#define HCI_OE_LOW_RESOURCES                    0x14
#define HCI_OE_POWER_OFF                        0x15
#define HCI_CONNECTION_TERMINATED               0x16
#define HCI_REPEATED_ATTEMPTS                   0x17
#define HCI_PAIRING_NOT_ALLOWED                 0x18
#define HCI_UNKNOWN_LMP_PDU                     0x19
#define HCI_UNSUPPORTED_REMOTE_FEATURE          0x1a
#define HCI_SCO_OFFSET_REJECTED                 0x1b
#define HCI_SCO_INTERVAL_REJECTED               0x1c
#define HCI_AIR_MODE_REJECTED                   0x1d
#define HCI_INVALID_LMP_PARAMETERS              0x1e
#define HCI_UNSPECIFIED_ERROR                   0x1f
#define HCI_UNSUPPORTED_LMP_PARAMETER_VALUE     0x20
#define HCI_ROLE_CHANGE_NOT_ALLOWED             0x21
#define HCI_LMP_RESPONSE_TIMEOUT                0x22
#define HCI_LMP_ERROR_TRANSACTION_COLLISION     0x23
#define HCI_LMP_PDU_NOT_ALLOWED                 0x24
#define HCI_ENCRYPTION_MODE_NOT_ACCEPTED        0x25
#define HCI_UNIT_LINK_KEY_USED                  0x26
#define HCI_QOS_NOT_SUPPORTED                   0x27
#define HCI_INSTANT_PASSED                      0x28
#define HCI_PAIRING_NOT_SUPPORTED               0x29
#define HCI_TRANSACTION_COLLISION               0x2a
#define HCI_QOS_UNACCEPTABLE_PARAMETER          0x2c
#define HCI_QOS_REJECTED                        0x2d
#define HCI_CLASSIFICATION_NOT_SUPPORTED        0x2e
#define HCI_INSUFFICIENT_SECURITY               0x2f
#define HCI_PARAMETER_OUT_OF_RANGE              0x30
#define HCI_ROLE_SWITCH_PENDING                 0x32
#define HCI_SLOT_VIOLATION                      0x34
#define HCI_ROLE_SWITCH_FAILED                  0x35
#define HCI_EIR_TOO_LARGE                       0x36
#define HCI_SIMPLE_PAIRING_NOT_SUPPORTED        0x37
#define HCI_HOST_BUSY_PAIRING                   0x38
#define HCI_CONN_REJ_NO_CH_FOUND                0x39
#define HCI_CONTROLLER_BUSY                     0x3A
#define HCI_UNACCEPTABLE_CONN_INTERV            0x3B
#define HCI_DIRECTED_ADV_TIMEOUT                0x3C
#define HCI_CONN_TERM_MIC_FAIL                  0x3D
#define HCI_CONN_FAIL_TO_BE_ESTABL              0x3E
#define HCI_MAC_CONN_FAILED                     0x3F
/**
 * @}
 */


/*
 * HCI library functions.
 * Each function returns 0 in case of success, otherwise one of the error codes.
 */

int hci_reset(void);

int hci_disconnect(uint16_t handle, uint8_t reason);

int hci_le_set_advertise_enable(uint8_t enable);

int hci_le_set_advertising_parameters(uint16_t min_interval, uint16_t max_interval, uint8_t advtype,
		uint8_t own_bdaddr_type, uint8_t direct_bdaddr_type, const tBDAddr direct_bdaddr, uint8_t chan_map,
		uint8_t filter);

int hci_le_set_scan_parameters(uint8_t type, uint16_t interval,
                               uint16_t window, uint8_t own_bdaddr_type,
                               uint8_t filter);

int hci_le_set_scan_enable(uint8_t enable, uint8_t filter_dup);

int hci_le_set_advertising_data(uint8_t length, const uint8_t data[]);

int hci_le_set_scan_resp_data(uint8_t length, const uint8_t data[]);

int hci_le_rand(uint8_t random_number[8]);

int hci_le_read_advertising_channel_tx_power(int8_t *tx_power_level);

int hci_acl_data(const uint8_t * data, uint16_t len);

int hci_le_set_random_address(tBDAddr bdaddr);

int hci_read_bd_addr(tBDAddr bdaddr);

int hci_le_read_white_list_size(uint8_t *size);

int hci_le_clear_white_list(void);

int hci_le_add_device_to_white_list(uint8_t bdaddr_type, tBDAddr bdaddr);

int hci_le_remove_device_from_white_list(uint8_t bdaddr_type, tBDAddr bdaddr);

int hci_le_encrypt(uint8_t key[16], uint8_t plaintextData[16], uint8_t encryptedData[16]);

int hci_le_ltk_request_reply(uint8_t key[16]);

int hci_le_ltk_request_neg_reply(void);

int hci_le_read_buffer_size(uint16_t *pkt_len, uint8_t *max_pkt);

int hci_le_create_connection(uint16_t interval,	uint16_t window, uint8_t initiator_filter, uint8_t peer_bdaddr_type,
                             const 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);

int hci_le_create_connection_cancel(void);

int hci_read_transmit_power_level(uint16_t *conn_handle, uint8_t type, int8_t *tx_level);

int hci_read_rssi(uint16_t *conn_handle, int8_t *rssi);

int hci_le_read_local_supported_features(uint8_t *features);

int hci_le_read_channel_map(uint16_t conn_handle, uint8_t ch_map[5]);

int hci_le_read_supported_states(uint8_t states[8]);

int hci_le_receiver_test(uint8_t frequency);

int hci_le_transmitter_test(uint8_t frequency, uint8_t length, uint8_t payload);

int hci_le_test_end(uint16_t *num_pkts);

int hci_le_read_local_version(uint8_t *hci_version, uint16_t *hci_revision, uint8_t *lmp_pal_version, 
			      uint16_t *manufacturer_name, uint16_t *lmp_pal_subversion);

/**
 * This function must be used to pass the packet received from the HCI
 * interface to the BLE Stack HCI state machine.
 *
 * @param[in] hciReadPacket    The packet that is received from HCI interface.
 *
 */
void HCI_Input(tHciDataPacket *hciReadPacket);

/**
 * Initialization function. Must be done before any data can be received from
 * BLE controller.
 */
void HCI_Init(void);

/**
 * Callback used to pass events to application.
 *
 * @param[in] pckt    The event.
 *
 */
extern void HCI_Event_CB(void *pckt);

/**
 * Processing function that must be called after an event is received from
 * HCI interface. Must be called outside ISR. It will call HCI_Event_CB if
 * necessary.
*/
void HCI_Process(void);

/**
 * @brief Check if queue of HCI event is empty or not.
 * @note This funtion can be used to check if the event queue from BlueNRG is empty. This
 *        is useful when checking if it is safe to go to sleep. 
 * @return TRUE if event queue is empty. FALSE otherwhise.
 */
BOOL HCI_Queue_Empty(void);
/**
 * Iterrupt service routine that must be called when the BlueNRG 
 * reports a packet received or an event to the host through the 
 * BlueNRG interrupt line.
 */
#ifdef __DMA_LP__
void HCI_Isr(uint8_t *buffer, uint8_t event_payload_len);
void HCI_Process_Notification_Request(void);
void HCI_Cmd_Status(HCI_CMD_STATUS_t Hci_Cmd_Status);
void HCI_Wait_For_Response(void);
#else
void HCI_Isr(void);
#endif /* __DMA_LP__ */

extern tListNode hciReadPktPool;
extern tListNode hciReadPktRxQueue;

#endif /* __HCI_H_ */