Skip to content

Commit 12a0cc2

Browse files
authored
feat(p4): Add method to set the pins for SDIO to WiFi chip espressif#11513
1 parent 0ffab9d commit 12a0cc2

File tree

1 file changed

+113
-33
lines changed

1 file changed

+113
-33
lines changed

libraries/WiFi/src/WiFiGeneric.cpp

Lines changed: 113 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -246,19 +246,67 @@ extern "C" {
246246
extern esp_err_t esp_hosted_init();
247247
extern esp_err_t esp_hosted_deinit();
248248
};
249+
typedef struct {
250+
uint8_t pin_clk;
251+
uint8_t pin_cmd;
252+
uint8_t pin_d0;
253+
uint8_t pin_d1;
254+
uint8_t pin_d2;
255+
uint8_t pin_d3;
256+
uint8_t pin_reset;
257+
} sdio_pin_config_t;
258+
249259
static bool hosted_initialized = false;
260+
static sdio_pin_config_t sdio_pin_config = {
261+
#ifdef BOARD_HAS_SDIO_ESP_HOSTED
262+
.pin_clk = BOARD_SDIO_ESP_HOSTED_CLK,
263+
.pin_cmd = BOARD_SDIO_ESP_HOSTED_CMD,
264+
.pin_d0 = BOARD_SDIO_ESP_HOSTED_D0,
265+
.pin_d1 = BOARD_SDIO_ESP_HOSTED_D1,
266+
.pin_d2 = BOARD_SDIO_ESP_HOSTED_D2,
267+
.pin_d3 = BOARD_SDIO_ESP_HOSTED_D3,
268+
.pin_reset = BOARD_SDIO_ESP_HOSTED_RESET
269+
#else
270+
.pin_clk = CONFIG_ESP_SDIO_PIN_CLK,
271+
.pin_cmd = CONFIG_ESP_SDIO_PIN_CMD,
272+
.pin_d0 = CONFIG_ESP_SDIO_PIN_D0,
273+
.pin_d1 = CONFIG_ESP_SDIO_PIN_D1,
274+
.pin_d2 = CONFIG_ESP_SDIO_PIN_D2,
275+
.pin_d3 = CONFIG_ESP_SDIO_PIN_D3,
276+
.pin_reset = CONFIG_ESP_SDIO_GPIO_RESET_SLAVE
277+
#endif
278+
};
279+
280+
bool WiFiGenericClass::setPins(int8_t clk, int8_t cmd, int8_t d0, int8_t d1, int8_t d2, int8_t d3, int8_t rst) {
281+
if (clk < 0 || cmd < 0 || d0 < 0 || d1 < 0 || d2 < 0 || d3 < 0 || rst < 0) {
282+
log_e("All SDIO pins must be defined");
283+
return false;
284+
}
285+
if (hosted_initialized) {
286+
log_e("SDIO pins must be set before WiFi is initialized");
287+
return false;
288+
}
289+
sdio_pin_config.pin_clk = clk;
290+
sdio_pin_config.pin_cmd = cmd;
291+
sdio_pin_config.pin_d0 = d0;
292+
sdio_pin_config.pin_d1 = d1;
293+
sdio_pin_config.pin_d2 = d2;
294+
sdio_pin_config.pin_d3 = d3;
295+
sdio_pin_config.pin_reset = rst;
296+
return true;
297+
}
250298

