From 0884a6a455de96197d36e6f6c8b67f699cd1c5a2 Mon Sep 17 00:00:00 2001 From: Andrea Gilardoni Date: Wed, 15 Jan 2025 11:15:10 +0100 Subject: [PATCH 01/10] codestyle unification --- src/local/BLELocalDevice.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/local/BLELocalDevice.cpp b/src/local/BLELocalDevice.cpp index 076c7bad..193bd2d8 100644 --- a/src/local/BLELocalDevice.cpp +++ b/src/local/BLELocalDevice.cpp @@ -187,10 +187,10 @@ int BLELocalDevice::begin() // } // Serial.println(); - // // save this + // // save this // uint8_t zeros[16]; // for(int k=0; k<16; k++) zeros[15-k] = 0; - + // // HCI.leAddResolvingAddress((*BADDR_Type)[i],(*BADDRs)[i],(*IRKs)[i], zeros); // delete[] (*BADDRs)[i]; @@ -202,7 +202,7 @@ int BLELocalDevice::begin() // delete BADDRs; // delete[] (*IRKs); // delete IRKs; - + // memcheck = new uint8_t[1]; // Serial.print("nIRK location: 0x"); // Serial.println((int)memcheck,HEX); @@ -315,7 +315,7 @@ bool BLELocalDevice::setManufacturerData(const uint16_t companyId, const uint8_t bool BLELocalDevice::setLocalName(const char *localName) { - return _scanResponseData.setLocalName(localName); + return _scanResponseData.setLocalName(localName); } void BLELocalDevice::setAdvertisingData(BLEAdvertisingData& advertisingData) @@ -360,7 +360,7 @@ int BLELocalDevice::advertise() { _advertisingData.updateData(); _scanResponseData.updateData(); - return GAP.advertise( _advertisingData.data(), _advertisingData.dataLength(), + return GAP.advertise( _advertisingData.data(), _advertisingData.dataLength(), _scanResponseData.data(), _scanResponseData.dataLength()); } From c358f71995c3f857e162a1d2840275deb322e577 Mon Sep 17 00:00:00 2001 From: Andrea Gilardoni Date: Wed, 15 Jan 2025 14:57:06 +0100 Subject: [PATCH 02/10] HCI Uart changing supported devices nina based devices will be supported through nina spi transport changing the macro from exclusion to explicit inclusion --- src/utility/HCIUartTransport.cpp | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/utility/HCIUartTransport.cpp b/src/utility/HCIUartTransport.cpp index 5a848ea7..7abc1538 100644 --- a/src/utility/HCIUartTransport.cpp +++ b/src/utility/HCIUartTransport.cpp @@ -17,15 +17,11 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#if !defined(ARDUINO_ARCH_MBED) && !defined(__ZEPHYR__) && !defined(ESP32) && !defined(ARDUINO_SILABS) && !defined(ARDUINO_UNOR4_WIFI) && !defined(__ZEPHYR__) || defined(TARGET_NANO_RP2040_CONNECT) //|| defined(CORE_CM4) +#if defined(ARDUINO_PORTENTA_C33) #include "HCIUartTransport.h" -#if defined(ARDUINO_SAMD_MKRWIFI1010) || defined(ARDUINO_AVR_UNO_WIFI_REV2) -#define SerialHCI Serial2 -#elif defined(ARDUINO_SAMD_NANO_33_IOT) || defined(ARDUINO_NANO_RP2040_CONNECT) -// SerialHCI is already defined in the variant -#elif defined(ARDUINO_PORTENTA_H7_M4) +#if defined(ARDUINO_PORTENTA_H7_M4) // SerialHCI is already defined in the variant #elif defined(ARDUINO_PORTENTA_H7_M7) || defined(ARDUINO_NICLA_VISION) #define SerialHCI Serial2 From df7c6239119ba201ec67ff875d1d145cefbc5951 Mon Sep 17 00:00:00 2001 From: Andrea Gilardoni Date: Wed, 15 Jan 2025 14:58:21 +0100 Subject: [PATCH 03/10] removing mbed devices from uart transport Since automatically excluded from previous exclusion preprocessor if --- src/utility/HCIUartTransport.cpp | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/src/utility/HCIUartTransport.cpp b/src/utility/HCIUartTransport.cpp index 7abc1538..606c8148 100644 --- a/src/utility/HCIUartTransport.cpp +++ b/src/utility/HCIUartTransport.cpp @@ -21,16 +21,8 @@ #include "HCIUartTransport.h" -#if defined(ARDUINO_PORTENTA_H7_M4) -// SerialHCI is already defined in the variant -#elif defined(ARDUINO_PORTENTA_H7_M7) || defined(ARDUINO_NICLA_VISION) -#define SerialHCI Serial2 -#elif defined(ARDUINO_OPTA) -#define SerialHCI Serial3 -#elif defined(ARDUINO_PORTENTA_C33) +#if defined(ARDUINO_PORTENTA_C33) #define SerialHCI Serial5 -#elif defined(ARDUINO_GIGA) -arduino::UART SerialHCI(CYBSP_BT_UART_TX, CYBSP_BT_UART_RX, CYBSP_BT_UART_RTS, CYBSP_BT_UART_CTS); #else #error "Unsupported board selected!" #endif From eccdbebc6f0db1ccfeae43c190eafb87a60b220d Mon Sep 17 00:00:00 2001 From: Andrea Gilardoni Date: Thu, 9 Jan 2025 09:56:37 +0100 Subject: [PATCH 04/10] changing paradigm for BLE local device Since in the next version for BLE we are delivering HCI commands through spi we don't need to restart the nina device for ble to run, thus removing those commands from this library --- src/local/BLELocalDevice.cpp | 31 +++---------------------------- 1 file changed, 3 insertions(+), 28 deletions(-) diff --git a/src/local/BLELocalDevice.cpp b/src/local/BLELocalDevice.cpp index 193bd2d8..a562ed70 100644 --- a/src/local/BLELocalDevice.cpp +++ b/src/local/BLELocalDevice.cpp @@ -63,26 +63,7 @@ BLELocalDevice::~BLELocalDevice() int BLELocalDevice::begin() { -#if defined(ARDUINO_SAMD_MKRWIFI1010) || defined(ARDUINO_AVR_UNO_WIFI_REV2) || defined(ARDUINO_SAMD_NANO_33_IOT) || defined(ARDUINO_NANO_RP2040_CONNECT) - // reset the NINA in BLE mode - pinMode(SPIWIFI_SS, OUTPUT); - pinMode(NINA_RESETN, OUTPUT); - - digitalWrite(SPIWIFI_SS, LOW); -#endif - -#if defined(ARDUINO_SAMD_MKRWIFI1010) || defined(ARDUINO_AVR_UNO_WIFI_REV2) - digitalWrite(NINA_RESETN, HIGH); - delay(100); - digitalWrite(NINA_RESETN, LOW); - delay(750); -#elif defined(ARDUINO_SAMD_NANO_33_IOT) || defined(ARDUINO_NANO_RP2040_CONNECT) - // inverted reset - digitalWrite(NINA_RESETN, LOW); - delay(100); - digitalWrite(NINA_RESETN, HIGH); - delay(750); -#elif defined(PORTENTA_H7_PINS) || defined(ARDUINO_PORTENTA_H7_M7) || defined(ARDUINO_NICLA_VISION) || defined(ARDUINO_GIGA) || defined(ARDUINO_OPTA) +#if defined(PORTENTA_H7_PINS) || defined(ARDUINO_PORTENTA_H7_M7) || defined(ARDUINO_NICLA_VISION) || defined(ARDUINO_GIGA) || defined(ARDUINO_OPTA) // BT_REG_ON -> HIGH pinMode(BT_REG_ON, OUTPUT); digitalWrite(BT_REG_ON, LOW); @@ -221,15 +202,9 @@ void BLELocalDevice::end() HCI.end(); -#if defined(ARDUINO_SAMD_MKRWIFI1010) || defined(ARDUINO_AVR_UNO_WIFI_REV2) - // disable the NINA - digitalWrite(NINA_RESETN, HIGH); -#elif defined(ARDUINO_SAMD_NANO_33_IOT) || defined(ARDUINO_NANO_RP2040_CONNECT) - // disable the NINA - digitalWrite(NINA_RESETN, LOW); -#elif defined(ARDUINO_PORTENTA_H7_M4) || defined(ARDUINO_PORTENTA_H7_M7) || defined(ARDUINO_NICLA_VISION) || defined(ARDUINO_GIGA) || defined(ARDUINO_OPTA) +#if defined(ARDUINO_PORTENTA_H7_M4) || defined(ARDUINO_PORTENTA_H7_M7) || defined(ARDUINO_NICLA_VISION) || defined(ARDUINO_GIGA) || defined(ARDUINO_OPTA) digitalWrite(BT_REG_ON, LOW); -#endif +#endif _advertisingData.clear(); _scanResponseData.clear(); } From 2cb1a5a6762cceaa95c2f4d73b78044a8e6dede6 Mon Sep 17 00:00:00 2001 From: Andrea Gilardoni Date: Thu, 9 Jan 2025 09:57:12 +0100 Subject: [PATCH 05/10] enabling hci through spi commands --- src/utility/HCINinaSpiTransport.cpp | 64 +++++++++++++++++++++++++++++ src/utility/HCINinaSpiTransport.h | 32 +++++++++++++++ 2 files changed, 96 insertions(+) create mode 100644 src/utility/HCINinaSpiTransport.cpp create mode 100644 src/utility/HCINinaSpiTransport.h diff --git a/src/utility/HCINinaSpiTransport.cpp b/src/utility/HCINinaSpiTransport.cpp new file mode 100644 index 00000000..38d46766 --- /dev/null +++ b/src/utility/HCINinaSpiTransport.cpp @@ -0,0 +1,64 @@ +/* + This file is part of the ArduinoBLE library. + + Copyright (c) 2024 Arduino SA + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. +*/ + +#if defined(ARDUINO_AVR_UNO_WIFI_REV2) || defined(ARDUINO_SAMD_MKRWIFI1010) || defined(ARDUINO_SAMD_NANO_33_IOT) || defined(TARGET_NANO_RP2040_CONNECT) +#include "HCINinaSpiTransport.h" +#include + +int HCINinaSpiTransportClass::begin() +{ + WiFiDrv::wifiDriverInit(); + return WiFiDrv::bleBegin(); +} + +void HCINinaSpiTransportClass::end() +{ + WiFiDrv::bleEnd(); +} + +void HCINinaSpiTransportClass::wait(unsigned long timeout) +{ + for (unsigned long start = millis(); (millis() - start) < timeout;) { + if (available()) { + break; + } + } +} + +int HCINinaSpiTransportClass::available() +{ + return WiFiDrv::bleAvailable(); +} + +int HCINinaSpiTransportClass::peek() +{ + int res=-1; + WiFiDrv::blePeek((uint8_t*)&res, 1); // read a single byte, if nothing is returned we return -1 + + return res; +} + +int HCINinaSpiTransportClass::read() +{ + int res=-1; + WiFiDrv::bleRead((uint8_t*)&res, 1); // read a single byte, if nothing is returned we return -1 + + return res; +} + +size_t HCINinaSpiTransportClass::write(const uint8_t* data, size_t length) +{ + return WiFiDrv::bleWrite(data, length); +} + +HCINinaSpiTransportClass HCINinaSpiTransport; +HCITransportInterface& HCITransport = HCINinaSpiTransport; + +#endif diff --git a/src/utility/HCINinaSpiTransport.h b/src/utility/HCINinaSpiTransport.h new file mode 100644 index 00000000..55cb1068 --- /dev/null +++ b/src/utility/HCINinaSpiTransport.h @@ -0,0 +1,32 @@ +/* + This file is part of the ArduinoBLE library. + + Copyright (c) 2024 Arduino SA + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. +*/ + +#ifndef _HCI_NINA_SPI_TRANSPORT_H_ +#define _HCI_NINA_SPI_TRANSPORT_H_ + +#include "HCITransport.h" + +class HCINinaSpiTransportClass : public HCITransportInterface { +public: + HCINinaSpiTransportClass() {} + + virtual int begin(); + virtual void end(); + + virtual void wait(unsigned long timeout); + + virtual int available(); + virtual int peek(); + virtual int read(); + + virtual size_t write(const uint8_t* data, size_t length); +}; + +#endif From c323ec3fe19ee1534996896b3b2359d9bf9702d8 Mon Sep 17 00:00:00 2001 From: Andrea Gilardoni Date: Wed, 15 Jan 2025 14:08:55 +0100 Subject: [PATCH 06/10] Adding dependency to WiFiNINA for boards using nina --- library.properties | 1 + 1 file changed, 1 insertion(+) diff --git a/library.properties b/library.properties index aee31480..d0a4c82b 100644 --- a/library.properties +++ b/library.properties @@ -8,3 +8,4 @@ category=Communication url=https://www.arduino.cc/en/Reference/ArduinoBLE architectures=* includes=ArduinoBLE.h +depends=WiFiNINA From 18c8cfc52095d4a7ae9f7e919ec5dd64f7f0acfb Mon Sep 17 00:00:00 2001 From: Andrea Gilardoni Date: Wed, 15 Jan 2025 15:18:41 +0100 Subject: [PATCH 07/10] fixing ci for nina based boards --- .github/workflows/compile-examples.yml | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/.github/workflows/compile-examples.yml b/.github/workflows/compile-examples.yml index 58acf44b..435f1d59 100644 --- a/.github/workflows/compile-examples.yml +++ b/.github/workflows/compile-examples.yml @@ -34,17 +34,20 @@ jobs: - fqbn: arduino:samd:mkrwifi1010 platforms: | - name: arduino:samd - libraries: "" + libraries: | + - name: WiFiNINA artifact-name-suffix: arduino-samd-mkrwifi1010 - fqbn: arduino:samd:nano_33_iot platforms: | - name: arduino:samd - libraries: "" + libraries: | + - name: WiFiNINA artifact-name-suffix: arduino-samd-nano_33_iot - fqbn: arduino:megaavr:uno2018:mode=on platforms: | - name: arduino:megaavr - libraries: "" + libraries: | + - name: WiFiNINA artifact-name-suffix: arduino-megaavr-uno2018 - fqbn: arduino:mbed_nano:nano33ble platforms: | @@ -54,7 +57,8 @@ jobs: - fqbn: arduino:mbed_nano:nanorp2040connect platforms: | - name: arduino:mbed_nano - libraries: "" + libraries: | + - name: WiFiNINA artifact-name-suffix: arduino-mbed_nano-nanorp2040connect - fqbn: arduino:mbed_portenta:envie_m7 platforms: | @@ -175,6 +179,8 @@ jobs: with: github-token: ${{ secrets.GITHUB_TOKEN }} fqbn: ${{ matrix.fqbn }} + libraries: | + ${{ matrix.libraries }} platforms: | - name: esp32:esp32 source-url: https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json From 5c720e1f718977e3a70339b9820faf39dd60a476 Mon Sep 17 00:00:00 2001 From: pennam Date: Fri, 28 Mar 2025 09:06:06 +0100 Subject: [PATCH 08/10] Use SpiNINA library --- src/utility/HCINinaSpiTransport.cpp | 17 ++-- src/utility/ble_drv.cpp | 153 ++++++++++++++++++++++++++++ src/utility/ble_drv.h | 20 ++++ src/utility/ble_spi.h | 13 +++ 4 files changed, 195 insertions(+), 8 deletions(-) create mode 100644 src/utility/ble_drv.cpp create mode 100644 src/utility/ble_drv.h create mode 100644 src/utility/ble_spi.h diff --git a/src/utility/HCINinaSpiTransport.cpp b/src/utility/HCINinaSpiTransport.cpp index 38d46766..4eeb90f3 100644 --- a/src/utility/HCINinaSpiTransport.cpp +++ b/src/utility/HCINinaSpiTransport.cpp @@ -10,17 +10,18 @@ #if defined(ARDUINO_AVR_UNO_WIFI_REV2) || defined(ARDUINO_SAMD_MKRWIFI1010) || defined(ARDUINO_SAMD_NANO_33_IOT) || defined(TARGET_NANO_RP2040_CONNECT) #include "HCINinaSpiTransport.h" -#include +#include "spi_drv.h" +#include "ble_drv.h" int HCINinaSpiTransportClass::begin() { - WiFiDrv::wifiDriverInit(); - return WiFiDrv::bleBegin(); + SpiDrv::begin(); + return BleDrv::bleBegin(); } void HCINinaSpiTransportClass::end() { - WiFiDrv::bleEnd(); + BleDrv::bleEnd(); } void HCINinaSpiTransportClass::wait(unsigned long timeout) @@ -34,13 +35,13 @@ void HCINinaSpiTransportClass::wait(unsigned long timeout) int HCINinaSpiTransportClass::available() { - return WiFiDrv::bleAvailable(); + return BleDrv::bleAvailable(); } int HCINinaSpiTransportClass::peek() { int res=-1; - WiFiDrv::blePeek((uint8_t*)&res, 1); // read a single byte, if nothing is returned we return -1 + BleDrv::blePeek((uint8_t*)&res, 1); // read a single byte, if nothing is returned we return -1 return res; } @@ -48,14 +49,14 @@ int HCINinaSpiTransportClass::peek() int HCINinaSpiTransportClass::read() { int res=-1; - WiFiDrv::bleRead((uint8_t*)&res, 1); // read a single byte, if nothing is returned we return -1 + BleDrv::bleRead((uint8_t*)&res, 1); // read a single byte, if nothing is returned we return -1 return res; } size_t HCINinaSpiTransportClass::write(const uint8_t* data, size_t length) { - return WiFiDrv::bleWrite(data, length); + return BleDrv::bleWrite(data, length); } HCINinaSpiTransportClass HCINinaSpiTransport; diff --git a/src/utility/ble_drv.cpp b/src/utility/ble_drv.cpp new file mode 100644 index 00000000..22e16ba6 --- /dev/null +++ b/src/utility/ble_drv.cpp @@ -0,0 +1,153 @@ + +#include +#include +#include + +#include "Arduino.h" +#include +#include "utility/ble_drv.h" + + +extern "C" { +#include "utility/ble_spi.h" +} + + +int BleDrv::bleBegin() { + WAIT_FOR_SLAVE_SELECT(); + + SpiDrv::sendCmd(BLE_BEGIN, PARAM_NUMS_0); + + SpiDrv::spiSlaveDeselect(); + //Wait the reply elaboration + SpiDrv::waitForSlaveReady(); + SpiDrv::spiSlaveSelect(); + + uint8_t len = 1; + uint8_t result = 0; + SpiDrv::waitResponseCmd(BLE_BEGIN, PARAM_NUMS_1, (uint8_t*)&result, &len); + SpiDrv::spiSlaveDeselect(); + + return result == 0; +} + +void BleDrv::bleEnd() { + WAIT_FOR_SLAVE_SELECT(); + + SpiDrv::sendCmd(BLE_END, PARAM_NUMS_0); + + SpiDrv::spiSlaveDeselect(); + //Wait the reply elaboration + SpiDrv::waitForSlaveReady(); + SpiDrv::spiSlaveSelect(); + + uint8_t len = 1; + uint8_t result = 0; + SpiDrv::waitResponseCmd(BLE_END, PARAM_NUMS_1, (uint8_t*)&result, &len); + SpiDrv::spiSlaveDeselect(); +} + +int BleDrv::bleAvailable() { + WAIT_FOR_SLAVE_SELECT(); + uint16_t result = 0; + + SpiDrv::sendCmd(BLE_AVAILABLE, PARAM_NUMS_0); + + SpiDrv::spiSlaveDeselect(); + //Wait the reply elaboration + SpiDrv::waitForSlaveReady(); + SpiDrv::spiSlaveSelect(); + + uint8_t len = 2; + SpiDrv::waitResponseCmd(BLE_AVAILABLE, PARAM_NUMS_1, (uint8_t*)&result, &len); + SpiDrv::spiSlaveDeselect(); + + return result; +} + +int BleDrv::bleRead(uint8_t data[], size_t length) { + WAIT_FOR_SLAVE_SELECT(); + + SpiDrv::sendCmd(BLE_READ, PARAM_NUMS_1); + + int commandSize = 7; // 4 for the normal command length + 3 for the parameter + uint16_t param = length; // TODO check length doesn't exceed 2^16 + SpiDrv::sendParam((uint8_t*)¶m, sizeof(param), LAST_PARAM); + + // pad to multiple of 4 + while (commandSize % 4 != 0) { + SpiDrv::readChar(); + commandSize++; + } + + SpiDrv::spiSlaveDeselect(); + //Wait the reply elaboration + SpiDrv::waitForSlaveReady(); + SpiDrv::spiSlaveSelect(); + + uint16_t res_len = 0; + SpiDrv::waitResponseData16(BLE_READ, data, (uint16_t*)&res_len); + + SpiDrv::spiSlaveDeselect(); + + return res_len; +} + +int BleDrv::blePeek(uint8_t data[], size_t length) { + WAIT_FOR_SLAVE_SELECT(); + + SpiDrv::sendCmd(BLE_PEEK, PARAM_NUMS_1); + + int commandSize = 7; // 4 for the normal command length + 3 for the parameter + uint16_t param = length; // TODO check length doesn't exceed 2^16 + SpiDrv::sendParam((uint8_t*)¶m, sizeof(param), LAST_PARAM); + + // pad to multiple of 4 + while (commandSize % 4 != 0) { + SpiDrv::readChar(); + commandSize++; + } + + SpiDrv::spiSlaveDeselect(); + //Wait the reply elaboration + SpiDrv::waitForSlaveReady(); + SpiDrv::spiSlaveSelect(); + + uint16_t res_len = 0; + SpiDrv::waitResponseData16(BLE_READ, data, (uint16_t*)&res_len); + + SpiDrv::spiSlaveDeselect(); + + return res_len; +} + +size_t BleDrv::bleWrite(const uint8_t* data, size_t len) { + WAIT_FOR_SLAVE_SELECT(); + + int commandSize = 4; + SpiDrv::sendCmd(BLE_WRITE, PARAM_NUMS_1); + + SpiDrv::sendBuffer((uint8_t*)data, len, LAST_PARAM); + commandSize += len+2; + + // pad to multiple of 4 + while (commandSize % 4 != 0) { + SpiDrv::readChar(); + commandSize++; + } + + SpiDrv::spiSlaveDeselect(); + //Wait the reply elaboration + SpiDrv::waitForSlaveReady(); + SpiDrv::spiSlaveSelect(); + + uint8_t res_len = 1; + uint16_t res = 0; + SpiDrv::waitResponseCmd(BLE_WRITE, PARAM_NUMS_1, (uint8_t*)&res, &res_len); + SpiDrv::spiSlaveDeselect(); + + return res; +} + + +BleDrv bleDrv; \ No newline at end of file diff --git a/src/utility/ble_drv.h b/src/utility/ble_drv.h new file mode 100644 index 00000000..8eeab162 --- /dev/null +++ b/src/utility/ble_drv.h @@ -0,0 +1,20 @@ + +#pragma once + +#include + + + +class BleDrv +{ +public: + static int bleBegin(); + static void bleEnd(); + static int bleAvailable(); + static int bleRead(uint8_t data[], size_t length); + static int blePeek(uint8_t data[], size_t length); + static size_t bleWrite(const uint8_t* data, size_t length); + +}; + +extern BleDrv bleDrv; diff --git a/src/utility/ble_spi.h b/src/utility/ble_spi.h new file mode 100644 index 00000000..486a22c5 --- /dev/null +++ b/src/utility/ble_spi.h @@ -0,0 +1,13 @@ +#pragma once + +enum { + + + BLE_BEGIN = 0x4A, + BLE_END = 0x4B, + BLE_AVAILABLE = 0x4C, + BLE_PEEK = 0x4D, + BLE_READ = 0x4E, + BLE_WRITE = 0x4F, + +}; \ No newline at end of file From c5f8ae4ac73e7cdb1faff6199887738826c30566 Mon Sep 17 00:00:00 2001 From: fabik111 Date: Tue, 2 Sep 2025 15:41:20 +0200 Subject: [PATCH 09/10] move ble_drv for nina boards to HCINinaSpiTransport --- src/utility/HCINinaSpiTransport.cpp | 146 +++++++++++++++++++++++++- src/utility/HCINinaSpiTransport.h | 11 ++ src/utility/ble_drv.cpp | 153 ---------------------------- src/utility/ble_drv.h | 20 ---- src/utility/ble_spi.h | 13 --- 5 files changed, 156 insertions(+), 187 deletions(-) delete mode 100644 src/utility/ble_drv.cpp delete mode 100644 src/utility/ble_drv.h delete mode 100644 src/utility/ble_spi.h diff --git a/src/utility/HCINinaSpiTransport.cpp b/src/utility/HCINinaSpiTransport.cpp index 4eeb90f3..d5bc9585 100644 --- a/src/utility/HCINinaSpiTransport.cpp +++ b/src/utility/HCINinaSpiTransport.cpp @@ -11,7 +11,151 @@ #if defined(ARDUINO_AVR_UNO_WIFI_REV2) || defined(ARDUINO_SAMD_MKRWIFI1010) || defined(ARDUINO_SAMD_NANO_33_IOT) || defined(TARGET_NANO_RP2040_CONNECT) #include "HCINinaSpiTransport.h" #include "spi_drv.h" -#include "ble_drv.h" + +enum { + BLE_BEGIN = 0x4A, + BLE_END = 0x4B, + BLE_AVAILABLE = 0x4C, + BLE_PEEK = 0x4D, + BLE_READ = 0x4E, + BLE_WRITE = 0x4F, +}; + +int BleDrv::bleBegin() { + WAIT_FOR_SLAVE_SELECT(); + + SpiDrv::sendCmd(BLE_BEGIN, PARAM_NUMS_0); + + SpiDrv::spiSlaveDeselect(); + //Wait the reply elaboration + SpiDrv::waitForSlaveReady(); + SpiDrv::spiSlaveSelect(); + + uint8_t len = 1; + uint8_t result = 0; + SpiDrv::waitResponseCmd(BLE_BEGIN, PARAM_NUMS_1, (uint8_t*)&result, &len); + SpiDrv::spiSlaveDeselect(); + + return result == 0; +} + +void BleDrv::bleEnd() { + WAIT_FOR_SLAVE_SELECT(); + + SpiDrv::sendCmd(BLE_END, PARAM_NUMS_0); + + SpiDrv::spiSlaveDeselect(); + //Wait the reply elaboration + SpiDrv::waitForSlaveReady(); + SpiDrv::spiSlaveSelect(); + + uint8_t len = 1; + uint8_t result = 0; + SpiDrv::waitResponseCmd(BLE_END, PARAM_NUMS_1, (uint8_t*)&result, &len); + SpiDrv::spiSlaveDeselect(); +} + +int BleDrv::bleAvailable() { + WAIT_FOR_SLAVE_SELECT(); + uint16_t result = 0; + + SpiDrv::sendCmd(BLE_AVAILABLE, PARAM_NUMS_0); + + SpiDrv::spiSlaveDeselect(); + //Wait the reply elaboration + SpiDrv::waitForSlaveReady(); + SpiDrv::spiSlaveSelect(); + + uint8_t len = 2; + SpiDrv::waitResponseCmd(BLE_AVAILABLE, PARAM_NUMS_1, (uint8_t*)&result, &len); + SpiDrv::spiSlaveDeselect(); + + return result; +} + +int BleDrv::bleRead(uint8_t data[], size_t length) { + WAIT_FOR_SLAVE_SELECT(); + + SpiDrv::sendCmd(BLE_READ, PARAM_NUMS_1); + + int commandSize = 7; // 4 for the normal command length + 3 for the parameter + uint16_t param = length; // TODO check length doesn't exceed 2^16 + SpiDrv::sendParam((uint8_t*)¶m, sizeof(param), LAST_PARAM); + + // pad to multiple of 4 + while (commandSize % 4 != 0) { + SpiDrv::readChar(); + commandSize++; + } + + SpiDrv::spiSlaveDeselect(); + //Wait the reply elaboration + SpiDrv::waitForSlaveReady(); + SpiDrv::spiSlaveSelect(); + + uint16_t res_len = 0; + SpiDrv::waitResponseData16(BLE_READ, data, (uint16_t*)&res_len); + + SpiDrv::spiSlaveDeselect(); + + return res_len; +} + +int BleDrv::blePeek(uint8_t data[], size_t length) { + WAIT_FOR_SLAVE_SELECT(); + + SpiDrv::sendCmd(BLE_PEEK, PARAM_NUMS_1); + + int commandSize = 7; // 4 for the normal command length + 3 for the parameter + uint16_t param = length; // TODO check length doesn't exceed 2^16 + SpiDrv::sendParam((uint8_t*)¶m, sizeof(param), LAST_PARAM); + + // pad to multiple of 4 + while (commandSize % 4 != 0) { + SpiDrv::readChar(); + commandSize++; + } + + SpiDrv::spiSlaveDeselect(); + //Wait the reply elaboration + SpiDrv::waitForSlaveReady(); + SpiDrv::spiSlaveSelect(); + + uint16_t res_len = 0; + SpiDrv::waitResponseData16(BLE_READ, data, (uint16_t*)&res_len); + + SpiDrv::spiSlaveDeselect(); + + return res_len; +} + +size_t BleDrv::bleWrite(const uint8_t* data, size_t len) { + WAIT_FOR_SLAVE_SELECT(); + + int commandSize = 4; + SpiDrv::sendCmd(BLE_WRITE, PARAM_NUMS_1); + + SpiDrv::sendBuffer((uint8_t*)data, len, LAST_PARAM); + commandSize += len+2; + + // pad to multiple of 4 + while (commandSize % 4 != 0) { + SpiDrv::readChar(); + commandSize++; + } + + SpiDrv::spiSlaveDeselect(); + //Wait the reply elaboration + SpiDrv::waitForSlaveReady(); + SpiDrv::spiSlaveSelect(); + + uint8_t res_len = 1; + uint16_t res = 0; + SpiDrv::waitResponseCmd(BLE_WRITE, PARAM_NUMS_1, (uint8_t*)&res, &res_len); + SpiDrv::spiSlaveDeselect(); + + return res; +} int HCINinaSpiTransportClass::begin() { diff --git a/src/utility/HCINinaSpiTransport.h b/src/utility/HCINinaSpiTransport.h index 55cb1068..d02a97cd 100644 --- a/src/utility/HCINinaSpiTransport.h +++ b/src/utility/HCINinaSpiTransport.h @@ -13,6 +13,17 @@ #include "HCITransport.h" +class BleDrv +{ +public: + static int bleBegin(); + static void bleEnd(); + static int bleAvailable(); + static int bleRead(uint8_t data[], size_t length); + static int blePeek(uint8_t data[], size_t length); + static size_t bleWrite(const uint8_t* data, size_t length); +}; + class HCINinaSpiTransportClass : public HCITransportInterface { public: HCINinaSpiTransportClass() {} diff --git a/src/utility/ble_drv.cpp b/src/utility/ble_drv.cpp deleted file mode 100644 index 22e16ba6..00000000 --- a/src/utility/ble_drv.cpp +++ /dev/null @@ -1,153 +0,0 @@ - -#include -#include -#include - -#include "Arduino.h" -#include -#include "utility/ble_drv.h" - - -extern "C" { -#include "utility/ble_spi.h" -} - - -int BleDrv::bleBegin() { - WAIT_FOR_SLAVE_SELECT(); - - SpiDrv::sendCmd(BLE_BEGIN, PARAM_NUMS_0); - - SpiDrv::spiSlaveDeselect(); - //Wait the reply elaboration - SpiDrv::waitForSlaveReady(); - SpiDrv::spiSlaveSelect(); - - uint8_t len = 1; - uint8_t result = 0; - SpiDrv::waitResponseCmd(BLE_BEGIN, PARAM_NUMS_1, (uint8_t*)&result, &len); - SpiDrv::spiSlaveDeselect(); - - return result == 0; -} - -void BleDrv::bleEnd() { - WAIT_FOR_SLAVE_SELECT(); - - SpiDrv::sendCmd(BLE_END, PARAM_NUMS_0); - - SpiDrv::spiSlaveDeselect(); - //Wait the reply elaboration - SpiDrv::waitForSlaveReady(); - SpiDrv::spiSlaveSelect(); - - uint8_t len = 1; - uint8_t result = 0; - SpiDrv::waitResponseCmd(BLE_END, PARAM_NUMS_1, (uint8_t*)&result, &len); - SpiDrv::spiSlaveDeselect(); -} - -int BleDrv::bleAvailable() { - WAIT_FOR_SLAVE_SELECT(); - uint16_t result = 0; - - SpiDrv::sendCmd(BLE_AVAILABLE, PARAM_NUMS_0); - - SpiDrv::spiSlaveDeselect(); - //Wait the reply elaboration - SpiDrv::waitForSlaveReady(); - SpiDrv::spiSlaveSelect(); - - uint8_t len = 2; - SpiDrv::waitResponseCmd(BLE_AVAILABLE, PARAM_NUMS_1, (uint8_t*)&result, &len); - SpiDrv::spiSlaveDeselect(); - - return result; -} - -int BleDrv::bleRead(uint8_t data[], size_t length) { - WAIT_FOR_SLAVE_SELECT(); - - SpiDrv::sendCmd(BLE_READ, PARAM_NUMS_1); - - int commandSize = 7; // 4 for the normal command length + 3 for the parameter - uint16_t param = length; // TODO check length doesn't exceed 2^16 - SpiDrv::sendParam((uint8_t*)¶m, sizeof(param), LAST_PARAM); - - // pad to multiple of 4 - while (commandSize % 4 != 0) { - SpiDrv::readChar(); - commandSize++; - } - - SpiDrv::spiSlaveDeselect(); - //Wait the reply elaboration - SpiDrv::waitForSlaveReady(); - SpiDrv::spiSlaveSelect(); - - uint16_t res_len = 0; - SpiDrv::waitResponseData16(BLE_READ, data, (uint16_t*)&res_len); - - SpiDrv::spiSlaveDeselect(); - - return res_len; -} - -int BleDrv::blePeek(uint8_t data[], size_t length) { - WAIT_FOR_SLAVE_SELECT(); - - SpiDrv::sendCmd(BLE_PEEK, PARAM_NUMS_1); - - int commandSize = 7; // 4 for the normal command length + 3 for the parameter - uint16_t param = length; // TODO check length doesn't exceed 2^16 - SpiDrv::sendParam((uint8_t*)¶m, sizeof(param), LAST_PARAM); - - // pad to multiple of 4 - while (commandSize % 4 != 0) { - SpiDrv::readChar(); - commandSize++; - } - - SpiDrv::spiSlaveDeselect(); - //Wait the reply elaboration - SpiDrv::waitForSlaveReady(); - SpiDrv::spiSlaveSelect(); - - uint16_t res_len = 0; - SpiDrv::waitResponseData16(BLE_READ, data, (uint16_t*)&res_len); - - SpiDrv::spiSlaveDeselect(); - - return res_len; -} - -size_t BleDrv::bleWrite(const uint8_t* data, size_t len) { - WAIT_FOR_SLAVE_SELECT(); - - int commandSize = 4; - SpiDrv::sendCmd(BLE_WRITE, PARAM_NUMS_1); - - SpiDrv::sendBuffer((uint8_t*)data, len, LAST_PARAM); - commandSize += len+2; - - // pad to multiple of 4 - while (commandSize % 4 != 0) { - SpiDrv::readChar(); - commandSize++; - } - - SpiDrv::spiSlaveDeselect(); - //Wait the reply elaboration - SpiDrv::waitForSlaveReady(); - SpiDrv::spiSlaveSelect(); - - uint8_t res_len = 1; - uint16_t res = 0; - SpiDrv::waitResponseCmd(BLE_WRITE, PARAM_NUMS_1, (uint8_t*)&res, &res_len); - SpiDrv::spiSlaveDeselect(); - - return res; -} - - -BleDrv bleDrv; \ No newline at end of file diff --git a/src/utility/ble_drv.h b/src/utility/ble_drv.h deleted file mode 100644 index 8eeab162..00000000 --- a/src/utility/ble_drv.h +++ /dev/null @@ -1,20 +0,0 @@ - -#pragma once - -#include - - - -class BleDrv -{ -public: - static int bleBegin(); - static void bleEnd(); - static int bleAvailable(); - static int bleRead(uint8_t data[], size_t length); - static int blePeek(uint8_t data[], size_t length); - static size_t bleWrite(const uint8_t* data, size_t length); - -}; - -extern BleDrv bleDrv; diff --git a/src/utility/ble_spi.h b/src/utility/ble_spi.h deleted file mode 100644 index 486a22c5..00000000 --- a/src/utility/ble_spi.h +++ /dev/null @@ -1,13 +0,0 @@ -#pragma once - -enum { - - - BLE_BEGIN = 0x4A, - BLE_END = 0x4B, - BLE_AVAILABLE = 0x4C, - BLE_PEEK = 0x4D, - BLE_READ = 0x4E, - BLE_WRITE = 0x4F, - -}; \ No newline at end of file From 16026f27781164ef662a6a9cd5aabe7570551f66 Mon Sep 17 00:00:00 2001 From: Gilberto Conti Date: Thu, 5 Feb 2026 16:05:55 +0100 Subject: [PATCH 10/10] nano_connect: zephyr support --- src/utility/HCINinaSpiTransport.cpp | 2 +- src/utility/HCIUartTransport.cpp | 2 +- src/utility/HCIVirtualTransportZephyr.cpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/utility/HCINinaSpiTransport.cpp b/src/utility/HCINinaSpiTransport.cpp index d5bc9585..2df31d21 100644 --- a/src/utility/HCINinaSpiTransport.cpp +++ b/src/utility/HCINinaSpiTransport.cpp @@ -8,7 +8,7 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#if defined(ARDUINO_AVR_UNO_WIFI_REV2) || defined(ARDUINO_SAMD_MKRWIFI1010) || defined(ARDUINO_SAMD_NANO_33_IOT) || defined(TARGET_NANO_RP2040_CONNECT) +#if defined(ARDUINO_AVR_UNO_WIFI_REV2) || defined(ARDUINO_SAMD_MKRWIFI1010) || defined(ARDUINO_SAMD_NANO_33_IOT) || defined(TARGET_NANO_RP2040_CONNECT) || defined(ARDUINO_NANO_RP2040_CONNECT) #include "HCINinaSpiTransport.h" #include "spi_drv.h" diff --git a/src/utility/HCIUartTransport.cpp b/src/utility/HCIUartTransport.cpp index 606c8148..599d3ed7 100644 --- a/src/utility/HCIUartTransport.cpp +++ b/src/utility/HCIUartTransport.cpp @@ -87,7 +87,7 @@ size_t HCIUartTransportClass::write(const uint8_t* data, size_t length) return result; } -#if defined(ARDUINO_AVR_UNO_WIFI_REV2) || defined(ARDUINO_NANO_RP2040_CONNECT) +#if defined(ARDUINO_AVR_UNO_WIFI_REV2) HCIUartTransportClass HCIUartTransport(SerialHCI, 119600); #else HCIUartTransportClass HCIUartTransport(SerialHCI, 912600); diff --git a/src/utility/HCIVirtualTransportZephyr.cpp b/src/utility/HCIVirtualTransportZephyr.cpp index 51216a17..6740016e 100644 --- a/src/utility/HCIVirtualTransportZephyr.cpp +++ b/src/utility/HCIVirtualTransportZephyr.cpp @@ -17,7 +17,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#if defined(__ZEPHYR__) && !defined(ARDUINO_UNO_Q) +#if defined(__ZEPHYR__) && !defined(ARDUINO_UNO_Q) && !defined(ARDUINO_NANO_RP2040_CONNECT) #include "HCIVirtualTransportZephyr.h" #include "HCI.h"