mirror of https://github.com/ARMmbed/mbed-os.git
COMPONENT_BlueNRG_MS cleanup
- use of json config - add license header - update ReadMe - remove mbed.h - astylepull/12456/head
parent
a9135a1971
commit
aa66ae52bc
|
@ -1,15 +1,43 @@
|
|||
/*
|
||||
* Copyright (c) 2017-2020 ARM Limited
|
||||
* Copyright (c) 2017-2020 STMicroelectronics
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
// drivers
|
||||
#include "drivers/DigitalOut.h"
|
||||
#include "drivers/SPI.h"
|
||||
#include "drivers/InterruptIn.h"
|
||||
|
||||
// platform
|
||||
#include "platform/mbed_wait_api.h"
|
||||
|
||||
// FEATURE_BLE/targets/TARGET_CORDIO
|
||||
#include "CordioBLE.h"
|
||||
#include "CordioHCIDriver.h"
|
||||
#include "CordioHCITransportDriver.h"
|
||||
#include "mbed.h"
|
||||
#include "hci_api.h"
|
||||
#include "hci_cmd.h"
|
||||
#include "hci_core.h"
|
||||
#include "dm_api.h"
|
||||
#include "bstream.h"
|
||||
#include "hci_mbed_os_adaptation.h"
|
||||
#include "bluenrg_targets.h"
|
||||
|
||||
// rtos
|
||||
#include "Thread.h"
|
||||
#include "Semaphore.h"
|
||||
#include "Mutex.h"
|
||||
|
@ -38,8 +66,7 @@ namespace bluenrg {
|
|||
* BlueNRG HCI driver implementation.
|
||||
* @see cordio::CordioHCIDriver
|
||||
*/
|
||||
class HCIDriver : public cordio::CordioHCIDriver
|
||||
{
|
||||
class HCIDriver : public cordio::CordioHCIDriver {
|
||||
public:
|
||||
/**
|
||||
* Construction of the BlueNRG HCIDriver.
|
||||
|
@ -52,7 +79,8 @@ public:
|
|||
/**
|
||||
* @see CordioHCIDriver::do_initialize
|
||||
*/
|
||||
virtual void do_initialize() {
|
||||
virtual void do_initialize()
|
||||
{
|
||||
bluenrg_reset();
|
||||
}
|
||||
|
||||
|
@ -68,7 +96,8 @@ public:
|
|||
/**
|
||||
* @see CordioHCIDriver::start_reset_sequence
|
||||
*/
|
||||
virtual void start_reset_sequence() {
|
||||
virtual void start_reset_sequence()
|
||||
{
|
||||
reset_received = false;
|
||||
bluenrg_initialized = false;
|
||||
enable_link_layer_mode_ongoing = false;
|
||||
|
@ -79,21 +108,21 @@ public:
|
|||
/**
|
||||
* @see CordioHCIDriver::do_terminate
|
||||
*/
|
||||
virtual void do_terminate() {
|
||||
virtual void do_terminate()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @see CordioHCIDriver::handle_reset_sequence
|
||||
*/
|
||||
virtual void handle_reset_sequence(uint8_t *pMsg) {
|
||||
virtual void handle_reset_sequence(uint8_t *pMsg)
|
||||
{
|
||||
uint16_t opcode;
|
||||
static uint8_t randCnt;
|
||||
//wait_ms(5);
|
||||
|
||||
/* if event is a command complete event */
|
||||
if (*pMsg == HCI_CMD_CMPL_EVT)
|
||||
{
|
||||
if (*pMsg == HCI_CMD_CMPL_EVT) {
|
||||
/* parse parameters */
|
||||
pMsg += HCI_EVT_HDR_LEN;
|
||||
pMsg++; /* skip num packets */
|
||||
|
@ -101,18 +130,17 @@ public:
|
|||
pMsg++; /* skip status */
|
||||
|
||||
/* decode opcode */
|
||||
switch (opcode)
|
||||
{
|
||||
switch (opcode) {
|
||||
case HCI_OPCODE_RESET: {
|
||||
/* initialize rand command count */
|
||||
randCnt = 0;
|
||||
reset_received = true;
|
||||
// important, the bluenrg_initialized event come after the
|
||||
// hci reset event (not documented)
|
||||
// bluenrg_initialized event has to come after the hci reset event
|
||||
bluenrg_initialized = false;
|
||||
} break;
|
||||
}
|
||||
break;
|
||||
|
||||
// ACL packet ...
|
||||
// ACL packet
|
||||
case ACI_WRITE_CONFIG_DATA_OPCODE:
|
||||
if (enable_link_layer_mode_ongoing) {
|
||||
enable_link_layer_mode_ongoing = false;
|
||||
|
@ -145,10 +173,9 @@ public:
|
|||
break;
|
||||
|
||||
case HCI_OPCODE_LE_SET_EVENT_MASK:
|
||||
// Note: the public address is not read because there is no valid public address
|
||||
// provisioned by default on the target
|
||||
// Enable if the
|
||||
#if MBED_CONF_CORDIO_BLUENRG_VALID_PUBLIC_BD_ADDRESS == 1
|
||||
// Note: the public address is not read because there is no valid public address provisioned by default on the target
|
||||
// You can enable it thanks to json "valid-public-bd-address" config value
|
||||
#if MBED_CONF_BLUENRG_MS_VALID_PUBLIC_BD_ADDRESS == 1
|
||||
/* send next command in sequence */
|
||||
HciReadBdAddrCmd();
|
||||
break;
|
||||
|
@ -206,8 +233,7 @@ public:
|
|||
hciCoreReadMaxDataLen();
|
||||
break;
|
||||
|
||||
case HCI_OPCODE_LE_READ_MAX_DATA_LEN:
|
||||
{
|
||||
case HCI_OPCODE_LE_READ_MAX_DATA_LEN: {
|
||||
uint16_t maxTxOctets;
|
||||
uint16_t maxTxTime;
|
||||
|
||||
|
@ -223,13 +249,10 @@ public:
|
|||
break;
|
||||
|
||||
case HCI_OPCODE_LE_WRITE_DEF_DATA_LEN:
|
||||
if (hciCoreCb.extResetSeq)
|
||||
{
|
||||
if (hciCoreCb.extResetSeq) {
|
||||
/* send first extended command */
|
||||
(*hciCoreCb.extResetSeq)(pMsg, opcode);
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
/* initialize extended parameters */
|
||||
hciCoreCb.maxAdvDataLen = 0;
|
||||
hciCoreCb.numSupAdvSets = 0;
|
||||
|
@ -243,8 +266,7 @@ public:
|
|||
case HCI_OPCODE_LE_READ_MAX_ADV_DATA_LEN:
|
||||
case HCI_OPCODE_LE_READ_NUM_SUP_ADV_SETS:
|
||||
case HCI_OPCODE_LE_READ_PER_ADV_LIST_SIZE:
|
||||
if (hciCoreCb.extResetSeq)
|
||||
{
|
||||
if (hciCoreCb.extResetSeq) {
|
||||
/* send next extended command in sequence */
|
||||
(*hciCoreCb.extResetSeq)(pMsg, opcode);
|
||||
}
|
||||
|
@ -252,13 +274,10 @@ public:
|
|||
|
||||
case HCI_OPCODE_LE_RAND:
|
||||
/* check if need to send second rand command */
|
||||
if (randCnt < (HCI_RESET_RAND_CNT-1))
|
||||
{
|
||||
if (randCnt < (HCI_RESET_RAND_CNT - 1)) {
|
||||
randCnt++;
|
||||
HciLeRandCmd();
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
signal_reset_sequence_done();
|
||||
}
|
||||
break;
|
||||
|
@ -290,20 +309,23 @@ public:
|
|||
}
|
||||
|
||||
private:
|
||||
void aciEnableLinkLayerModeOnly() {
|
||||
void aciEnableLinkLayerModeOnly()
|
||||
{
|
||||
uint8_t data[1] = { 0x01 };
|
||||
enable_link_layer_mode_ongoing = true;
|
||||
aciWriteConfigData(LL_WITHOUT_HOST_OFFSET, data);
|
||||
}
|
||||
|
||||
void aciSetRole() {
|
||||
void aciSetRole()
|
||||
{
|
||||
// master and slave, simultaneous advertising and scanning
|
||||
// (up to 4 connections)
|
||||
uint8_t data[1] = { 0x04 };
|
||||
aciWriteConfigData(ROLE_OFFSET, data);
|
||||
}
|
||||
|
||||
void aciGattInit() {
|
||||
void aciGattInit()
|
||||
{
|
||||
uint8_t *pBuf = hciCmdAlloc(ACI_GATT_INIT_OPCODE, 0);
|
||||
if (!pBuf) {
|
||||
return;
|
||||
|
@ -311,7 +333,8 @@ private:
|
|||
hciCmdSend(pBuf);
|
||||
}
|
||||
|
||||
void aciGapInit() {
|
||||
void aciGapInit()
|
||||
{
|
||||
uint8_t *pBuf = hciCmdAlloc(ACI_GAP_INIT_OPCODE, 3);
|
||||
if (!pBuf) {
|
||||
return;
|
||||
|
@ -322,7 +345,8 @@ private:
|
|||
hciCmdSend(pBuf);
|
||||
}
|
||||
|
||||
void aciReadConfigParameter(uint8_t offset) {
|
||||
void aciReadConfigParameter(uint8_t offset)
|
||||
{
|
||||
uint8_t *pBuf = hciCmdAlloc(ACI_READ_CONFIG_DATA_OPCODE, 1);
|
||||
if (!pBuf) {
|
||||
return;
|
||||
|
@ -333,7 +357,8 @@ private:
|
|||
}
|
||||
|
||||
template<size_t N>
|
||||
void aciWriteConfigData(uint8_t offset, uint8_t (&buf)[N]) {
|
||||
void aciWriteConfigData(uint8_t offset, uint8_t (&buf)[N])
|
||||
{
|
||||
uint8_t *pBuf = hciCmdAlloc(ACI_WRITE_CONFIG_DATA_OPCODE, 2 + N);
|
||||
if (!pBuf) {
|
||||
return;
|
||||
|
@ -349,13 +374,10 @@ private:
|
|||
{
|
||||
/* if LL Privacy is supported by Controller and included */
|
||||
if ((hciCoreCb.leSupFeat & HCI_LE_SUP_FEAT_PRIVACY) &&
|
||||
(hciLeSupFeatCfg & HCI_LE_SUP_FEAT_PRIVACY))
|
||||
{
|
||||
(hciLeSupFeatCfg & HCI_LE_SUP_FEAT_PRIVACY)) {
|
||||
/* send next command in sequence */
|
||||
HciLeReadResolvingListSize();
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
hciCoreCb.resListSize = 0;
|
||||
|
||||
/* send next command in sequence */
|
||||
|
@ -367,19 +389,17 @@ private:
|
|||
{
|
||||
/* if LE Data Packet Length Extensions is supported by Controller and included */
|
||||
if ((hciCoreCb.leSupFeat & HCI_LE_SUP_FEAT_DATA_LEN_EXT) &&
|
||||
(hciLeSupFeatCfg & HCI_LE_SUP_FEAT_DATA_LEN_EXT))
|
||||
{
|
||||
(hciLeSupFeatCfg & HCI_LE_SUP_FEAT_DATA_LEN_EXT)) {
|
||||
/* send next command in sequence */
|
||||
HciLeReadMaxDataLen();
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
/* send next command in sequence */
|
||||
HciLeRandCmd();
|
||||
}
|
||||
}
|
||||
|
||||
void bluenrg_reset() {
|
||||
void bluenrg_reset()
|
||||
{
|
||||
/* Reset BlueNRG SPI interface. Hold reset line to 0 for 1500ms */
|
||||
rst = 0;
|
||||
wait_us(1500);
|
||||
|
@ -389,7 +409,7 @@ private:
|
|||
wait_us(100000);
|
||||
}
|
||||
|
||||
DigitalOut rst;
|
||||
mbed::DigitalOut rst;
|
||||
bool reset_received;
|
||||
bool bluenrg_initialized;
|
||||
bool enable_link_layer_mode_ongoing;
|
||||
|
@ -425,8 +445,9 @@ public:
|
|||
* @param irq Pin used by the module to signal data are available.
|
||||
*/
|
||||
TransportDriver(PinName mosi, PinName miso, PinName sclk, PinName ncs, PinName irq)
|
||||
: spi(mosi, miso, sclk), nCS(ncs), irq(irq), _spi_thread(osPriorityNormal, SPI_STACK_SIZE, _spi_thread_stack) {
|
||||
_spi_thread.start(callback(this, &TransportDriver::spi_read_cb));
|
||||
: spi(mosi, miso, sclk), nCS(ncs), irq(irq), _spi_thread(osPriorityNormal, SPI_STACK_SIZE, _spi_thread_stack)
|
||||
{
|
||||
_spi_thread.start(mbed::callback(this, &TransportDriver::spi_read_cb));
|
||||
}
|
||||
|
||||
virtual ~TransportDriver() { }
|
||||
|
@ -434,7 +455,8 @@ public:
|
|||
/**
|
||||
* @see CordioHCITransportDriver::initialize
|
||||
*/
|
||||
virtual void initialize() {
|
||||
virtual void initialize()
|
||||
{
|
||||
// Setup the spi for 8 bit data, low clock polarity,
|
||||
// 1-edge phase, with an 8MHz clock rate
|
||||
spi.format(8, 0);
|
||||
|
@ -447,7 +469,7 @@ public:
|
|||
|
||||
// Set the interrupt handler for the device
|
||||
irq.mode(PullDown); // set irq mode
|
||||
irq.rise(callback(this, &TransportDriver::HCI_Isr));
|
||||
irq.rise(mbed::callback(this, &TransportDriver::HCI_Isr));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -458,7 +480,8 @@ public:
|
|||
/**
|
||||
* @see CordioHCITransportDriver::write
|
||||
*/
|
||||
virtual uint16_t write(uint8_t type, uint16_t len, uint8_t *pData) {
|
||||
virtual uint16_t write(uint8_t type, uint16_t len, uint8_t *pData)
|
||||
{
|
||||
// repeat write until successfull. A number of attempt or timeout might
|
||||
// be useful
|
||||
while (spiWrite(type, pData, len) == 0) { }
|
||||
|
@ -466,7 +489,8 @@ public:
|
|||
}
|
||||
|
||||
private:
|
||||
uint16_t spiWrite(uint8_t type, const uint8_t* data, uint16_t data_length) {
|
||||
uint16_t spiWrite(uint8_t type, const uint8_t *data, uint16_t data_length)
|
||||
{
|
||||
static const uint8_t header_master[] = {
|
||||
0x0A, 0x00, 0x00, 0x00, 0x00
|
||||
};
|
||||
|
@ -549,7 +573,8 @@ private:
|
|||
_spi_read_sem.release();
|
||||
}
|
||||
|
||||
void spi_read_cb() {
|
||||
void spi_read_cb()
|
||||
{
|
||||
uint8_t data_buffer[256];
|
||||
while (true) {
|
||||
_spi_read_sem.acquire();
|
||||
|
@ -567,8 +592,8 @@ private:
|
|||
* Unsafe SPI, does not lock when SPI access happens.
|
||||
*/
|
||||
::mbed::SPI spi;
|
||||
DigitalOut nCS;
|
||||
InterruptIn irq;
|
||||
mbed::DigitalOut nCS;
|
||||
mbed::InterruptIn irq;
|
||||
rtos::Thread _spi_thread;
|
||||
uint8_t _spi_thread_stack[SPI_STACK_SIZE];
|
||||
rtos::Semaphore _spi_read_sem;
|
||||
|
@ -582,17 +607,18 @@ private:
|
|||
/**
|
||||
* Cordio HCI driver factory
|
||||
*/
|
||||
ble::vendor::cordio::CordioHCIDriver& ble_cordio_get_hci_driver() {
|
||||
ble::vendor::cordio::CordioHCIDriver &ble_cordio_get_hci_driver()
|
||||
{
|
||||
static ble::vendor::bluenrg::TransportDriver transport_driver(
|
||||
BLUENRG_PIN_SPI_MOSI,
|
||||
BLUENRG_PIN_SPI_MISO,
|
||||
BLUENRG_PIN_SPI_SCK,
|
||||
BLUENRG_PIN_SPI_nCS,
|
||||
BLUENRG_PIN_SPI_IRQ
|
||||
MBED_CONF_BLUENRG_MS_SPI_MOSI,
|
||||
MBED_CONF_BLUENRG_MS_SPI_MISO,
|
||||
MBED_CONF_BLUENRG_MS_SPI_SCK,
|
||||
MBED_CONF_BLUENRG_MS_SPI_NCS,
|
||||
MBED_CONF_BLUENRG_MS_SPI_IRQ
|
||||
);
|
||||
static ble::vendor::bluenrg::HCIDriver hci_driver(
|
||||
transport_driver,
|
||||
BLUENRG_PIN_SPI_RESET
|
||||
MBED_CONF_BLUENRG_MS_SPI_RESET
|
||||
);
|
||||
return hci_driver;
|
||||
}
|
||||
|
|
|
@ -1,13 +1,69 @@
|
|||
# Cordio BLE-X-NUCLEO-IDB0XA1
|
||||
# BlueNRG_MS
|
||||
|
||||
BLE_API wrapper Library for X-NUCLEO-IDB05A1 BlueNRG (Bluetooth Low Energy) Expansion Board. It uses ARM Cordio stack instead of the ST BlueNRG stack.
|
||||
BLE API wrapper Library for BlueNRG (Bluetooth Low Energy)
|
||||
|
||||
## Introduction
|
||||
Maybe a simple table like this could help:
|
||||
|
||||
This firmware package implements the port of BLE_API to STMicroelectronics' [X-NUCLEO-IDB05A1](https://developer.mbed.org/components/X-NUCLEO-IDB05A1-Bluetooth-Low-Energy/) Bluetooth Low Energy Nucleo Expansion Board.
|
||||
|Name|Type|Bluetooth compliance|Status|Used in shields & boards|Link|
|
||||
|-----------|----------|-----|-|-|-|
|
||||
|SPBTLE-RF |Module |v4.1 |Not recommended for new designs |X-NUCLEO-IDB05A1, DISCO-L475VG-IOT01A, DISCO-L562QE | https://www.st.com/en/wireless-transceivers-mcus-and-modules/spbtle-rf.html |
|
||||
|BlueNRG-M0 |Module |v4.2 |Active (included in ST's Longevity Program) |No | https://www.st.com/en/wireless-transceivers-mcus-and-modules/bluenrg-m0.html |
|
||||
|BlueNRG-MS |Processor |v4.2 |Active (included in ST's Longevity Program) |X-NUCLEO-IDB05A2 (coming soon) | https://www.st.com/en/wireless-transceivers-mcus-and-modules/bluenrg-ms.html |
|
||||
|
||||
|
||||
It uses ARM Cordio stack instead of the ST BlueNRG stack.
|
||||
|
||||
## History
|
||||
|
||||
- deprecated ST BLE port: https://github.com/ARMmbed/ble-x-nucleo-idb0xa1
|
||||
- deprecated X-NUCLEO-IDB05A1 BlueNRG : https://github.com/ARMmbed/cordio-ble-x-nucleo-idb0xa1
|
||||
|
||||
|
||||
## Boards
|
||||
|
||||
### X-NUCLEO-IDB05A1
|
||||
|
||||
Bluetooth Low Energy Nucleo Expansion Board:
|
||||
|
||||
https://developer.mbed.org/components/X-NUCLEO-IDB05A1-Bluetooth-Low-Energy/
|
||||
|
||||
### DISCO-L475VG-IOT01A
|
||||
|
||||
STM32L4 Discovery kit IoT node, low-power wireless, Bluetooth V4.1 module (SPBTLE-RF)
|
||||
|
||||
https://os.mbed.com/platforms/ST-Discovery-L475E-IOT01A/
|
||||
|
||||
|
||||
### DISCO-L562QE
|
||||
|
||||
STM32L562E-DK Discovery kit with Bluetooth V4.1 low energy module and Arm Cortex-M33 with TrustZone
|
||||
|
||||
https://os.mbed.com/platforms/ST-Discovery-L562QE/
|
||||
|
||||
|
||||
## Driver configuration
|
||||
|
||||
In order to use the BlueNRG-MS module together with other targets,
|
||||
you may need to override default settings in your local `mbed_app.json` file
|
||||
|
||||
### ST-DISCO boards
|
||||
|
||||
Default settings for `DISCO-L475VG-IOT01A` and `DISCO-L562QE` are configured
|
||||
|
||||
### Arduino Connector Compatibility Warning
|
||||
|
||||
Default Arduino connection is using:
|
||||
|
||||
```
|
||||
"SPI_MOSI": "D11",
|
||||
"SPI_MISO": "D12",
|
||||
"SPI_nCS": "A1",
|
||||
"SPI_RESET": "D7",
|
||||
"SPI_IRQ": "A0",
|
||||
"SPI_SCK": "D3",
|
||||
"valid-public-bd-address": false
|
||||
```
|
||||
|
||||
X-NUCLEO-IDB05A1 is Arduino compatible with an exception: instead of using pin **D13** for the SPI clock, pin **D3** is used.
|
||||
The default configuration for this library is having the SPI clock on pin **D3**.
|
||||
|
||||
|
@ -15,31 +71,47 @@ To be fully Arduino compatible, X-NUCLEO-IDB05A1 needs a small HW patch.
|
|||
|
||||
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. To this aim you need to compile this driver with macro `BLUENRG_PIN_SPI_SCK=D13` defined.
|
||||
In case you patch your board, then you also have to configure this library to use pin **D13** to drive the SPI clock.
|
||||
To this aim you need to update your local mbed_app.json file with:
|
||||
|
||||
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**.
|
||||
```
|
||||
"target_overrides": {
|
||||
"XXXX": {
|
||||
"bluenrg_ms.SPI_SCK": "D13"
|
||||
},
|
||||
```
|
||||
|
||||
Referring to the current list of tested platforms (see [X-NUCLEO-IDB05A1](https://developer.mbed.org/components/X-NUCLEO-IDB05A1-Bluetooth-Low-Energy/) page), the patch is required by [ST-Nucleo-F103RB](https://developer.mbed.org/platforms/ST-Nucleo-F103RB/); [ST-Nucleo-F302R8](https://developer.mbed.org/platforms/ST-Nucleo-F302R8/); [ST-Nucleo-F411RE](https://developer.mbed.org/platforms/ST-Nucleo-F411RE/); [ST-Nucleo-F446RE](https://developer.mbed.org/platforms/ST-Nucleo-F446RE/); and [FRDM-K64F](https://developer.mbed.org/platforms/FRDM-K64F/).
|
||||
If you use pin **D13** for the SPI clock, please be aware that on some 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-IDB05A1](https://developer.mbed.org/components/X-NUCLEO-IDB05A1-Bluetooth-Low-Energy/) page),
|
||||
the patch is required for
|
||||
- [ST-Nucleo-F103RB](https://developer.mbed.org/platforms/ST-Nucleo-F103RB/)
|
||||
- [ST-Nucleo-F302R8](https://developer.mbed.org/platforms/ST-Nucleo-F302R8/)
|
||||
- [ST-Nucleo-F411RE](https://developer.mbed.org/platforms/ST-Nucleo-F411RE/)
|
||||
- [ST-Nucleo-F446RE](https://developer.mbed.org/platforms/ST-Nucleo-F446RE/)
|
||||
- [FRDM-K64F](https://developer.mbed.org/platforms/FRDM-K64F/)
|
||||
|
||||
### Driver configuration
|
||||
|
||||
In order to use the BlueNRG-MS module together with other targets, you need to set the macros defined in file [bluenrg_targets.h](https://github.com/ARMmbed/ble-x-nucleo-idb0xa1/blob/master/bluenrg/bluenrg_targets.h). Please, update the [mbed_lib.json](https://github.com/ARMmbed/ble-x-nucleo-idb0xa1/blob/master/mbed_lib.json) to include the list of extra macros that configure the driver for your target.
|
||||
|
||||
## Target Configuration
|
||||
### Target Configuration
|
||||
|
||||
To use that library, the target requires some extra configuration in the application `mbed_app.json`. In the `target_overides` section:
|
||||
|
||||
* BLE feature has to be enabled for the target using the BlueNRG module
|
||||
* BLE feature has to be enabled
|
||||
|
||||
```json
|
||||
"target.features_add": ["BLE"]
|
||||
```
|
||||
|
||||
* BlueNRG module has to be enabled
|
||||
|
||||
```json
|
||||
"target.components_add": ["BlueNRG_MS"]
|
||||
```
|
||||
|
||||
* Extra labels have to be defined to include the cordio stack and this library:
|
||||
|
||||
```json
|
||||
"target.extra_labels_add": ["CORDIO", "CORDIO_BLUENRG"]
|
||||
"target.extra_labels_add": ["CORDIO"]
|
||||
```
|
||||
|
||||
As an example, the target overide section for the `NUCLEO_F401RE` would be:
|
||||
|
@ -47,6 +119,7 @@ As an example, the target overide section for the `NUCLEO_F401RE` would be:
|
|||
```json
|
||||
"NUCLEO_F401RE": {
|
||||
"target.features_add": ["BLE"],
|
||||
"target.extra_labels_add": ["CORDIO", "CORDIO_BLUENRG"]
|
||||
"target.components_add": ["BlueNRG_MS"],
|
||||
"target.extra_labels_add": ["CORDIO"]
|
||||
}
|
||||
```
|
||||
|
|
|
@ -1,65 +0,0 @@
|
|||
/**
|
||||
******************************************************************************
|
||||
* @file bluenrg_targets.h
|
||||
* @author AST / EST
|
||||
* @version V0.0.1
|
||||
* @date 24-July-2015
|
||||
* @brief This header file is intended to manage the differences between
|
||||
* the different supported base-boards which might mount the
|
||||
* X_NUCLEO_IDB0XA1 BlueNRG BLE Expansion Board.
|
||||
******************************************************************************
|
||||
* @attention
|
||||
*
|
||||
* <h2><center>© COPYRIGHT(c) 2015 STMicroelectronics</center></h2>
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
* 3. Neither the name of STMicroelectronics nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
/* Define to prevent from recursive inclusion --------------------------------*/
|
||||
#ifndef _BLUENRG_TARGETS_H_
|
||||
#define _BLUENRG_TARGETS_H_
|
||||
|
||||
#if !defined(BLUENRG_PIN_SPI_MOSI)
|
||||
#define BLUENRG_PIN_SPI_MOSI (D11)
|
||||
#endif
|
||||
#if !defined(BLUENRG_PIN_SPI_MISO)
|
||||
#define BLUENRG_PIN_SPI_MISO (D12)
|
||||
#endif
|
||||
#if !defined(BLUENRG_PIN_SPI_nCS)
|
||||
#define BLUENRG_PIN_SPI_nCS (A1)
|
||||
#endif
|
||||
#if !defined(BLUENRG_PIN_SPI_RESET)
|
||||
#define BLUENRG_PIN_SPI_RESET (D7)
|
||||
#endif
|
||||
#if !defined(BLUENRG_PIN_SPI_IRQ)
|
||||
#define BLUENRG_PIN_SPI_IRQ (A0)
|
||||
#endif
|
||||
|
||||
/* NOTE: Refer to README for further details regarding BLUENRG_PIN_SPI_SCK */
|
||||
#if !defined(BLUENRG_PIN_SPI_SCK)
|
||||
#define BLUENRG_PIN_SPI_SCK (D3)
|
||||
#endif
|
||||
|
||||
#endif // _BLUENRG_TARGTES_H_
|
|
@ -1,6 +1,12 @@
|
|||
{
|
||||
"name": "cordio_bluenrg",
|
||||
"name": "bluenrg_ms",
|
||||
"config": {
|
||||
"SPI_MOSI": "D11",
|
||||
"SPI_MISO": "D12",
|
||||
"SPI_nCS": "A1",
|
||||
"SPI_RESET": "D7",
|
||||
"SPI_IRQ": "A0",
|
||||
"SPI_SCK": "D3",
|
||||
"valid-public-bd-address": {
|
||||
"help": "Read the BD public address at startup",
|
||||
"value": false
|
||||
|
@ -8,17 +14,23 @@
|
|||
},
|
||||
"target_overrides": {
|
||||
"K64F": {
|
||||
"target.macros_add": ["BLUENRG_PIN_SPI_SCK=D13"]
|
||||
"SPI_SCK": "D13"
|
||||
},
|
||||
"DISCO_L475VG_IOT01A": {
|
||||
"target.macros_add": [
|
||||
"BLUENRG_PIN_SPI_MOSI=PC_12",
|
||||
"BLUENRG_PIN_SPI_MISO=PC_11",
|
||||
"BLUENRG_PIN_SPI_nCS=PD_13",
|
||||
"BLUENRG_PIN_SPI_RESET=PA_8",
|
||||
"BLUENRG_PIN_SPI_IRQ=PE_6",
|
||||
"BLUENRG_PIN_SPI_SCK=PC_10"
|
||||
]
|
||||
"SPI_MOSI": "PC_12",
|
||||
"SPI_MISO": "PC_11",
|
||||
"SPI_nCS": "PD_13",
|
||||
"SPI_RESET": "PA_8",
|
||||
"SPI_IRQ": "PE_6",
|
||||
"SPI_SCK": "PC_10"
|
||||
},
|
||||
"DISCO_L562QE": {
|
||||
"SPI_MOSI": "PG_4",
|
||||
"SPI_MISO": "PG_3",
|
||||
"SPI_nCS": "PG_5",
|
||||
"SPI_RESET": "PG_8",
|
||||
"SPI_IRQ": "PG_6",
|
||||
"SPI_SCK": "PG_2"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue