Merge branch 'bugfix/fix_micro_error_SPI_HOST_MAX' into 'master'

spi: fix micro SPI_HOST_MAX error

Closes IDFGH-8932

See merge request espressif/esp-idf!21557
This commit is contained in:
Wan Lei 2023-01-05 16:07:17 +08:00
commit 419544a2c8
4 changed files with 60 additions and 33 deletions

View File

@ -19,7 +19,9 @@ typedef enum {
//SPI1 can be used as GPSPI only on ESP32 //SPI1 can be used as GPSPI only on ESP32
SPI1_HOST=0, ///< SPI1 SPI1_HOST=0, ///< SPI1
SPI2_HOST=1, ///< SPI2 SPI2_HOST=1, ///< SPI2
#if SOC_SPI_PERIPH_NUM > 2
SPI3_HOST=2, ///< SPI3 SPI3_HOST=2, ///< SPI3
#endif
SPI_HOST_MAX, ///< invalid host value SPI_HOST_MAX, ///< invalid host value
} spi_host_device_t; } spi_host_device_t;

View File

@ -243,33 +243,39 @@ esp_err_t esp_flash_init_os_functions(esp_flash_t *chip, int host_id, spi_bus_lo
return ESP_ERR_INVALID_ARG; return ESP_ERR_INVALID_ARG;
} }
if (host_id == SPI1_HOST) { switch (host_id)
//SPI1 {
chip->os_func = &esp_flash_spi1_default_os_functions; case SPI1_HOST:
chip->os_func_data = heap_caps_malloc(sizeof(spi1_app_func_arg_t), //SPI1
MALLOC_CAP_INTERNAL | MALLOC_CAP_8BIT); chip->os_func = &esp_flash_spi1_default_os_functions;
if (chip->os_func_data == NULL) { chip->os_func_data = heap_caps_malloc(sizeof(spi1_app_func_arg_t),
return ESP_ERR_NO_MEM; MALLOC_CAP_INTERNAL | MALLOC_CAP_8BIT);
} if (chip->os_func_data == NULL) {
*(spi1_app_func_arg_t*) chip->os_func_data = (spi1_app_func_arg_t) { return ESP_ERR_NO_MEM;
.common_arg = { }
*(spi1_app_func_arg_t*) chip->os_func_data = (spi1_app_func_arg_t) {
.common_arg = {
.dev_lock = dev_handle,
},
.no_protect = true,
};
break;
case SPI2_HOST:
#if SOC_SPI_PERIPH_NUM > 2
case SPI3_HOST:
#endif
//SPI2, SPI3
chip->os_func = &esp_flash_spi23_default_os_functions;
chip->os_func_data = heap_caps_malloc(sizeof(app_func_arg_t),
MALLOC_CAP_INTERNAL | MALLOC_CAP_8BIT);
if (chip->os_func_data == NULL) {
return ESP_ERR_NO_MEM;
}
*(app_func_arg_t*) chip->os_func_data = (app_func_arg_t) {
.dev_lock = dev_handle, .dev_lock = dev_handle,
}, };
.no_protect = true, break;
}; default: return ESP_ERR_INVALID_ARG;
} else if (host_id == SPI2_HOST || host_id == SPI3_HOST) {
//SPI2, SPI3
chip->os_func = &esp_flash_spi23_default_os_functions;
chip->os_func_data = heap_caps_malloc(sizeof(app_func_arg_t),
MALLOC_CAP_INTERNAL | MALLOC_CAP_8BIT);
if (chip->os_func_data == NULL) {
return ESP_ERR_NO_MEM;
}
*(app_func_arg_t*) chip->os_func_data = (app_func_arg_t) {
.dev_lock = dev_handle,
};
} else {
return ESP_ERR_INVALID_ARG;
} }
return ESP_OK; return ESP_OK;

View File

