From 0afe0d7fc99161c292da70a2537f421fbbc2d379 Mon Sep 17 00:00:00 2001 From: lumapu Date: Thu, 18 Apr 2024 23:04:28 +0200 Subject: [PATCH] fix SPI topics, not completely tested --- .gitattributes | 1 + src/hm/nrfHal.h | 9 ++++----- src/hms/cmtHal.h | 9 ++++----- src/network/AhoyEthernetSpi.h | 27 +++++++------------------- src/plugins/Display/epdHal.h | 9 ++++----- src/utils/dbg.h | 2 +- src/utils/spiPatcher.cpp | 3 ++- src/utils/spiPatcher.h | 36 +++++++++++++++++++++++++---------- 8 files changed, 49 insertions(+), 47 deletions(-) create mode 100644 .gitattributes diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000..3041f8dc --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +patches/GxEPD2_HAL.patch eol=crlf \ No newline at end of file diff --git a/src/hm/nrfHal.h b/src/hm/nrfHal.h index 4bd14763..a9bd89d2 100644 --- a/src/hm/nrfHal.h +++ b/src/hm/nrfHal.h @@ -17,9 +17,7 @@ class nrfHal: public RF24_hal, public SpiPatcherHandle { public: - nrfHal() { - mSpiPatcher = SpiPatcher::getInstance(SPI2_HOST); - } + nrfHal() {} void patch() override { esp_rom_gpio_connect_out_signal(mPinMosi, spi_periph_signal[mHostDevice].spid_out, false, false); @@ -41,7 +39,8 @@ class nrfHal: public RF24_hal, public SpiPatcherHandle { mPinEn = static_cast(en); mSpiSpeed = speed; - mHostDevice = mSpiPatcher->getDevice(); + mHostDevice = (14 == sclk) ? SPI2_HOST : SPI3_HOST; + mSpiPatcher = SpiPatcher::getInstance(mHostDevice); gpio_reset_pin(mPinMosi); gpio_set_direction(mPinMosi, GPIO_MODE_OUTPUT); @@ -72,7 +71,7 @@ class nrfHal: public RF24_hal, public SpiPatcherHandle { .pre_cb = nullptr, .post_cb = nullptr }; - ESP_ERROR_CHECK(spi_bus_add_device(mHostDevice, &devcfg, &spi)); + mSpiPatcher->addDevice(mHostDevice, &devcfg, &spi); release_spi(); gpio_reset_pin(mPinEn); diff --git a/src/hms/cmtHal.h b/src/hms/cmtHal.h index 676b0b71..58f79da4 100644 --- a/src/hms/cmtHal.h +++ b/src/hms/cmtHal.h @@ -16,9 +16,7 @@ class cmtHal : public SpiPatcherHandle { public: - cmtHal() { - mSpiPatcher = SpiPatcher::getInstance(DEF_CMT_SPI_HOST); - } + cmtHal() {} void patch() override { esp_rom_gpio_connect_out_signal(mPinSdio, spi_periph_signal[mHostDevice].spid_out, false, false); @@ -39,7 +37,8 @@ class cmtHal : public SpiPatcherHandle { mPinFcs = static_cast(fcs); mSpiSpeed = speed; - mHostDevice = mSpiPatcher->getDevice(); + mHostDevice = (14 == clk) ? SPI2_HOST : SPI3_HOST; + mSpiPatcher = SpiPatcher::getInstance(mHostDevice); gpio_reset_pin(mPinSdio); gpio_set_direction(mPinSdio, GPIO_MODE_INPUT_OUTPUT); @@ -67,7 +66,7 @@ class cmtHal : public SpiPatcherHandle { .pre_cb = nullptr, .post_cb = nullptr }; - ESP_ERROR_CHECK(spi_bus_add_device(mHostDevice, &devcfg_reg, &spi_reg)); + mSpiPatcher->addDevice(mHostDevice, &devcfg_reg, &spi_reg); release_spi(); gpio_reset_pin(mPinFcs); diff --git a/src/network/AhoyEthernetSpi.h b/src/network/AhoyEthernetSpi.h index b41431b4..7b5bac85 100644 --- a/src/network/AhoyEthernetSpi.h +++ b/src/network/AhoyEthernetSpi.h @@ -12,7 +12,7 @@ #include #include #include -#include +#include "../utils/spiPatcher.h" // Functions from WiFiGeneric void tcpipInit(); @@ -44,23 +44,8 @@ class AhoyEthernetSpi { gpio_reset_pin(static_cast(pin_int)); gpio_set_pull_mode(static_cast(pin_int), GPIO_PULLUP_ONLY); - - spi_bus_config_t buscfg = { - .mosi_io_num = pin_mosi, - .miso_io_num = pin_miso, - .sclk_io_num = pin_sclk, - .quadwp_io_num = -1, - .quadhd_io_num = -1, - .data4_io_num = -1, - .data5_io_num = -1, - .data6_io_num = -1, - .data7_io_num = -1, - .max_transfer_sz = 0, // uses default value internally - .flags = 0, - .intr_flags = 0 - }; - - ESP_ERROR_CHECK(spi_bus_initialize(SPI3_HOST, &buscfg, SPI_DMA_CH_AUTO)); + mHostDevice = (14 == pin_sclk) ? SPI2_HOST : SPI3_HOST; + mSpiPatcher = SpiPatcher::getInstance(mHostDevice); spi_device_interface_config_t devcfg = { .command_bits = 16, // actually address phase @@ -79,8 +64,7 @@ class AhoyEthernetSpi { .post_cb = nullptr }; - spi_device_handle_t spi; - ESP_ERROR_CHECK(spi_bus_add_device(SPI3_HOST, &devcfg, &spi)); + mSpiPatcher->addDevice(mHostDevice, &devcfg, &spi); // Reset sequence if(-1 != pin_rst) { @@ -137,6 +121,9 @@ class AhoyEthernetSpi { private: esp_eth_handle_t eth_handle; esp_netif_t *eth_netif; + spi_host_device_t mHostDevice; + spi_device_handle_t spi; + SpiPatcher *mSpiPatcher; }; #endif /*__ETH_SPI_H__*/ diff --git a/src/plugins/Display/epdHal.h b/src/plugins/Display/epdHal.h index 1219f107..4d2057dd 100644 --- a/src/plugins/Display/epdHal.h +++ b/src/plugins/Display/epdHal.h @@ -15,9 +15,7 @@ class epdHal: public GxEPD2_HalInterface, public SpiPatcherHandle { public: - epdHal() { - mSpiPatcher = SpiPatcher::getInstance(SPI3_HOST); - } + epdHal() {} void patch() override { esp_rom_gpio_connect_out_signal(mPinMosi, spi_periph_signal[mHostDevice].spid_out, false, false); @@ -40,7 +38,8 @@ class epdHal: public GxEPD2_HalInterface, public SpiPatcherHandle { mPinBusy = static_cast(busy); mSpiSpeed = speed; - mHostDevice = mSpiPatcher->getDevice(); + mHostDevice = (14 == sclk) ? SPI2_HOST : SPI3_HOST; + mSpiPatcher = SpiPatcher::getInstance(mHostDevice); gpio_reset_pin(mPinMosi); gpio_set_direction(mPinMosi, GPIO_MODE_OUTPUT); @@ -68,7 +67,7 @@ class epdHal: public GxEPD2_HalInterface, public SpiPatcherHandle { .pre_cb = nullptr, .post_cb = nullptr }; - ESP_ERROR_CHECK(spi_bus_add_device(mHostDevice, &devcfg, &spi)); + mSpiPatcher->addDevice(mHostDevice, &devcfg, &spi); release_spi(); if(GPIO_NUM_NC != mPinRst) { diff --git a/src/utils/dbg.h b/src/utils/dbg.h index 9e754ba6..f6dd8012 100644 --- a/src/utils/dbg.h +++ b/src/utils/dbg.h @@ -110,7 +110,7 @@ #if DEBUG_LEVEL >= DBG_ERROR #define PERR(str) DBGPRINT(F("E: ")); DBGPRINT(str); - #define PERRLN(str) DBGPRINT(F("E: ")); DBGPRINTLN(str); + #define PERRLN(str) DBGPRINT(F("E: ")); DBGPRINTLN(str); DSERIAL.flush(); #else #define PERR(str) #define PERRLN(str) diff --git a/src/utils/spiPatcher.cpp b/src/utils/spiPatcher.cpp index 3b7b5681..b3d27482 100644 --- a/src/utils/spiPatcher.cpp +++ b/src/utils/spiPatcher.cpp @@ -5,5 +5,6 @@ #if defined(ESP32) #include "spiPatcher.h" -SpiPatcher *SpiPatcher::mInstance = nullptr; +SpiPatcher *SpiPatcher::InstanceHost2 = nullptr; +SpiPatcher *SpiPatcher::InstanceHost3 = nullptr; #endif diff --git a/src/utils/spiPatcher.h b/src/utils/spiPatcher.h index 210b2a09..23775a36 100644 --- a/src/utils/spiPatcher.h +++ b/src/utils/spiPatcher.h @@ -9,6 +9,7 @@ #if defined(ESP32) +#include "dbg.h" #include "spiPatcherHandle.h" #include @@ -17,7 +18,7 @@ class SpiPatcher { protected: explicit SpiPatcher(spi_host_device_t dev) : - mHostDevice(dev), mCurHandle(nullptr) { + mCurHandle(nullptr) { // Use binary semaphore instead of mutex for performance reasons mutex = xSemaphoreCreateBinaryStatic(&mutex_buffer); xSemaphoreGive(mutex); @@ -36,23 +37,37 @@ class SpiPatcher { .flags = 0, .intr_flags = 0 }; - ESP_ERROR_CHECK(spi_bus_initialize(mHostDevice, &buscfg, SPI_DMA_DISABLED)); + ESP_ERROR_CHECK(spi_bus_initialize(dev, &buscfg, SPI_DMA_DISABLED)); } public: - SpiPatcher(SpiPatcher &other) = delete; + SpiPatcher(const SpiPatcher &other) = delete; void operator=(const SpiPatcher &) = delete; static SpiPatcher* getInstance(spi_host_device_t dev) { - if(nullptr == mInstance) - mInstance = new SpiPatcher(dev); - return mInstance; + if(SPI2_HOST == dev) { + if(nullptr == InstanceHost2) + InstanceHost2 = new SpiPatcher(dev); + return InstanceHost2; + } else { // SPI3_HOST + if(nullptr == InstanceHost3) + InstanceHost3 = new SpiPatcher(dev); + return InstanceHost3; + } } ~SpiPatcher() { vSemaphoreDelete(mutex); } - spi_host_device_t getDevice() { - return mHostDevice; + inline void addDevice(spi_host_device_t host_id, const spi_device_interface_config_t *dev_config, spi_device_handle_t *handle) { + if(SPI2_HOST == host_id) + mHost2Cnt++; + if(SPI3_HOST == host_id) + mHost3Cnt++; + + if((mHost2Cnt > 3) || (mHost3Cnt > 3)) + DPRINTLN(DBG_ERROR, F("maximum number of SPI devices reached (3)")); + + ESP_ERROR_CHECK(spi_bus_add_device(host_id, dev_config, handle)); } inline void request(SpiPatcherHandle* handle) { @@ -74,13 +89,14 @@ class SpiPatcher { } protected: - static SpiPatcher *mInstance; + static SpiPatcher *InstanceHost2; + static SpiPatcher *InstanceHost3; private: - const spi_host_device_t mHostDevice; SpiPatcherHandle* mCurHandle; SemaphoreHandle_t mutex; StaticSemaphore_t mutex_buffer; + uint8_t mHost2Cnt = 0, mHost3Cnt = 0; }; #endif /*ESP32*/