Contiki-NG
ble-cc2650.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2017, Graz University of Technology
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  * notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  * notice, this list of conditions and the following disclaimer in the
12  * documentation and/or other materials provided with the distribution.
13  * 3. Neither the name of the copyright holder nor the names of its
14  * contributors may be used to endorse or promote products derived
15  * from this software without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
20  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
21  * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
22  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
23  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
24  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
26  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
28  * OF THE POSSIBILITY OF SUCH DAMAGE.
29  */
30 
31 /**
32  * \file
33  * BLE radio for the TI CC26xx platform
34  *
35  * \author
36  * Michael Spoerk <michael.spoerk@tugraz.at>
37  */
38 /*---------------------------------------------------------------------------*/
39 #include "contiki.h"
40 #include "dev/radio.h"
41 #include "os/dev/ble-hal.h"
43 
44 #include <stdint.h>
45 #include <string.h>
46 /*---------------------------------------------------------------------------*/
47 #include "sys/log.h"
48 #define LOG_MODULE "RADIO"
49 #define LOG_LEVEL LOG_LEVEL_MAIN
50 /*---------------------------------------------------------------------------*/
51 static uint16_t adv_interval;
52 static ble_adv_type_t adv_type;
53 static ble_addr_type_t adv_own_addr_type;
54 static uint8_t adv_channel_map;
55 static uint16_t buffer_size = 0;
56 /*---------------------------------------------------------------------------*/
57 static uint16_t scan_interval;
58 static uint16_t scan_window;
59 static ble_scan_type_t scan_type;
60 static ble_addr_type_t scan_own_addr_type;
61 /*---------------------------------------------------------------------------*/
62 static ble_addr_type_t initiator_peer_addr_type;
63 static uint8_t initiator_peer_addr[BLE_ADDR_SIZE];
64 /*---------------------------------------------------------------------------*/
65 static uint16_t connection_interval;
66 static uint16_t connection_latency;
67 static uint16_t connection_timeout;
68 /*---------------------------------------------------------------------------*/
69 static int
70 init(void)
71 {
72  int result = ble_hal.reset();
73  return result == BLE_RESULT_OK;
74 }
75 /*---------------------------------------------------------------------------*/
76 static int
77 send(const void *payload, unsigned short payload_len)
78 {
79  uint8_t res;
80  res = ble_hal.send((void *)payload, payload_len);
81  LOG_DBG("ble-mode send() %d bytes\n", payload_len);
82  if(res == BLE_RESULT_OK) {
83  return RADIO_TX_OK;
84  } else {
85  LOG_ERR("ble-mode send() error: %d\n", res);
86  return RADIO_TX_ERR;
87  }
88 }
89 /*---------------------------------------------------------------------------*/
90 static int
91 on(void)
92 {
93  return 1;
94 }
95 /*---------------------------------------------------------------------------*/
96 static int
97 off(void)
98 {
99  ble_hal.disconnect(0, 0);
100  return 1;
101 }
102 /*---------------------------------------------------------------------------*/
103 static radio_result_t
104 get_value(radio_param_t param, radio_value_t *value)
105 {
106  unsigned int temp;
107 
108  if(!value) {
110  }
111 
112  switch(param) {
114  *value = BLE_DATA_CHANNEL_MIN;
115  return RADIO_RESULT_OK;
117  *value = BLE_DATA_CHANNEL_MAX;
118  return RADIO_RESULT_OK;
119  case RADIO_CONST_BLE_BUFFER_SIZE:
120  if(buffer_size == 0) {
121  ble_hal.read_buffer_size((unsigned int *)&buffer_size, &temp);
122  }
123  memcpy(value, &buffer_size, 2);
124  return RADIO_RESULT_OK;
125  case RADIO_CONST_BLE_BUFFER_AMOUNT:
126  ble_hal.read_buffer_size(&temp, (unsigned int *)value);
127  return RADIO_RESULT_OK;
128  case RADIO_PARAM_BLE_CONN_INTERVAL:
129  ble_hal.read_connection_interval(0, (unsigned int *)value);
130  return RADIO_RESULT_OK;
131  default:
133  }
134 }
135 /*---------------------------------------------------------------------------*/
136 static radio_result_t
137 set_value(radio_param_t param, radio_value_t value)
138 {
139  switch(param) {
140  case RADIO_PARAM_BLE_ADV_INTERVAL:
141  if((value > BLE_ADV_INTERVAL_MAX) || (value < BLE_ADV_INTERVAL_MIN)) {
143  }
144  adv_interval = (uint16_t)value;
145  return RADIO_RESULT_OK;
146  case RADIO_PARAM_BLE_ADV_TYPE:
147  adv_type = value;
148  return RADIO_RESULT_OK;
149  case RADIO_PARAM_BLE_ADV_OWN_ADDR_TYPE:
150  adv_own_addr_type = value;
151  return RADIO_RESULT_OK;
152  case RADIO_PARAM_BLE_ADV_CHANNEL_MAP:
153  adv_channel_map = value;
154  return RADIO_RESULT_OK;
155  case RADIO_PARAM_BLE_ADV_ENABLE:
156  if(value) {
157  /* set the advertisement parameter before enabling */
158  ble_hal.set_adv_param(adv_interval, adv_type,
159  adv_own_addr_type, adv_channel_map);
160  }
161  ble_hal.set_adv_enable(value);
162  return RADIO_RESULT_OK;
163  case RADIO_PARAM_BLE_SCAN_INTERVAL:
164  if((value > BLE_SCAN_INTERVAL_MAX) || (value < BLE_SCAN_INTERVAL_MIN)) {
166  }
167  scan_interval = (uint16_t)value;
168  return RADIO_RESULT_OK;
169  case RADIO_PARAM_BLE_SCAN_WINDOW:
170  if((value > BLE_SCAN_INTERVAL_MAX) || (value < BLE_SCAN_INTERVAL_MIN)) {
172  }
173  scan_window = (uint16_t)value;
174  return RADIO_RESULT_OK;
175  case RADIO_PARAM_BLE_SCAN_TYPE:
176  scan_type = value;
177  return RADIO_RESULT_OK;
178  case RADIO_PARAM_BLE_SCAN_OWN_ADDR_TYPE:
179  scan_own_addr_type = value;
180  return RADIO_RESULT_OK;
181  case RADIO_PARAM_BLE_SCAN_ENABLE:
182  if(value) {
183  ble_hal.set_scan_param(scan_type, scan_interval,
184  scan_window, scan_own_addr_type);
185  }
186  ble_hal.set_scan_enable(value, 0);
187  return RADIO_RESULT_OK;
188  case RADIO_PARAM_BLE_PEER_ADDR_TYPE:
189  initiator_peer_addr_type = value;
190  return RADIO_RESULT_OK;
191  case RADIO_PARAM_BLE_CONN_INTERVAL:
192  connection_interval = value;
193  return RADIO_RESULT_OK;
194  case RADIO_PARAM_BLE_CONN_LATENCY:
195  connection_latency = value;
196  return RADIO_RESULT_OK;
197  case RADIO_PARAM_BLE_CONN_SUPERVISION_TIMEOUT:
198  connection_timeout = value;
199  return RADIO_RESULT_OK;
200  case RADIO_PARAM_BLE_INITIATOR_ENABLE:
201  if(value) {
202  ble_hal.create_connection(scan_interval, scan_window,
203  initiator_peer_addr_type,
204  initiator_peer_addr,
205  scan_own_addr_type,
206  connection_interval,
207  connection_latency,
208  connection_timeout);
209  } else {
210  ble_hal.create_connection_cancel();
211  }
212  return RADIO_RESULT_OK;
213  case RADIO_PARAM_BLE_CONN_UPDATE:
214  if(value) {
215  return ble_hal.connection_update(0, connection_interval, connection_latency, connection_timeout);
216  } else {
218  }
219  default:
221  }
222 }
223 /*---------------------------------------------------------------------------*/
224 static radio_result_t
225 get_object(radio_param_t param, void *dest, size_t size)
226 {
227  switch(param) {
228  case RADIO_CONST_BLE_BD_ADDR:
229  if(size != BLE_ADDR_SIZE || !dest) {
231  }
232  ble_hal.read_bd_addr(dest);
233  return RADIO_RESULT_OK;
234  }
236 }
237 /*---------------------------------------------------------------------------*/
238 static radio_result_t
239 set_object(radio_param_t param, const void *src, size_t size)
240 {
241  switch(param) {
242  case RADIO_PARAM_BLE_ADV_PAYLOAD:
243  if(size <= 0 || size >= BLE_ADV_DATA_LEN || !src) {
245  }
246  ble_hal.set_adv_data((unsigned short)size, (char *)src);
247  return RADIO_RESULT_OK;
248  case RADIO_PARAM_BLE_ADV_SCAN_RESPONSE:
249  if(size <= 0 || size >= BLE_SCAN_RESP_DATA_LEN || !src) {
251  }
252  ble_hal.set_scan_resp_data((unsigned short)size, (char *)src);
253  return RADIO_RESULT_OK;
254  case RADIO_PARAM_BLE_PEER_ADDR:
255  if(size <= 0 || size > BLE_ADDR_SIZE || !src) {
257  }
258  memcpy(initiator_peer_addr, src, size);
259  return RADIO_RESULT_OK;
260  }
262 }
263 /*---------------------------------------------------------------------------*/
264 const struct radio_driver ble_cc2650_driver = {
265  init,
266  NULL,
267  NULL,
268  send,
269  NULL,
270  NULL,
271  NULL,
272  NULL,
273  on,
274  off,
275  get_value,
276  set_value,
277  get_object,
278  set_object,
279 };
280 /*---------------------------------------------------------------------------*/
radio_result_t(* get_object)(radio_param_t param, void *dest, size_t size)
Get a radio parameter object.
Definition: radio.h:762
ble_result_t(* set_scan_param)(ble_scan_type_t type, unsigned int scan_interval, unsigned int scan_window, ble_addr_type_t own_addr_type)
Sets the parameter for scanning.
Definition: ble-hal.h:330
ble_result_t(* reset)(void)
Resets the BLE controller.
Definition: ble-hal.h:254
The parameter is not supported.
Definition: radio.h:473
ble_result_t(* set_adv_enable)(unsigned short enable)
Enables/disables advertising.
Definition: ble-hal.h:318
Header file for the radio API
ble_result_t(* create_connection_cancel)(void)
Cancels the initiation of a BLE connection.
Definition: ble-hal.h:371
radio_result_t(* set_value)(radio_param_t param, radio_value_t value)
Set a radio parameter value.
Definition: radio.h:748
The structure of a Contiki-NG radio device driver.
Definition: radio.h:526
The value argument was incorrect.
Definition: radio.h:474
The parameter was set/read successfully.
Definition: radio.h:472
int radio_value_t
Each radio has a set of parameters that designate the current configuration and state of the radio...
Definition: radio.h:88
int(* send)(const void *payload, unsigned short payload_len)
Prepare & transmit a packet.
Definition: radio.h:623
hardware abstraction for a BLE controller
int(* off)(void)
Turn the radio off.
Definition: radio.h:721
The lowest radio channel number.
Definition: radio.h:303
ble_result_t(* set_adv_data)(unsigned short data_len, char *data)
Sets the advertising data.
Definition: ble-hal.h:301
The highest radio channel number.
Definition: radio.h:308
ble_result_t(* set_adv_param)(unsigned int adv_interval, ble_adv_type_t type, ble_addr_type_t own_addr_type, unsigned short adv_channel_map)
Sets the parameter for advertising.
Definition: ble-hal.h:283
ble_result_t(* read_bd_addr)(uint8_t *addr)
Reads the static BLE device address.
Definition: ble-hal.h:261
ble_result_t(* read_buffer_size)(unsigned int *buf_len, unsigned int *num_buf)
Reads the size of the data buffers.
Definition: ble-hal.h:269
ble_result_t(* create_connection)(unsigned int scan_interval, unsigned int scan_window, ble_addr_type_t peer_addr_type, uint8_t *peer_addr, ble_addr_type_t own_addr_type, unsigned int conn_interval, unsigned int conn_latency, unsigned int supervision_timeout)
Initiates the creation of a BLE connection.
Definition: ble-hal.h:359
enum radio_result_e radio_result_t
Radio return values when setting or getting radio parameters.
int(* init)(void)
Initialise the radio hardware.
Definition: radio.h:547
ble_result_t(* set_scan_enable)(unsigned short enable, unsigned short filter_duplicates)
Enables/disables scanning.
Definition: ble-hal.h:341
radio_result_t(* get_value)(radio_param_t param, radio_value_t *value)
Get a radio parameter value.
Definition: radio.h:733
An error occurred during transmission.
Definition: radio.h:498
Header file for the logging system
radio_result_t(* set_object)(radio_param_t param, const void *src, size_t size)
Set a radio parameter object.
Definition: radio.h:779
ble_result_t(* disconnect)(unsigned int connection_handle, unsigned short reason)
Disconnects the connection.
Definition: ble-hal.h:393
TX was successful and where an ACK was requested one was received.
Definition: radio.h:490
ble_result_t(* connection_update)(unsigned int connection_handle, unsigned int conn_interval, unsigned int conn_latency, unsigned int supervision_timeout)
Updates the connection parameters.
Definition: ble-hal.h:382
BLE radio hardware abstraction for the TI CC26XX controller.
int(* on)(void)
Turn the radio on.
Definition: radio.h:703
ble_result_t(* set_scan_resp_data)(unsigned short data_len, char *data)
Sets the scan response data.
Definition: ble-hal.h:310