@ -346,7 +346,8 @@ static void setup_bus(spi_host_device_t host_id)
gpio_iomux_out(hd_pin, spi_periph_signal[host_id].func, false); gpio_iomux_out(hd_pin, spi_periph_signal[host_id].func, false);
#endif //CONFIG_ESPTOOLPY_FLASHMODE_QIO || CONFIG_ESPTOOLPY_FLASHMODE_QOUT #endif //CONFIG_ESPTOOLPY_FLASHMODE_QIO || CONFIG_ESPTOOLPY_FLASHMODE_QOUT
//currently the SPI bus for main flash chip is initialized through GPIO matrix //currently the SPI bus for main flash chip is initialized through GPIO matrix
} else if (host_id == SPI2_HOST) { }
else if (host_id == SPI2_HOST) {
ESP_LOGI(TAG, "setup flash on SPI%d (FSPI) CS0...\n", host_id + 1); ESP_LOGI(TAG, "setup flash on SPI%d (FSPI) CS0...\n", host_id + 1);
spi_bus_config_t fspi_bus_cfg = { spi_bus_config_t fspi_bus_cfg = {
.mosi_io_num = FSPI_PIN_NUM_MOSI, .mosi_io_num = FSPI_PIN_NUM_MOSI,
@ -358,7 +359,9 @@ static void setup_bus(spi_host_device_t host_id)
}; };
esp_err_t ret = spi_bus_initialize(host_id, &fspi_bus_cfg, 0); esp_err_t ret = spi_bus_initialize(host_id, &fspi_bus_cfg, 0);
TEST_ESP_OK(ret); TEST_ESP_OK(ret);
} else if (host_id == SPI3_HOST) { }
#if SOC_SPI_PERIPH_NUM > 2
else if (host_id == SPI3_HOST) {
ESP_LOGI(TAG, "setup flash on SPI%d (HSPI) CS0...\n", host_id + 1); ESP_LOGI(TAG, "setup flash on SPI%d (HSPI) CS0...\n", host_id + 1);
spi_bus_config_t hspi_bus_cfg = { spi_bus_config_t hspi_bus_cfg = {
.mosi_io_num = HSPI_PIN_NUM_MOSI, .mosi_io_num = HSPI_PIN_NUM_MOSI,
@ -377,7 +380,9 @@ static void setup_bus(spi_host_device_t host_id)
gpio_set_direction(HSPI_PIN_NUM_WP, GPIO_MODE_OUTPUT); gpio_set_direction(HSPI_PIN_NUM_WP, GPIO_MODE_OUTPUT);
gpio_set_level(HSPI_PIN_NUM_WP, 1); gpio_set_level(HSPI_PIN_NUM_WP, 1);
} else { }
#endif
else {
ESP_LOGE(TAG, "invalid bus"); ESP_LOGE(TAG, "invalid bus");
} }
} }
@ -386,7 +391,12 @@ static void setup_bus(spi_host_device_t host_id)
static void release_bus(int host_id) static void release_bus(int host_id)
{ {
//SPI1 bus can't be deinitialized //SPI1 bus can't be deinitialized
if (host_id == SPI2_HOST || host_id == SPI3_HOST) { #if SOC_SPI_PERIPH_NUM > 2
if (host_id == SPI2_HOST || host_id == SPI3_HOST)
#else
if (host_id == SPI2_HOST)
#endif
{
spi_bus_free(host_id); spi_bus_free(host_id);
} }
} }

View File

@ -140,7 +140,9 @@ static void setup_bus(spi_host_device_t host_id)
}; };
esp_err_t ret = spi_bus_initialize(host_id, &fspi_bus_cfg, 0); esp_err_t ret = spi_bus_initialize(host_id, &fspi_bus_cfg, 0);
TEST_ESP_OK(ret); TEST_ESP_OK(ret);
} else if (host_id == SPI3_HOST) { }
#if SOC_SPI_PERIPH_NUM > 2
else if (host_id == SPI3_HOST) {
ESP_LOGI(TAG, "setup flash on SPI%u (HSPI) CS0...\n", host_id + 1); ESP_LOGI(TAG, "setup flash on SPI%u (HSPI) CS0...\n", host_id + 1);
spi_bus_config_t hspi_bus_cfg = { spi_bus_config_t hspi_bus_cfg = {
.mosi_io_num = HSPI_PIN_NUM_MOSI, .mosi_io_num = HSPI_PIN_NUM_MOSI,
@ -159,7 +161,9 @@ static void setup_bus(spi_host_device_t host_id)
gpio_set_direction(HSPI_PIN_NUM_WP, GPIO_MODE_OUTPUT); gpio_set_direction(HSPI_PIN_NUM_WP, GPIO_MODE_OUTPUT);
gpio_set_level(HSPI_PIN_NUM_WP, 1); gpio_set_level(HSPI_PIN_NUM_WP, 1);
} else { }
#endif
else {
ESP_LOGE(TAG, "invalid bus"); ESP_LOGE(TAG, "invalid bus");
} }
} }
@ -168,7 +172,12 @@ static void setup_bus(spi_host_device_t host_id)
static void release_bus(int host_id) static void release_bus(int host_id)
{ {
//SPI1 bus can't be deinitialized //SPI1 bus can't be deinitialized
if (host_id == SPI2_HOST || host_id == SPI3_HOST) { #if SOC_SPI_PERIPH_NUM > 2
if (host_id == SPI2_HOST || host_id == SPI3_HOST)
#else
if (host_id == SPI2_HOST)
#endif
{
spi_bus_free(host_id); spi_bus_free(host_id);
} }
} }