feat(p4): Add method to set the pins for SDIO to WiFi chip (#11513)

* feat(p4): Add method to set the pins for SDIO to WiFi chip

* ci(pre-commit): Apply automatic fixes

---------

Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com>
This commit is contained in:
Me No Dev 2025-06-30 16:03:38 +03:00 committed by GitHub
parent 6e60f2f6b9
commit 2592a7b3bb
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 67 additions and 24 deletions

View file

@ -246,29 +246,67 @@ extern "C" {
extern esp_err_t esp_hosted_init();
extern esp_err_t esp_hosted_deinit();
};
typedef struct {
uint8_t pin_clk;
uint8_t pin_cmd;
uint8_t pin_d0;
uint8_t pin_d1;
uint8_t pin_d2;
uint8_t pin_d3;
uint8_t pin_reset;
} sdio_pin_config_t;
static bool hosted_initialized = false;
static sdio_pin_config_t sdio_pin_config = {
#ifdef BOARD_HAS_SDIO_ESP_HOSTED
.pin_clk = BOARD_SDIO_ESP_HOSTED_CLK,
.pin_cmd = BOARD_SDIO_ESP_HOSTED_CMD,
.pin_d0 = BOARD_SDIO_ESP_HOSTED_D0,
.pin_d1 = BOARD_SDIO_ESP_HOSTED_D1,
.pin_d2 = BOARD_SDIO_ESP_HOSTED_D2,
.pin_d3 = BOARD_SDIO_ESP_HOSTED_D3,
.pin_reset = BOARD_SDIO_ESP_HOSTED_RESET
#else
.pin_clk = CONFIG_ESP_SDIO_PIN_CLK,
.pin_cmd = CONFIG_ESP_SDIO_PIN_CMD,
.pin_d0 = CONFIG_ESP_SDIO_PIN_D0,
.pin_d1 = CONFIG_ESP_SDIO_PIN_D1,
.pin_d2 = CONFIG_ESP_SDIO_PIN_D2,
.pin_d3 = CONFIG_ESP_SDIO_PIN_D3,
.pin_reset = CONFIG_ESP_SDIO_GPIO_RESET_SLAVE
#endif
};
bool WiFiGenericClass::setPins(int8_t clk, int8_t cmd, int8_t d0, int8_t d1, int8_t d2, int8_t d3, int8_t rst) {
if (clk < 0 || cmd < 0 || d0 < 0 || d1 < 0 || d2 < 0 || d3 < 0 || rst < 0) {
log_e("All SDIO pins must be defined");
return false;
}
if (hosted_initialized) {
log_e("SDIO pins must be set before WiFi is initialized");
return false;
}
sdio_pin_config.pin_clk = clk;
sdio_pin_config.pin_cmd = cmd;
sdio_pin_config.pin_d0 = d0;
sdio_pin_config.pin_d1 = d1;
sdio_pin_config.pin_d2 = d2;
sdio_pin_config.pin_d3 = d3;
sdio_pin_config.pin_reset = rst;
return true;
}
static bool wifiHostedInit() {
if (!hosted_initialized) {
hosted_initialized = true;
struct esp_hosted_sdio_config conf = INIT_DEFAULT_HOST_SDIO_CONFIG();
#ifdef BOARD_HAS_SDIO_ESP_HOSTED
conf.pin_clk.pin = BOARD_SDIO_ESP_HOSTED_CLK;
conf.pin_cmd.pin = BOARD_SDIO_ESP_HOSTED_CMD;
conf.pin_d0.pin = BOARD_SDIO_ESP_HOSTED_D0;
conf.pin_d1.pin = BOARD_SDIO_ESP_HOSTED_D1;
conf.pin_d2.pin = BOARD_SDIO_ESP_HOSTED_D2;
conf.pin_d3.pin = BOARD_SDIO_ESP_HOSTED_D3;
conf.pin_reset.pin = BOARD_SDIO_ESP_HOSTED_RESET;
#else
conf.pin_clk.pin = CONFIG_ESP_SDIO_PIN_CLK;
conf.pin_cmd.pin = CONFIG_ESP_SDIO_PIN_CMD;
conf.pin_d0.pin = CONFIG_ESP_SDIO_PIN_D0;
conf.pin_d1.pin = CONFIG_ESP_SDIO_PIN_D1;
conf.pin_d2.pin = CONFIG_ESP_SDIO_PIN_D2;
conf.pin_d3.pin = CONFIG_ESP_SDIO_PIN_D3;
conf.pin_reset.pin = CONFIG_ESP_SDIO_GPIO_RESET_SLAVE;
#endif
conf.pin_clk.pin = sdio_pin_config.pin_clk;
conf.pin_cmd.pin = sdio_pin_config.pin_cmd;
conf.pin_d0.pin = sdio_pin_config.pin_d0;
conf.pin_d1.pin = sdio_pin_config.pin_d1;
conf.pin_d2.pin = sdio_pin_config.pin_d2;
conf.pin_d3.pin = sdio_pin_config.pin_d3;
conf.pin_reset.pin = sdio_pin_config.pin_reset;
// esp_hosted_sdio_set_config() will fail on second attempt but here temporarily to not cause exception on reinit
if (esp_hosted_sdio_set_config(&conf) != ESP_OK || esp_hosted_init() != ESP_OK) {
log_e("esp_hosted_init failed!");
@ -279,13 +317,13 @@ static bool wifiHostedInit() {
}
// Attach pins to PeriMan here
// Slave chip model is CONFIG_IDF_SLAVE_TARGET
// CONFIG_ESP_SDIO_PIN_CMD
// CONFIG_ESP_SDIO_PIN_CLK
// CONFIG_ESP_SDIO_PIN_D0
// CONFIG_ESP_SDIO_PIN_D1
// CONFIG_ESP_SDIO_PIN_D2
// CONFIG_ESP_SDIO_PIN_D3
// CONFIG_ESP_SDIO_GPIO_RESET_SLAVE
// sdio_pin_config.pin_clk
// sdio_pin_config.pin_cmd
// sdio_pin_config.pin_d0
// sdio_pin_config.pin_d1
// sdio_pin_config.pin_d2
// sdio_pin_config.pin_d3
// sdio_pin_config.pin_reset
return true;
}

View file

@ -82,6 +82,11 @@ class WiFiGenericClass {
public:
WiFiGenericClass();
#if CONFIG_ESP_WIFI_REMOTE_ENABLED
// Set SDIO pins for connection to external ESP MCU
static bool setPins(int8_t clk, int8_t cmd, int8_t d0, int8_t d1, int8_t d2, int8_t d3, int8_t rst);
#endif
wifi_event_id_t onEvent(WiFiEventCb cbEvent, arduino_event_id_t event = ARDUINO_EVENT_MAX);
wifi_event_id_t onEvent(WiFiEventFuncCb cbEvent, arduino_event_id_t event = ARDUINO_EVENT_MAX);
wifi_event_id_t onEvent(WiFiEventSysCb cbEvent, arduino_event_id_t event = ARDUINO_EVENT_MAX);