summaryrefslogtreecommitdiff
path: root/include/bluetooth_le_ll.h
blob: dd1f9155fd14b38f500bb6bec52eaf5546797e93 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
/* Copyright 2016 The Chromium OS Authors. All rights reserved.
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#include "common.h"
#include "btle_hci_int.h"

enum ll_state_t {
	UNINITIALIZED,
	STANDBY,
	SCANNING,
	ADVERTISING,
	INITIATING,
	CONNECTION,
	TEST_RX,
	TEST_TX,
};

#define LL_ADV_INTERVAL_UNIT_US       625
#define LL_ADV_TIMEOUT_UNIT_US        1000000

#define LL_ADV_DIRECT_INTERVAL_US     3750    /* 3.75 ms */
#define LL_ADV_DIRECT_TIMEOUT_US      1280000 /* 1.28 s */

#define LL_MAX_DATA_PACKET_LENGTH     27
#define LL_MAX_DATA_PACKETS           4

/* BTLE Spec 4.0: Vol 6, Part B, Section 4.5.3 */
#define TRANSMIT_WINDOW_OFFSET_CONSTANT	1250

#define LL_MAX_BUFFER_SIZE  (LL_MAX_DATA_PACKET_LENGTH * LL_MAX_DATA_PACKETS)

#define LL_SUPPORTED_FEATURES (HCI_LE_FTR_ENCRYPTION | \
	HCI_LE_FTR_CONNECTION_PARAMETERS_REQUEST | \
	HCI_LE_FTR_EXTENDED_REJECT_INDICATION | \
	HCI_LE_FTR_SLAVE_INITIATED_FEATURES_EXCHANGE)

#define LL_SUPPORTED_STATES (HCI_LE_STATE_NONCON_ADV | \
	HCI_LE_STATE_SCANNABLE_ADV | \
	HCI_LE_STATE_CONNECTABLE_ADV | \
	HCI_LE_STATE_DIRECT_ADV | \
	HCI_LE_STATE_PASSIVE_SCAN | \
	HCI_LE_STATE_ACTIVE_SCAN | \
	HCI_LE_STATE_INITIATE | \
	HCI_LE_STATE_SLAVE)

/*
 * 4.6.1 LE Encryption
 * A controller that supports LE Encryption shall support the following sections
 * within this document:
 * - LL_ENC_REQ (Section 2.4.2.4)
 * - LL_ENC_RSP (Section 2.4.2.5)
 * - LL_START_ENC_REQ (Section 2.4.2.6)
 * - LL_START_ENC_RSP (Section 2.4.2.7)
 * - LL_PAUSE_ENC_REQ (Section 2.4.2.11)
 * - LL_PAUSE_ENC_RSP (Section 2.4.2.12)
 * - Encryption Start Procedure (Section 5.1.3.1)
 * - Encryption Pause Procedure (Section 5.1.3.2)
 */

/*Link Layer Control PDU Opcodes */
#define LL_CONNECTION_UPDATE_REQ  0x00
#define LL_CHANNEL_MAP_REQ        0x01
#define LL_TERMINATE_IND          0x02
#define LL_ENC_REQ                0x03
#define LL_ENC_RSP                0x04
#define LL_START_ENC_REQ          0x05
#define LL_START_ENC_RSP          0x06
#define LL_UNKNOWN_RSP            0x07
#define LL_FEATURE_REQ            0x08
#define LL_FEATURE_RSP            0x09
#define LL_PAUSE_ENC_REQ          0x0A
#define LL_PAUSE_ENC_RSP          0x0B
#define LL_VERSION_IND            0x0C
#define LL_REJECT_IND             0x0D
#define LL_SLAVE_FEATURE_REQ      0x0E
#define LL_CONNECTION_PARAM_REQ   0x0F
#define LL_CONNECTION_PARAM_RSP   0x10
#define LL_REJECT_IND_EXT         0x11
#define LL_PING_REQ               0x12
#define LL_PING_RSP               0x13

/* BLE 4.1 Vol 6 2.3.3.1 Connection information */
#define CONNECT_REQ_INITA_LEN					6
#define CONNECT_REQ_ADVA_LEN					6
#define CONNECT_REQ_ACCESS_ADDR_LEN				4
#define CONNECT_REQ_CRC_INIT_VAL_LEN				3
#define CONNECT_REQ_WIN_SIZE_LEN				1
#define CONNECT_REQ_WIN_OFFSET_LEN				2
#define CONNECT_REQ_INTERVAL_LEN				2
#define CONNECT_REQ_LATENCY_LEN					2
#define CONNECT_REQ_TIMEOUT_LEN					2
#define CONNECT_REQ_CHANNEL_MAP_LEN				5
#define CONNECT_REQ_HOP_INCREMENT_AND_SCA_LEN			1
struct ble_connection_params {
	uint8_t		init_a[CONNECT_REQ_INITA_LEN];
	uint8_t		adv_a[CONNECT_REQ_ADVA_LEN];
	uint32_t	access_addr;
	uint32_t	crc_init_val;
	uint8_t		win_size;
	uint16_t	win_offset;
	uint16_t	interval;
	uint16_t	latency;
	uint16_t	timeout;
	uint64_t	channel_map;
	uint8_t		hop_increment;
	uint8_t		sleep_clock_accuracy;
	uint32_t	transmitWindowOffset;
	uint32_t	transmitWindowSize;
	uint32_t	connInterval;
	uint16_t	connSlaveLatency;
	uint32_t	connSupervisionTimeout;
};

uint8_t ll_reset(void);

uint8_t ll_set_tx_power(uint8_t *params);


/* LE Information */
uint8_t ll_read_buffer_size(uint8_t *return_params);
uint8_t ll_read_local_supported_features(uint8_t *return_params);
uint8_t ll_read_supported_states(uint8_t *return_params);
uint8_t ll_set_host_channel_classification(uint8_t *params);

/* Advertising */
uint8_t ll_set_advertising_params(uint8_t *params);
uint8_t ll_read_tx_power(void);
uint8_t ll_set_adv_data(uint8_t *params);
uint8_t ll_set_scan_response_data(uint8_t *params);
uint8_t ll_set_advertising_enable(uint8_t *params);

uint8_t ll_set_random_address(uint8_t *params);

/* Scanning */
uint8_t ll_set_scan_enable(uint8_t *params);
uint8_t ll_set_scan_params(uint8_t *params);

/* White List */
uint8_t ll_clear_white_list(void);
uint8_t ll_read_white_list_size(uint8_t *return_params);
uint8_t ll_add_device_to_white_list(uint8_t *params);
uint8_t ll_remove_device_from_white_list(uint8_t *params);

/* Connections */
uint8_t ll_read_remote_used_features(uint8_t *params);

/* RF Phy Testing */
uint8_t ll_receiver_test(uint8_t *params);
uint8_t ll_transmitter_test(uint8_t *params);
uint8_t ll_test_end(uint8_t *return_params);

void ll_ble_test_rx(void);
void ll_ble_test_rx(void);