Skip to content

Commit 68b19d3

Browse files
authored
Merge pull request #15 from m5stack/fix-wifi-init-crash
fix wifi init crash with updated c6 firmware
2 parents 3376195 + 4b57c62 commit 68b19d3

2 files changed

Lines changed: 67 additions & 2 deletions

File tree

app/apps/app_startup_anim/app_startup_anim.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ using namespace mooncake;
1313
using namespace smooth_ui_toolkit;
1414
using namespace smooth_ui_toolkit::lvgl_cpp;
1515

16-
#define FIRMWARE_VERSION "V0.3"
16+
#define FIRMWARE_VERSION "V0.4"
1717

1818
AppStartupAnim::AppStartupAnim()
1919
{

platforms/tab5/main/hal/components/hal_wifi.cpp

Lines changed: 66 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@
1717
#include <esp_log.h>
1818
#include <nvs_flash.h>
1919
#include <esp_netif.h>
20+
#include <esp_wifi_default.h>
21+
#include <esp_wifi_netif.h>
22+
#include <esp_private/wifi.h>
2023
#include <esp_http_server.h>
2124

2225
#define TAG "wifi"
@@ -25,6 +28,68 @@
2528
#define WIFI_PASS ""
2629
#define MAX_STA_CONN 4
2730

31+
static bool s_wifi_ap_netif_started = false;
32+
33+
static void wifi_remote_ap_start_handler(void* arg, esp_event_base_t base, int32_t event_id, void* data)
34+
{
35+
auto* netif = static_cast<esp_netif_t*>(arg);
36+
if (s_wifi_ap_netif_started || esp_netif_is_netif_up(netif)) {
37+
ESP_LOGW(TAG, "ignore duplicate Wi-Fi AP start event");
38+
return;
39+
}
40+
41+
auto driver = static_cast<wifi_netif_driver_t>(esp_netif_get_io_driver(netif));
42+
uint8_t mac[6];
43+
esp_err_t ret = esp_wifi_get_if_mac(driver, mac);
44+
if (ret != ESP_OK) {
45+
ESP_LOGE(TAG, "esp_wifi_get_if_mac failed: %s", esp_err_to_name(ret));
46+
return;
47+
}
48+
49+
if (esp_wifi_is_if_ready_when_started(driver)) {
50+
ret = esp_wifi_register_if_rxcb(driver, esp_netif_receive, netif);
51+
if (ret != ESP_OK) {
52+
ESP_LOGE(TAG, "esp_wifi_register_if_rxcb failed: %s", esp_err_to_name(ret));
53+
return;
54+
}
55+
}
56+
57+
ret = esp_wifi_internal_reg_netstack_buf_cb(esp_netif_netstack_buf_ref, esp_netif_netstack_buf_free);
58+
if (ret != ESP_OK) {
59+
ESP_LOGE(TAG, "netstack cb register failed: %s", esp_err_to_name(ret));
60+
return;
61+
}
62+
63+
esp_netif_set_mac(netif, mac);
64+
esp_netif_action_start(netif, base, event_id, data);
65+
s_wifi_ap_netif_started = true;
66+
}
67+
68+
static void wifi_remote_ap_stop_handler(void* arg, esp_event_base_t base, int32_t event_id, void* data)
69+
{
70+
auto* netif = static_cast<esp_netif_t*>(arg);
71+
if (!s_wifi_ap_netif_started && !esp_netif_is_netif_up(netif)) {
72+
ESP_LOGW(TAG, "ignore duplicate Wi-Fi AP stop event");
73+
return;
74+
}
75+
76+
esp_netif_action_stop(netif, base, event_id, data);
77+
s_wifi_ap_netif_started = false;
78+
}
79+
80+
static esp_netif_t* create_wifi_remote_ap_netif()
81+
{
82+
esp_netif_config_t cfg = ESP_NETIF_DEFAULT_WIFI_AP();
83+
esp_netif_t* netif = esp_netif_new(&cfg);
84+
assert(netif);
85+
86+
ESP_ERROR_CHECK(esp_netif_attach_wifi_ap(netif));
87+
ESP_ERROR_CHECK(esp_event_handler_register(WIFI_EVENT, WIFI_EVENT_AP_START, wifi_remote_ap_start_handler, netif));
88+
ESP_ERROR_CHECK(esp_event_handler_register(WIFI_EVENT, WIFI_EVENT_AP_STOP, wifi_remote_ap_stop_handler, netif));
89+
90+
return netif;
91+
}
92+
2893
// HTTP 处理函数
2994
esp_err_t hello_get_handler(httpd_req_t* req)
3095
{
@@ -89,7 +154,7 @@ void wifi_init_softap()
89154
ESP_ERROR_CHECK(esp_netif_init());
90155
ESP_ERROR_CHECK(esp_event_loop_create_default());
91156

92-
esp_netif_create_default_wifi_ap();
157+
create_wifi_remote_ap_netif();
93158

94159
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
95160
ESP_ERROR_CHECK(esp_wifi_init(&cfg));

0 commit comments

Comments
 (0)