251299
static bool wifiHostedInit() {
252300
if (!hosted_initialized) {
253301
hosted_initialized = true;
254302
struct esp_hosted_sdio_config conf = INIT_DEFAULT_HOST_SDIO_CONFIG();
255-
conf.pin_clk.pin = CONFIG_ESP_SDIO_PIN_CLK;
256-
conf.pin_cmd.pin = CONFIG_ESP_SDIO_PIN_CMD;
257-
conf.pin_d0.pin = CONFIG_ESP_SDIO_PIN_D0;
258-
conf.pin_d1.pin = CONFIG_ESP_SDIO_PIN_D1;
259-
conf.pin_d2.pin = CONFIG_ESP_SDIO_PIN_D2;
260-
conf.pin_d3.pin = CONFIG_ESP_SDIO_PIN_D3;
261-
//conf.pin_rst.pin = CONFIG_ESP_SDIO_GPIO_RESET_SLAVE;
303+
conf.pin_clk.pin = sdio_pin_config.pin_clk;
304+
conf.pin_cmd.pin = sdio_pin_config.pin_cmd;
305+
conf.pin_d0.pin = sdio_pin_config.pin_d0;
306+
conf.pin_d1.pin = sdio_pin_config.pin_d1;
307+
conf.pin_d2.pin = sdio_pin_config.pin_d2;
308+
conf.pin_d3.pin = sdio_pin_config.pin_d3;
309+
conf.pin_reset.pin = sdio_pin_config.pin_reset;
262310
// esp_hosted_sdio_set_config() will fail on second attempt but here temporarily to not cause exception on reinit
263311
if (esp_hosted_sdio_set_config(&conf) != ESP_OK || esp_hosted_init() != ESP_OK) {
264312
log_e("esp_hosted_init failed!");
@@ -269,13 +317,13 @@ static bool wifiHostedInit() {
269317
}
270318
// Attach pins to PeriMan here
271319
// Slave chip model is CONFIG_IDF_SLAVE_TARGET
272-
// CONFIG_ESP_SDIO_PIN_CMD
273-
// CONFIG_ESP_SDIO_PIN_CLK
274-
// CONFIG_ESP_SDIO_PIN_D0
275-
// CONFIG_ESP_SDIO_PIN_D1
276-
// CONFIG_ESP_SDIO_PIN_D2
277-
// CONFIG_ESP_SDIO_PIN_D3
278-
// CONFIG_ESP_SDIO_GPIO_RESET_SLAVE
320+
// sdio_pin_config.pin_clk
321+
// sdio_pin_config.pin_cmd
322+
// sdio_pin_config.pin_d0
323+
// sdio_pin_config.pin_d1
324+
// sdio_pin_config.pin_d2
325+
// sdio_pin_config.pin_d3
326+
// sdio_pin_config.pin_reset
279327

280328
return true;
281329
}
@@ -308,7 +356,7 @@ bool wifiLowLevelInit(bool persistent) {
308356

309357
esp_err_t err = esp_wifi_init(&cfg);
310358
if (err) {
311-
log_e("esp_wifi_init %d", err);
359+
log_e("esp_wifi_init 0x%x: %s", err, esp_err_to_name(err));
312360
lowLevelInitDone = false;
313361
return lowLevelInitDone;
314362
}
@@ -375,7 +423,7 @@ static bool espWiFiStart() {
375423
esp_err_t err = esp_wifi_start();
376424
if (err != ESP_OK) {
377425
_esp_wifi_started = false;
378-
log_e("esp_wifi_start %d", err);
426+
log_e("esp_wifi_start 0x%x: %s", err, esp_err_to_name(err));
379427
return _esp_wifi_started;
380428
}
381429
return _esp_wifi_started;
@@ -389,7 +437,7 @@ static bool espWiFiStop() {
389437
_esp_wifi_started = false;
390438
err = esp_wifi_stop();
391439
if (err) {
392-
log_e("Could not stop WiFi! %d", err);
440+
log_e("Could not stop WiFi! 0x%x: %s", err, esp_err_to_name(err));
393441
_esp_wifi_started = true;
394442
return false;
395443
}
@@ -478,7 +526,7 @@ int WiFiGenericClass::setChannel(uint8_t primary, wifi_second_chan_t secondary)
478526

479527
ret = esp_wifi_get_country(&country);
480528
if (ret != ESP_OK) {
481-
log_e("Failed to get country info");
529+
log_e("Failed to get country info 0x%x: %s", ret, esp_err_to_name(ret));
482530
return ret;
483531
}
484532

@@ -492,7 +540,7 @@ int WiFiGenericClass::setChannel(uint8_t primary, wifi_second_chan_t secondary)
492540

493541
ret = esp_wifi_set_channel(primary, secondary);
494542
if (ret != ESP_OK) {
495-
log_e("Failed to set channel");
543+
log_e("Failed to set channel 0x%x: %s", ret, esp_err_to_name(ret));
496544
return ret;
497545
}
498546

@@ -562,13 +610,13 @@ bool WiFiGenericClass::mode(wifi_mode_t m) {
562610
if (((m & WIFI_MODE_STA) != 0) && ((cm & WIFI_MODE_STA) == 0)) {
563611
err = esp_netif_set_hostname(esp_netifs[ESP_IF_WIFI_STA], NetworkManager::getHostname());
564612
if (err) {
565-
log_e("Could not set hostname! %d", err);
613+
log_e("Could not set hostname! 0x%x: %s", err, esp_err_to_name(err));
566614
return false;
567615
}
568616
}
569617
err = esp_wifi_set_mode(m);
570618
if (err) {
571-
log_e("Could not set mode! %d", err);
619+
log_e("Could not set mode! 0x%x: %s", err, esp_err_to_name(err));
572620
return false;
573621
}
574622

@@ -585,17 +633,44 @@ bool WiFiGenericClass::mode(wifi_mode_t m) {
585633
if (m & WIFI_MODE_STA) {
586634
err = esp_wifi_set_protocol(WIFI_IF_STA, WIFI_PROTOCOL_LR);
587635
if (err != ESP_OK) {
588-
log_e("Could not enable long range on STA! %d", err);
636+
log_e("Could not enable long range on STA! 0x%x: %s", err, esp_err_to_name(err));
589637
return false;
590638
}
591639
}
592640
if (m & WIFI_MODE_AP) {
593641
err = esp_wifi_set_protocol(WIFI_IF_AP, WIFI_PROTOCOL_LR);
594642
if (err != ESP_OK) {
595-
log_e("Could not enable long range on AP! %d", err);
643+
log_e("Could not enable long range on AP! 0x%x: %s", err, esp_err_to_name(err));
596644
return false;
597645
}
598646
}
647+
} else {
648+
#if CONFIG_SOC_WIFI_HE_SUPPORT
649+
#define WIFI_PROTOCOL_DEFAULT (WIFI_PROTOCOL_11B | WIFI_PROTOCOL_11G | WIFI_PROTOCOL_11N | WIFI_PROTOCOL_11AX)
650+
#else
651+
#define WIFI_PROTOCOL_DEFAULT (WIFI_PROTOCOL_11B | WIFI_PROTOCOL_11G | WIFI_PROTOCOL_11N)
652+
#endif
653+
uint32_t current_protocol = 0;
654+
if (m & WIFI_MODE_STA) {
655+
err = esp_wifi_get_protocol(WIFI_IF_STA, (uint8_t *)&current_protocol);
656+
if (err == ESP_OK && current_protocol == WIFI_PROTOCOL_LR) {
657+
log_v("Disabling long range on STA");
658+
err = esp_wifi_set_protocol(WIFI_IF_STA, WIFI_PROTOCOL_DEFAULT);
659+
if (err != ESP_OK) {
660+
log_e("Could not disable long range on STA! 0x%x: %s", err, esp_err_to_name(err));
661+
}
662+
}
663+
}
664+
if (m & WIFI_MODE_AP) {
665+
err = esp_wifi_get_protocol(WIFI_IF_AP, (uint8_t *)&current_protocol);
666+
if (err == ESP_OK && current_protocol == WIFI_PROTOCOL_LR) {
667+
log_v("Disabling long range on AP");
668+
err = esp_wifi_set_protocol(WIFI_IF_AP, WIFI_PROTOCOL_DEFAULT);
669+
if (err != ESP_OK) {
670+
log_e("Could not disable long range on AP! 0x%x: %s", err, esp_err_to_name(err));
671+
}
672+
}
673+
}
599674
}
600675
if (!espWiFiStart()) {
601676
return false;
@@ -683,8 +758,9 @@ bool WiFiGenericClass::setSleep(wifi_ps_type_t sleepType) {
683758
if (sleepType != _sleepEnabled) {
684759
_sleepEnabled = sleepType;
685760
if (WiFi.STA.started()) {
686-
if (esp_wifi_set_ps(_sleepEnabled) != ESP_OK) {
687-
log_e("esp_wifi_set_ps failed!");
761+
esp_err_t err = esp_wifi_set_ps(_sleepEnabled);
762+
if (err != ESP_OK) {
763+
log_e("esp_wifi_set_ps failed!: 0x%x: %s", err, esp_err_to_name(err));
688764
return false;
689765
}
690766
}
@@ -748,8 +824,9 @@ bool WiFiGenericClass::initiateFTM(uint8_t frm_count, uint16_t burst_period, uin
748824
memcpy(ftmi_cfg.resp_mac, mac, 6);
749825
}
750826
// Request FTM session with the Responder
751-
if (ESP_OK != esp_wifi_ftm_initiate_session(&ftmi_cfg)) {
752-
log_e("Failed to initiate FTM session");
827+
esp_err_t err = esp_wifi_ftm_initiate_session(&ftmi_cfg);
828+
if (ESP_OK != err) {
829+
log_e("Failed to initiate FTM session: 0x%x: %s", err, esp_err_to_name(err));
753830
return false;
754831
}
755832
return true;
@@ -768,8 +845,9 @@ bool WiFiGenericClass::setDualAntennaConfig(uint8_t gpio_ant1, uint8_t gpio_ant2
768845

769846
esp_phy_ant_gpio_config_t wifi_ant_io;
770847

771-
if (ESP_OK != esp_phy_get_ant_gpio(&wifi_ant_io)) {
772-
log_e("Failed to get antenna configuration");
848+
esp_err_t err = esp_phy_get_ant_gpio(&wifi_ant_io);
849+
if (ESP_OK != err) {
850+
log_e("Failed to get antenna configuration: 0x%x: %s", err, esp_err_to_name(err));
773851
return false;
774852
}
775853

@@ -778,8 +856,9 @@ bool WiFiGenericClass::setDualAntennaConfig(uint8_t gpio_ant1, uint8_t gpio_ant2
778856
wifi_ant_io.gpio_cfg[1].gpio_num = gpio_ant2;
779857
wifi_ant_io.gpio_cfg[1].gpio_select = 1;
780858

781-
if (ESP_OK != esp_phy_set_ant_gpio(&wifi_ant_io)) {
782-
log_e("Failed to set antenna GPIO configuration");
859+
err = esp_phy_set_ant_gpio(&wifi_ant_io);
860+
if (ESP_OK != err) {
861+
log_e("Failed to set antenna GPIO configuration: 0x%x: %s", err, esp_err_to_name(err));
783862
return false;
784863
}
785864

@@ -827,8 +906,9 @@ bool WiFiGenericClass::setDualAntennaConfig(uint8_t gpio_ant1, uint8_t gpio_ant2
827906
}
828907

829908
set_ant:
830-
if (ESP_OK != esp_phy_set_ant(&ant_config)) {
831-
log_e("Failed to set antenna configuration");
909+
err = esp_phy_set_ant(&ant_config);
910+
if (ESP_OK != err) {
911+
log_e("Failed to set antenna configuration: 0x%x: %s", err, esp_err_to_name(err));
832912
return false;
833913
}
834914
#endif

0 commit comments

Comments
 (0)