mirror of
https://github.com/espressif/esp-idf.git
synced 2024-10-05 20:47:46 -04:00
Merge branch 'feature/add_ci_for_esp_wifi_powersave_example' into 'master'
ci(wifi): add pytest case for wifi powersave example See merge request espressif/esp-idf!25227
This commit is contained in:
commit
6e9708a489
@ -79,10 +79,10 @@ esp_err_t sleep_sys_periph_tee_apm_retention_init(void)
|
|||||||
|
|
||||||
esp_err_t sleep_sys_periph_uart0_retention_init(void)
|
esp_err_t sleep_sys_periph_uart0_retention_init(void)
|
||||||
{
|
{
|
||||||
#define N_REGS_UART() (((UART_ID_REG(0) - REG_UART_BASE(0)) / 4) + 1)
|
#define N_REGS_UART() (((UART_ID_REG(0) - UART_INT_RAW_REG(0)) / 4) + 1)
|
||||||
|
|
||||||
const static sleep_retention_entries_config_t uart_regs_retention[] = {
|
const static sleep_retention_entries_config_t uart_regs_retention[] = {
|
||||||
[0] = { .config = REGDMA_LINK_CONTINUOUS_INIT(REGDMA_UART_LINK(0x00), REG_UART_BASE(0), REG_UART_BASE(0), N_REGS_UART(), 0, 0), .owner = ENTRY(0) | ENTRY(2) }, /* uart */
|
[0] = { .config = REGDMA_LINK_CONTINUOUS_INIT(REGDMA_UART_LINK(0x00), UART_INT_RAW_REG(0), UART_INT_RAW_REG(0), N_REGS_UART(), 0, 0), .owner = ENTRY(0) | ENTRY(2) }, /* uart */
|
||||||
/* Note: uart register should set update reg to make the configuration take effect */
|
/* Note: uart register should set update reg to make the configuration take effect */
|
||||||
[1] = { .config = REGDMA_LINK_WRITE_INIT (REGDMA_UART_LINK(0x01), UART_REG_UPDATE_REG(0), UART_REG_UPDATE, UART_REG_UPDATE_M, 1, 0), .owner = ENTRY(0) | ENTRY(2) },
|
[1] = { .config = REGDMA_LINK_WRITE_INIT (REGDMA_UART_LINK(0x01), UART_REG_UPDATE_REG(0), UART_REG_UPDATE, UART_REG_UPDATE_M, 1, 0), .owner = ENTRY(0) | ENTRY(2) },
|
||||||
[2] = { .config = REGDMA_LINK_WAIT_INIT (REGDMA_UART_LINK(0x02), UART_REG_UPDATE_REG(0), 0x0, UART_REG_UPDATE_M, 1, 0), .owner = ENTRY(0) | ENTRY(2) }
|
[2] = { .config = REGDMA_LINK_WAIT_INIT (REGDMA_UART_LINK(0x02), UART_REG_UPDATE_REG(0), 0x0, UART_REG_UPDATE_M, 1, 0), .owner = ENTRY(0) | ENTRY(2) }
|
||||||
|
@ -31,6 +31,10 @@ examples/wifi/itwt:
|
|||||||
disable:
|
disable:
|
||||||
- if: SOC_WIFI_HE_SUPPORT != 1
|
- if: SOC_WIFI_HE_SUPPORT != 1
|
||||||
|
|
||||||
|
examples/wifi/powersave:
|
||||||
|
disable_test:
|
||||||
|
- if: SOC_WIFI_SUPPORTED != 1
|
||||||
|
|
||||||
examples/wifi/wifi_aware:
|
examples/wifi/wifi_aware:
|
||||||
disable:
|
disable:
|
||||||
- if: SOC_WIFI_NAN_SUPPORT != 1
|
- if: SOC_WIFI_NAN_SUPPORT != 1
|
||||||
|
@ -1,2 +1,3 @@
|
|||||||
idf_component_register(SRCS "power_save.c"
|
idf_component_register(SRCS "power_save.c"
|
||||||
|
"get_ap_info.c"
|
||||||
INCLUDE_DIRS ".")
|
INCLUDE_DIRS ".")
|
||||||
|
@ -1,14 +1,23 @@
|
|||||||
menu "Example Configuration"
|
menu "Example Configuration"
|
||||||
|
|
||||||
|
config EXAMPLE_GET_AP_INFO_FROM_STDIN
|
||||||
|
bool "Get AP info from console"
|
||||||
|
default n
|
||||||
|
help
|
||||||
|
If enabled, the example will prompt the user to enter the SSID and Password of the AP to be connected
|
||||||
|
via the console.
|
||||||
|
|
||||||
config EXAMPLE_WIFI_SSID
|
config EXAMPLE_WIFI_SSID
|
||||||
string "WiFi SSID"
|
string "WiFi SSID"
|
||||||
default "myssid"
|
default "myssid"
|
||||||
|
depends on !EXAMPLE_GET_AP_INFO_FROM_STDIN
|
||||||
help
|
help
|
||||||
SSID (network name) for the example to connect to.
|
SSID (network name) for the example to connect to.
|
||||||
|
|
||||||
config EXAMPLE_WIFI_PASSWORD
|
config EXAMPLE_WIFI_PASSWORD
|
||||||
string "WiFi Password"
|
string "WiFi Password"
|
||||||
default "mypassword"
|
default "mypassword"
|
||||||
|
depends on !EXAMPLE_GET_AP_INFO_FROM_STDIN
|
||||||
help
|
help
|
||||||
WiFi password (WPA or WPA2) for the example to use.
|
WiFi password (WPA or WPA2) for the example to use.
|
||||||
|
|
||||||
|
68
examples/wifi/power_save/main/get_ap_info.c
Normal file
68
examples/wifi/power_save/main/get_ap_info.c
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
/*
|
||||||
|
* SPDX-FileCopyrightText: 2023 Espressif Systems (Shanghai) CO LTD
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Unlicense OR CC0-1.0
|
||||||
|
*/
|
||||||
|
#include <string.h>
|
||||||
|
#include "sdkconfig.h"
|
||||||
|
#include "esp_log.h"
|
||||||
|
#include "esp_vfs_dev.h"
|
||||||
|
#include "driver/uart.h"
|
||||||
|
|
||||||
|
#if CONFIG_EXAMPLE_GET_AP_INFO_FROM_STDIN
|
||||||
|
static const char *TAG = "power_save";
|
||||||
|
static char stdin_ssid[32];
|
||||||
|
static char stdin_password[64];
|
||||||
|
|
||||||
|
void get_ap_info_from_stdin(void)
|
||||||
|
{
|
||||||
|
// Initialize VFS & UART so we can use std::cout/cin
|
||||||
|
setvbuf(stdin, NULL, _IONBF, 0);
|
||||||
|
/* Install UART driver for interrupt-driven reads and writes */
|
||||||
|
ESP_ERROR_CHECK( uart_driver_install( (uart_port_t)CONFIG_ESP_CONSOLE_UART_NUM,
|
||||||
|
256, 0, 0, NULL, 0) );
|
||||||
|
|
||||||
|
/* Tell VFS to use UART driver */
|
||||||
|
esp_vfs_dev_uart_use_driver(CONFIG_ESP_CONSOLE_UART_NUM);
|
||||||
|
esp_vfs_dev_uart_port_set_rx_line_endings(CONFIG_ESP_CONSOLE_UART_NUM, ESP_LINE_ENDINGS_CR);
|
||||||
|
/* Move the caret to the beginning of the next line on '\n' */
|
||||||
|
esp_vfs_dev_uart_port_set_tx_line_endings(CONFIG_ESP_CONSOLE_UART_NUM, ESP_LINE_ENDINGS_CRLF);
|
||||||
|
|
||||||
|
ESP_LOGI(TAG, "Input SSID:");
|
||||||
|
|
||||||
|
if (fgets(stdin_ssid, 32, stdin) == NULL) {
|
||||||
|
ESP_LOGE(TAG, "Failed to get SSID");
|
||||||
|
} else {
|
||||||
|
stdin_ssid[strcspn(stdin_ssid, "\n")] = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
ESP_LOGI(TAG, "Input Password:");
|
||||||
|
if (fgets(stdin_password, 64, stdin) == NULL) {
|
||||||
|
ESP_LOGE(TAG, "Failed to get password");
|
||||||
|
} else {
|
||||||
|
stdin_password[strcspn(stdin_password, "\n")] = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Back to use non-blocking vfs console*/
|
||||||
|
esp_vfs_dev_uart_use_nonblocking(CONFIG_ESP_CONSOLE_UART_NUM);
|
||||||
|
uart_driver_delete(CONFIG_ESP_CONSOLE_UART_NUM);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
char *get_ap_ssid(void)
|
||||||
|
{
|
||||||
|
#if CONFIG_EXAMPLE_GET_AP_INFO_FROM_STDIN
|
||||||
|
return stdin_ssid;
|
||||||
|
#else
|
||||||
|
return CONFIG_EXAMPLE_WIFI_SSID;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
char *get_ap_password(void)
|
||||||
|
{
|
||||||
|
#if CONFIG_EXAMPLE_GET_AP_INFO_FROM_STDIN
|
||||||
|
return stdin_password;
|
||||||
|
#else
|
||||||
|
return CONFIG_EXAMPLE_WIFI_PASSWORD;
|
||||||
|
#endif
|
||||||
|
}
|
34
examples/wifi/power_save/main/get_ap_info.h
Normal file
34
examples/wifi/power_save/main/get_ap_info.h
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
/*
|
||||||
|
* SPDX-FileCopyrightText: 2023 Espressif Systems (Shanghai) CO LTD
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Unlicense OR CC0-1.0
|
||||||
|
*/
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#if CONFIG_EXAMPLE_GET_AP_INFO_FROM_STDIN
|
||||||
|
/**
|
||||||
|
* Initialize vfs console and prompt user input the AP info
|
||||||
|
*/
|
||||||
|
void get_ap_info_from_stdin(void);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the AP ssid from user input or configure
|
||||||
|
* @return The string of SSID
|
||||||
|
*/
|
||||||
|
char *get_ap_ssid(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the AP password from user input or configure
|
||||||
|
* @return The string of password
|
||||||
|
*/
|
||||||
|
char *get_ap_password(void);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
@ -12,6 +12,8 @@
|
|||||||
set a router or a AP using the same SSID&PASSWORD as configuration of this example.
|
set a router or a AP using the same SSID&PASSWORD as configuration of this example.
|
||||||
start esp32 and when it connected to AP it will enter power save mode
|
start esp32 and when it connected to AP it will enter power save mode
|
||||||
*/
|
*/
|
||||||
|
#include <string.h>
|
||||||
|
#include "sdkconfig.h"
|
||||||
#include "freertos/FreeRTOS.h"
|
#include "freertos/FreeRTOS.h"
|
||||||
#include "freertos/event_groups.h"
|
#include "freertos/event_groups.h"
|
||||||
#include "esp_wifi.h"
|
#include "esp_wifi.h"
|
||||||
@ -19,10 +21,7 @@
|
|||||||
#include "esp_event.h"
|
#include "esp_event.h"
|
||||||
#include "esp_pm.h"
|
#include "esp_pm.h"
|
||||||
#include "nvs_flash.h"
|
#include "nvs_flash.h"
|
||||||
|
#include "get_ap_info.h"
|
||||||
/*set the ssid and password via "idf.py menuconfig"*/
|
|
||||||
#define DEFAULT_SSID CONFIG_EXAMPLE_WIFI_SSID
|
|
||||||
#define DEFAULT_PWD CONFIG_EXAMPLE_WIFI_PASSWORD
|
|
||||||
|
|
||||||
#define DEFAULT_LISTEN_INTERVAL CONFIG_EXAMPLE_WIFI_LISTEN_INTERVAL
|
#define DEFAULT_LISTEN_INTERVAL CONFIG_EXAMPLE_WIFI_LISTEN_INTERVAL
|
||||||
#define DEFAULT_BEACON_TIMEOUT CONFIG_EXAMPLE_WIFI_BEACON_TIMEOUT
|
#define DEFAULT_BEACON_TIMEOUT CONFIG_EXAMPLE_WIFI_BEACON_TIMEOUT
|
||||||
@ -69,11 +68,15 @@ static void wifi_power_save(void)
|
|||||||
|
|
||||||
wifi_config_t wifi_config = {
|
wifi_config_t wifi_config = {
|
||||||
.sta = {
|
.sta = {
|
||||||
.ssid = DEFAULT_SSID,
|
|
||||||
.password = DEFAULT_PWD,
|
|
||||||
.listen_interval = DEFAULT_LISTEN_INTERVAL,
|
.listen_interval = DEFAULT_LISTEN_INTERVAL,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
strcpy((char *)wifi_config.sta.ssid, get_ap_ssid());
|
||||||
|
strcpy((char *)wifi_config.sta.password, get_ap_password());
|
||||||
|
|
||||||
|
ESP_LOGI(TAG, "Connecting AP: %s with password: %s", wifi_config.sta.ssid, wifi_config.sta.password);
|
||||||
|
|
||||||
ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA));
|
ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA));
|
||||||
ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, &wifi_config));
|
ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, &wifi_config));
|
||||||
ESP_ERROR_CHECK(esp_wifi_start());
|
ESP_ERROR_CHECK(esp_wifi_start());
|
||||||
@ -93,6 +96,10 @@ void app_main(void)
|
|||||||
}
|
}
|
||||||
ESP_ERROR_CHECK( ret );
|
ESP_ERROR_CHECK( ret );
|
||||||
|
|
||||||
|
#if CONFIG_EXAMPLE_GET_AP_INFO_FROM_STDIN
|
||||||
|
get_ap_info_from_stdin();
|
||||||
|
#endif
|
||||||
|
|
||||||
#if CONFIG_PM_ENABLE
|
#if CONFIG_PM_ENABLE
|
||||||
// Configure dynamic frequency scaling:
|
// Configure dynamic frequency scaling:
|
||||||
// maximum and minimum frequencies are set in sdkconfig,
|
// maximum and minimum frequencies are set in sdkconfig,
|
||||||
|
77
examples/wifi/power_save/pytest_wifi_power_save.py
Normal file
77
examples/wifi/power_save/pytest_wifi_power_save.py
Normal file
@ -0,0 +1,77 @@
|
|||||||
|
# SPDX-FileCopyrightText: 2021-2023 Espressif Systems (Shanghai) CO LTD
|
||||||
|
# SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
|
import logging
|
||||||
|
|
||||||
|
import pexpect
|
||||||
|
import pytest
|
||||||
|
from common_test_methods import get_env_config_variable
|
||||||
|
from pytest_embedded import Dut
|
||||||
|
|
||||||
|
bad_event_str = [
|
||||||
|
'bcn_timout',
|
||||||
|
'm f probe req l',
|
||||||
|
'abort() was called',
|
||||||
|
'Guru Meditation Error',
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
def _run_test(dut: Dut) -> None:
|
||||||
|
if dut.app.sdkconfig.get('EXAMPLE_GET_AP_INFO_FROM_STDIN') is True:
|
||||||
|
env_name = 'wifi_ap'
|
||||||
|
ap_ssid = get_env_config_variable(env_name, 'ap_ssid')
|
||||||
|
ap_password = get_env_config_variable(env_name, 'ap_password')
|
||||||
|
tag = 'power_save'
|
||||||
|
dut.expect(f'{tag}: Input SSID:', timeout=5)
|
||||||
|
dut.write(f'{ap_ssid}')
|
||||||
|
dut.expect(f'{tag}: Input Password:', timeout=5)
|
||||||
|
dut.write(f'{ap_password}')
|
||||||
|
else:
|
||||||
|
# for local test may config ssid/password from menuconfig
|
||||||
|
pass
|
||||||
|
|
||||||
|
try:
|
||||||
|
dut.expect(r'got ip: (\d+\.\d+\.\d+\.\d+)[^\d]', timeout=20)
|
||||||
|
log_after_got_ip = dut.expect(pexpect.TIMEOUT, timeout=10).decode()
|
||||||
|
if any(s in log_after_got_ip for s in bad_event_str):
|
||||||
|
logging.info('Abnormal connection log:')
|
||||||
|
logging.info('\n' + log_after_got_ip)
|
||||||
|
raise RuntimeError('Something abnormal happened after got ip')
|
||||||
|
except pexpect.exceptions.TIMEOUT:
|
||||||
|
raise RuntimeError('Failed to get ip in power save mode')
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.esp32
|
||||||
|
@pytest.mark.esp32c2
|
||||||
|
@pytest.mark.esp32s2
|
||||||
|
@pytest.mark.esp32c3
|
||||||
|
@pytest.mark.esp32s3
|
||||||
|
@pytest.mark.esp32c6
|
||||||
|
@pytest.mark.wifi_ap
|
||||||
|
def test_wifi_power_save(dut: Dut) -> None:
|
||||||
|
_run_test(dut)
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.esp32c6
|
||||||
|
@pytest.mark.wifi_ap
|
||||||
|
@pytest.mark.parametrize(
|
||||||
|
'config',
|
||||||
|
[
|
||||||
|
'pd_top',
|
||||||
|
],
|
||||||
|
indirect=True,
|
||||||
|
)
|
||||||
|
def test_wifi_power_save_pd_top(dut: Dut) -> None:
|
||||||
|
_run_test(dut)
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.esp32c2
|
||||||
|
@pytest.mark.wifi_ap
|
||||||
|
@pytest.mark.xtal_26mhz
|
||||||
|
@pytest.mark.parametrize(
|
||||||
|
'config, baud', [
|
||||||
|
('c2_xtal26m', '74880'),
|
||||||
|
], indirect=True
|
||||||
|
)
|
||||||
|
def test_wifi_power_save_esp32c2_26mhz(dut: Dut) -> None:
|
||||||
|
_run_test(dut)
|
3
examples/wifi/power_save/sdkconfig.ci.c2_xtal26m
Normal file
3
examples/wifi/power_save/sdkconfig.ci.c2_xtal26m
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
CONFIG_IDF_TARGET="esp32c2"
|
||||||
|
CONFIG_XTAL_FREQ_26=y
|
||||||
|
CONFIG_EXAMPLE_GET_AP_INFO_FROM_STDIN=y
|
1
examples/wifi/power_save/sdkconfig.ci.default
Normal file
1
examples/wifi/power_save/sdkconfig.ci.default
Normal file
@ -0,0 +1 @@
|
|||||||
|
CONFIG_EXAMPLE_GET_AP_INFO_FROM_STDIN=y
|
4
examples/wifi/power_save/sdkconfig.ci.pd_top
Normal file
4
examples/wifi/power_save/sdkconfig.ci.pd_top
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
CONFIG_EXAMPLE_GET_AP_INFO_FROM_STDIN=y
|
||||||
|
CONFIG_PM_POWER_DOWN_PERIPHERAL_IN_LIGHT_SLEEP=y
|
||||||
|
CONFIG_ESP_PHY_MAC_BB_PD=y
|
||||||
|
CONFIG_MBEDTLS_HARDWARE_AES=n
|
Loading…
x
Reference in New Issue
Block a user