mirror of
https://github.com/apache/nuttx.git
synced 2026-05-31 23:40:19 +08:00
esp32[s2|s3]: Add SPI bitbang support
This commit is contained in:
committed by
Xiang Xiao
parent
243a2adcaf
commit
3f77e97b03
@@ -30,7 +30,105 @@
|
||||
|
||||
#include <nuttx/spi/spi_transfer.h>
|
||||
|
||||
#ifdef CONFIG_ESPRESSIF_SPI_PERIPH
|
||||
#include "esp32_spi.h"
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_ESPRESSIF_SPI_BITBANG
|
||||
#include "espressif/esp_spi_bitbang.h"
|
||||
#endif
|
||||
|
||||
/****************************************************************************
|
||||
* Private Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Name: spi_bitbang_driver_init
|
||||
*
|
||||
* Description:
|
||||
* Initialize SPI bitbang driver and register the /dev/spi device.
|
||||
*
|
||||
* Input Parameters:
|
||||
* port - The SPI bus number, used to build the device path as /dev/spiN
|
||||
*
|
||||
* Returned Value:
|
||||
* Zero (OK) is returned on success; A negated errno value is returned
|
||||
* to indicate the nature of any failure.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
#ifdef CONFIG_ESPRESSIF_SPI_BITBANG
|
||||
static int spi_bitbang_driver_init(int port)
|
||||
{
|
||||
int ret;
|
||||
struct spi_dev_s *spi;
|
||||
|
||||
syslog(LOG_INFO, "Initializing /dev/spi%d...\n", port);
|
||||
|
||||
/* Initialize SPI device */
|
||||
|
||||
spi = esp_spi_bitbang_init();
|
||||
|
||||
if (spi == NULL)
|
||||
{
|
||||
syslog(LOG_ERR, "Failed to initialize SPI%d.\n", port);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
ret = spi_register(spi, port);
|
||||
if (ret < 0)
|
||||
{
|
||||
syslog(LOG_ERR, "Failed to register /dev/spi%d: %d\n", port, ret);
|
||||
esp_spi_bitbang_uninitialize(spi);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
||||
/****************************************************************************
|
||||
* Name: spi_driver_init
|
||||
*
|
||||
* Description:
|
||||
* Initialize SPI driver and register the /dev/spi device.
|
||||
*
|
||||
* Input Parameters:
|
||||
* port - The SPI bus number, used to build the device path as /dev/spiN
|
||||
*
|
||||
* Returned Value:
|
||||
* Zero (OK) is returned on success; A negated errno value is returned
|
||||
* to indicate the nature of any failure.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
#ifdef CONFIG_ESPRESSIF_SPI_PERIPH
|
||||
static int spi_driver_init(int port)
|
||||
{
|
||||
int ret = OK;
|
||||
struct spi_dev_s *spi;
|
||||
|
||||
syslog(LOG_INFO, "Initializing /dev/spi%d...\n", port);
|
||||
|
||||
/* Initialize SPI device */
|
||||
|
||||
spi = esp32_spibus_initialize(port);
|
||||
|
||||
if (spi == NULL)
|
||||
{
|
||||
syslog(LOG_ERR, "Failed to initialize SPI%d.\n", port);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
ret = spi_register(spi, port);
|
||||
if (ret < 0)
|
||||
{
|
||||
syslog(LOG_ERR, "Failed to register /dev/spi%d: %d\n", port, ret);
|
||||
esp32_spibus_uninitialize(spi);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
||||
/****************************************************************************
|
||||
* Public Functions
|
||||
@@ -40,32 +138,64 @@
|
||||
* Name: board_spidev_initialize
|
||||
*
|
||||
* Description:
|
||||
* Initialize and register SPI driver for the specified SPI port.
|
||||
* Initialize SPI driver and register the /dev/spi device.
|
||||
*
|
||||
* Input Parameters:
|
||||
* port - The SPI bus number, used to build the device path as /dev/spiN
|
||||
*
|
||||
* Returned Value:
|
||||
* Zero (OK) is returned on success; A negated errno value is returned
|
||||
* to indicate the nature of any failure.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
int board_spidev_initialize(int port)
|
||||
{
|
||||
int ret;
|
||||
struct spi_dev_s *spi;
|
||||
int ret = OK;
|
||||
|
||||
spiinfo("Initializing /dev/spi%d...\n", port);
|
||||
|
||||
/* Initialize SPI device */
|
||||
|
||||
spi = esp32_spibus_initialize(port);
|
||||
if (spi == NULL)
|
||||
switch (port)
|
||||
{
|
||||
spierr("Failed to initialize SPI%d.\n", port);
|
||||
return -ENODEV;
|
||||
}
|
||||
#ifdef CONFIG_ESP32_SPI2
|
||||
case ESP32_SPI2:
|
||||
{
|
||||
ret = spi_driver_init(ESP32_SPI2);
|
||||
if (ret != OK)
|
||||
{
|
||||
return ret;
|
||||
}
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
|
||||
ret = spi_register(spi, port);
|
||||
if (ret < 0)
|
||||
{
|
||||
spierr("Failed to register /dev/spi%d: %d\n", port, ret);
|
||||
#ifdef CONFIG_ESP32_SPI3
|
||||
case ESP32_SPI3:
|
||||
{
|
||||
ret = spi_driver_init(ESP32_SPI3);
|
||||
if (ret != OK)
|
||||
{
|
||||
return ret;
|
||||
}
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
|
||||
esp32_spibus_uninitialize(spi);
|
||||
#ifdef CONFIG_ESPRESSIF_SPI_BITBANG
|
||||
case ESPRESSIF_SPI_BITBANG:
|
||||
{
|
||||
ret = spi_bitbang_driver_init(ESPRESSIF_SPI_BITBANG);
|
||||
if (ret != OK)
|
||||
{
|
||||
return ret;
|
||||
}
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
|
||||
default:
|
||||
{
|
||||
wderr("ERROR: unsupported SPI %d\n", port);
|
||||
return ERROR;
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
|
||||
Reference in New Issue
Block a user