Skip to content

Commit 4c11e81

Browse files
committed
feat(driver_spi): support gpio reserved check
1 parent a952037 commit 4c11e81

File tree

8 files changed

+238
-270
lines changed

8 files changed

+238
-270
lines changed

components/esp_driver_spi/include/driver/spi_common.h

Lines changed: 24 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -97,26 +97,31 @@ typedef spi_common_dma_t spi_dma_chan_t;
9797
*/
9898
typedef struct {
9999
union {
100-
int mosi_io_num; ///< GPIO pin for Master Out Slave In (=spi_d) signal, or -1 if not used.
101-
int data0_io_num; ///< GPIO pin for spi data0 signal in quad/octal mode, or -1 if not used.
100+
struct {
101+
union {
102+
int mosi_io_num; ///< [0] GPIO pin for Master Out Slave In (=spi_d) signal, or -1 if not used.
103+
int data0_io_num; ///< [0] GPIO pin for spi data0 signal in dual/quad/octal mode, or -1 if not used.
104+
};
105+
union {
106+
int miso_io_num; ///< [1] GPIO pin for Master In Slave Out (=spi_q) signal, or -1 if not used.
107+
int data1_io_num; ///< [1] GPIO pin for spi data1 signal in dual/quad/octal mode, or -1 if not used.
108+
};
109+
int sclk_io_num; ///< [2] GPIO pin for SPI Clock signal, or -1 if not used.
110+
union {
111+
int quadwp_io_num; ///< [3] GPIO pin for WP (Write Protect) signal, or -1 if not used.
112+
int data2_io_num; ///< [3] GPIO pin for spi data2 signal in quad/octal mode, or -1 if not used.
113+
};
114+
union {
115+
int quadhd_io_num; ///< [4] GPIO pin for HD (Hold) signal, or -1 if not used.
116+
int data3_io_num; ///< [4] GPIO pin for spi data3 signal in quad/octal mode, or -1 if not used.
117+
};
118+
int data4_io_num; ///< [5] GPIO pin for spi data4 signal in octal mode, or -1 if not used.
119+
int data5_io_num; ///< [6] GPIO pin for spi data5 signal in octal mode, or -1 if not used.
120+
int data6_io_num; ///< [7] GPIO pin for spi data6 signal in octal mode, or -1 if not used.
121+
int data7_io_num; ///< [8] GPIO pin for spi data7 signal in octal mode, or -1 if not used.
122+
};
123+
int iocfg[9]; ///< GPIO config in array format follow the above order.
102124
};
103-
union {
104-
int miso_io_num; ///< GPIO pin for Master In Slave Out (=spi_q) signal, or -1 if not used.
105-
int data1_io_num; ///< GPIO pin for spi data1 signal in quad/octal mode, or -1 if not used.
106-
};
107-
int sclk_io_num; ///< GPIO pin for SPI Clock signal, or -1 if not used.
108-
union {
109-
int quadwp_io_num; ///< GPIO pin for WP (Write Protect) signal, or -1 if not used.
110-
int data2_io_num; ///< GPIO pin for spi data2 signal in quad/octal mode, or -1 if not used.
111-
};
112-
union {
113-
int quadhd_io_num; ///< GPIO pin for HD (Hold) signal, or -1 if not used.
114-
int data3_io_num; ///< GPIO pin for spi data3 signal in quad/octal mode, or -1 if not used.
115-
};
116-
int data4_io_num; ///< GPIO pin for spi data4 signal in octal mode, or -1 if not used.
117-
int data5_io_num; ///< GPIO pin for spi data5 signal in octal mode, or -1 if not used.
118-
int data6_io_num; ///< GPIO pin for spi data6 signal in octal mode, or -1 if not used.
119-
int data7_io_num; ///< GPIO pin for spi data7 signal in octal mode, or -1 if not used.
120125
bool data_io_default_level; ///< Output data IO default level when no transaction.
121126
int max_transfer_sz; ///< Maximum transfer size, in bytes. Defaults to 4092 if 0 when DMA enabled, or to `SOC_SPI_MAXIMUM_BUFFER_SIZE` if DMA is disabled.
122127
uint32_t flags; ///< Abilities of bus to be checked by the driver. Or-ed value of ``SPICOMMON_BUSFLAG_*`` flags.

components/esp_driver_spi/include/esp_private/spi_common_internal.h

Lines changed: 11 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ typedef enum {
5353
/// Attributes of an SPI bus
5454
typedef struct {
5555
spi_bus_config_t bus_cfg; ///< Config used to initialize the bus
56+
uint64_t gpio_reserve; ///< reserved output gpio bit mask
5657
uint32_t flags; ///< Flags (attributes) of the bus
5758
int max_transfer_sz; ///< Maximum length of bytes available to send
5859
bool dma_enabled; ///< To enable DMA or not
@@ -156,49 +157,44 @@ esp_err_t spicommon_dma_chan_free(spi_dma_ctx_t *dma_ctx);
156157
* - ``SPICOMMON_BUSFLAG_QUAD``: Combination of ``SPICOMMON_BUSFLAG_DUAL`` and ``SPICOMMON_BUSFLAG_WPHD``.
157158
* - ``SPICOMMON_BUSFLAG_IO4_IO7``: The bus has spi data4 ~ spi data7 connected.
158159
* - ``SPICOMMON_BUSFLAG_OCTAL``: Combination of ``SPICOMMON_BUSFLAG_QUAL`` and ``SPICOMMON_BUSFLAG_IO4_IO7``.
160+
* @param[out] io_reserved Output the reserved gpio map
159161
* @return
160162
* - ESP_ERR_INVALID_ARG if parameter is invalid
161163
* - ESP_OK on success
162164
*/
163-
esp_err_t spicommon_bus_initialize_io(spi_host_device_t host, const spi_bus_config_t *bus_config, uint32_t flags, uint32_t *flags_o);
165+
esp_err_t spicommon_bus_initialize_io(spi_host_device_t host, const spi_bus_config_t *bus_config, uint32_t flags, uint32_t *flags_o, uint64_t *io_reserved);
164166

165167
/**
166168
* @brief Free the IO used by a SPI peripheral
167169
*
168170
* @param bus_cfg Bus config struct which defines which pins to be used.
171+
* @param io_reserved Bitmap indicate which pin is reserved
169172
*
170173
* @return
171174
* - ESP_ERR_INVALID_ARG if parameter is invalid
172175
* - ESP_OK on success
173176
*/
174-
esp_err_t spicommon_bus_free_io_cfg(const spi_bus_config_t *bus_cfg);
177+
esp_err_t spicommon_bus_free_io_cfg(const spi_bus_config_t *bus_cfg, uint64_t *io_reserved);
175178

176179
/**
177180
* @brief Initialize a Chip Select pin for a specific SPI peripheral
178181
*
179182
* @param host SPI peripheral
180183
* @param cs_io_num GPIO pin to route
181-
* @param cs_num CS id to route
184+
* @param cs_id Hardware CS id to route
182185
* @param force_gpio_matrix If true, CS will always be routed through the GPIO matrix. If false,
183186
* if the GPIO number allows it, the routing will happen through the IO_mux.
187+
* @param[out] io_reserved Output the reserved gpio map
184188
*/
185-
void spicommon_cs_initialize(spi_host_device_t host, int cs_io_num, int cs_num, int force_gpio_matrix);
189+
void spicommon_cs_initialize(spi_host_device_t host, int cs_io_num, int cs_id, int force_gpio_matrix, uint64_t *io_reserved);
186190

187191
/**
188192
* @brief Free a chip select line
189193
*
190194
* @param cs_gpio_num CS gpio num to free
195+
* @param io_reserved Bitmap indicate which pin is reserved
191196
*/
192-
void spicommon_cs_free_io(int cs_gpio_num);
193-
194-
/**
195-
* @brief Check whether all pins used by a host are through IOMUX.
196-
*
197-
* @param host SPI peripheral
198-
*
199-
* @return false if any pins are through the GPIO matrix, otherwise true.
200-
*/
201-
bool spicommon_bus_using_iomux(spi_host_device_t host);
197+
void spicommon_cs_free_io(int cs_gpio_num, uint64_t *io_reserved);
202198

203199
/**
204200
* @brief Get the IRQ source for a specific SPI host
@@ -298,8 +294,7 @@ const spi_dma_ctx_t* spi_bus_get_dma_ctx(spi_host_device_t host_id);
298294
* @param arg The argument to call the destructor
299295
* @return Always ESP_OK.
300296
*/
301-
esp_err_t spi_bus_register_destroy_func(spi_host_device_t host_id,
302-
spi_destroy_func_t f, void *arg);
297+
esp_err_t spi_bus_register_destroy_func(spi_host_device_t host_id, spi_destroy_func_t f, void *arg);
303298

304299
#ifdef __cplusplus
305300
}

0 commit comments

Comments
 (0)