mirror of
https://github.com/espressif/esp-idf.git
synced 2026-10-02 03:00:34 +03:00
feat(ble_log): report build, lib and chip versions in a version info frame
Replace the 2-byte BLE Log info record with a 58-byte version info frame (BLE_LOG_VERSION 5 -> 6; the abandoned branch that claimed the version-6 slot frees it, so the overall bump stays 5 -> 6): - idf build commit (12 bytes), injected at build time by register_ble_log_idf_commit() next to the other register_* helpers; the git probe is only trusted when the IDF tree itself is a repo/worktree, since rev-parse walks up parent directories - controller, btdm_common, BLE Mesh and BLE Audio lib commits (10 bytes each, zero-padded), every getter guarded by the exact condition that links its lib, so configs without the lib leave the field zero (no link errors) - chip model and revision from esp_chip_info() at runtime Lib strings are copied NUL-safely instead of assuming a fixed hash length; the mesh commit is the substring after the last space of bt_mesh_v11_commit_str. Frame layout is pinned by a static assert. Verified on target: esp32, esp32c3, esp32c5 and esp32h4 boards (the h4 run covers controller + btdm_common + mesh in one build); the audio-enabled build is blocked by pre-existing esp_ble_audio compile errors on this base (audio symbol verified with nm instead).
This commit is contained in:
@@ -119,6 +119,7 @@ if(CONFIG_BT_ENABLED)
|
|||||||
target_compile_options(${COMPONENT_LIB} PRIVATE -Wno-implicit-fallthrough -Wno-unused-const-variable)
|
target_compile_options(${COMPONENT_LIB} PRIVATE -Wno-implicit-fallthrough -Wno-unused-const-variable)
|
||||||
target_compile_options(${COMPONENT_LIB} PRIVATE "-Wno-format")
|
target_compile_options(${COMPONENT_LIB} PRIVATE "-Wno-format")
|
||||||
|
|
||||||
|
register_ble_log_idf_commit()
|
||||||
register_bt_ctrl_libs()
|
register_bt_ctrl_libs()
|
||||||
set_bluedroid_host_compile_flags()
|
set_bluedroid_host_compile_flags()
|
||||||
set_nimble_host_compile_flags()
|
set_nimble_host_compile_flags()
|
||||||
|
|||||||
@@ -66,6 +66,35 @@ function(wrap_uart_log_tx_interface)
|
|||||||
endif()
|
endif()
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
|
# Inject the ESP-IDF build commit into the bt component as a private compile
|
||||||
|
# definition (BLE_LOG_IDF_COMMIT), reported later in the BLE Log version info
|
||||||
|
# frame. Does nothing when the commit cannot be determined.
|
||||||
|
function(register_ble_log_idf_commit)
|
||||||
|
idf_build_get_property(idf_path IDF_PATH)
|
||||||
|
# "git rev-parse" walks up parent dirs; only trust it when the IDF tree
|
||||||
|
# itself is a repo/worktree. Release trees have no .git and must leave
|
||||||
|
# BLE_LOG_IDF_COMMIT undefined instead of picking up an enclosing repo.
|
||||||
|
if(NOT EXISTS "${idf_path}/.git")
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
execute_process(
|
||||||
|
COMMAND "${GIT_EXECUTABLE}" rev-parse HEAD
|
||||||
|
WORKING_DIRECTORY "${idf_path}"
|
||||||
|
RESULT_VARIABLE ble_log_git_result
|
||||||
|
OUTPUT_VARIABLE ble_log_idf_commit
|
||||||
|
OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||||
|
ERROR_QUIET
|
||||||
|
)
|
||||||
|
string(LENGTH "${ble_log_idf_commit}" ble_log_idf_commit_len)
|
||||||
|
# Take the first 12 chars of the full hash; --short=N may return a longer
|
||||||
|
# ambiguous abbreviation, so never rely on abbreviated output
|
||||||
|
if(ble_log_git_result EQUAL 0 AND ble_log_idf_commit_len EQUAL 40)
|
||||||
|
string(SUBSTRING "${ble_log_idf_commit}" 0 12 ble_log_idf_commit)
|
||||||
|
target_compile_definitions(${COMPONENT_LIB} PRIVATE
|
||||||
|
"BLE_LOG_IDF_COMMIT=\"${ble_log_idf_commit}\"")
|
||||||
|
endif()
|
||||||
|
endfunction()
|
||||||
|
|
||||||
set(bt_common_srcs "" PARENT_SCOPE)
|
set(bt_common_srcs "" PARENT_SCOPE)
|
||||||
set(bt_common_include_dirs "" PARENT_SCOPE)
|
set(bt_common_include_dirs "" PARENT_SCOPE)
|
||||||
set(bt_common_priv_include_dirs "" PARENT_SCOPE)
|
set(bt_common_priv_include_dirs "" PARENT_SCOPE)
|
||||||
|
|||||||
@@ -14,10 +14,39 @@
|
|||||||
#include "ble_log_lbm.h"
|
#include "ble_log_lbm.h"
|
||||||
|
|
||||||
#include "esp_log.h"
|
#include "esp_log.h"
|
||||||
|
#include "esp_chip_info.h"
|
||||||
|
|
||||||
/* MACRO */
|
/* MACRO */
|
||||||
#define TAG "ble_log_rt"
|
#define TAG "ble_log_rt"
|
||||||
|
|
||||||
|
#if CONFIG_BT_CONTROLLER_ENABLED
|
||||||
|
#if CONFIG_IDF_TARGET_ESP32 || CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32S3
|
||||||
|
extern const char *btdm_controller_get_compile_version(void);
|
||||||
|
#define BLE_LOG_CONTROLLER_GET_COMMIT() btdm_controller_get_compile_version()
|
||||||
|
#elif !CONFIG_BT_DUAL_MODE_ARCH || CONFIG_BT_CTRL_BLE_ENABLE
|
||||||
|
/* BR/EDR-only dual-mode builds do not link the BLE controller lib */
|
||||||
|
extern char *ble_controller_get_compile_version(void);
|
||||||
|
#define BLE_LOG_CONTROLLER_GET_COMMIT() ble_controller_get_compile_version()
|
||||||
|
#endif
|
||||||
|
#if CONFIG_BT_DUAL_MODE_ARCH
|
||||||
|
/* BTDM common lib (dual-mode arch only) */
|
||||||
|
extern const char *r_btdm_get_compile_version(void);
|
||||||
|
#define BLE_LOG_BTDM_COMMON_GET_COMMIT() r_btdm_get_compile_version()
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if CONFIG_BLE_MESH && CONFIG_BLE_MESH_V11_SUPPORT
|
||||||
|
/* "Bluetooth Mesh v1.1 commit: <hash>" */
|
||||||
|
extern const char bt_mesh_v11_commit_str[];
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if CONFIG_BT_AUDIO && CONFIG_SOC_BLE_AUDIO_SUPPORTED
|
||||||
|
extern const char *lib_audio_commit_get(void);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
_Static_assert(sizeof(ble_log_version_info_t) == 58,
|
||||||
|
"Unexpected BLE Log version info frame size");
|
||||||
|
|
||||||
/* VARIABLE */
|
/* VARIABLE */
|
||||||
BLE_LOG_STATIC BLE_LOG_DRAM_ATTR uint32_t rt_inited = 0;
|
BLE_LOG_STATIC BLE_LOG_DRAM_ATTR uint32_t rt_inited = 0;
|
||||||
BLE_LOG_STATIC BLE_LOG_DRAM_ATTR volatile uint32_t rt_ref_count = 0;
|
BLE_LOG_STATIC BLE_LOG_DRAM_ATTR volatile uint32_t rt_ref_count = 0;
|
||||||
@@ -35,6 +64,12 @@ BLE_LOG_STATIC void ble_log_rt_ts_trigger(void *arg);
|
|||||||
#endif /* CONFIG_BLE_LOG_TS_ENABLED */
|
#endif /* CONFIG_BLE_LOG_TS_ENABLED */
|
||||||
|
|
||||||
/* PRIVATE FUNCTION */
|
/* PRIVATE FUNCTION */
|
||||||
|
/* Copies a NUL-terminated commit string into a fixed-width zero-padded field */
|
||||||
|
BLE_LOG_STATIC void ble_log_commit_copy(uint8_t *dst, const char *src, size_t len)
|
||||||
|
{
|
||||||
|
BLE_LOG_MEMCPY(dst, src, strnlen(src, len));
|
||||||
|
}
|
||||||
|
|
||||||
BLE_LOG_STATIC void ble_log_rt_task(void *pvParameters)
|
BLE_LOG_STATIC void ble_log_rt_task(void *pvParameters)
|
||||||
{
|
{
|
||||||
(void)pvParameters;
|
(void)pvParameters;
|
||||||
@@ -56,12 +91,42 @@ BLE_LOG_STATIC void ble_log_rt_task(void *pvParameters)
|
|||||||
}
|
}
|
||||||
last_hook_os_ts = curr_os_ts;
|
last_hook_os_ts = curr_os_ts;
|
||||||
|
|
||||||
/* Write BLE Log info log */
|
/* Write version info: BLE Log version, idf commit (build-time),
|
||||||
ble_log_info_t ble_log_info = {
|
* linked-in BLE lib commits, chip model/revision (efuse, runtime-only).
|
||||||
.int_src_code = BLE_LOG_INT_SRC_INFO,
|
* Libs absent from the build leave their fields zero. */
|
||||||
|
ble_log_version_info_t version_info = {
|
||||||
|
.int_src_code = BLE_LOG_INT_SRC_VERSION_INFO,
|
||||||
.version = BLE_LOG_VERSION,
|
.version = BLE_LOG_VERSION,
|
||||||
};
|
};
|
||||||
ble_log_write_hex(BLE_LOG_SRC_INTERNAL, (const uint8_t *)&ble_log_info, sizeof(ble_log_info_t));
|
#ifdef BLE_LOG_IDF_COMMIT
|
||||||
|
BLE_LOG_MEMCPY(version_info.idf_commit, BLE_LOG_IDF_COMMIT, BLE_LOG_IDF_COMMIT_LEN);
|
||||||
|
#endif
|
||||||
|
#if CONFIG_BT_CONTROLLER_ENABLED && defined(BLE_LOG_CONTROLLER_GET_COMMIT)
|
||||||
|
ble_log_commit_copy(version_info.controller_commit, BLE_LOG_CONTROLLER_GET_COMMIT(),
|
||||||
|
BLE_LOG_LIB_COMMIT_LEN);
|
||||||
|
#endif
|
||||||
|
#if CONFIG_BT_CONTROLLER_ENABLED && defined(BLE_LOG_BTDM_COMMON_GET_COMMIT)
|
||||||
|
ble_log_commit_copy(version_info.btdm_common_commit, BLE_LOG_BTDM_COMMON_GET_COMMIT(),
|
||||||
|
BLE_LOG_LIB_COMMIT_LEN);
|
||||||
|
#endif
|
||||||
|
#if CONFIG_BLE_MESH && CONFIG_BLE_MESH_V11_SUPPORT
|
||||||
|
/* The hash is the substring after the last space of the lib string */
|
||||||
|
const char *mesh_commit = strrchr(bt_mesh_v11_commit_str, ' ');
|
||||||
|
if (mesh_commit) {
|
||||||
|
ble_log_commit_copy(version_info.mesh_commit, mesh_commit + 1,
|
||||||
|
BLE_LOG_LIB_COMMIT_LEN);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#if CONFIG_BT_AUDIO && CONFIG_SOC_BLE_AUDIO_SUPPORTED
|
||||||
|
ble_log_commit_copy(version_info.audio_commit, lib_audio_commit_get(),
|
||||||
|
BLE_LOG_LIB_COMMIT_LEN);
|
||||||
|
#endif
|
||||||
|
esp_chip_info_t chip_info;
|
||||||
|
esp_chip_info(&chip_info);
|
||||||
|
version_info.chip_model = (uint16_t)chip_info.model;
|
||||||
|
version_info.chip_revision = chip_info.revision;
|
||||||
|
ble_log_write_hex(BLE_LOG_SRC_INTERNAL, (const uint8_t *)&version_info,
|
||||||
|
sizeof(version_info));
|
||||||
|
|
||||||
ble_log_write_enh_stat();
|
ble_log_write_enh_stat();
|
||||||
ble_log_write_buf_util();
|
ble_log_write_buf_util();
|
||||||
|
|||||||
@@ -91,7 +91,10 @@ void ble_log_cas_release(volatile bool *cas_lock)
|
|||||||
__atomic_store_n(cas_lock, false, __ATOMIC_RELEASE);
|
__atomic_store_n(cas_lock, false, __ATOMIC_RELEASE);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define BLE_LOG_VERSION (5)
|
#define BLE_LOG_VERSION (6)
|
||||||
|
#define BLE_LOG_IDF_COMMIT_LEN (12)
|
||||||
|
/* Lib commit hashes are at most 10 hex chars; zero-padded when shorter */
|
||||||
|
#define BLE_LOG_LIB_COMMIT_LEN (10)
|
||||||
|
|
||||||
/* TYPEDEF */
|
/* TYPEDEF */
|
||||||
typedef enum {
|
typedef enum {
|
||||||
@@ -102,6 +105,7 @@ typedef enum {
|
|||||||
BLE_LOG_INT_SRC_FLUSH,
|
BLE_LOG_INT_SRC_FLUSH,
|
||||||
BLE_LOG_INT_SRC_BUF_UTIL,
|
BLE_LOG_INT_SRC_BUF_UTIL,
|
||||||
BLE_LOG_INT_SRC_FINAL_STAT,
|
BLE_LOG_INT_SRC_FINAL_STAT,
|
||||||
|
BLE_LOG_INT_SRC_VERSION_INFO,
|
||||||
BLE_LOG_INT_SRC_MAX,
|
BLE_LOG_INT_SRC_MAX,
|
||||||
} ble_log_int_src_t;
|
} ble_log_int_src_t;
|
||||||
|
|
||||||
@@ -110,6 +114,18 @@ typedef struct {
|
|||||||
uint8_t version;
|
uint8_t version;
|
||||||
} __attribute__((packed)) ble_log_info_t;
|
} __attribute__((packed)) ble_log_info_t;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint8_t int_src_code;
|
||||||
|
uint8_t version;
|
||||||
|
uint8_t idf_commit[BLE_LOG_IDF_COMMIT_LEN];
|
||||||
|
uint8_t controller_commit[BLE_LOG_LIB_COMMIT_LEN];
|
||||||
|
uint8_t btdm_common_commit[BLE_LOG_LIB_COMMIT_LEN];
|
||||||
|
uint8_t mesh_commit[BLE_LOG_LIB_COMMIT_LEN];
|
||||||
|
uint8_t audio_commit[BLE_LOG_LIB_COMMIT_LEN];
|
||||||
|
uint16_t chip_model;
|
||||||
|
uint16_t chip_revision;
|
||||||
|
} __attribute__((packed)) ble_log_version_info_t;
|
||||||
|
|
||||||
/* INTERFACE */
|
/* INTERFACE */
|
||||||
uint32_t ble_log_fast_checksum(const uint8_t *data, size_t len);
|
uint32_t ble_log_fast_checksum(const uint8_t *data, size_t len);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user