Merge branch 'feat/add_ble_dtm_on_cert_test_v5.2' into 'release/v5.2'

feat(ble): add dtm test code to cert test example on ESP32-C6 (v5.2)

See merge request espressif/esp-idf!39832
This commit is contained in:
Island
2025-06-16 17:40:43 +08:00
8 changed files with 246 additions and 6 deletions

View File

@ -6,7 +6,6 @@
(See the README.md file in the upper level 'examples' directory for more information about examples.) (See the README.md file in the upper level 'examples' directory for more information about examples.)
This example shows how to use the Certification test APIS. This example shows how to use the Certification test APIS.
## How to use example ## How to use example
Before project configuration and build, be sure to set the correct chip target using `idf.py set-target <chip_name>`. Before project configuration and build, be sure to set the correct chip target using `idf.py set-target <chip_name>`.
@ -114,6 +113,9 @@ phy>
For BLE test, if you want to use `fcc_le_tx` and `rw_le_rx_per` legacy commands for tx/rx test, you need to enable `ESP_PHY_LEGACY_COMMANDS` in menuconfig, otherwise, the new format commands `esp_ble_tx` and `esp_ble_rx` are supported. For BLE test, if you want to use `fcc_le_tx` and `rw_le_rx_per` legacy commands for tx/rx test, you need to enable `ESP_PHY_LEGACY_COMMANDS` in menuconfig, otherwise, the new format commands `esp_ble_tx` and `esp_ble_rx` are supported.
## BLE DTM Test Function
The BLE DTM test function in this example currently supports only the ESP32-H2 and ESP32-C6 chips.
## Troubleshooting ## Troubleshooting
For any technical queries, please open an [issue](https://github.com/espressif/esp-idf/issues) on GitHub. We will get back to you soon. For any technical queries, please open an [issue](https://github.com/espressif/esp-idf/issues) on GitHub. We will get back to you soon.

View File

@ -1,3 +1,9 @@
idf_component_register(SRCS "cert_test.c" set(srcs "cert_test.c"
"cmd_phy.c" "cmd_phy.c")
if(CONFIG_COMMANDS_ENABLE_BLE_DTM_TEST)
list(APPEND srcs "cmd_ble_dtm.c")
endif()
idf_component_register(SRCS "${srcs}"
PRIV_REQUIRES bt
INCLUDE_DIRS ".") INCLUDE_DIRS ".")

View File

@ -11,4 +11,11 @@ menu "Example Configuration"
endchoice endchoice
config COMMANDS_ENABLE_BLE_DTM_TEST
bool "Enable BLE DTM Test Mode"
depends on IDF_TARGET_ESP32C6 || IDF_TARGET_ESP32H2
default n
help
Enable this option to support BLE Direct Test Mode (DTM) for RF testing and validation.
endmenu endmenu

View File

@ -1,5 +1,5 @@
/* /*
* SPDX-FileCopyrightText: 2023-2024 Espressif Systems (Shanghai) CO LTD * SPDX-FileCopyrightText: 2023-2025 Espressif Systems (Shanghai) CO LTD
* *
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
@ -12,6 +12,9 @@
#include "cmd_phy.h" #include "cmd_phy.h"
#include "esp_phy_cert_test.h" #include "esp_phy_cert_test.h"
#if CONFIG_COMMANDS_ENABLE_BLE_DTM_TEST
#include "cmd_ble_dtm.h"
#endif
void app_main(void) void app_main(void)
{ {
@ -20,7 +23,6 @@ void app_main(void)
esp_console_repl_t *repl = NULL; esp_console_repl_t *repl = NULL;
esp_console_repl_config_t repl_config = ESP_CONSOLE_REPL_CONFIG_DEFAULT(); esp_console_repl_config_t repl_config = ESP_CONSOLE_REPL_CONFIG_DEFAULT();
repl_config.prompt = "phy>"; repl_config.prompt = "phy>";
#if CONFIG_ESP_CONSOLE_UART #if CONFIG_ESP_CONSOLE_UART
esp_console_dev_uart_config_t uart_config = ESP_CONSOLE_DEV_UART_CONFIG_DEFAULT(); esp_console_dev_uart_config_t uart_config = ESP_CONSOLE_DEV_UART_CONFIG_DEFAULT();
ESP_ERROR_CHECK(esp_console_new_repl_uart(&uart_config, &repl_config, &repl)); ESP_ERROR_CHECK(esp_console_new_repl_uart(&uart_config, &repl_config, &repl));
@ -46,7 +48,9 @@ void app_main(void)
esp_phy_rftest_config(1); esp_phy_rftest_config(1);
esp_phy_rftest_init(); esp_phy_rftest_init();
#endif #endif
#if CONFIG_COMMANDS_ENABLE_BLE_DTM_TEST
dtm_configuration_command_register();
#endif
int help_index = 1; int help_index = 1;
printf("\n ==================================================\n"); printf("\n ==================================================\n");
printf(" | RF certification test |\n"); printf(" | RF certification test |\n");

View File

@ -0,0 +1,189 @@
/*
* SPDX-FileCopyrightText: 2024-2025 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Unlicense OR CC0-1.0
*/
#include "esp_log.h"
#include "esp_bt.h"
#include "esp_console.h"
#include "argtable3/argtable3.h"
#include "esp_hci_driver.h"
#define PROMPT_STR CONFIG_IDF_TARGET
static struct {
struct arg_int *cmd_params;
struct arg_end *end;
} dtm_set_tx_power_cmd_args;
static struct {
struct arg_int *tx_pin;
struct arg_int *rx_pin;
struct arg_end *end;
} dtm_reconfig_uart_cmd_args;
static struct {
struct arg_int *cmd_params;
struct arg_end *end;
} dtm_enable_cmd_args;
static int dtm_set_ble_tx_power_command(int argc, char **argv)
{
esp_err_t ret = ESP_OK;
int nerrors = arg_parse(argc, argv, (void **) &dtm_set_tx_power_cmd_args);
if (nerrors != 0) {
arg_print_errors(stderr, dtm_set_tx_power_cmd_args.end, argv[0]);
return 1;
}
if (esp_bt_controller_get_status() != ESP_BT_CONTROLLER_STATUS_ENABLED) {
esp_rom_printf("\nPlease enable BLE DTM mode first by using the command enable_ble_dtm -e 1 before sending this command.\n");
return 2;
}
ESP_LOGI(__func__, "Set tx power level '%d'", dtm_set_tx_power_cmd_args.cmd_params->ival[0]);
if (dtm_set_tx_power_cmd_args.cmd_params->ival[0] > 15) {
return 3;
}
ret = esp_ble_tx_power_set_enhanced(ESP_BLE_ENHANCED_PWR_TYPE_DEFAULT, 0, dtm_set_tx_power_cmd_args.cmd_params->ival[0]);
if (ret != ESP_OK) {
return 4;
}
return 0;
}
static int dtm_get_ble_tx_power_command(int argc, char **argv)
{
esp_power_level_t power_level = 0xFF;
if (esp_bt_controller_get_status() != ESP_BT_CONTROLLER_STATUS_ENABLED) {
esp_rom_printf("\nPlease enable BLE DTM mode first by using the command enable_ble_dtm -e 1 before sending this command.\n");
return 2;
}
power_level = esp_ble_tx_power_get_enhanced(ESP_BLE_ENHANCED_PWR_TYPE_DEFAULT, 0);
esp_rom_printf("\nCurrent BLE TX power is %d level\n", power_level);
return 0;
}
static int dtm_reconfig_uart_pins_command(int argc, char **argv)
{
int nerrors = arg_parse(argc, argv, (void **) &dtm_reconfig_uart_cmd_args);
if (nerrors != 0) {
arg_print_errors(stderr, dtm_reconfig_uart_cmd_args.end, argv[0]);
return 1;
}
if (esp_bt_controller_get_status() != ESP_BT_CONTROLLER_STATUS_ENABLED) {
esp_rom_printf("\nPlease enable BLE DTM mode first by using the command enable_ble_dtm -e 1 before sending this command.\n");
return 2;
}
ESP_LOGI(__func__, "reconfig tx:'%d', rx: '%d'",
dtm_reconfig_uart_cmd_args.tx_pin->ival[0], dtm_reconfig_uart_cmd_args.rx_pin->ival[0]);
hci_uart_reconfig_pin(dtm_reconfig_uart_cmd_args.tx_pin->ival[0],
dtm_reconfig_uart_cmd_args.rx_pin->ival[0], -1, -1);
return 0;
}
static int dtm_test_enable_command(int argc, char **argv)
{
int dtm_enable = 0;
esp_bt_controller_config_t config_opts = BT_CONTROLLER_INIT_CONFIG_DEFAULT();
int nerrors = arg_parse(argc, argv, (void **) &dtm_enable_cmd_args);
if (nerrors != 0) {
arg_print_errors(stderr, dtm_enable_cmd_args.end, argv[0]);
return 1;
}
dtm_enable = dtm_enable_cmd_args.cmd_params->ival[0];
ESP_LOGI(__func__, "Enable DTM Test '%d'", dtm_enable);
if (dtm_enable > 2) {
return 2;
}
if (dtm_enable) {
if (esp_bt_controller_get_status() == ESP_BT_CONTROLLER_STATUS_IDLE) {
/* Initialize Bluetooth Controller parameters. */
ESP_ERROR_CHECK(esp_bt_controller_init(&config_opts));
/* Enable the task stack of the Bluetooth Controller. */
ESP_ERROR_CHECK(esp_bt_controller_enable(ESP_BT_MODE_BLE));
}
} else {
if (esp_bt_controller_get_status() == ESP_BT_CONTROLLER_STATUS_ENABLED) {
ESP_ERROR_CHECK(esp_bt_controller_disable());
ESP_ERROR_CHECK(esp_bt_controller_deinit());
}
}
return 0;
}
esp_err_t esp_console_register_set_ble_tx_power_command(void)
{
dtm_set_tx_power_cmd_args.cmd_params = arg_int1("i", "index", "<index>","tx power level index");
dtm_set_tx_power_cmd_args.end = arg_end(1);
esp_console_cmd_t command = {
.command = "set_ble_tx_power",
.help = "Set ble tx power during DTM",
.func = &dtm_set_ble_tx_power_command,
.argtable = &dtm_set_tx_power_cmd_args
};
return esp_console_cmd_register(&command);
}
esp_err_t esp_console_register_get_ble_tx_power_command(void)
{
esp_console_cmd_t command = {
.command = "get_ble_tx_power",
.help = "Get ble tx power during DTM",
.func = &dtm_get_ble_tx_power_command,
};
return esp_console_cmd_register(&command);
}
esp_err_t esp_console_register_reconfig_dtm_pins_command(void)
{
dtm_reconfig_uart_cmd_args.tx_pin = arg_int1("t", "tx", "<tx_pin>","tx pin index");
dtm_reconfig_uart_cmd_args.rx_pin = arg_int1("r", "rx", "<rx_pin>","rx pin index");
dtm_reconfig_uart_cmd_args.end = arg_end(2);
esp_console_cmd_t command = {
.command = "reconfig_dtm_uart_pin",
.help = "Reconfig dtm uart pins during DTM",
.func = &dtm_reconfig_uart_pins_command,
.argtable = &dtm_reconfig_uart_cmd_args
};
return esp_console_cmd_register(&command);
}
esp_err_t esp_console_register_enable_ble_dtm_command(void)
{
dtm_enable_cmd_args.cmd_params = arg_int1("e", "enable", "<enable>","enable/disable ble dtm test");
dtm_enable_cmd_args.end = arg_end(1);
esp_console_cmd_t command = {
.command = "enable_ble_dtm",
.help = "Enable BLE DTM Test",
.func = &dtm_test_enable_command,
.argtable = &dtm_enable_cmd_args
};
return esp_console_cmd_register(&command);
}
esp_err_t dtm_configuration_command_register(void)
{
esp_console_register_set_ble_tx_power_command();
esp_console_register_get_ble_tx_power_command();
esp_console_register_reconfig_dtm_pins_command();
esp_console_register_enable_ble_dtm_command();
return ESP_OK;
}

View File

@ -0,0 +1,13 @@
/*
* SPDX-FileCopyrightText: 2024-2025 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Unlicense OR CC0-1.0
*/
#ifndef __CMD_BLE_DTM_H__
#define __CMD_BLE_DTM_H__
#include <stdint.h>
#include <stdbool.h>
#include "esp_err.h"
esp_err_t dtm_configuration_command_register(void);
#endif

View File

@ -0,0 +1,10 @@
#
# ESP32C6-specific
#
CONFIG_COMMANDS_ENABLE_BLE_DTM_TEST=y
CONFIG_BT_CONTROLLER_ONLY=y
CONFIG_BT_LE_HCI_INTERFACE_USE_UART=y
CONFIG_BT_LE_HCI_UART_TX_PIN=8
CONFIG_BT_LE_HCI_UART_RX_PIN=9
CONFIG_BT_LE_HCI_UART_BAUD=115200

View File

@ -0,0 +1,9 @@
#
# ESP32C6-specific
#
CONFIG_COMMANDS_ENABLE_BLE_DTM_TEST=y
CONFIG_BT_CONTROLLER_ONLY=y
CONFIG_BT_LE_HCI_INTERFACE_USE_UART=y
CONFIG_BT_LE_HCI_UART_TX_PIN=8
CONFIG_BT_LE_HCI_UART_RX_PIN=9
CONFIG_BT_LE_HCI_UART_BAUD=115200