forked from Makuna/NeoPixelBus
@@ -32,12 +32,12 @@ License along with NeoPixel. If not, see
|
|||||||
// API and type use require newer IDF versions
|
// API and type use require newer IDF versions
|
||||||
#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 4, 1)
|
#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 4, 1)
|
||||||
|
|
||||||
template<typename T_SPISPEED, typename T_SPIBUS> class _DotStarEsp32DmaSpiMethod
|
template<typename T_SPISPEED, typename T_SPIBUS> class DotStarEsp32DmaSpiMethodBase
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
typedef typename T_SPISPEED::SettingsObject SettingsObject;
|
typedef typename T_SPISPEED::SettingsObject SettingsObject;
|
||||||
|
|
||||||
_DotStarEsp32DmaSpiMethod(uint16_t pixelCount, size_t elementSize, size_t settingsSize) :
|
DotStarEsp32DmaSpiMethodBase(uint16_t pixelCount, size_t elementSize, size_t settingsSize) :
|
||||||
_sizeStartFrame(4 * T_SPIBUS::ParallelBits),
|
_sizeStartFrame(4 * T_SPIBUS::ParallelBits),
|
||||||
_sizePixelData(pixelCount * elementSize + settingsSize),
|
_sizePixelData(pixelCount * elementSize + settingsSize),
|
||||||
_sizeEndFrame((pixelCount + 15) / 16 * T_SPIBUS::ParallelBits) // 16 = div 2 (bit for every two pixels) div 8 (bits to bytes)
|
_sizeEndFrame((pixelCount + 15) / 16 * T_SPIBUS::ParallelBits) // 16 = div 2 (bit for every two pixels) div 8 (bits to bytes)
|
||||||
@@ -58,12 +58,12 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Support constructor specifying pins by ignoring pins
|
// Support constructor specifying pins by ignoring pins
|
||||||
_DotStarEsp32DmaSpiMethod(uint8_t, uint8_t, uint16_t pixelCount, size_t elementSize, size_t settingsSize) :
|
DotStarEsp32DmaSpiMethodBase(uint8_t, uint8_t, uint16_t pixelCount, size_t elementSize, size_t settingsSize) :
|
||||||
_DotStarEsp32DmaSpiMethod(pixelCount, elementSize, settingsSize)
|
DotStarEsp32DmaSpiMethodBase(pixelCount, elementSize, settingsSize)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
~_DotStarEsp32DmaSpiMethod()
|
~DotStarEsp32DmaSpiMethodBase()
|
||||||
{
|
{
|
||||||
if (_spiHandle)
|
if (_spiHandle)
|
||||||
{
|
{
|
||||||
@@ -79,7 +79,7 @@ public:
|
|||||||
bool IsReadyToUpdate() const
|
bool IsReadyToUpdate() const
|
||||||
{
|
{
|
||||||
spi_transaction_t t;
|
spi_transaction_t t;
|
||||||
spi_transaction_t * tptr = &t;
|
spi_transaction_t* tptr = &t;
|
||||||
|
|
||||||
esp_err_t ret = spi_device_get_trans_result(_spiHandle, &tptr, 0);
|
esp_err_t ret = spi_device_get_trans_result(_spiHandle, &tptr, 0);
|
||||||
|
|
||||||
@@ -96,9 +96,8 @@ public:
|
|||||||
_ssPin = ss;
|
_ssPin = ss;
|
||||||
|
|
||||||
esp_err_t ret;
|
esp_err_t ret;
|
||||||
spi_bus_config_t buscfg;
|
spi_bus_config_t buscfg = { 0 };
|
||||||
memset(&buscfg, 0x00, sizeof(buscfg));
|
|
||||||
|
|
||||||
buscfg.sclk_io_num = sck;
|
buscfg.sclk_io_num = sck;
|
||||||
buscfg.data0_io_num = dat0;
|
buscfg.data0_io_num = dat0;
|
||||||
buscfg.data1_io_num = dat1;
|
buscfg.data1_io_num = dat1;
|
||||||
@@ -109,7 +108,8 @@ public:
|
|||||||
buscfg.data6_io_num = dat6;
|
buscfg.data6_io_num = dat6;
|
||||||
buscfg.data7_io_num = dat7;
|
buscfg.data7_io_num = dat7;
|
||||||
buscfg.max_transfer_sz = _spiBufferSize;
|
buscfg.max_transfer_sz = _spiBufferSize;
|
||||||
if (T_SPIBUS::ParallelBits == 8) {
|
if (T_SPIBUS::ParallelBits == 8)
|
||||||
|
{
|
||||||
buscfg.flags = SPICOMMON_BUSFLAG_OCTAL;
|
buscfg.flags = SPICOMMON_BUSFLAG_OCTAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -117,6 +117,7 @@ public:
|
|||||||
ret = spi_bus_initialize(T_SPIBUS::SpiHostDevice, &buscfg, SPI_DMA_CH_AUTO);
|
ret = spi_bus_initialize(T_SPIBUS::SpiHostDevice, &buscfg, SPI_DMA_CH_AUTO);
|
||||||
ESP_ERROR_CHECK(ret);
|
ESP_ERROR_CHECK(ret);
|
||||||
|
|
||||||
|
_spiTransaction = { 0 };
|
||||||
initSpiDevice();
|
initSpiDevice();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -156,8 +157,9 @@ public:
|
|||||||
|
|
||||||
memcpy(_dmadata, _data, _spiBufferSize);
|
memcpy(_dmadata, _data, _spiBufferSize);
|
||||||
|
|
||||||
memset(&_spiTransaction, 0, sizeof(spi_transaction_t));
|
_spiTransaction = { 0 };
|
||||||
_spiTransaction.length = (_spiBufferSize) * 8; // in bits not bytes!
|
_spiTransaction.length = (_spiBufferSize) * 8; // in bits not bytes!
|
||||||
|
|
||||||
if (T_SPIBUS::ParallelBits == 1)
|
if (T_SPIBUS::ParallelBits == 1)
|
||||||
{
|
{
|
||||||
_spiTransaction.flags = 0;
|
_spiTransaction.flags = 0;
|
||||||
@@ -209,7 +211,7 @@ public:
|
|||||||
private:
|
private:
|
||||||
void initSpiDevice()
|
void initSpiDevice()
|
||||||
{
|
{
|
||||||
spi_device_interface_config_t devcfg = {};
|
spi_device_interface_config_t devcfg = {0};
|
||||||
|
|
||||||
devcfg.clock_speed_hz = _speed.Clock;
|
devcfg.clock_speed_hz = _speed.Clock;
|
||||||
devcfg.mode = 0; //SPI mode 0
|
devcfg.mode = 0; //SPI mode 0
|
||||||
@@ -265,7 +267,7 @@ enum spi_bus_width_t {
|
|||||||
WIDTH8 = 8,
|
WIDTH8 = 8,
|
||||||
};
|
};
|
||||||
|
|
||||||
template <spi_host_device_t bus, spi_bus_width_t bits=WIDTH1>
|
template <spi_host_device_t bus, spi_bus_width_t bits = WIDTH1>
|
||||||
struct Esp32SpiBus
|
struct Esp32SpiBus
|
||||||
{
|
{
|
||||||
const static spi_host_device_t SpiHostDevice = bus;
|
const static spi_host_device_t SpiHostDevice = bus;
|
||||||
@@ -280,9 +282,9 @@ typedef Esp32SpiBus<SPI1_HOST, WIDTH1> Esp32Spi1Bus;
|
|||||||
typedef Esp32SpiBus<SPI1_HOST, WIDTH2> Esp32Spi12BitBus;
|
typedef Esp32SpiBus<SPI1_HOST, WIDTH2> Esp32Spi12BitBus;
|
||||||
typedef Esp32SpiBus<SPI1_HOST, WIDTH4> Esp32Spi14BitBus;
|
typedef Esp32SpiBus<SPI1_HOST, WIDTH4> Esp32Spi14BitBus;
|
||||||
|
|
||||||
typedef _DotStarEsp32DmaSpiMethod<SpiSpeed10Mhz, Esp32Spi1Bus> DotStarEsp32DmaSpi1Method;
|
typedef DotStarEsp32DmaSpiMethodBase<SpiSpeed10Mhz, Esp32Spi1Bus> DotStarEsp32DmaSpi1Method;
|
||||||
typedef _DotStarEsp32DmaSpiMethod<SpiSpeed10Mhz, Esp32Spi12BitBus> DotStarEsp32DmaSpi12BitMethod;
|
typedef DotStarEsp32DmaSpiMethodBase<SpiSpeed10Mhz, Esp32Spi12BitBus> DotStarEsp32DmaSpi12BitMethod;
|
||||||
typedef _DotStarEsp32DmaSpiMethod<SpiSpeed10Mhz, Esp32Spi14BitBus> DotStarEsp32DmaSpi14BitMethod;
|
typedef DotStarEsp32DmaSpiMethodBase<SpiSpeed10Mhz, Esp32Spi14BitBus> DotStarEsp32DmaSpi14BitMethod;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// SPI2
|
// SPI2
|
||||||
@@ -293,11 +295,11 @@ typedef Esp32SpiBus<SPI2_HOST, WIDTH4> Esp32Spi24BitBus;
|
|||||||
typedef Esp32SpiBus<SPI2_HOST, WIDTH8> Esp32Spi28BitBus;
|
typedef Esp32SpiBus<SPI2_HOST, WIDTH8> Esp32Spi28BitBus;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
typedef _DotStarEsp32DmaSpiMethod<SpiSpeed10Mhz, Esp32Spi2Bus> DotStarEsp32DmaSpi2Method;
|
typedef DotStarEsp32DmaSpiMethodBase<SpiSpeed10Mhz, Esp32Spi2Bus> DotStarEsp32DmaSpi2Method;
|
||||||
typedef _DotStarEsp32DmaSpiMethod<SpiSpeed10Mhz, Esp32Spi22BitBus> DotStarEsp32DmaSpi22BitMethod;
|
typedef DotStarEsp32DmaSpiMethodBase<SpiSpeed10Mhz, Esp32Spi22BitBus> DotStarEsp32DmaSpi22BitMethod;
|
||||||
typedef _DotStarEsp32DmaSpiMethod<SpiSpeed10Mhz, Esp32Spi24BitBus> DotStarEsp32DmaSpi24BitMethod;
|
typedef DotStarEsp32DmaSpiMethodBase<SpiSpeed10Mhz, Esp32Spi24BitBus> DotStarEsp32DmaSpi24BitMethod;
|
||||||
#if SOC_SPI_SUPPORT_OCT
|
#if SOC_SPI_SUPPORT_OCT
|
||||||
typedef _DotStarEsp32DmaSpiMethod<SpiSpeed10Mhz, Esp32Spi28BitBus> DotStarEsp32DmaSpi28BitMethod;
|
typedef DotStarEsp32DmaSpiMethodBase<SpiSpeed10Mhz, Esp32Spi28BitBus> DotStarEsp32DmaSpi28BitMethod;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
@@ -307,14 +309,14 @@ typedef Esp32SpiBus<SPI3_HOST, WIDTH1> Esp32Spi3Bus;
|
|||||||
typedef Esp32SpiBus<SPI3_HOST, WIDTH2> Esp32Spi32BitBus;
|
typedef Esp32SpiBus<SPI3_HOST, WIDTH2> Esp32Spi32BitBus;
|
||||||
typedef Esp32SpiBus<SPI3_HOST, WIDTH4> Esp32Spi34BitBus;
|
typedef Esp32SpiBus<SPI3_HOST, WIDTH4> Esp32Spi34BitBus;
|
||||||
|
|
||||||
typedef _DotStarEsp32DmaSpiMethod<SpiSpeed10Mhz, Esp32Spi3Bus> DotStarEsp32DmaSpi3Method;
|
typedef DotStarEsp32DmaSpiMethodBase<SpiSpeed10Mhz, Esp32Spi3Bus> DotStarEsp32DmaSpi3Method;
|
||||||
typedef _DotStarEsp32DmaSpiMethod<SpiSpeed10Mhz, Esp32Spi32BitBus> DotStarEsp32DmaSpi32BitMethod;
|
typedef DotStarEsp32DmaSpiMethodBase<SpiSpeed10Mhz, Esp32Spi32BitBus> DotStarEsp32DmaSpi32BitMethod;
|
||||||
typedef _DotStarEsp32DmaSpiMethod<SpiSpeed10Mhz, Esp32Spi34BitBus> DotStarEsp32DmaSpi34BitMethod;
|
typedef DotStarEsp32DmaSpiMethodBase<SpiSpeed10Mhz, Esp32Spi34BitBus> DotStarEsp32DmaSpi34BitMethod;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(CONFIG_IDF_TARGET_ESP32S2)
|
#if defined(CONFIG_IDF_TARGET_ESP32S2)
|
||||||
typedef Esp32SpiBus<SPI3_HOST, WIDTH1> Esp32Spi3Bus;
|
typedef Esp32SpiBus<SPI3_HOST, WIDTH1> Esp32Spi3Bus;
|
||||||
typedef _DotStarEsp32DmaSpiMethod<SpiSpeed10Mhz, Esp32Spi3Bus> DotStarEsp32DmaSpi3Method;
|
typedef DotStarEsp32DmaSpiMethodBase<SpiSpeed10Mhz, Esp32Spi3Bus> DotStarEsp32DmaSpi3Method;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Default SpiDma methods if we don't care about bus. It's nice that every single ESP32 out there
|
// Default SpiDma methods if we don't care about bus. It's nice that every single ESP32 out there
|
||||||
|
Reference in New Issue
Block a user