mirror of
https://github.com/espressif/esp-idf.git
synced 2025-09-02 22:51:14 +00:00
refactor(spi): moved spi hw sharing func to hw support
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.
This commit is contained in:
@@ -17,6 +17,7 @@
|
||||
#include "driver/spi_master.h"
|
||||
#include "esp_private/periph_ctrl.h"
|
||||
#include "esp_private/spi_common_internal.h"
|
||||
#include "esp_private/spi_share_hw_ctrl.h"
|
||||
#include "hal/spi_hal.h"
|
||||
#include "hal/gpio_hal.h"
|
||||
#if CONFIG_IDF_TARGET_ESP32
|
||||
@@ -28,12 +29,6 @@
|
||||
#include "hal/cache_ll.h"
|
||||
#endif
|
||||
|
||||
#if !SOC_RCC_IS_INDEPENDENT
|
||||
#define SPI_COMMON_RCC_CLOCK_ATOMIC() PERIPH_RCC_ATOMIC()
|
||||
#else
|
||||
#define SPI_COMMON_RCC_CLOCK_ATOMIC()
|
||||
#endif
|
||||
|
||||
static const char *SPI_TAG = "spi";
|
||||
|
||||
#define SPI_CHECK(a, str, ret_val) ESP_RETURN_ON_FALSE(a, ret_val, SPI_TAG, str)
|
||||
@@ -67,20 +62,19 @@ typedef struct {
|
||||
#endif
|
||||
} spicommon_bus_context_t;
|
||||
|
||||
//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};
|
||||
static spicommon_bus_context_t s_mainbus = SPI_MAIN_BUS_DEFAULT();
|
||||
static spicommon_bus_context_t* bus_ctx[SOC_SPI_PERIPH_NUM] = {&s_mainbus};
|
||||
|
||||
#if CONFIG_SPI_FLASH_SHARE_SPI1_BUS
|
||||
/* The lock for the share SPI1 bus is registered here in a constructor due to need to access the context
|
||||
This way we are able to decouple the SPI-flash driver from the spi-master driver */
|
||||
static __attribute__((constructor)) void spi_bus_lock_init_main_bus(void)
|
||||
{
|
||||
/* Initialize bus context about the main SPI bus lock, called during chip startup. */
|
||||
spi_bus_main_set_lock(g_main_spi_bus_lock);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if !SOC_GDMA_SUPPORTED
|
||||
//Each bit stands for 1 dma channel, BIT(0) should be used for SPI1
|
||||
static uint8_t spi_dma_chan_enabled = 0;
|
||||
@@ -96,42 +90,6 @@ static inline bool is_valid_host(spi_host_device_t host)
|
||||
#endif
|
||||
}
|
||||
|
||||
//----------------------------------------------------------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;
|
||||
}
|
||||
|
||||
int spicommon_irqsource_for_host(spi_host_device_t host)
|
||||
{
|
||||
return spi_periph_signal[host].irq;
|
||||
|
@@ -31,6 +31,7 @@
|
||||
#include "esp_private/spi_slave_internal.h"
|
||||
#include "esp_private/spi_common_internal.h"
|
||||
#include "esp_private/esp_cache_private.h"
|
||||
#include "esp_private/spi_share_hw_ctrl.h"
|
||||
|
||||
static const char *SPI_TAG = "spi_slave";
|
||||
|
||||
|
@@ -13,6 +13,7 @@
|
||||
#include "freertos/ringbuf.h"
|
||||
#include "driver/gpio.h"
|
||||
#include "esp_private/spi_common_internal.h"
|
||||
#include "esp_private/spi_share_hw_ctrl.h"
|
||||
#include "esp_private/esp_cache_private.h"
|
||||
#include "driver/spi_slave_hd.h"
|
||||
#include "hal/spi_slave_hd_hal.h"
|
||||
|
Reference in New Issue
Block a user