fix(hw_support): spi buslock fix unregister dev api issue

This commit is contained in:
wanckl
2026-07-09 19:33:03 +08:00
parent 4a270847e9
commit c107a30b6e
6 changed files with 32 additions and 5 deletions

View File

@@ -510,6 +510,7 @@ esp_err_t spi_bus_remove_device(spi_device_handle_t handle)
//catch design errors and aren't meant to be triggered during normal operation.
SPI_CHECK(uxQueueMessagesWaiting(handle->trans_queue)==0, "Have unfinished transactions", ESP_ERR_INVALID_STATE);
SPI_CHECK(handle->host->cur_cs == DEV_NUM_MAX || handle->host->device[handle->host->cur_cs] != handle, "Have unfinished transactions", ESP_ERR_INVALID_STATE);
SPI_CHECK(handle->host->device_acquiring_lock != handle, "Device has acquired the bus", ESP_ERR_INVALID_STATE);
if (handle->ret_queue) {
SPI_CHECK(uxQueueMessagesWaiting(handle->ret_queue)==0, "Have unfinished transactions", ESP_ERR_INVALID_STATE);
}

View File

@@ -687,8 +687,16 @@ void spi_bus_lock_unregister_dev(spi_bus_lock_dev_handle_t dev_handle)
spi_bus_lock_t* lock = dev_handle->parent;
BUS_LOCK_DEBUG_EXECUTE_CHECK(atomic_load(&lock->dev[id]) == (intptr_t)dev_handle);
BUS_LOCK_DEBUG_EXECUTE_CHECK(lock->acquiring_dev != dev_handle);
BUS_LOCK_DEBUG_EXECUTE_CHECK((lock_status_fetch(lock) & dev_handle->mask) == 0);
if (lock->last_dev == dev_handle) lock->last_dev = NULL;
if (lock->last_dev == dev_handle) {
lock->last_dev = NULL;
}
if (lock->acquiring_dev == dev_handle) {
lock->acquiring_dev = NULL;
lock->acq_dev_bg_active = false;
}
atomic_store(&lock->dev[id], (intptr_t)NULL);
if (dev_handle->semphr) {
@@ -715,6 +723,11 @@ void spi_bus_lock_set_bg_control(spi_bus_lock_handle_t lock, bg_ctrl_func_t bg_e
lock->bg_arg = arg;
}
IRAM_ATTR spi_bus_lock_handle_t spi_bus_lock_get_parent(spi_bus_lock_dev_handle_t dev_handle)
{
return (dev_handle ? dev_handle->parent : NULL);
}
IRAM_ATTR int spi_bus_lock_get_dev_id(spi_bus_lock_dev_handle_t dev_handle)
{
return (dev_handle? dev_lock_get_id(dev_handle): -1);

View File

@@ -290,13 +290,17 @@ esp_err_t spi_bus_remove_flash_device(esp_flash_t *chip)
}
spi_bus_lock_dev_handle_t dev_handle = NULL;
esp_flash_deinit_os_functions(chip, &dev_handle);
esp_err_t ret = esp_flash_deinit_os_functions(chip, &dev_handle);
if (ret != ESP_OK) {
return ret;
}
if (dev_handle) {
spi_bus_lock_unregister_dev(dev_handle);
}
free(chip->host);
free(chip);
return ESP_OK;
return ret;
}
/* The default (ie initial boot) no-OS ROM esp_flash_os_functions_t */

View File

@@ -63,7 +63,9 @@ esp_err_t esp_flash_init_os_functions(esp_flash_t *chip, int host_id, spi_bus_lo
* @param chip The chip to deinit os functions
* @param out_dev_handle The SPI bus lock passed from `esp_flash_init_os_functions`. The caller should deinitialize
* the lock.
* @return always ESP_OK.
* @return
* - ESP_ERR_INVALID_STATE: the chip is still acquiring the SPI bus lock.
* - ESP_OK: success.
*/
esp_err_t esp_flash_deinit_os_functions(esp_flash_t* chip, spi_bus_lock_dev_handle_t* out_dev_handle);

View File

@@ -51,6 +51,7 @@ esp_err_t spi_bus_add_flash_device(esp_flash_t **out_chip, const esp_flash_spi_d
*
* @return
* - ESP_ERR_INVALID_ARG: The chip is invalid.
* - ESP_ERR_INVALID_STATE: The chip is still acquiring the SPI bus lock.
* - ESP_OK: success.
*/
esp_err_t spi_bus_remove_flash_device(esp_flash_t *chip);

View File

@@ -310,9 +310,15 @@ esp_err_t esp_flash_init_os_functions(esp_flash_t *chip, int host_id, spi_bus_lo
esp_err_t esp_flash_deinit_os_functions(esp_flash_t* chip, spi_bus_lock_dev_handle_t* out_dev_handle)
{
*out_dev_handle = NULL;
if (chip->os_func_data) {
app_func_arg_t *ctx = (app_func_arg_t*)chip->os_func_data;
spi_bus_lock_dev_handle_t dev_handle = ctx->dev_lock;
if (dev_handle && spi_bus_lock_get_acquiring_dev(spi_bus_lock_get_parent(dev_handle)) == dev_handle) {
return ESP_ERR_INVALID_STATE;
}
// SPI bus lock is possibly not used on SPI1 bus
*out_dev_handle = ((app_func_arg_t*)chip->os_func_data)->dev_lock;
*out_dev_handle = dev_handle;
free(chip->os_func_data);
}
chip->os_func = NULL;