mirror of
https://github.com/espressif/esp-idf.git
synced 2024-10-05 20:47:46 -04:00
52e3f09b32
Common spi functionality for sharing the SPI bus between modules is moved from esp_driver_spi to a more fitting location in esp_hw_support (shared HW resource control). This also allows us to decouple the spi_flash driver from esp_driver_spi, removing esp_driver_spi and esp_ringbuf from G1 builds.
64 lines
2.0 KiB
C
64 lines
2.0 KiB
C
/*
|
|
* SPDX-FileCopyrightText: 2023 Espressif Systems (Shanghai) CO LTD
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
#include "esp_private/spi_share_hw_ctrl.h"
|
|
|
|
#include <stdatomic.h>
|
|
|
|
#include "sdkconfig.h"
|
|
#include "soc/soc_caps.h"
|
|
#include "hal/spi_ll.h"
|
|
#include "esp_log.h"
|
|
|
|
static const char* SPI_TAG = "spi_share_hw_ctrl";
|
|
|
|
//Periph 1 is 'claimed' by SPI flash code.
|
|
static atomic_bool spi_periph_claimed[SOC_SPI_PERIPH_NUM] = { ATOMIC_VAR_INIT(true), ATOMIC_VAR_INIT(false),
|
|
#if (SOC_SPI_PERIPH_NUM >= 3)
|
|
ATOMIC_VAR_INIT(false),
|
|
#endif
|
|
#if (SOC_SPI_PERIPH_NUM >= 4)
|
|
ATOMIC_VAR_INIT(false),
|
|
#endif
|
|
};
|
|
|
|
static const char* spi_claiming_func[3] = {NULL, NULL, NULL};
|
|
|
|
//----------------------------------------------------------alloc spi periph-------------------------------------------------------//
|
|
//Returns true if this peripheral is successfully claimed, false if otherwise.
|
|
bool spicommon_periph_claim(spi_host_device_t host, const char* source)
|
|
{
|
|
bool false_var = false;
|
|
bool ret = atomic_compare_exchange_strong(&spi_periph_claimed[host], &false_var, true);
|
|
if (ret) {
|
|
spi_claiming_func[host] = source;
|
|
SPI_COMMON_RCC_CLOCK_ATOMIC() {
|
|
spi_ll_enable_bus_clock(host, true);
|
|
spi_ll_reset_register(host);
|
|
}
|
|
} else {
|
|
ESP_EARLY_LOGE(SPI_TAG, "SPI%d already claimed by %s.", host + 1, spi_claiming_func[host]);
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
bool spicommon_periph_in_use(spi_host_device_t host)
|
|
{
|
|
return atomic_load(&spi_periph_claimed[host]);
|
|
}
|
|
|
|
//Returns true if this peripheral is successfully freed, false if otherwise.
|
|
bool spicommon_periph_free(spi_host_device_t host)
|
|
{
|
|
bool true_var = true;
|
|
bool ret = atomic_compare_exchange_strong(&spi_periph_claimed[host], &true_var, false);
|
|
if (ret) {
|
|
SPI_COMMON_RCC_CLOCK_ATOMIC() {
|
|
spi_ll_enable_bus_clock(host, false);
|
|
}
|
|
}
|
|
return ret;
|
|
}
|