From daa383649b385924afad52070d0ba49a06fb8559 Mon Sep 17 00:00:00 2001 From: Scott Brust Date: Fri, 31 May 2024 15:47:15 -0700 Subject: [PATCH 1/7] [ble] return SYSTEM_ERROR_TOO_LARGE when appending beyond maximum advertising data length --- system/src/system_ble_prov.cpp | 6 ++++-- wiring/inc/spark_wiring_ble.h | 1 + wiring/src/spark_wiring_ble.cpp | 17 ++++++++++++----- 3 files changed, 17 insertions(+), 7 deletions(-) diff --git a/system/src/system_ble_prov.cpp b/system/src/system_ble_prov.cpp index 1c6378b5a0..1d3abd5206 100644 --- a/system/src/system_ble_prov.cpp +++ b/system/src/system_ble_prov.cpp @@ -33,8 +33,10 @@ using namespace particle::system; int system_ble_prov_mode(bool enabled, void* reserved) { SYSTEM_THREAD_CONTEXT_SYNC(system_ble_prov_mode(enabled, reserved)); if (!HAL_Feature_Get(FEATURE_DISABLE_LISTENING_MODE)) { - LOG(ERROR, "Listening mode is not disabled. Cannot use prov mode"); - return SYSTEM_ERROR_NOT_ALLOWED; + if (enabled) { + LOG(ERROR, "Provisioning mode not enabled, listening mode is not disabled"); + } + return SYSTEM_ERROR_NOT_ALLOWED; } if (enabled) { CHECK_FALSE(BleProvisioningModeHandler::instance()->getProvModeStatus(), SYSTEM_ERROR_NONE); diff --git a/wiring/inc/spark_wiring_ble.h b/wiring/inc/spark_wiring_ble.h index 923711447a..fdd34eacc7 100644 --- a/wiring/inc/spark_wiring_ble.h +++ b/wiring/inc/spark_wiring_ble.h @@ -491,6 +491,7 @@ class BleAdvertisingData { static size_t locate(const uint8_t* buf, size_t len, BleAdvertisingDataType type, size_t* offset); Vector selfData_; + size_t maxAdvertisingDataLen_; }; diff --git a/wiring/src/spark_wiring_ble.cpp b/wiring/src/spark_wiring_ble.cpp index 8edfd72abc..9465d464d3 100644 --- a/wiring/src/spark_wiring_ble.cpp +++ b/wiring/src/spark_wiring_ble.cpp @@ -562,6 +562,11 @@ BleAdvertisingData::BleAdvertisingData() : selfData_() { uint8_t flag = BLE_SIG_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE; append(BleAdvertisingDataType::FLAGS, &flag, sizeof(uint8_t)); +#if HAL_PLATFORM_RTL872X + maxAdvertisingDataLen_ = BLE_MAX_ADV_DATA_LEN; +#else + maxAdvertisingDataLen_ = BLE_MAX_ADV_DATA_LEN_EXT; +#endif } BleAdvertisingData::BleAdvertisingData(const iBeacon& beacon) @@ -587,7 +592,7 @@ size_t BleAdvertisingData::set(const iBeacon& beacon) { return selfData_.size(); } - CHECK_TRUE(selfData_.reserve(BLE_MAX_ADV_DATA_LEN), 0); + CHECK_TRUE(selfData_.reserve(maxAdvertisingDataLen_), 0); selfData_.append(0x02); selfData_.append(BLE_SIG_AD_TYPE_FLAGS); selfData_.append(BLE_SIG_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE); @@ -625,7 +630,7 @@ size_t BleAdvertisingData::append(BleAdvertisingDataType type, const uint8_t* bu size_t adsLen = locate(selfData_.data(), selfData_.size(), type, &offset); if (!force && adsLen > 0) { // Update the existing AD structure. - if ((selfData_.size() - adsLen + len + 2) <= BLE_MAX_ADV_DATA_LEN_EXT) { + if ((selfData_.size() - adsLen + len + 2) <= maxAdvertisingDataLen_) { // Firstly, remove the existing AD structure. selfData_.removeAt(offset, adsLen); // Secondly, Update the AD structure. @@ -638,12 +643,14 @@ size_t BleAdvertisingData::append(BleAdvertisingDataType type, const uint8_t* bu selfData_.insert(offset + 2, buf, len); } } - else if ((selfData_.size() + len + 2) <= BLE_MAX_ADV_DATA_LEN_EXT) { + else if ((selfData_.size() + len + 2) <= maxAdvertisingDataLen_) { // Append the AD structure at the and of advertising data. CHECK_TRUE(selfData_.reserve(selfData_.size() + len + 2), selfData_.size()); selfData_.append(len + 1); selfData_.append(static_cast(type)); selfData_.append(buf, len); + } else { + return SYSTEM_ERROR_TOO_LARGE; } return selfData_.size(); } @@ -665,7 +672,7 @@ size_t BleAdvertisingData::appendAppearance(ble_sig_appearance_t appearance) { } size_t BleAdvertisingData::resize(size_t size) { - selfData_.resize(std::min(size, (size_t)BLE_MAX_ADV_DATA_LEN_EXT)); + selfData_.resize(std::min(size, (size_t)maxAdvertisingDataLen_)); return selfData_.size(); } @@ -726,7 +733,7 @@ size_t BleAdvertisingData::deviceName(char* buf, size_t len) const { String BleAdvertisingData::deviceName() const { String name; - char buf[BLE_MAX_ADV_DATA_LEN]; + char buf[maxAdvertisingDataLen_]; size_t len = deviceName(buf, sizeof(buf)); if (len > 0) { for (size_t i = 0; i < len; i++) { From f07a6215aa8059c796e93075420007680e1ec816 Mon Sep 17 00:00:00 2001 From: Scott Brust Date: Fri, 31 May 2024 15:49:29 -0700 Subject: [PATCH 2/7] Advertise "Photon 2" for BLE name --- hal/src/rtl872x/device_code.cpp | 16 ++++++++++++++-- hal/src/tron/hal_platform_config.h | 3 +++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/hal/src/rtl872x/device_code.cpp b/hal/src/rtl872x/device_code.cpp index d01f492035..3a17d3a5e3 100644 --- a/hal/src/rtl872x/device_code.cpp +++ b/hal/src/rtl872x/device_code.cpp @@ -85,6 +85,18 @@ bool fetch_or_generate_setup_ssid(device_code_t* code) { return true; } +static const char * get_product_series_name(void) { +#if PLATFORM_ID == PLATFORM_P2 + uint32_t model, variant = 0; + hal_get_device_hw_model(&model, &variant, nullptr); + if (variant == PLATFORM_P2_PHOTON_2) { + return PRODUCT_SERIES_PHOTON2; + } +#endif + + return PRODUCT_SERIES; +} + int get_device_name(char* buf, size_t size) { char dctName[DEVICE_NAME_DCT_SIZE] = {}; int ret = dct_read_app_data_copy(DEVICE_NAME_DCT_OFFSET, dctName, DEVICE_NAME_DCT_SIZE); @@ -101,8 +113,8 @@ int get_device_name(char* buf, size_t size) { return ret; } // Get platform name - const char* const platform = PRODUCT_SERIES; - nameSize = sizeof(PRODUCT_SERIES) - 1; // Exclude term. null + const char* const platform = get_product_series_name(); + nameSize = strlen(platform); // Exclude term. null if (nameSize + SETUP_CODE_SIZE + 1 > DEVICE_NAME_MAX_SIZE) { // Reserve 1 character for '-' nameSize = DEVICE_NAME_MAX_SIZE - SETUP_CODE_SIZE - 1; } diff --git a/hal/src/tron/hal_platform_config.h b/hal/src/tron/hal_platform_config.h index b53a104ed8..9750510254 100644 --- a/hal/src/tron/hal_platform_config.h +++ b/hal/src/tron/hal_platform_config.h @@ -30,11 +30,14 @@ #if defined(MODULE_FUNCTION) && MODULE_FUNCTION != 2 // MOD_FUNC_BOOTLOADER #define HAL_PLATFORM_USB_PRODUCT_STRING "P2" +#define HAL_PLATFORM_PHOTON2_USB_PRODUCT_STRING "Photon 2" #else #define HAL_PLATFORM_USB_PRODUCT_STRING "P2 DFU Mode" +#define HAL_PLATFORM_PHOTON2_USB_PRODUCT_STRING "Photon 2 DFU Mode" #endif // defined(MODULE_FUNCTION) && MODULE_FUNCTION != 2 // MOD_FUNC_BOOTLOADER #define PRODUCT_SERIES "P2" +#define PRODUCT_SERIES_PHOTON2 "Photon 2" #define PLATFORM_P2_MODEL_BARE_SOM_DEFAULT (0xffff) #define PLATFORM_P2_PHOTON_2 (0x0001) From 95e7f2269f65c8f1f294a202f46dc01f658bf869 Mon Sep 17 00:00:00 2001 From: Scott Brust Date: Fri, 31 May 2024 15:50:27 -0700 Subject: [PATCH 3/7] Display "Photon 2" in USB endpoints --- hal/src/rtl872x/usbd_cdc.cpp | 9 +++++++-- hal/src/rtl872x/usbd_control.cpp | 7 +++++-- hal/src/rtl872x/usbd_device.cpp | 16 ++++++++++++++-- hal/src/rtl872x/usbd_device.h | 1 + user/applications/tinker/src/fqc_test.cpp | 7 +------ 5 files changed, 28 insertions(+), 12 deletions(-) diff --git a/hal/src/rtl872x/usbd_cdc.cpp b/hal/src/rtl872x/usbd_cdc.cpp index cb35f3f1e1..1a59107c4d 100644 --- a/hal/src/rtl872x/usbd_cdc.cpp +++ b/hal/src/rtl872x/usbd_cdc.cpp @@ -33,7 +33,7 @@ using namespace particle::usbd; namespace { -const char DEFAULT_NAME[] = HAL_PLATFORM_USB_PRODUCT_STRING " " "USB Serial"; +const char DEFAULT_NAME_SUFFIX[] = " USB Serial"; const uint8_t DUMMY_IN_EP = 0x8a; } // anonymous @@ -378,7 +378,12 @@ int CdcClassDriver::getString(unsigned id, uint16_t langId, uint8_t* buf, size_t if (name_) { return dev_->getUnicodeString(name_, strlen(name_), buf, length); } - return dev_->getUnicodeString(DEFAULT_NAME, sizeof(DEFAULT_NAME) - 1, buf, length); + + char strBuffer[256] = {}; + BufferAppender appender(strBuffer, sizeof(strBuffer)); + appender.appendString(dev_->getPlatformUsbName()); + appender.appendString(DEFAULT_NAME_SUFFIX); + return dev_->getUnicodeString(appender.buffer(), appender.dataSize(), buf, length); } return SYSTEM_ERROR_NOT_FOUND; } diff --git a/hal/src/rtl872x/usbd_control.cpp b/hal/src/rtl872x/usbd_control.cpp index 99847c89e9..6d16d0ed2f 100644 --- a/hal/src/rtl872x/usbd_control.cpp +++ b/hal/src/rtl872x/usbd_control.cpp @@ -217,8 +217,11 @@ int ControlInterfaceClassDriver::getConfigurationDescriptor(uint8_t* buf, size_t int ControlInterfaceClassDriver::getString(unsigned id, uint16_t langId, uint8_t* buf, size_t length) { if (id == stringBase_) { - const char str[] = HAL_PLATFORM_USB_PRODUCT_STRING " " "Control Interface"; - return dev_->getUnicodeString(str, strlen(str), buf, length); + char strBuffer[256] = {}; + BufferAppender appender(strBuffer, sizeof(strBuffer)); + appender.appendString(dev_->getPlatformUsbName()); + appender.appendString(" Control Interface"); + return dev_->getUnicodeString(appender.buffer(), appender.dataSize(), buf, length); } return SYSTEM_ERROR_NOT_FOUND; } diff --git a/hal/src/rtl872x/usbd_device.cpp b/hal/src/rtl872x/usbd_device.cpp index c46b40abbc..a584c70976 100644 --- a/hal/src/rtl872x/usbd_device.cpp +++ b/hal/src/rtl872x/usbd_device.cpp @@ -332,6 +332,18 @@ int Device::getRawString(const char* data, size_t len, uint8_t* buf, size_t bufl return len + 2; } +const char * Device::getPlatformUsbName(void) { +#if PLATFORM_ID == PLATFORM_P2 + uint32_t model, variant = 0; + hal_get_device_hw_model(&model, &variant, nullptr); + if (variant == PLATFORM_P2_PHOTON_2) { + return HAL_PLATFORM_PHOTON2_USB_PRODUCT_STRING; + } +#endif + + return HAL_PLATFORM_USB_PRODUCT_STRING; +} + int Device::getString(unsigned id, uint16_t langId, uint8_t* buf, size_t len) { switch (id) { case STRING_IDX_LANGID: { @@ -341,14 +353,14 @@ int Device::getString(unsigned id, uint16_t langId, uint8_t* buf, size_t len) { return getUnicodeString(HAL_PLATFORM_USB_MANUFACTURER_STRING, sizeof(HAL_PLATFORM_USB_MANUFACTURER_STRING) - 1, buf, len); } case STRING_IDX_PRODUCT: { - return getUnicodeString(HAL_PLATFORM_USB_PRODUCT_STRING, sizeof(HAL_PLATFORM_USB_PRODUCT_STRING) - 1, buf, len); + return getUnicodeString(getPlatformUsbName(), strlen(getPlatformUsbName()), buf, len); } case STRING_IDX_SERIAL: { char deviceid[HAL_DEVICE_ID_SIZE * 2] = {}; return getUnicodeString(device_id_as_string(deviceid), sizeof(deviceid), buf, len); } case STRING_IDX_CONFIG: { - return getUnicodeString(HAL_PLATFORM_USB_CONFIGURATION_STRING, sizeof(HAL_PLATFORM_USB_CONFIGURATION_STRING) - 1, buf, len); + return getUnicodeString(getPlatformUsbName(), strlen(getPlatformUsbName()), buf, len); } case STRING_IDX_MSFT: { return getRawString((const char*)MSFT_STR_DESC, sizeof(MSFT_STR_DESC), buf, len); diff --git a/hal/src/rtl872x/usbd_device.h b/hal/src/rtl872x/usbd_device.h index 0ead8d4970..a286831368 100644 --- a/hal/src/rtl872x/usbd_device.h +++ b/hal/src/rtl872x/usbd_device.h @@ -234,6 +234,7 @@ class Device { int setupReceive(SetupRequest* r, uint8_t* data, size_t size); int setupError(SetupRequest* r); + const char * getPlatformUsbName(void); static int getUnicodeString(const char* ascii, size_t len, uint8_t* buf, size_t buflen); static int getRawString(const char* data, size_t len, uint8_t* buf, size_t buflen); diff --git a/user/applications/tinker/src/fqc_test.cpp b/user/applications/tinker/src/fqc_test.cpp index 4c31223df2..590b0c17e2 100644 --- a/user/applications/tinker/src/fqc_test.cpp +++ b/user/applications/tinker/src/fqc_test.cpp @@ -348,13 +348,8 @@ bool FqcTest::ioTest(JSONValue req) { uint16_t pinB = 0; // Pick which set of pins to use based on hardware variant - uint32_t model, variant, efuseReadAttempts = 0; + uint32_t model, variant = 0; int result = hal_get_device_hw_model(&model, &variant, nullptr); - while (result != SYSTEM_ERROR_NONE && efuseReadAttempts < 5) { - Log.warn("Failed to read logical efuse: %d attempt: %lu", result, efuseReadAttempts); - result = hal_get_device_hw_model(&model, &variant, nullptr); - efuseReadAttempts++; - } if (result != SYSTEM_ERROR_NONE) { Log.error("Could not read logical efuse"); From ee2865975ecc81fe1d6c25b4253cd5f258fb35c2 Mon Sep 17 00:00:00 2001 From: Scott Brust Date: Mon, 3 Jun 2024 11:22:58 -0700 Subject: [PATCH 4/7] Add get_device_usb_name() --- hal/inc/device_code.h | 2 ++ hal/src/nRF52840/device_code.cpp | 4 ++++ hal/src/rtl872x/device_code.cpp | 14 +++++++++++++- hal/src/rtl872x/usbd_cdc.cpp | 13 +++++++------ hal/src/rtl872x/usbd_control.cpp | 12 +++++++----- hal/src/rtl872x/usbd_device.cpp | 21 +++++++-------------- hal/src/rtl872x/usbd_device.h | 1 - 7 files changed, 40 insertions(+), 27 deletions(-) diff --git a/hal/inc/device_code.h b/hal/inc/device_code.h index 284839aa89..ebac39acad 100644 --- a/hal/inc/device_code.h +++ b/hal/inc/device_code.h @@ -52,6 +52,8 @@ int get_device_name(char* buf, size_t size); int get_device_setup_code(char* code, size_t size); +int get_device_usb_name(char* buf, size_t size); + #ifdef __cplusplus } #endif diff --git a/hal/src/nRF52840/device_code.cpp b/hal/src/nRF52840/device_code.cpp index 882c54dec1..8a8f00ead3 100644 --- a/hal/src/nRF52840/device_code.cpp +++ b/hal/src/nRF52840/device_code.cpp @@ -124,3 +124,7 @@ int get_device_name(char* buf, size_t size) { } return nameSize; } + +int get_device_usb_name(char* buf, size_t size) { + return SYSTEM_ERROR_NOT_SUPPORTED; +} diff --git a/hal/src/rtl872x/device_code.cpp b/hal/src/rtl872x/device_code.cpp index 3a17d3a5e3..3ecbb4185d 100644 --- a/hal/src/rtl872x/device_code.cpp +++ b/hal/src/rtl872x/device_code.cpp @@ -93,7 +93,6 @@ static const char * get_product_series_name(void) { return PRODUCT_SERIES_PHOTON2; } #endif - return PRODUCT_SERIES; } @@ -134,3 +133,16 @@ int get_device_name(char* buf, size_t size) { } return nameSize; } + +int get_device_usb_name(char* buf, size_t size) { +#if PLATFORM_ID == PLATFORM_P2 + uint32_t model, variant = 0; + hal_get_device_hw_model(&model, &variant, nullptr); + if (variant == PLATFORM_P2_PHOTON_2) { + snprintf(buf, size, "%s", HAL_PLATFORM_PHOTON2_USB_PRODUCT_STRING); + return 0; + } +#endif + snprintf(buf, size, "%s", HAL_PLATFORM_USB_PRODUCT_STRING); + return 0; +} diff --git a/hal/src/rtl872x/usbd_cdc.cpp b/hal/src/rtl872x/usbd_cdc.cpp index 1a59107c4d..dcac699721 100644 --- a/hal/src/rtl872x/usbd_cdc.cpp +++ b/hal/src/rtl872x/usbd_cdc.cpp @@ -28,12 +28,13 @@ #include #include #include "service_debug.h" +#include "device_code.h" using namespace particle::usbd; namespace { -const char DEFAULT_NAME_SUFFIX[] = " USB Serial"; +const char DEFAULT_NAME_SUFFIX[] = "USB Serial"; const uint8_t DUMMY_IN_EP = 0x8a; } // anonymous @@ -379,11 +380,11 @@ int CdcClassDriver::getString(unsigned id, uint16_t langId, uint8_t* buf, size_t return dev_->getUnicodeString(name_, strlen(name_), buf, length); } - char strBuffer[256] = {}; - BufferAppender appender(strBuffer, sizeof(strBuffer)); - appender.appendString(dev_->getPlatformUsbName()); - appender.appendString(DEFAULT_NAME_SUFFIX); - return dev_->getUnicodeString(appender.buffer(), appender.dataSize(), buf, length); + char usbName[64] = {}; + char strBuffer[256] = {}; + get_device_usb_name(usbName, sizeof(usbName)); + snprintf(strBuffer, sizeof(strBuffer), "%s %s", usbName, DEFAULT_NAME_SUFFIX); + return dev_->getUnicodeString(strBuffer, strlen(strBuffer), buf, length); } return SYSTEM_ERROR_NOT_FOUND; } diff --git a/hal/src/rtl872x/usbd_control.cpp b/hal/src/rtl872x/usbd_control.cpp index 6d16d0ed2f..db20bcedc0 100644 --- a/hal/src/rtl872x/usbd_control.cpp +++ b/hal/src/rtl872x/usbd_control.cpp @@ -18,9 +18,11 @@ #include "usbd_control.h" #include #include +#include #include "usbd_wcid.h" #include "appender.h" #include "check.h" +#include "device_code.h" using namespace particle::usbd; @@ -217,11 +219,11 @@ int ControlInterfaceClassDriver::getConfigurationDescriptor(uint8_t* buf, size_t int ControlInterfaceClassDriver::getString(unsigned id, uint16_t langId, uint8_t* buf, size_t length) { if (id == stringBase_) { - char strBuffer[256] = {}; - BufferAppender appender(strBuffer, sizeof(strBuffer)); - appender.appendString(dev_->getPlatformUsbName()); - appender.appendString(" Control Interface"); - return dev_->getUnicodeString(appender.buffer(), appender.dataSize(), buf, length); + char usbName[64] = {}; + char strBuffer[256] = {}; + get_device_usb_name(usbName, sizeof(usbName)); + snprintf(strBuffer, sizeof(strBuffer), "%s %s", usbName, "Control Interface"); + return dev_->getUnicodeString(strBuffer, strlen(strBuffer), buf, length); } return SYSTEM_ERROR_NOT_FOUND; } diff --git a/hal/src/rtl872x/usbd_device.cpp b/hal/src/rtl872x/usbd_device.cpp index a584c70976..631dcf7c5a 100644 --- a/hal/src/rtl872x/usbd_device.cpp +++ b/hal/src/rtl872x/usbd_device.cpp @@ -25,6 +25,7 @@ #include "usbd_wcid.h" #include #include "appender.h" +#include "device_code.h" using namespace particle::usbd; @@ -332,18 +333,6 @@ int Device::getRawString(const char* data, size_t len, uint8_t* buf, size_t bufl return len + 2; } -const char * Device::getPlatformUsbName(void) { -#if PLATFORM_ID == PLATFORM_P2 - uint32_t model, variant = 0; - hal_get_device_hw_model(&model, &variant, nullptr); - if (variant == PLATFORM_P2_PHOTON_2) { - return HAL_PLATFORM_PHOTON2_USB_PRODUCT_STRING; - } -#endif - - return HAL_PLATFORM_USB_PRODUCT_STRING; -} - int Device::getString(unsigned id, uint16_t langId, uint8_t* buf, size_t len) { switch (id) { case STRING_IDX_LANGID: { @@ -353,14 +342,18 @@ int Device::getString(unsigned id, uint16_t langId, uint8_t* buf, size_t len) { return getUnicodeString(HAL_PLATFORM_USB_MANUFACTURER_STRING, sizeof(HAL_PLATFORM_USB_MANUFACTURER_STRING) - 1, buf, len); } case STRING_IDX_PRODUCT: { - return getUnicodeString(getPlatformUsbName(), strlen(getPlatformUsbName()), buf, len); + char usbName[64] = {}; + get_device_usb_name(usbName, sizeof(usbName)); + return getUnicodeString(usbName, strlen(usbName), buf, len); } case STRING_IDX_SERIAL: { char deviceid[HAL_DEVICE_ID_SIZE * 2] = {}; return getUnicodeString(device_id_as_string(deviceid), sizeof(deviceid), buf, len); } case STRING_IDX_CONFIG: { - return getUnicodeString(getPlatformUsbName(), strlen(getPlatformUsbName()), buf, len); + char usbName[64] = {}; + get_device_usb_name(usbName, sizeof(usbName)); + return getUnicodeString(usbName, strlen(usbName), buf, len); } case STRING_IDX_MSFT: { return getRawString((const char*)MSFT_STR_DESC, sizeof(MSFT_STR_DESC), buf, len); diff --git a/hal/src/rtl872x/usbd_device.h b/hal/src/rtl872x/usbd_device.h index a286831368..0ead8d4970 100644 --- a/hal/src/rtl872x/usbd_device.h +++ b/hal/src/rtl872x/usbd_device.h @@ -234,7 +234,6 @@ class Device { int setupReceive(SetupRequest* r, uint8_t* data, size_t size); int setupError(SetupRequest* r); - const char * getPlatformUsbName(void); static int getUnicodeString(const char* ascii, size_t len, uint8_t* buf, size_t buflen); static int getRawString(const char* data, size_t len, uint8_t* buf, size_t buflen); From 2ea798ea4dc78db91f46cca49876efc740af0484 Mon Sep 17 00:00:00 2001 From: Scott Brust Date: Mon, 3 Jun 2024 12:22:45 -0700 Subject: [PATCH 5/7] Fix build --- bootloader/src/rtl872x/sources.mk | 1 + 1 file changed, 1 insertion(+) diff --git a/bootloader/src/rtl872x/sources.mk b/bootloader/src/rtl872x/sources.mk index 25bad642e7..395540afe7 100644 --- a/bootloader/src/rtl872x/sources.mk +++ b/bootloader/src/rtl872x/sources.mk @@ -24,6 +24,7 @@ CSRC += $(call target_files,$(BOOTLOADER_MODULE_PATH)/../hal/src/rtl872x/littlef CPPSRC += $(call target_files,$(BOOTLOADER_MODULE_PATH)/../hal/shared/,filesystem.cpp) CPPSRC += $(call target_files,$(BOOTLOADER_MODULE_PATH)/../hal/src/rtl872x/,usbd_device.cpp) CPPSRC += $(call target_files,$(BOOTLOADER_MODULE_PATH)/../hal/src/rtl872x/,usbd_driver.cpp) +CPPSRC += $(call target_files,$(BOOTLOADER_MODULE_PATH)/../hal/src/rtl872x/,device_code.cpp) LDFLAGS += -T$(BOOTLOADER_SRC_PATH)/linker.ld LINKER_DEPS += $(BOOTLOADER_SRC_PATH)/linker.ld From fa62bff1f395920b6bf696c246c51ddf64c33505 Mon Sep 17 00:00:00 2001 From: Scott Brust Date: Mon, 3 Jun 2024 16:00:14 -0700 Subject: [PATCH 6/7] Add ble hal define for max allowed advertising data length --- hal/src/nRF52840/ble_hal_impl.h | 2 ++ hal/src/rtl872x/ble_hal_impl.h | 2 ++ system/src/ble_provisioning_mode_handler.cpp | 8 +++---- user/applications/tinker/src/burnin_test.cpp | 4 ++-- wiring/inc/spark_wiring_ble.h | 1 - wiring/src/spark_wiring_ble.cpp | 25 ++++++++------------ 6 files changed, 20 insertions(+), 22 deletions(-) diff --git a/hal/src/nRF52840/ble_hal_impl.h b/hal/src/nRF52840/ble_hal_impl.h index 050eb2e67c..cb0414c3f8 100644 --- a/hal/src/nRF52840/ble_hal_impl.h +++ b/hal/src/nRF52840/ble_hal_impl.h @@ -85,6 +85,8 @@ #define BLE_MAX_ADV_DATA_LEN_EXT BLE_GAP_SCAN_BUFFER_EXTENDED_MAX_SUPPORTED #define BLE_MAX_ADV_DATA_LEN_EXT_CONNECTABLE BLE_GAP_ADV_SET_DATA_SIZE_EXTENDED_CONNECTABLE_MAX_SUPPORTED +#define BLE_MAX_SUPPORTED_ADV_DATA_LEN BLE_MAX_ADV_DATA_LEN_EXT + /* Connection Parameters limits */ #define BLE_CONN_PARAMS_SLAVE_LATENCY_ERR 5 #define BLE_CONN_PARAMS_TIMEOUT_ERR 100 diff --git a/hal/src/rtl872x/ble_hal_impl.h b/hal/src/rtl872x/ble_hal_impl.h index b51897060f..756d6d3e60 100644 --- a/hal/src/rtl872x/ble_hal_impl.h +++ b/hal/src/rtl872x/ble_hal_impl.h @@ -81,6 +81,8 @@ /* Maximum length of advertising and scan response data */ #define BLE_MAX_ADV_DATA_LEN 31 +#define BLE_MAX_SUPPORTED_ADV_DATA_LEN BLE_MAX_ADV_DATA_LEN + /* Maximum length of the buffer to store scan report data */ #define BLE_MAX_SCAN_REPORT_BUF_LEN 255 /* Must support extended length for CODED_PHY scanning */ diff --git a/system/src/ble_provisioning_mode_handler.cpp b/system/src/ble_provisioning_mode_handler.cpp index 4a880f0739..b25dc24fb9 100644 --- a/system/src/ble_provisioning_mode_handler.cpp +++ b/system/src/ble_provisioning_mode_handler.cpp @@ -129,15 +129,15 @@ int BleProvisioningModeHandler::cacheUserConfigurations() { LOG_DEBUG(TRACE, "Cache user's BLE configurations."); CHECK_FALSE(exited_, SYSTEM_ERROR_INVALID_STATE); - Vector tempAdvData(BLE_MAX_ADV_DATA_LEN); - Vector tempSrData(BLE_MAX_ADV_DATA_LEN); + Vector tempAdvData(BLE_MAX_SUPPORTED_ADV_DATA_LEN); + Vector tempSrData(BLE_MAX_SUPPORTED_ADV_DATA_LEN); // Advertising data set by user application - size_t len = CHECK(hal_ble_gap_get_advertising_data(tempAdvData.data(), BLE_MAX_ADV_DATA_LEN, nullptr)); + size_t len = CHECK(hal_ble_gap_get_advertising_data(tempAdvData.data(), BLE_MAX_SUPPORTED_ADV_DATA_LEN, nullptr)); tempAdvData.resize(len); // Scan response data set by user application - len = CHECK(hal_ble_gap_get_scan_response_data(tempSrData.data(), BLE_MAX_ADV_DATA_LEN, nullptr)); + len = CHECK(hal_ble_gap_get_scan_response_data(tempSrData.data(), BLE_MAX_SUPPORTED_ADV_DATA_LEN, nullptr)); tempSrData.resize(len); // Advertising and connection parameters set by user application diff --git a/user/applications/tinker/src/burnin_test.cpp b/user/applications/tinker/src/burnin_test.cpp index d5500e917b..53c11b80d5 100644 --- a/user/applications/tinker/src/burnin_test.cpp +++ b/user/applications/tinker/src/burnin_test.cpp @@ -296,8 +296,8 @@ bool BurninTest::testBleScan() { Log.info("Found %d beacons", count); for (int ii = 0; ii < count; ii++) { - uint8_t buf[BLE_MAX_ADV_DATA_LEN]; - size_t len = scanResults[ii].advertisingData().get(BleAdvertisingDataType::MANUFACTURER_SPECIFIC_DATA, buf, BLE_MAX_ADV_DATA_LEN); + uint8_t buf[BLE_MAX_SUPPORTED_ADV_DATA_LEN]; + size_t len = scanResults[ii].advertisingData().get(BleAdvertisingDataType::MANUFACTURER_SPECIFIC_DATA, buf, sizeof(buf)); Log.info("Beacon %d: rssi %d Advertising Data Len %u", ii, scanResults[ii].rssi(), len); if (len > 0) { Log.print("Advertising Data: "); diff --git a/wiring/inc/spark_wiring_ble.h b/wiring/inc/spark_wiring_ble.h index fdd34eacc7..923711447a 100644 --- a/wiring/inc/spark_wiring_ble.h +++ b/wiring/inc/spark_wiring_ble.h @@ -491,7 +491,6 @@ class BleAdvertisingData { static size_t locate(const uint8_t* buf, size_t len, BleAdvertisingDataType type, size_t* offset); Vector selfData_; - size_t maxAdvertisingDataLen_; }; diff --git a/wiring/src/spark_wiring_ble.cpp b/wiring/src/spark_wiring_ble.cpp index 9465d464d3..a83bf0f4e7 100644 --- a/wiring/src/spark_wiring_ble.cpp +++ b/wiring/src/spark_wiring_ble.cpp @@ -562,11 +562,6 @@ BleAdvertisingData::BleAdvertisingData() : selfData_() { uint8_t flag = BLE_SIG_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE; append(BleAdvertisingDataType::FLAGS, &flag, sizeof(uint8_t)); -#if HAL_PLATFORM_RTL872X - maxAdvertisingDataLen_ = BLE_MAX_ADV_DATA_LEN; -#else - maxAdvertisingDataLen_ = BLE_MAX_ADV_DATA_LEN_EXT; -#endif } BleAdvertisingData::BleAdvertisingData(const iBeacon& beacon) @@ -580,7 +575,7 @@ size_t BleAdvertisingData::set(const uint8_t* buf, size_t len) { return selfData_.size(); } selfData_.clear(); - len = std::min(len, (size_t)BLE_MAX_ADV_DATA_LEN_EXT); + len = std::min(len, (size_t)BLE_MAX_SUPPORTED_ADV_DATA_LEN); CHECK_TRUE(selfData_.append(buf, len), 0); return selfData_.size(); } @@ -592,7 +587,7 @@ size_t BleAdvertisingData::set(const iBeacon& beacon) { return selfData_.size(); } - CHECK_TRUE(selfData_.reserve(maxAdvertisingDataLen_), 0); + CHECK_TRUE(selfData_.reserve(BLE_MAX_SUPPORTED_ADV_DATA_LEN), 0); selfData_.append(0x02); selfData_.append(BLE_SIG_AD_TYPE_FLAGS); selfData_.append(BLE_SIG_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE); @@ -630,7 +625,7 @@ size_t BleAdvertisingData::append(BleAdvertisingDataType type, const uint8_t* bu size_t adsLen = locate(selfData_.data(), selfData_.size(), type, &offset); if (!force && adsLen > 0) { // Update the existing AD structure. - if ((selfData_.size() - adsLen + len + 2) <= maxAdvertisingDataLen_) { + if ((selfData_.size() - adsLen + len + 2) <= BLE_MAX_SUPPORTED_ADV_DATA_LEN) { // Firstly, remove the existing AD structure. selfData_.removeAt(offset, adsLen); // Secondly, Update the AD structure. @@ -643,7 +638,7 @@ size_t BleAdvertisingData::append(BleAdvertisingDataType type, const uint8_t* bu selfData_.insert(offset + 2, buf, len); } } - else if ((selfData_.size() + len + 2) <= maxAdvertisingDataLen_) { + else if ((selfData_.size() + len + 2) <= BLE_MAX_SUPPORTED_ADV_DATA_LEN) { // Append the AD structure at the and of advertising data. CHECK_TRUE(selfData_.reserve(selfData_.size() + len + 2), selfData_.size()); selfData_.append(len + 1); @@ -672,7 +667,7 @@ size_t BleAdvertisingData::appendAppearance(ble_sig_appearance_t appearance) { } size_t BleAdvertisingData::resize(size_t size) { - selfData_.resize(std::min(size, (size_t)maxAdvertisingDataLen_)); + selfData_.resize(std::min(size, (size_t)BLE_MAX_SUPPORTED_ADV_DATA_LEN)); return selfData_.size(); } @@ -733,7 +728,7 @@ size_t BleAdvertisingData::deviceName(char* buf, size_t len) const { String BleAdvertisingData::deviceName() const { String name; - char buf[maxAdvertisingDataLen_]; + char buf[BLE_MAX_SUPPORTED_ADV_DATA_LEN]; size_t len = deviceName(buf, sizeof(buf)); if (len > 0) { for (size_t i = 0; i < len; i++) { @@ -2256,7 +2251,7 @@ ssize_t BleLocalDevice::getAdvertisingData(BleAdvertisingData* advertisingData) advParams.size = sizeof(hal_ble_adv_params_t); hal_ble_gap_get_advertising_parameters(&advParams, nullptr); advertisingData->clear(); - CHECK_TRUE(advertisingData->resize((advParams.primary_phy == BLE_PHYS_CODED) ? BLE_MAX_ADV_DATA_LEN_EXT : BLE_MAX_ADV_DATA_LEN), SYSTEM_ERROR_NO_MEMORY); + CHECK_TRUE(advertisingData->resize((advParams.primary_phy == BLE_PHYS_CODED) ? BLE_MAX_ADV_DATA_LEN_EXT : BLE_MAX_ADV_DATA_LEN), SYSTEM_ERROR_NO_MEMORY);// TODO:? size_t len = CHECK(hal_ble_gap_get_advertising_data(advertisingData->data(), advertisingData->length(), nullptr)); advertisingData->resize(len); return len; @@ -2271,7 +2266,7 @@ ssize_t BleLocalDevice::getScanResponseData(BleAdvertisingData* scanResponse) co return SYSTEM_ERROR_INVALID_ARGUMENT; } scanResponse->clear(); - CHECK_TRUE(scanResponse->resize(BLE_MAX_ADV_DATA_LEN), SYSTEM_ERROR_NO_MEMORY); + CHECK_TRUE(scanResponse->resize(BLE_MAX_SUPPORTED_ADV_DATA_LEN), SYSTEM_ERROR_NO_MEMORY); size_t len = CHECK(hal_ble_gap_get_scan_response_data(scanResponse->data(), scanResponse->length(), nullptr)); scanResponse->resize(len); return len; @@ -2525,8 +2520,8 @@ class BleScanDelegator { size_t filterCustomDatalen; const uint8_t* filterCustomData = filter_.customData(&filterCustomDatalen); if (filterCustomData != nullptr && filterCustomDatalen > 0) { - size_t srLen = result.scanResponse().get(BleAdvertisingDataType::MANUFACTURER_SPECIFIC_DATA, nullptr, BLE_MAX_ADV_DATA_LEN); - size_t advLen = result.advertisingData().get(BleAdvertisingDataType::MANUFACTURER_SPECIFIC_DATA, nullptr, BLE_MAX_ADV_DATA_LEN_EXT); + size_t srLen = result.scanResponse().get(BleAdvertisingDataType::MANUFACTURER_SPECIFIC_DATA, nullptr, BLE_MAX_SUPPORTED_ADV_DATA_LEN); + size_t advLen = result.advertisingData().get(BleAdvertisingDataType::MANUFACTURER_SPECIFIC_DATA, nullptr, BLE_MAX_SUPPORTED_ADV_DATA_LEN); if (srLen != filterCustomDatalen && advLen != filterCustomDatalen) { LOG_DEBUG(TRACE, "Custom data mismatched."); return false; From 80d4dab08e5f994b7ac242a3a5a2da2e51f50304 Mon Sep 17 00:00:00 2001 From: Scott Brust Date: Wed, 5 Jun 2024 08:57:12 -0700 Subject: [PATCH 7/7] fixup --- hal/src/nRF52840/ble_hal_impl.h | 2 +- hal/src/rtl872x/ble_hal_impl.h | 2 +- wiring/src/spark_wiring_ble.cpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/hal/src/nRF52840/ble_hal_impl.h b/hal/src/nRF52840/ble_hal_impl.h index cb0414c3f8..cb4d52a02a 100644 --- a/hal/src/nRF52840/ble_hal_impl.h +++ b/hal/src/nRF52840/ble_hal_impl.h @@ -85,7 +85,7 @@ #define BLE_MAX_ADV_DATA_LEN_EXT BLE_GAP_SCAN_BUFFER_EXTENDED_MAX_SUPPORTED #define BLE_MAX_ADV_DATA_LEN_EXT_CONNECTABLE BLE_GAP_ADV_SET_DATA_SIZE_EXTENDED_CONNECTABLE_MAX_SUPPORTED -#define BLE_MAX_SUPPORTED_ADV_DATA_LEN BLE_MAX_ADV_DATA_LEN_EXT +#define BLE_MAX_SUPPORTED_ADV_DATA_LEN BLE_MAX_ADV_DATA_LEN_EXT /* Connection Parameters limits */ #define BLE_CONN_PARAMS_SLAVE_LATENCY_ERR 5 diff --git a/hal/src/rtl872x/ble_hal_impl.h b/hal/src/rtl872x/ble_hal_impl.h index 756d6d3e60..6e3c9f455f 100644 --- a/hal/src/rtl872x/ble_hal_impl.h +++ b/hal/src/rtl872x/ble_hal_impl.h @@ -81,7 +81,7 @@ /* Maximum length of advertising and scan response data */ #define BLE_MAX_ADV_DATA_LEN 31 -#define BLE_MAX_SUPPORTED_ADV_DATA_LEN BLE_MAX_ADV_DATA_LEN +#define BLE_MAX_SUPPORTED_ADV_DATA_LEN BLE_MAX_ADV_DATA_LEN /* Maximum length of the buffer to store scan report data */ #define BLE_MAX_SCAN_REPORT_BUF_LEN 255 /* Must support extended length for CODED_PHY scanning */ diff --git a/wiring/src/spark_wiring_ble.cpp b/wiring/src/spark_wiring_ble.cpp index a83bf0f4e7..e1bd812ac4 100644 --- a/wiring/src/spark_wiring_ble.cpp +++ b/wiring/src/spark_wiring_ble.cpp @@ -2251,7 +2251,7 @@ ssize_t BleLocalDevice::getAdvertisingData(BleAdvertisingData* advertisingData) advParams.size = sizeof(hal_ble_adv_params_t); hal_ble_gap_get_advertising_parameters(&advParams, nullptr); advertisingData->clear(); - CHECK_TRUE(advertisingData->resize((advParams.primary_phy == BLE_PHYS_CODED) ? BLE_MAX_ADV_DATA_LEN_EXT : BLE_MAX_ADV_DATA_LEN), SYSTEM_ERROR_NO_MEMORY);// TODO:? + CHECK_TRUE(advertisingData->resize((advParams.primary_phy == BLE_PHYS_CODED) ? BLE_MAX_ADV_DATA_LEN_EXT : BLE_MAX_ADV_DATA_LEN), SYSTEM_ERROR_NO_MEMORY); size_t len = CHECK(hal_ble_gap_get_advertising_data(advertisingData->data(), advertisingData->length(), nullptr)); advertisingData->resize(len); return len;