45#include "rf_ble_cmd.h"
52#define LOG_MODULE "BLE-RADIO"
53#define LOG_LEVEL LOG_LEVEL_MAIN
55#define CMD_GET_STATUS(X) (((rfc_radioOp_t *)X)->status)
59static uint16_t tx_power = 0x3161;
64uint32_t ble_overrides_common[] =
67 ADI_HALFREG_OVERRIDE(0,4,0xF,0x8),
73 HW_REG_OVERRIDE(0x4020, 0x7F00),
75 HW32_ARRAY_OVERRIDE(0x4004, 1),
94uint32_t ble_overrides_1Mbps[] =
97 ADI_HALFREG_OVERRIDE(0,4,0xF,0x8),
99 HW_REG_OVERRIDE(0x6084, 0x05F8),
100 (uint32_t)0xFFFFFFFF,
103uint32_t ble_overrides_2Mbps[] =
106 ADI_HALFREG_OVERRIDE(0,4,0xF,0x8),
107 (uint32_t)0xFFFFFFFF,
110uint32_t ble_overrides_coded[] =
113 ADI_HALFREG_OVERRIDE(0,4,0xF,0xF),
115 HW_REG_OVERRIDE(0x6088, 0x0018),
116 (uint32_t)0xFFFFFFFF,
119static uint32_t ble_overrides[] = {
135 rfc_radioOp_t *cmd = (rfc_radioOp_t *)command;
138 LOG_ERR(
"rf_ble_cmd_send() could not send cmd. status: 0x%04X\n",
139 CMD_GET_STATUS(cmd));
140 return RF_BLE_CMD_ERROR;
142 return RF_BLE_CMD_OK;
148 rfc_radioOp_t *cmd = (rfc_radioOp_t *)command;
150 LOG_ERR(
"rf_ble_cmd_wait() could not wait. status: 0x%04X\n",
151 CMD_GET_STATUS(cmd));
152 return RF_BLE_CMD_ERROR;
154 return RF_BLE_CMD_OK;
161 rfc_CMD_BLE5_RADIO_SETUP_t cmd;
166 cmd.startTrigger.bEnaCmd = 0;
167 cmd.defaultPhy.mainMode = 1;
168 cmd.defaultPhy.coding = 1;
169 cmd.pRegOverrideCommon = ble_overrides_common;
170 cmd.pRegOverride1Mbps = ble_overrides_1Mbps;
171 cmd.pRegOverride2Mbps = ble_overrides_2Mbps;
172 cmd.pRegOverrideCoded = ble_overrides_coded;
174 rfc_CMD_RADIO_SETUP_t cmd;
180 cmd.pRegOverride = ble_overrides;
182 cmd.txPower = tx_power;
186 return RF_BLE_CMD_ERROR;
197 uint8_t *param, uint8_t *output)
200 rfc_CMD_BLE5_ADV_t *c = (rfc_CMD_BLE5_ADV_t *)command;
202 memset(c, 0x00,
sizeof(rfc_CMD_BLE5_ADV_t));
204 c->commandNo = CMD_BLE5_ADV;
207 c->txPower = tx_power;
209 rfc_CMD_BLE_ADV_t *c = (rfc_CMD_BLE_ADV_t *)command;
211 memset(c, 0x00,
sizeof(rfc_CMD_BLE_ADV_t));
212 c->commandNo = CMD_BLE_ADV;
214 c->condition.rule = COND_NEVER;
215 c->whitening.bOverride = 0;
216 c->channel = channel;
217 c->pParams = (rfc_bleAdvPar_t *)param;
218 c->startTrigger.triggerType = TRIG_NOW;
219 c->pOutput = (rfc_bleAdvOutput_t *)output;
224 uint8_t adv_data_len, uint8_t *adv_data,
225 uint8_t scan_resp_data_len, uint8_t *scan_resp_data,
226 ble_addr_type_t own_addr_type, uint8_t *own_addr)
228 rfc_bleAdvPar_t *p = (rfc_bleAdvPar_t *)param;
230 memset(p, 0x00,
sizeof(rfc_bleAdvPar_t));
233 p->rxConfig.bAutoFlushIgnored = 1;
234 p->rxConfig.bAutoFlushCrcErr = 0;
235 p->rxConfig.bAutoFlushEmpty = 1;
236 p->rxConfig.bIncludeLenByte = 1;
237 p->rxConfig.bIncludeCrc = 0;
238 p->rxConfig.bAppendRssi = 1;
239 p->rxConfig.bAppendStatus = 1;
240 p->rxConfig.bAppendTimestamp = 1;
241 p->advConfig.advFilterPolicy = 0;
242 p->advConfig.bStrictLenFilter = 0;
243 p->advConfig.deviceAddrType = own_addr_type;
244 p->pDeviceAddress = (uint16_t *)own_addr;
245 p->advLen = adv_data_len;
246 p->scanRspLen = scan_resp_data_len;
247 p->pAdvData = adv_data;
248 p->pScanRspData = scan_resp_data;
249 p->endTrigger.triggerType = TRIG_NEVER;
256 uint8_t *output, uint32_t start_time)
259 rfc_CMD_BLE5_INITIATOR_t *c = (rfc_CMD_BLE5_INITIATOR_t *)cmd;
261 memset(c, 0x00,
sizeof(rfc_CMD_BLE5_INITIATOR_t));
263 c->commandNo = CMD_BLE5_INITIATOR;
264 c->condition.rule = COND_NEVER;
265 c->whitening.bOverride = 0;
266 c->channel = channel;
267 c->pParams = (rfc_ble5InitiatorPar_t *)params;
268 c->startTrigger.triggerType = TRIG_ABSTIME;
269 c->startTime = start_time;
270 c->pOutput = (rfc_ble5ScanInitOutput_t *)output;
272 c->txPower = tx_power;
275 rfc_CMD_BLE_INITIATOR_t *c = (rfc_CMD_BLE_INITIATOR_t *)cmd;
277 memset(c, 0x00,
sizeof(rfc_CMD_BLE_INITIATOR_t));
279 c->commandNo = CMD_BLE_INITIATOR;
280 c->condition.rule = COND_NEVER;
281 c->whitening.bOverride = 0;
282 c->channel = channel;
283 c->pParams = (rfc_bleInitiatorPar_t *)params;
284 c->startTrigger.triggerType = TRIG_ABSTIME;
285 c->startTime = start_time;
286 c->pOutput = (rfc_bleInitiatorOutput_t *)output;
292 uint32_t initiator_time,
293 ble_addr_type_t own_addr_type, uint8_t *own_addr,
294 ble_addr_type_t peer_addr_type, uint8_t *peer_addr,
295 uint32_t connect_time, uint8_t *conn_req_data)
298 rfc_ble5InitiatorPar_t *p = (rfc_ble5InitiatorPar_t *)param;
299 p->backoffPar.bLastSucceeded = 0;
300 p->backoffPar.bLastFailed = 0;
301 p->maxWaitTimeForAuxCh = 0;
305 rfc_bleInitiatorPar_t *p = (rfc_bleInitiatorPar_t *)param;
308 p->rxConfig.bAutoFlushIgnored = 1;
309 p->rxConfig.bAutoFlushCrcErr = 0;
310 p->rxConfig.bAutoFlushEmpty = 1;
311 p->rxConfig.bIncludeLenByte = 1;
312 p->rxConfig.bIncludeCrc = 0;
313 p->rxConfig.bAppendRssi = 1;
314 p->rxConfig.bAppendStatus = 1;
315 p->rxConfig.bAppendTimestamp = 1;
318 p->initConfig.bUseWhiteList = 1;
319 p->initConfig.bDynamicWinOffset = 0;
320 p->initConfig.deviceAddrType = own_addr_type;
321 p->initConfig.peerAddrType = peer_addr_type;
322 p->initConfig.bStrictLenFilter = 1;
324 p->connectReqLen = 22;
325 p->pConnectReqData = conn_req_data;
326 p->pDeviceAddress = (uint16_t *)own_addr;
327 p->pWhiteList = (rfc_bleWhiteListEntry_t *)peer_addr;
328 p->connectTime = connect_time;
329 p->timeoutTrigger.triggerType = TRIG_REL_START;
330 p->timeoutTime = initiator_time;
331 p->endTrigger.triggerType = TRIG_NEVER;
338 uint8_t *output, uint32_t start_time)
341 rfc_CMD_BLE5_SLAVE_t *c = (rfc_CMD_BLE5_SLAVE_t *)cmd;
343 memset(c, 0x00,
sizeof(rfc_CMD_BLE5_SLAVE_t));
345 c->commandNo = CMD_BLE5_SLAVE;
346 c->condition.rule = COND_NEVER;
347 c->whitening.bOverride = 0;
348 c->channel = channel;
349 c->pParams = (rfc_ble5SlavePar_t *)params;
350 c->startTrigger.triggerType = TRIG_ABSTIME;
351 c->startTime = start_time;
352 c->pOutput = (rfc_bleMasterSlaveOutput_t *)output;
354 c->phyMode.mainMode = 1;
355 c->phyMode.coding = 1;
356 c->txPower = tx_power;
359 rfc_CMD_BLE_SLAVE_t *c = (rfc_CMD_BLE_SLAVE_t *)cmd;
361 memset(c, 0x00,
sizeof(rfc_CMD_BLE_SLAVE_t));
363 c->commandNo = CMD_BLE_SLAVE;
364 c->condition.rule = COND_NEVER;
365 c->whitening.bOverride = 0;
366 c->channel = channel;
367 c->pParams = (rfc_bleSlavePar_t *)params;
368 c->startTrigger.triggerType = TRIG_ABSTIME;
369 c->startTrigger.pastTrig = 0;
370 c->startTime = start_time;
371 c->pOutput = (rfc_bleMasterSlaveOutput_t *)output;
377 dataQueue_t *tx_queue, uint32_t access_address,
378 uint8_t crc_init_0, uint8_t crc_init_1,
379 uint8_t crc_init_2, uint32_t win_size,
380 uint32_t window_widening, uint8_t first_packet)
383 rfc_ble5SlavePar_t *p = (rfc_ble5SlavePar_t *)params;
384 p->maxRxPktLen = 255;
385 p->maxLenLowRate = 0;
387 rfc_bleSlavePar_t *p = (rfc_bleSlavePar_t *)params;
391 p->rxConfig.bAutoFlushIgnored = 1;
392 p->rxConfig.bAutoFlushCrcErr = 1;
393 p->rxConfig.bAutoFlushEmpty = 1;
394 p->rxConfig.bIncludeLenByte = 1;
395 p->rxConfig.bIncludeCrc = 0;
396 p->rxConfig.bAppendRssi = 1;
397 p->rxConfig.bAppendStatus = 1;
398 p->rxConfig.bAppendTimestamp = 1;
402 p->seqStat.lastRxSn = 1;
403 p->seqStat.lastTxSn = 1;
404 p->seqStat.nextTxSn = 0;
405 p->seqStat.bFirstPkt = 1;
406 p->seqStat.bAutoEmpty = 0;
407 p->seqStat.bLlCtrlTx = 0;
408 p->seqStat.bLlCtrlAckRx = 0;
409 p->seqStat.bLlCtrlAckPending = 0;
414 p->accessAddress = access_address;
415 p->crcInit0 = crc_init_0;
416 p->crcInit1 = crc_init_1;
417 p->crcInit2 = crc_init_2;
418 p->timeoutTrigger.triggerType = TRIG_REL_START;
420 p->timeoutTime = (uint32_t)(10 * win_size);
422 p->timeoutTime = (uint32_t)(win_size + 2 * window_widening);
424 p->endTrigger.triggerType = TRIG_NEVER;
431 uint8_t *output, uint32_t start_time)
434 rfc_CMD_BLE5_MASTER_t *c = (rfc_CMD_BLE5_MASTER_t *)cmd;
436 memset(c, 0x00,
sizeof(rfc_CMD_BLE5_MASTER_t));
438 c->commandNo = CMD_BLE5_MASTER;
439 c->condition.rule = COND_NEVER;
440 c->whitening.bOverride = 0;
441 c->channel = channel;
442 c->pParams = (rfc_ble5MasterPar_t *)params;
443 c->startTrigger.triggerType = TRIG_ABSTIME;
444 c->startTime = start_time;
445 c->pOutput = (rfc_bleMasterSlaveOutput_t *)output;
447 c->phyMode.mainMode = 1;
448 c->phyMode.coding = 1;
449 c->txPower = tx_power;
452 rfc_CMD_BLE_MASTER_t *c = (rfc_CMD_BLE_MASTER_t *)cmd;
454 memset(c, 0x00,
sizeof(rfc_CMD_BLE_MASTER_t));
456 c->commandNo = CMD_BLE_MASTER;
457 c->condition.rule = COND_NEVER;
458 c->whitening.bOverride = 0;
459 c->channel = channel;
460 c->pParams = (rfc_bleMasterPar_t *)params;
461 c->startTrigger.triggerType = TRIG_ABSTIME;
462 c->startTime = start_time;
463 c->pOutput = (rfc_bleMasterSlaveOutput_t *)output;
469 dataQueue_t *tx_queue, uint32_t access_address,
470 uint8_t crc_init_0, uint8_t crc_init_1,
471 uint8_t crc_init_2, uint8_t first_packet)
474 rfc_ble5MasterPar_t *p = (rfc_ble5MasterPar_t *)params;
475 p->maxRxPktLen = 255;
476 p->maxLenLowRate = 0;
478 rfc_bleMasterPar_t *p = (rfc_bleMasterPar_t *)params;
482 p->rxConfig.bAutoFlushIgnored = 1;
483 p->rxConfig.bAutoFlushCrcErr = 1;
484 p->rxConfig.bAutoFlushEmpty = 1;
485 p->rxConfig.bIncludeLenByte = 1;
486 p->rxConfig.bIncludeCrc = 0;
487 p->rxConfig.bAppendRssi = 1;
488 p->rxConfig.bAppendStatus = 1;
489 p->rxConfig.bAppendTimestamp = 1;
493 p->seqStat.lastRxSn = 1;
494 p->seqStat.lastTxSn = 1;
495 p->seqStat.nextTxSn = 0;
496 p->seqStat.bFirstPkt = 1;
497 p->seqStat.bAutoEmpty = 0;
498 p->seqStat.bLlCtrlTx = 0;
499 p->seqStat.bLlCtrlAckRx = 0;
500 p->seqStat.bLlCtrlAckPending = 0;
504 p->accessAddress = access_address;
505 p->crcInit0 = crc_init_0;
506 p->crcInit1 = crc_init_1;
507 p->crcInit2 = crc_init_2;
508 p->endTrigger.triggerType = TRIG_REL_START;
509 p->endTime = (uint32_t)15 * 4000;
519 rfc_CMD_ADD_DATA_ENTRY_t cmd;
520 cmd.commandNo = CMD_ADD_DATA_ENTRY;
525 LOG_ERR(
"could not add entry to data queue. status: 0x%04" PRIX32
"\n", cmdsta);
526 return RF_BLE_CMD_ERROR;
528 return RF_BLE_CMD_OK;
void rf_core_init_radio_op(rfc_radioOp_t *op, uint16_t len, uint16_t command)
Prepare a buffer to host a Radio Op.
uint_fast8_t rf_core_send_cmd(uint32_t cmd, uint32_t *status)
Sends a command to the RF core.
uint_fast8_t rf_core_wait_cmd_done(void *cmd)
Block and wait for a Radio op to complete.
Header file for the logging system.
void rf_ble_cmd_create_adv_cmd(uint8_t *command, uint8_t channel, uint8_t *param, uint8_t *output)
Creates a BLE radio command structure that enables BLE advertisement when sent to the radio core.
void rf_ble_cmd_create_slave_params(uint8_t *params, dataQueue_t *rx_queue, dataQueue_t *tx_queue, uint32_t access_address, uint8_t crc_init_0, uint8_t crc_init_1, uint8_t crc_init_2, uint32_t win_size, uint32_t window_widening, uint8_t first_packet)
Creates BLE radio command parameters that are used to setup a single BLE connection event on the radi...
unsigned short rf_ble_cmd_send(uint8_t *command)
Sends a BLE radio command to the radio.
void rf_ble_cmd_create_slave_cmd(uint8_t *cmd, uint8_t channel, uint8_t *params, uint8_t *output, uint32_t start_time)
Creates a BLE radio command structure that sets up a single BLE connection event when sent to the rad...
void rf_ble_cmd_create_master_params(uint8_t *params, dataQueue_t *rx_queue, dataQueue_t *tx_queue, uint32_t access_address, uint8_t crc_init_0, uint8_t crc_init_1, uint8_t crc_init_2, uint8_t first_packet)
Creates BLE radio command parameters that are used to set up BLE connection event on the radio core.
void rf_ble_cmd_create_adv_params(uint8_t *param, dataQueue_t *rx_queue, uint8_t adv_data_len, uint8_t *adv_data, uint8_t scan_resp_data_len, uint8_t *scan_resp_data, ble_addr_type_t own_addr_type, uint8_t *own_addr)
Creates BLE radio command parameters that are used to enable BLE advertisement on the radio core.
void rf_ble_cmd_create_initiator_cmd(uint8_t *cmd, uint8_t channel, uint8_t *params, uint8_t *output, uint32_t start_time)
Creates a BLE radio command structure that sets up BLE initiation event when sent to the radio core.
void rf_ble_cmd_create_master_cmd(uint8_t *cmd, uint8_t channel, uint8_t *params, uint8_t *output, uint32_t start_time)
Creates a BLE radio command structure that sets up BLE connection event when sent to the radio core.
void rf_ble_cmd_create_initiator_params(uint8_t *param, dataQueue_t *rx_queue, uint32_t initiator_time, ble_addr_type_t own_addr_type, uint8_t *own_addr, ble_addr_type_t peer_addr_type, uint8_t *peer_addr, uint32_t connect_time, uint8_t *conn_req_data)
Creates BLE radio command parameters that are used to set up BLE initiation event on the radio core.
unsigned short rf_ble_cmd_setup_ble_mode(void)
Initializes the radio core to be used as a BLE radio.
unsigned short rf_ble_cmd_add_data_queue_entry(dataQueue_t *q, uint8_t *e)
Adds a data buffer to a BLE transmission queue.
unsigned short rf_ble_cmd_wait(uint8_t *command)
Waits for a running BLE radio command to be finished.
BLE commands for the TI CC26xx BLE radio.
Header file for the CC13xx/CC26xx RF core driver.