mirror of
https://github.com/apache/nuttx.git
synced 2026-06-01 07:45:16 +08:00
esp32[c3|c6|h2]: Add SPI bitbang support
This commit is contained in:
committed by
Xiang Xiao
parent
cfda04089c
commit
243a2adcaf
@@ -248,6 +248,10 @@ by default to each other and running the ``spi`` example::
|
|||||||
Sending: AB
|
Sending: AB
|
||||||
Received: AB
|
Received: AB
|
||||||
|
|
||||||
|
If SPI peripherals are already in use you can also use bitbang driver which is a
|
||||||
|
software implemented SPI peripheral by enabling `CONFIG_ESPRESSIF_SPI_BITBANG`
|
||||||
|
option.
|
||||||
|
|
||||||
spiflash
|
spiflash
|
||||||
--------
|
--------
|
||||||
|
|
||||||
|
|||||||
@@ -260,6 +260,10 @@ by default to each other and running the ``spi`` example::
|
|||||||
Sending: AB
|
Sending: AB
|
||||||
Received: AB
|
Received: AB
|
||||||
|
|
||||||
|
If SPI peripherals are already in use you can also use bitbang driver which is a
|
||||||
|
software implemented SPI peripheral by enabling `CONFIG_ESPRESSIF_SPI_BITBANG`
|
||||||
|
option.
|
||||||
|
|
||||||
spiflash
|
spiflash
|
||||||
--------
|
--------
|
||||||
|
|
||||||
|
|||||||
@@ -222,6 +222,10 @@ by default to each other and running the ``spi`` example::
|
|||||||
Sending: AB
|
Sending: AB
|
||||||
Received: AB
|
Received: AB
|
||||||
|
|
||||||
|
If SPI peripherals are already in use you can also use bitbang driver which is a
|
||||||
|
software implemented SPI peripheral by enabling `CONFIG_ESPRESSIF_SPI_BITBANG`
|
||||||
|
option.
|
||||||
|
|
||||||
spiflash
|
spiflash
|
||||||
--------
|
--------
|
||||||
|
|
||||||
|
|||||||
@@ -221,6 +221,10 @@ by default to each other and running the ``spi`` example::
|
|||||||
Sending: AB
|
Sending: AB
|
||||||
Received: AB
|
Received: AB
|
||||||
|
|
||||||
|
If SPI peripherals are already in use you can also use bitbang driver which is a
|
||||||
|
software implemented SPI peripheral by enabling `CONFIG_ESPRESSIF_SPI_BITBANG`
|
||||||
|
option.
|
||||||
|
|
||||||
spiflash
|
spiflash
|
||||||
--------
|
--------
|
||||||
|
|
||||||
|
|||||||
@@ -354,11 +354,26 @@ config ESPRESSIF_SPI
|
|||||||
bool
|
bool
|
||||||
default n
|
default n
|
||||||
|
|
||||||
|
config ESPRESSIF_SPI_PERIPH
|
||||||
|
bool
|
||||||
|
depends on ESPRESSIF_SPI2
|
||||||
|
default n
|
||||||
|
|
||||||
config ESPRESSIF_SPI2
|
config ESPRESSIF_SPI2
|
||||||
bool "SPI 2"
|
bool "SPI 2"
|
||||||
default n
|
default n
|
||||||
select ESPRESSIF_SPI
|
select ESPRESSIF_SPI
|
||||||
select SPI
|
select SPI
|
||||||
|
select ESPRESSIF_SPI_PERIPH
|
||||||
|
|
||||||
|
config ESPRESSIF_SPI_BITBANG
|
||||||
|
bool "SPI Bitbang"
|
||||||
|
default n
|
||||||
|
select ESPRESSIF_SPI
|
||||||
|
select SPI
|
||||||
|
select SPI_BITBANG
|
||||||
|
---help---
|
||||||
|
Software implemented SPI peripheral with GPIOs. Suggested to use if SPI peripheral is already in use.
|
||||||
|
|
||||||
config ESPRESSIF_SPIFLASH
|
config ESPRESSIF_SPIFLASH
|
||||||
bool "SPI Flash"
|
bool "SPI Flash"
|
||||||
@@ -1167,6 +1182,7 @@ menu "SPI configuration"
|
|||||||
|
|
||||||
config ESPRESSIF_SPI_SWCS
|
config ESPRESSIF_SPI_SWCS
|
||||||
bool "SPI software CS"
|
bool "SPI software CS"
|
||||||
|
depends on ESPRESSIF_SPI_PERIPH
|
||||||
default n
|
default n
|
||||||
---help---
|
---help---
|
||||||
Use SPI software CS.
|
Use SPI software CS.
|
||||||
@@ -1175,6 +1191,7 @@ config ESPRESSIF_SPI_UDCS
|
|||||||
bool "User defined CS"
|
bool "User defined CS"
|
||||||
default n
|
default n
|
||||||
depends on ESPRESSIF_SPI_SWCS
|
depends on ESPRESSIF_SPI_SWCS
|
||||||
|
depends on ESPRESSIF_SPI_PERIPH
|
||||||
---help---
|
---help---
|
||||||
Use user-defined CS.
|
Use user-defined CS.
|
||||||
|
|
||||||
@@ -1245,10 +1262,53 @@ config ESPRESSIF_SPI2_MISOPIN
|
|||||||
|
|
||||||
endif # ESPRESSIF_SPI2
|
endif # ESPRESSIF_SPI2
|
||||||
|
|
||||||
|
if ESPRESSIF_SPI_BITBANG
|
||||||
|
|
||||||
|
config ESPRESSIF_SPI_BITBANG_CSPIN
|
||||||
|
int "SPI Bitbang CS Pin"
|
||||||
|
default 0
|
||||||
|
range 0 21
|
||||||
|
|
||||||
|
config ESPRESSIF_SPI_BITBANG_CLKPIN
|
||||||
|
int "SPI Bitbang CLK Pin"
|
||||||
|
default 1
|
||||||
|
range 0 21
|
||||||
|
|
||||||
|
config ESPRESSIF_SPI_BITBANG_MOSIPIN
|
||||||
|
int "SPI Bitbang MOSI Pin"
|
||||||
|
default 2
|
||||||
|
range 0 21
|
||||||
|
|
||||||
|
config ESPRESSIF_SPI_BITBANG_MISOPIN
|
||||||
|
int "SPI Bitbang MISO Pin"
|
||||||
|
default 3
|
||||||
|
range 0 21
|
||||||
|
|
||||||
|
choice ESPRESSIF_SPI_BITBANG_MODE
|
||||||
|
prompt "SPI Bitbang mode"
|
||||||
|
default ESPRESSIF_SPI_BITBANG_MODE0
|
||||||
|
|
||||||
|
config ESPRESSIF_SPI_BITBANG_MODE0
|
||||||
|
bool "SPI MODE0"
|
||||||
|
|
||||||
|
config ESPRESSIF_SPI_BITBANG_MODE1
|
||||||
|
bool "SPI MODE1"
|
||||||
|
|
||||||
|
config ESPRESSIF_SPI_BITBANG_MODE2
|
||||||
|
bool "SPI MODE2"
|
||||||
|
|
||||||
|
config ESPRESSIF_SPI_BITBANG_MODE3
|
||||||
|
bool "SPI MODE3"
|
||||||
|
|
||||||
|
endchoice # ESPRESSIF_SPI_BITBANG_MODE
|
||||||
|
|
||||||
|
endif # ESPRESSIF_SPI_BITBANG
|
||||||
|
|
||||||
config ESPRESSIF_SPI_TEST_MODE
|
config ESPRESSIF_SPI_TEST_MODE
|
||||||
bool "SPI driver loopback test mode (for testing only)"
|
bool "SPI driver loopback test mode (for testing only)"
|
||||||
default n
|
default n
|
||||||
depends on SYSTEM_SPITOOL
|
depends on SYSTEM_SPITOOL
|
||||||
|
depends on ESPRESSIF_SPI_PERIPH
|
||||||
---help---
|
---help---
|
||||||
This enables a loopback test mode that attaches the transmitter
|
This enables a loopback test mode that attaches the transmitter
|
||||||
to the receiver internally, being able to test the SPI
|
to the receiver internally, being able to test the SPI
|
||||||
|
|||||||
@@ -108,10 +108,15 @@ ifeq ($(CONFIG_ESPRESSIF_I2C),y)
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq ($(CONFIG_ESPRESSIF_SPI),y)
|
ifeq ($(CONFIG_ESPRESSIF_SPI),y)
|
||||||
CHIP_CSRCS += esp_spi.c
|
ifeq ($(CONFIG_ESPRESSIF_SPI_PERIPH),y)
|
||||||
|
CHIP_CSRCS += esp_spi.c
|
||||||
|
endif
|
||||||
ifeq ($(CONFIG_SPI_SLAVE),y)
|
ifeq ($(CONFIG_SPI_SLAVE),y)
|
||||||
CHIP_CSRCS += esp_spi_slave.c
|
CHIP_CSRCS += esp_spi_slave.c
|
||||||
endif
|
endif
|
||||||
|
ifeq ($(CONFIG_ESPRESSIF_SPI_BITBANG),y)
|
||||||
|
CHIP_CSRCS += esp_spi_bitbang.c
|
||||||
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq ($(CONFIG_ESPRESSIF_SPIFLASH),y)
|
ifeq ($(CONFIG_ESPRESSIF_SPIFLASH),y)
|
||||||
|
|||||||
@@ -24,7 +24,7 @@
|
|||||||
|
|
||||||
#include <nuttx/config.h>
|
#include <nuttx/config.h>
|
||||||
|
|
||||||
#ifdef CONFIG_ESPRESSIF_SPI
|
#ifdef CONFIG_ESPRESSIF_SPI_PERIPH
|
||||||
|
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <debug.h>
|
#include <debug.h>
|
||||||
@@ -1283,4 +1283,4 @@ int esp_spibus_uninitialize(struct spi_dev_s *dev)
|
|||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* CONFIG_ESPRESSIF_SPI */
|
#endif /* CONFIG_ESPRESSIF_SPI_PERIPH */
|
||||||
|
|||||||
@@ -42,13 +42,11 @@ extern "C"
|
|||||||
#define EXTERN extern
|
#define EXTERN extern
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_ESPRESSIF_SPI
|
#ifdef CONFIG_ESPRESSIF_SPI_PERIPH
|
||||||
|
|
||||||
#include <nuttx/spi/spi.h>
|
#include <nuttx/spi/spi.h>
|
||||||
|
|
||||||
#ifdef CONFIG_ESPRESSIF_SPI2
|
#define ESPRESSIF_SPI2 2
|
||||||
# define ESPRESSIF_SPI2 2
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Public Function Prototypes
|
* Public Function Prototypes
|
||||||
@@ -159,7 +157,7 @@ struct spi_slave_ctrlr_s *esp_spislave_ctrlr_initialize(int port);
|
|||||||
|
|
||||||
int esp_spislave_ctrlr_uninitialize(struct spi_slave_ctrlr_s *ctrlr);
|
int esp_spislave_ctrlr_uninitialize(struct spi_slave_ctrlr_s *ctrlr);
|
||||||
|
|
||||||
#endif /* CONFIG_ESPRESSIF_SPI */
|
#endif /* CONFIG_ESPRESSIF_SPI_PERIPH */
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,251 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
* arch/risc-v/src/common/espressif/esp_spi_bitbang.c
|
||||||
|
*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file distributed with
|
||||||
|
* this work for additional information regarding copyright ownership. The
|
||||||
|
* ASF licenses this file to you under the Apache License, Version 2.0 (the
|
||||||
|
* "License"); you may not use this file except in compliance with the
|
||||||
|
* License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
* License for the specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Included Files
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#include <nuttx/config.h>
|
||||||
|
|
||||||
|
#ifdef CONFIG_ESPRESSIF_SPI_BITBANG
|
||||||
|
#include <sys/param.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <assert.h>
|
||||||
|
#include <debug.h>
|
||||||
|
|
||||||
|
#include <nuttx/arch.h>
|
||||||
|
#include <nuttx/irq.h>
|
||||||
|
#include <nuttx/mutex.h>
|
||||||
|
#include <nuttx/kmalloc.h>
|
||||||
|
#include <nuttx/spi/spi.h>
|
||||||
|
#include <nuttx/spi/spi_bitbang.h>
|
||||||
|
|
||||||
|
#include "riscv_internal.h"
|
||||||
|
#include "espressif/esp_gpio.h"
|
||||||
|
#include "soc/gpio_sig_map.h"
|
||||||
|
#include "esp_spi_bitbang.h"
|
||||||
|
#include <nuttx/spi/spi_bitbang.c>
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Pre-processor Definitions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#if defined(CONFIG_ESPRESSIF_SPI_BITBANG_MODE0)
|
||||||
|
#undef SPI_BITBANG_DISABLEMODE0
|
||||||
|
#define SPI_BITBANG_DISABLEMODE1 1
|
||||||
|
#define SPI_BITBANG_DISABLEMODE2 1
|
||||||
|
#define SPI_BITBANG_DISABLEMODE3 1
|
||||||
|
#elif defined(CONFIG_ESPRESSIF_SPI_BITBANG_MODE1)
|
||||||
|
#undef SPI_BITBANG_DISABLEMODE1
|
||||||
|
#define SPI_BITBANG_DISABLEMODE0 1
|
||||||
|
#define SPI_BITBANG_DISABLEMODE2 1
|
||||||
|
#define SPI_BITBANG_DISABLEMODE3 1
|
||||||
|
#elif defined(CONFIG_ESPRESSIF_SPI_BITBANG_MODE2)
|
||||||
|
#undef SPI_BITBANG_DISABLEMODE2
|
||||||
|
#define SPI_BITBANG_DISABLEMODE0 1
|
||||||
|
#define SPI_BITBANG_DISABLEMODE1 1
|
||||||
|
#define SPI_BITBANG_DISABLEMODE3 1
|
||||||
|
#else
|
||||||
|
#undef SPI_BITBANG_DISABLEMODE3
|
||||||
|
#define SPI_BITBANG_DISABLEMODE0 1
|
||||||
|
#define SPI_BITBANG_DISABLEMODE1 1
|
||||||
|
#define SPI_BITBANG_DISABLEMODE2 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Function Prototypes
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/* Lower-half SPI */
|
||||||
|
|
||||||
|
static void spi_select(struct spi_bitbang_s *priv, uint32_t devid,
|
||||||
|
bool selected);
|
||||||
|
static uint8_t spi_status(struct spi_bitbang_s *priv, uint32_t devid);
|
||||||
|
#ifdef CONFIG_SPI_CMDDATA
|
||||||
|
static int spi_cmddata(struct spi_bitbang_s *priv, uint32_t devid,
|
||||||
|
bool cmd);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Data
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
struct spi_bitbang_ops_s esp_spi_bitbang_ops =
|
||||||
|
{
|
||||||
|
.select = spi_select,
|
||||||
|
.status = spi_status,
|
||||||
|
#ifdef CONFIG_SPI_CMDDATA
|
||||||
|
.cmddata = spi_cmddata,
|
||||||
|
#endif
|
||||||
|
.setfrequency = spi_setfrequency,
|
||||||
|
.setmode = spi_setmode,
|
||||||
|
.exchange = spi_exchange,
|
||||||
|
};
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Functions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: spi_select
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Select or de-selected the SPI device specified by 'devid'
|
||||||
|
*
|
||||||
|
* Input Parameters:
|
||||||
|
* priv - An instance of the bit-bang driver structure
|
||||||
|
* devid - The device to select or de-select
|
||||||
|
* selected - True:select false:de-select
|
||||||
|
*
|
||||||
|
* Returned Value:
|
||||||
|
* None
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
static void spi_select(struct spi_bitbang_s *priv, uint32_t devid,
|
||||||
|
bool selected)
|
||||||
|
{
|
||||||
|
if (selected)
|
||||||
|
{
|
||||||
|
SPI_CLRCS;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SPI_SETCS;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: spi_status
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Return status of the SPI device specified by 'devid'
|
||||||
|
*
|
||||||
|
* Input Parameters:
|
||||||
|
* priv - An instance of the bit-bang driver structure
|
||||||
|
* devid - The device to select or de-select
|
||||||
|
*
|
||||||
|
* Returned Value:
|
||||||
|
* An 8-bit, bit-encoded status byte
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
static uint8_t spi_status(struct spi_bitbang_s *priv, uint32_t devid)
|
||||||
|
{
|
||||||
|
if (devid == SPIDEV_MMCSD(0))
|
||||||
|
{
|
||||||
|
return SPI_STATUS_PRESENT;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: spi_cmddata
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* If there were was a CMD/DATA line, this function would manage it
|
||||||
|
*
|
||||||
|
* Input Parameters:
|
||||||
|
* priv - An instance of the bit-bang driver structure
|
||||||
|
* devid - The device to use
|
||||||
|
* cmd - True=MCD false=DATA
|
||||||
|
*
|
||||||
|
* Returned Value:
|
||||||
|
* OK
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#ifdef CONFIG_SPI_CMDDATA
|
||||||
|
static int spi_cmddata(struct spi_bitbang_s *priv, uint32_t devid,
|
||||||
|
bool cmd)
|
||||||
|
{
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Public Functions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: esp_spi_bitbang_init
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Initialize the SPI bit-bang driver
|
||||||
|
*
|
||||||
|
* Input Parameters:
|
||||||
|
* None
|
||||||
|
*
|
||||||
|
* Returned Value:
|
||||||
|
* A non-NULL reference to the SPI driver on success
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
struct spi_dev_s *esp_spi_bitbang_init(void)
|
||||||
|
{
|
||||||
|
/* Configure the SPI bit-bang pins */
|
||||||
|
|
||||||
|
esp_gpiowrite(CONFIG_ESPRESSIF_SPI_BITBANG_CSPIN, true);
|
||||||
|
esp_gpiowrite(CONFIG_ESPRESSIF_SPI_BITBANG_MOSIPIN, true);
|
||||||
|
esp_gpiowrite(CONFIG_ESPRESSIF_SPI_BITBANG_CLKPIN, true);
|
||||||
|
|
||||||
|
#if CONFIG_ESPRESSIF_SPI_SWCS
|
||||||
|
esp_configgpio(CONFIG_ESPRESSIF_SPI_BITBANG_CSPIN, OUTPUT_FUNCTION_1);
|
||||||
|
esp_gpio_matrix_out(CONFIG_ESPRESSIF_SPI_BITBANG_CSPIN, SIG_GPIO_OUT_IDX,
|
||||||
|
0, 0);
|
||||||
|
#endif
|
||||||
|
esp_configgpio(CONFIG_ESPRESSIF_SPI_BITBANG_MOSIPIN, OUTPUT_FUNCTION_1);
|
||||||
|
esp_gpio_matrix_out(CONFIG_ESPRESSIF_SPI_BITBANG_MOSIPIN, SIG_GPIO_OUT_IDX,
|
||||||
|
0, 0);
|
||||||
|
|
||||||
|
esp_configgpio(CONFIG_ESPRESSIF_SPI_BITBANG_MISOPIN,
|
||||||
|
INPUT_FUNCTION_1 | PULLUP);
|
||||||
|
esp_gpio_matrix_out(CONFIG_ESPRESSIF_SPI_BITBANG_MISOPIN, SIG_GPIO_OUT_IDX,
|
||||||
|
0, 0);
|
||||||
|
|
||||||
|
esp_configgpio(CONFIG_ESPRESSIF_SPI_BITBANG_CLKPIN, OUTPUT_FUNCTION_1);
|
||||||
|
esp_gpio_matrix_out(CONFIG_ESPRESSIF_SPI_BITBANG_CLKPIN, SIG_GPIO_OUT_IDX,
|
||||||
|
0, 0);
|
||||||
|
|
||||||
|
/* Create the SPI driver instance */
|
||||||
|
|
||||||
|
return spi_create_bitbang(&esp_spi_bitbang_ops, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: esp_spi_bitbang_uninitialize
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Destroy an instance of the SPI bit-bang driver.
|
||||||
|
*
|
||||||
|
* Input Parameters:
|
||||||
|
* dev - device instance, target driver to destroy.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
void esp_spi_bitbang_uninitialize(struct spi_dev_s *dev)
|
||||||
|
{
|
||||||
|
spi_destroy_bitbang(dev);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* CONFIG_ESPRESSIF_SPI_BITBANG */
|
||||||
@@ -0,0 +1,116 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
* arch/risc-v/src/common/espressif/esp_spi_bitbang.h
|
||||||
|
*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file distributed with
|
||||||
|
* this work for additional information regarding copyright ownership. The
|
||||||
|
* ASF licenses this file to you under the Apache License, Version 2.0 (the
|
||||||
|
* "License"); you may not use this file except in compliance with the
|
||||||
|
* License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
* License for the specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Included Files
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#ifndef __ARCH_RISCV_SRC_COMMON_ESPRESSIF_ESP_SPI_BITBANG_H
|
||||||
|
#define __ARCH_RISCV_SRC_COMMON_ESPRESSIF_ESP_SPI_BITBANG_H
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Included Files
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#include <nuttx/config.h>
|
||||||
|
|
||||||
|
#ifndef __ASSEMBLY__
|
||||||
|
|
||||||
|
#undef EXTERN
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
#define EXTERN extern "C"
|
||||||
|
extern "C"
|
||||||
|
{
|
||||||
|
#else
|
||||||
|
#define EXTERN extern
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_ESPRESSIF_SPI_BITBANG
|
||||||
|
|
||||||
|
#include <nuttx/spi/spi.h>
|
||||||
|
#include <nuttx/spi/spi_bitbang.h>
|
||||||
|
#include "espressif/esp_gpio.h"
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Pre-processor Definitions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/* Macros needed to include/nuttx/spi/spi_bitbang.c. */
|
||||||
|
|
||||||
|
#define SPI_SETSCK esp_gpiowrite(CONFIG_ESPRESSIF_SPI_BITBANG_CLKPIN, true)
|
||||||
|
#define SPI_CLRSCK esp_gpiowrite(CONFIG_ESPRESSIF_SPI_BITBANG_CLKPIN, false)
|
||||||
|
#define SPI_SETMOSI esp_gpiowrite(CONFIG_ESPRESSIF_SPI_BITBANG_MOSIPIN, true)
|
||||||
|
#define SPI_CLRMOSI esp_gpiowrite(CONFIG_ESPRESSIF_SPI_BITBANG_MOSIPIN, \
|
||||||
|
false)
|
||||||
|
#define SPI_GETMISO esp_gpioread(CONFIG_ESPRESSIF_SPI_BITBANG_MISOPIN)
|
||||||
|
#define SPI_SETCS esp_gpiowrite(CONFIG_ESPRESSIF_SPI_BITBANG_CSPIN, true)
|
||||||
|
#define SPI_CLRCS esp_gpiowrite(CONFIG_ESPRESSIF_SPI_BITBANG_CSPIN, false)
|
||||||
|
|
||||||
|
/* Calibration value for timing loop */
|
||||||
|
|
||||||
|
#define SPI_BITBANG_LOOPSPERMSEC CONFIG_BOARD_LOOPSPERMSEC
|
||||||
|
|
||||||
|
/* SPI_PERBIT_NSEC is the minimum time to transfer one bit. This determines
|
||||||
|
* the maximum frequency and is also used to calculate delays to achieve
|
||||||
|
* other SPI frequencies.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define SPI_PERBIT_NSEC 100
|
||||||
|
|
||||||
|
#define ESPRESSIF_SPI_BITBANG 3
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: esp_spi_bitbang_init
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Initialize the SPI bit-bang driver
|
||||||
|
*
|
||||||
|
* Input Parameters:
|
||||||
|
* None
|
||||||
|
*
|
||||||
|
* Returned Value:
|
||||||
|
* A non-NULL reference to the SPI driver on success
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
struct spi_dev_s *esp_spi_bitbang_init(void);
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: esp_spi_bitbang_uninitialize
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Destroy an instance of the SPI bit-bang driver.
|
||||||
|
*
|
||||||
|
* Input Parameters:
|
||||||
|
* dev - device instance, target driver to destroy.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
void esp_spi_bitbang_uninitialize(struct spi_dev_s *dev);
|
||||||
|
|
||||||
|
#endif /* CONFIG_ESPRESSIF_SPI_BITBANG */
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#undef EXTERN
|
||||||
|
|
||||||
|
#endif /* __ASSEMBLY__ */
|
||||||
|
#endif /* __ARCH_RISCV_SRC_COMMON_ESPRESSIF_ESP_SPI_BITBANG_H */
|
||||||
@@ -30,16 +30,65 @@
|
|||||||
|
|
||||||
#include <nuttx/spi/spi_transfer.h>
|
#include <nuttx/spi/spi_transfer.h>
|
||||||
|
|
||||||
|
#ifdef CONFIG_ESPRESSIF_SPI_PERIPH
|
||||||
#include "espressif/esp_spi.h"
|
#include "espressif/esp_spi.h"
|
||||||
|
#endif
|
||||||
|
#ifdef CONFIG_ESPRESSIF_SPI_BITBANG
|
||||||
|
#include "espressif/esp_spi_bitbang.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "esp_board_spidev.h"
|
#include "esp_board_spidev.h"
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Public Functions
|
* Private Functions
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Name: board_spidev_initialize
|
* 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:
|
* Description:
|
||||||
* Initialize SPI driver and register the /dev/spi device.
|
* Initialize SPI driver and register the /dev/spi device.
|
||||||
@@ -53,9 +102,10 @@
|
|||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
int board_spidev_initialize(int port)
|
#ifdef CONFIG_ESPRESSIF_SPI_PERIPH
|
||||||
|
static int spi_driver_init(int port)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret = OK;
|
||||||
struct spi_dev_s *spi;
|
struct spi_dev_s *spi;
|
||||||
|
|
||||||
syslog(LOG_INFO, "Initializing /dev/spi%d...\n", port);
|
syslog(LOG_INFO, "Initializing /dev/spi%d...\n", port);
|
||||||
@@ -63,6 +113,7 @@ int board_spidev_initialize(int port)
|
|||||||
/* Initialize SPI device */
|
/* Initialize SPI device */
|
||||||
|
|
||||||
spi = esp_spibus_initialize(port);
|
spi = esp_spibus_initialize(port);
|
||||||
|
|
||||||
if (spi == NULL)
|
if (spi == NULL)
|
||||||
{
|
{
|
||||||
syslog(LOG_ERR, "Failed to initialize SPI%d.\n", port);
|
syslog(LOG_ERR, "Failed to initialize SPI%d.\n", port);
|
||||||
@@ -73,9 +124,68 @@ int board_spidev_initialize(int port)
|
|||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
{
|
{
|
||||||
syslog(LOG_ERR, "Failed to register /dev/spi%d: %d\n", port, ret);
|
syslog(LOG_ERR, "Failed to register /dev/spi%d: %d\n", port, ret);
|
||||||
|
|
||||||
esp_spibus_uninitialize(spi);
|
esp_spibus_uninitialize(spi);
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Public Functions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: board_spidev_initialize
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Configure the SPI drivers.
|
||||||
|
*
|
||||||
|
* 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 = OK;
|
||||||
|
|
||||||
|
switch (port)
|
||||||
|
{
|
||||||
|
#ifdef CONFIG_ESPRESSIF_SPI2
|
||||||
|
case ESPRESSIF_SPI2:
|
||||||
|
{
|
||||||
|
ret = spi_driver_init(ESPRESSIF_SPI2);
|
||||||
|
if (ret != OK)
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#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;
|
||||||
|
}
|
||||||
|
|||||||
@@ -70,6 +70,9 @@
|
|||||||
#ifdef CONFIG_ESPRESSIF_SPI
|
#ifdef CONFIG_ESPRESSIF_SPI
|
||||||
# include "espressif/esp_spi.h"
|
# include "espressif/esp_spi.h"
|
||||||
# include "esp_board_spidev.h"
|
# include "esp_board_spidev.h"
|
||||||
|
# ifdef CONFIG_ESPRESSIF_SPI_BITBANG
|
||||||
|
# include "espressif/esp_spi_bitbang.h"
|
||||||
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_ESPRESSIF_TEMP
|
#ifdef CONFIG_ESPRESSIF_TEMP
|
||||||
@@ -197,12 +200,22 @@ int esp_bringup(void)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(CONFIG_ESPRESSIF_SPI) && defined(CONFIG_SPI_DRIVER)
|
#if defined(CONFIG_ESPRESSIF_SPI) && defined(CONFIG_SPI_DRIVER)
|
||||||
|
# ifdef CONFIG_ESPRESSIF_SPI2
|
||||||
ret = board_spidev_initialize(ESPRESSIF_SPI2);
|
ret = board_spidev_initialize(ESPRESSIF_SPI2);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
{
|
{
|
||||||
syslog(LOG_ERR, "ERROR: Failed to init spidev 2: %d\n", ret);
|
syslog(LOG_ERR, "ERROR: Failed to init spidev 2: %d\n", ret);
|
||||||
}
|
}
|
||||||
#endif
|
# endif /* CONFIG_ESPRESSIF_SPI2 */
|
||||||
|
|
||||||
|
# ifdef CONFIG_ESPRESSIF_SPI_BITBANG
|
||||||
|
ret = board_spidev_initialize(ESPRESSIF_SPI_BITBANG);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
syslog(LOG_ERR, "ERROR: Failed to init spidev 3: %d\n", ret);
|
||||||
|
}
|
||||||
|
# endif /* CONFIG_ESPRESSIF_SPI_BITBANG */
|
||||||
|
#endif /* CONFIG_ESPRESSIF_SPI && CONFIG_SPI_DRIVER*/
|
||||||
|
|
||||||
#ifdef CONFIG_ESPRESSIF_SPIFLASH
|
#ifdef CONFIG_ESPRESSIF_SPIFLASH
|
||||||
ret = board_spiflash_init();
|
ret = board_spiflash_init();
|
||||||
|
|||||||
@@ -30,16 +30,65 @@
|
|||||||
|
|
||||||
#include <nuttx/spi/spi_transfer.h>
|
#include <nuttx/spi/spi_transfer.h>
|
||||||
|
|
||||||
|
#ifdef CONFIG_ESPRESSIF_SPI_PERIPH
|
||||||
#include "espressif/esp_spi.h"
|
#include "espressif/esp_spi.h"
|
||||||
|
#endif
|
||||||
|
#ifdef CONFIG_ESPRESSIF_SPI_BITBANG
|
||||||
|
#include "espressif/esp_spi_bitbang.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "esp_board_spidev.h"
|
#include "esp_board_spidev.h"
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Public Functions
|
* Private Functions
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Name: board_spidev_initialize
|
* 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:
|
* Description:
|
||||||
* Initialize SPI driver and register the /dev/spi device.
|
* Initialize SPI driver and register the /dev/spi device.
|
||||||
@@ -53,9 +102,10 @@
|
|||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
int board_spidev_initialize(int port)
|
#ifdef CONFIG_ESPRESSIF_SPI_PERIPH
|
||||||
|
static int spi_driver_init(int port)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret = OK;
|
||||||
struct spi_dev_s *spi;
|
struct spi_dev_s *spi;
|
||||||
|
|
||||||
syslog(LOG_INFO, "Initializing /dev/spi%d...\n", port);
|
syslog(LOG_INFO, "Initializing /dev/spi%d...\n", port);
|
||||||
@@ -63,6 +113,7 @@ int board_spidev_initialize(int port)
|
|||||||
/* Initialize SPI device */
|
/* Initialize SPI device */
|
||||||
|
|
||||||
spi = esp_spibus_initialize(port);
|
spi = esp_spibus_initialize(port);
|
||||||
|
|
||||||
if (spi == NULL)
|
if (spi == NULL)
|
||||||
{
|
{
|
||||||
syslog(LOG_ERR, "Failed to initialize SPI%d.\n", port);
|
syslog(LOG_ERR, "Failed to initialize SPI%d.\n", port);
|
||||||
@@ -73,9 +124,68 @@ int board_spidev_initialize(int port)
|
|||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
{
|
{
|
||||||
syslog(LOG_ERR, "Failed to register /dev/spi%d: %d\n", port, ret);
|
syslog(LOG_ERR, "Failed to register /dev/spi%d: %d\n", port, ret);
|
||||||
|
|
||||||
esp_spibus_uninitialize(spi);
|
esp_spibus_uninitialize(spi);
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Public Functions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: board_spidev_initialize
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Configure the SPI drivers.
|
||||||
|
*
|
||||||
|
* 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 = OK;
|
||||||
|
|
||||||
|
switch (port)
|
||||||
|
{
|
||||||
|
#ifdef CONFIG_ESPRESSIF_SPI2
|
||||||
|
case ESPRESSIF_SPI2:
|
||||||
|
{
|
||||||
|
ret = spi_driver_init(ESPRESSIF_SPI2);
|
||||||
|
if (ret != OK)
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#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;
|
||||||
|
}
|
||||||
|
|||||||
@@ -70,6 +70,9 @@
|
|||||||
#ifdef CONFIG_ESPRESSIF_SPI
|
#ifdef CONFIG_ESPRESSIF_SPI
|
||||||
# include "espressif/esp_spi.h"
|
# include "espressif/esp_spi.h"
|
||||||
# include "esp_board_spidev.h"
|
# include "esp_board_spidev.h"
|
||||||
|
# ifdef CONFIG_ESPRESSIF_SPI_BITBANG
|
||||||
|
# include "espressif/esp_spi_bitbang.h"
|
||||||
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_ESPRESSIF_TEMP
|
#ifdef CONFIG_ESPRESSIF_TEMP
|
||||||
@@ -225,12 +228,22 @@ int esp_bringup(void)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(CONFIG_ESPRESSIF_SPI) && defined(CONFIG_SPI_DRIVER)
|
#if defined(CONFIG_ESPRESSIF_SPI) && defined(CONFIG_SPI_DRIVER)
|
||||||
|
# ifdef CONFIG_ESPRESSIF_SPI2
|
||||||
ret = board_spidev_initialize(ESPRESSIF_SPI2);
|
ret = board_spidev_initialize(ESPRESSIF_SPI2);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
{
|
{
|
||||||
syslog(LOG_ERR, "ERROR: Failed to init spidev 2: %d\n", ret);
|
syslog(LOG_ERR, "ERROR: Failed to init spidev 2: %d\n", ret);
|
||||||
}
|
}
|
||||||
#endif
|
# endif /* CONFIG_ESPRESSIF_SPI2 */
|
||||||
|
|
||||||
|
# ifdef CONFIG_ESPRESSIF_SPI_BITBANG
|
||||||
|
ret = board_spidev_initialize(ESPRESSIF_SPI_BITBANG);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
syslog(LOG_ERR, "ERROR: Failed to init spidev 3: %d\n", ret);
|
||||||
|
}
|
||||||
|
# endif /* CONFIG_ESPRESSIF_SPI_BITBANG */
|
||||||
|
#endif /* CONFIG_ESPRESSIF_SPI && CONFIG_SPI_DRIVER*/
|
||||||
|
|
||||||
#ifdef CONFIG_ESPRESSIF_SPIFLASH
|
#ifdef CONFIG_ESPRESSIF_SPIFLASH
|
||||||
ret = board_spiflash_init();
|
ret = board_spiflash_init();
|
||||||
|
|||||||
@@ -70,6 +70,9 @@
|
|||||||
#ifdef CONFIG_ESPRESSIF_SPI
|
#ifdef CONFIG_ESPRESSIF_SPI
|
||||||
# include "espressif/esp_spi.h"
|
# include "espressif/esp_spi.h"
|
||||||
# include "esp_board_spidev.h"
|
# include "esp_board_spidev.h"
|
||||||
|
# ifdef CONFIG_ESPRESSIF_SPI_BITBANG
|
||||||
|
# include "espressif/esp_spi_bitbang.h"
|
||||||
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_ESPRESSIF_TEMP
|
#ifdef CONFIG_ESPRESSIF_TEMP
|
||||||
@@ -221,12 +224,22 @@ int esp_bringup(void)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(CONFIG_ESPRESSIF_SPI) && defined(CONFIG_SPI_DRIVER)
|
#if defined(CONFIG_ESPRESSIF_SPI) && defined(CONFIG_SPI_DRIVER)
|
||||||
|
# ifdef CONFIG_ESPRESSIF_SPI2
|
||||||
ret = board_spidev_initialize(ESPRESSIF_SPI2);
|
ret = board_spidev_initialize(ESPRESSIF_SPI2);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
{
|
{
|
||||||
syslog(LOG_ERR, "ERROR: Failed to init spidev 2: %d\n", ret);
|
syslog(LOG_ERR, "ERROR: Failed to init spidev 2: %d\n", ret);
|
||||||
}
|
}
|
||||||
#endif
|
# endif /* CONFIG_ESPRESSIF_SPI2 */
|
||||||
|
|
||||||
|
# ifdef CONFIG_ESPRESSIF_SPI_BITBANG
|
||||||
|
ret = board_spidev_initialize(ESPRESSIF_SPI_BITBANG);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
syslog(LOG_ERR, "ERROR: Failed to init spidev 3: %d\n", ret);
|
||||||
|
}
|
||||||
|
# endif /* CONFIG_ESPRESSIF_SPI_BITBANG */
|
||||||
|
#endif /* CONFIG_ESPRESSIF_SPI && CONFIG_SPI_DRIVER*/
|
||||||
|
|
||||||
#ifdef CONFIG_ESPRESSIF_SPIFLASH
|
#ifdef CONFIG_ESPRESSIF_SPIFLASH
|
||||||
ret = board_spiflash_init();
|
ret = board_spiflash_init();
|
||||||
|
|||||||
@@ -30,16 +30,65 @@
|
|||||||
|
|
||||||
#include <nuttx/spi/spi_transfer.h>
|
#include <nuttx/spi/spi_transfer.h>
|
||||||
|
|
||||||
|
#ifdef CONFIG_ESPRESSIF_SPI_PERIPH
|
||||||
#include "espressif/esp_spi.h"
|
#include "espressif/esp_spi.h"
|
||||||
|
#endif
|
||||||
|
#ifdef CONFIG_ESPRESSIF_SPI_BITBANG
|
||||||
|
#include "espressif/esp_spi_bitbang.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "esp_board_spidev.h"
|
#include "esp_board_spidev.h"
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Public Functions
|
* Private Functions
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Name: board_spidev_initialize
|
* 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:
|
* Description:
|
||||||
* Initialize SPI driver and register the /dev/spi device.
|
* Initialize SPI driver and register the /dev/spi device.
|
||||||
@@ -53,9 +102,10 @@
|
|||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
int board_spidev_initialize(int port)
|
#ifdef CONFIG_ESPRESSIF_SPI_PERIPH
|
||||||
|
static int spi_driver_init(int port)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret = OK;
|
||||||
struct spi_dev_s *spi;
|
struct spi_dev_s *spi;
|
||||||
|
|
||||||
syslog(LOG_INFO, "Initializing /dev/spi%d...\n", port);
|
syslog(LOG_INFO, "Initializing /dev/spi%d...\n", port);
|
||||||
@@ -63,6 +113,7 @@ int board_spidev_initialize(int port)
|
|||||||
/* Initialize SPI device */
|
/* Initialize SPI device */
|
||||||
|
|
||||||
spi = esp_spibus_initialize(port);
|
spi = esp_spibus_initialize(port);
|
||||||
|
|
||||||
if (spi == NULL)
|
if (spi == NULL)
|
||||||
{
|
{
|
||||||
syslog(LOG_ERR, "Failed to initialize SPI%d.\n", port);
|
syslog(LOG_ERR, "Failed to initialize SPI%d.\n", port);
|
||||||
@@ -73,9 +124,68 @@ int board_spidev_initialize(int port)
|
|||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
{
|
{
|
||||||
syslog(LOG_ERR, "Failed to register /dev/spi%d: %d\n", port, ret);
|
syslog(LOG_ERR, "Failed to register /dev/spi%d: %d\n", port, ret);
|
||||||
|
|
||||||
esp_spibus_uninitialize(spi);
|
esp_spibus_uninitialize(spi);
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Public Functions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: board_spidev_initialize
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Configure the SPI drivers.
|
||||||
|
*
|
||||||
|
* 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 = OK;
|
||||||
|
|
||||||
|
switch (port)
|
||||||
|
{
|
||||||
|
#ifdef CONFIG_ESPRESSIF_SPI2
|
||||||
|
case ESPRESSIF_SPI2:
|
||||||
|
{
|
||||||
|
ret = spi_driver_init(ESPRESSIF_SPI2);
|
||||||
|
if (ret != OK)
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#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;
|
||||||
|
}
|
||||||
|
|||||||
@@ -70,6 +70,9 @@
|
|||||||
#ifdef CONFIG_ESPRESSIF_SPI
|
#ifdef CONFIG_ESPRESSIF_SPI
|
||||||
# include "espressif/esp_spi.h"
|
# include "espressif/esp_spi.h"
|
||||||
# include "esp_board_spidev.h"
|
# include "esp_board_spidev.h"
|
||||||
|
# ifdef CONFIG_ESPRESSIF_SPI_BITBANG
|
||||||
|
# include "espressif/esp_spi_bitbang.h"
|
||||||
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_SPI_SLAVE_DRIVER
|
#ifdef CONFIG_SPI_SLAVE_DRIVER
|
||||||
@@ -213,12 +216,22 @@ int esp_bringup(void)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(CONFIG_ESPRESSIF_SPI) && defined(CONFIG_SPI_DRIVER)
|
#if defined(CONFIG_ESPRESSIF_SPI) && defined(CONFIG_SPI_DRIVER)
|
||||||
|
# ifdef CONFIG_ESPRESSIF_SPI2
|
||||||
ret = board_spidev_initialize(ESPRESSIF_SPI2);
|
ret = board_spidev_initialize(ESPRESSIF_SPI2);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
{
|
{
|
||||||
syslog(LOG_ERR, "ERROR: Failed to init spidev 2: %d\n", ret);
|
syslog(LOG_ERR, "ERROR: Failed to init spidev 2: %d\n", ret);
|
||||||
}
|
}
|
||||||
#endif
|
# endif /* CONFIG_ESPRESSIF_SPI2 */
|
||||||
|
|
||||||
|
# ifdef CONFIG_ESPRESSIF_SPI_BITBANG
|
||||||
|
ret = board_spidev_initialize(ESPRESSIF_SPI_BITBANG);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
syslog(LOG_ERR, "ERROR: Failed to init spidev 3: %d\n", ret);
|
||||||
|
}
|
||||||
|
# endif /* CONFIG_ESPRESSIF_SPI_BITBANG */
|
||||||
|
#endif /* CONFIG_ESPRESSIF_SPI && CONFIG_SPI_DRIVER*/
|
||||||
|
|
||||||
#ifdef CONFIG_ESPRESSIF_SPIFLASH
|
#ifdef CONFIG_ESPRESSIF_SPIFLASH
|
||||||
ret = board_spiflash_init();
|
ret = board_spiflash_init();
|
||||||
|
|||||||
Reference in New Issue
Block a user